quinta-feira, 13 de junho de 2013

CONTADOR DE PEÇAS COM ARDUINO UNO R3. + LCD Keypad Shield

Meu novo projeto agora é trazer o contador com a PIC 16F877a para o arduino uno R3 e o LCD keypad Shield.
-Eu optei pelo arduino pelo simples fato de ter o hardware já pronto. Não havendo necessidade desenvolver e confeccionar placas de circuito impresso. 

Hardware necessário:

Placa principal do ARDUÍNO UNO R3.  Veja AQUI


LCD Keypad Shield Veja AQUI


Aqui tem a WIKI do LCD, com pinagem, programas de exemplo, etc.

- Este LCD Keypad Shield possui 4 chaves ligadas em uma unica porta analógica do arduino. No meu projeto não vou utiliza-las, já que vou precisar de teclas maiores que ficarão em um painel maior.

- Ligação do LCD com o arduino.
- Os pinos utilizados pelo LCD são os seguintes: 
4,5,6,7,8,9 (São os pinos no arduino, não no LCD). É assim que ele vem ligado ao Arduino. O importante é o programa saber disso. Que neste caso será a seguinte instrução no começo do programa:


// select the pins used on the LCD panel
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);  significa que estes pinos são do Arduino e estão reservados para o LCD. 

- Uma mudança importante neste projeto em relação ao antigo, é a inclusão do item PEÇAS GRAVADAS. Ou seja, além do valor TOTAL digitado e o valor da contagem, aparecerá no display o número de peças já gravadas.

Exemplo do display:

T.: 1000     X1
F.: 999    G:1


Onde T.: é TOTAL de peças, X1, contará de uma-em-uma. F.: Peças que Faltam gravar e G: peças Gravadas.

Pinos utilizados no arduino:

1 -> SAÍDA  - RELÊ 1 - faz a mudança do botão de PULSO para o arduino controlar. Quando o arduino estiver desligado ou ligado mas sem estar programado, o botão PULSO estará ligado diretamente na máquina laser. Como se o Arduíno não existisse. Eu fiz isso para o caso de você querer gravar sem contar peças. Assim que o botão Enter é pressionado pela primeira vez, este relê ativa e transfere o botão PULSO direto para o Arduíno. Ou seja, ao pressionar o botão PULSO, o comando vai para o pino 12 do Arduíno, e o Arduíno vai acionar o RELÊ 2, que fará o papel do botão PULSO para a máquina Laser.
2 <- ENTRADA - Botão SOBE, ligado a chave e da chave ao GND. Aciona com nivel 0.
3 <- ENTRADA - Botão ENTER, ligado a chave e da chave ao GND. Aciona com nivel 0.
4,5,6,7,8,9 Reservado ao LCD.
10 - Back Light do LCD.
11 -> SAÍDA - BUZZ, aciona a busina do alarme.
12 <- ENTRADA - Sinal de PULSO, ativa em nivel 0.
13 -> SAÍDA - RELÊ 2 - ativa a gravação.



Esquema elétrico no Proteus.

O arquivo fonte de programação do Arduino. AQUI

Um pouco sobre o programa.
- Meu forte não é programação, porém vou explicar um pouco sobre o funcionamento deste aqui.
- Como todo mundo já deve saber, uma das primeiras coisas e, as mais importantes na programação é a definição de variáveis. É por onde tudo começa.
- Eu defini as seguintes variaveis:
- q1, q2, q3 e q4, serão utilizadas para armazenar o número que se deseja contar, cada uma representa uma casa decimal. Q1 é milhar, Q2 é centena, Q3 é dezenas e Q4 unidade.
No programa fica assim:
int long q1=0;
int long q2=0;
int long q3=0;
int long q4=0;

As outras são: conta, total e m.
O principio de funcionamento é começar utilizando a variável CONTA para escolher a casa do milhar (q1), assim que o valor é escolhido o valor de CONTA vai para q1. O próximo passo é escolher a centena (q2), novamente utilizando CONTA e passando para q2, e assim sucessivamente até chegar em q4.

Exemplo: Você escolheu a quantidade de 1000 peças a serem gravadas. Então as variáveis ficariam assim:
- Primeiramente CONTA=0, utilizando a tecla SOBE o valor de CONTA foi para 1, apertando ENTER, o valor  CONTA foi para q1, q1=conta;
- Segundo passo, CONTA=0, aperando ENTER, q2=conta;
No final teremos: 
-q1=1
-q2=0
-q3=0
-q4=0

Valor total 1000.
Agora precisamos colocar esse valor de 1000 na variável CONTA.
Usamos a seguinte expressão:
conta=(q4*1000)+(q3*100)+(q2*10)+q1;

Agora a variável CONTA tem o valor de 1000, e assim podemos começar a contagem.
A formula é bem simples, conta=conta-1; toda vez que temos o sinal de PULSO diminuímos 1 do valor de CONTA.

Porém eu utilizo um parâmetro a mais que é possibilidade de contar até de 4 em 4.
Você vai notar que ao iniciar o programa (ligar o Arduino), o primeiro parâmetro a ser definido é o MULTIPLO, por padrão ele já vem com o valor de 1, e vai até 4. Isso significa que eu posso querer gravar até quatro peças ao mesmo tempo, ou seja, toda vez que eu apertar o botão PULSO uma vez, ele vai descontar esse valor do total.
Usando como base o valor acima que é 1000, e com múltiplo setado em 4 a conta fica assim: conta=conta-4;
Neste caso eu utilizo a variável m para armazenar este valor.
conta=conta-m;

.....

Eu gostaria de comentar um pouco sobre uma rotina interessante, que na qual custei para desenvolver, porém é bem simples, mas como eu disse no começo, programação não é meu forte.
A questão é a seguinte: O programa dentro do chip do arduino roda muito rápido, milhões de ciclos por segundo, e como o programa fica lendo cada porta de entrada do chip em cada ciclo, temos um problema de repetição da tecla repetida.
Exemplo: Temos o botão SOBE ligado ao pino 2, cada vez que apertamos o botão o nivel do sinal deste pino vai para ZERO. O programa percebe isso e aceita como a tecla pressionada, no próximo ciclo de clock e vai ler novamente este pino e se estiver em ZERO, vai entender que a tecla foi pressionada novamente, mas na verdade não foi, pois o processo é tão rápido que nem deu tempo de soltar a tecla. Mesmo que você pressione rapidamente a tecla, a contagem no display será muito rápida. 
Para resolver isso eu fiz uma rotina que após a tecla ser pressionada, ele não passa adiante enquanto ela não for solta.

    if (digitalRead(Btnsobe)==LOW)
          {
            conta=conta+1;
            sobe3:
            ;
            if (digitalRead(Btnsobe)==LOW)
            {
               goto sobe3;
             }
     

Funciona assim, na primeira (1ª) linha diz o seguinte: SE a entrada digital(digitalRead), pino 2 (Btnsobe) for igual a ZERO (que é o botão SOBE pressionado), então execute o que está dentro da chave { , que é somar 1 no valor da variavel CONTA (3ª) e vá adiante.
Na linha tem um ponto de GOTO, ele vai passar direto a primeira vez.
Na linha está o segredo, ele vai verificar novamente se o botão continua pressionado, e como está pressionado e vai executar a linha que é desviar para a rotina sobe3; na linha, e vai ficar neste loop até a o botão for solto, só então ele vai continuar o programa.


MONTAGEM

- Imagem da finalização da caixa e botões.
- A chave preta rotativa do lado direito e os dois botões pequenos, não fazem parte do projeto Arduino.





Video de funcionamento.



Só quero lembrar que a chave preta do lado direito e os dois botões pequenos (verde e vermelho) não fazem parte do esquema elétrico do projeto Arduíno.




Código arduino. 


#include <LiquidCrystal.h>
// Ultima alteração em 22/08/2014
// Foi alterado o valor do delay do botão pulso de 300 para 180 ms.
// select the pins used on the LCD panel
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

// define some values used by the panel and buttons
int lcd_key     = 0;
int adc_key_in  = 0;
long int q1=0 ; // Armazena o primeiro digito da contagem
long int q2=0 ;
long int q3=0 ;
long int q4=0 ;
long int total=0; // valor total de gravação
long int conta=0; //usado para contagem
int m=1; // multiplos
int t=1;
int Btnsobe=2; //botão sobe usará o pino 2
int BtnEnter=3; //Botão Enter usará o pino3
int BtnPulso=12; //Botão Pulso usará o pino 12
int buzz=13; // buzzer no pino 11
int relay1=1; //rele1
int relay2=11; //rele2 pulso
int sobe=0;
int enter=0;
int pulso=0;
int caso=0;
int pronto=0;
int gravados=0;
#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5

// read the buttons
int read_LCD_buttons()
{
 adc_key_in = analogRead(0);      // read the value from the sensor
 // my buttons when read are centered at these valies: 0, 144, 329, 504, 741
 // we add approx 50 to those values and check to see if we are close
 if (adc_key_in > 1000) return btnNONE; // We make this the 1st option for speed reasons since it will be the most likely result
 // For V1.1 us this threshold
 if (adc_key_in < 50)   return btnRIGHT;
 if (adc_key_in < 250)  return btnUP;
 if (adc_key_in < 450)  return btnDOWN;
 if (adc_key_in < 650)  return btnLEFT;
 if (adc_key_in < 850)  return btnSELECT;

 // For V1.0 comment the other threshold and use the one below:
/*
 if (adc_key_in < 50)   return btnRIGHT;
 if (adc_key_in < 195)  return btnUP;
 if (adc_key_in < 380)  return btnDOWN;
 if (adc_key_in < 555)  return btnLEFT;
 if (adc_key_in < 790)  return btnSELECT;
*/


 return btnNONE;  // when all others fail, return this...
}

void setup()
{
 pinMode(Btnsobe,INPUT_PULLUP); // Habilita o pullup do pino 2, significa que está em nivel alto sempre, mudara para 0 quando o botão SOBE ligar este pino ao terra(GND).
 pinMode(BtnEnter,INPUT_PULLUP); // Enter
 pinMode(BtnPulso,INPUT_PULLUP); // Pulso, origem do sinal que vai ativar a máquina. É este sinal que ele vai ler para diminuir o valor da contagem.
 pinMode(buzz,OUTPUT); // Saida do buzzer
 pinMode(relay1,OUTPUT); // saida rele 1
 pinMode(relay2,OUTPUT); // Saida rele 2  - pulso
 digitalWrite(buzz,LOW);
 digitalWrite(relay1,LOW);
 digitalWrite(relay2,LOW);
 lcd.begin(16, 2);              // Inicia a biblioteca do LCD
 lcd.setCursor(0,0);            // Coloca o cursor na primeira linha e primeira coluna.
 lcd.print("Contador Arduino"); // Imprime a mensagem CONTADOR ARDUINO
 lcd.setCursor(0,1);            // Coloca o cursos na SEGUNDA linha e coluna 0
 //lcd.print(millis()/1000);      // display seconds elapsed since power-up
 lcd.print("Multiplos:");
}

void loop()
{
   delay (100);
   lcd.setCursor(12,1); // move to the begining of the second line
   lcd_key = read_LCD_buttons();  // read the buttons
   sobe=digitalRead(Btnsobe); //faz a leitura da porta digital 2 (Botão Sobe)
   enter=digitalRead(BtnEnter);
   pulso=digitalRead(BtnPulso);
   lcd.print(m);
   if (sobe==0) // Verifica se o botão SOBE foi ativado, ativa em ZERO(LOW) - obs.: Aqui tb poderia se usado if (digitalRead(Btnsobe)==LOW)
    {
      m=m+1; // Soma mais um à variavel M que é a contagem dos MULTIPLOS
      m1: // Ponto de retorno do GOTO, usado para verificar se a tecla permanece acionada
      ;
      if (m>5)
       {
        m=1; // se o valor de M for maior que 5, volta a ser 1
        lcd.setCursor(12,1);
        lcd.print(m);
       }
      if (digitalRead(Btnsobe)==LOW) // verifica se o botao continua apertado, se continuar, vai para o loop M1 logo acima.
       {
        goto m1;
       }
    }
   if (digitalRead(BtnEnter)==LOW) // Defini o valor do MULTIPLO e entra na rotina para definir a quantidade de peças.
    {
       digitalWrite(relay1,HIGH);
       lcd.clear(); //Limpa o LCD
       lcd.setCursor(10,0);
       lcd.print("X");
       lcd.print(m);
       lcd.setCursor(0,1);
       lcd.print("Qtda: ");
       Enter:
       ;
       if (digitalRead(BtnEnter)==LOW) //Verifica se a tecla Enter continua acionada.
         {
           goto Enter;
         }
       conta=0;
       do  //rotina para definir a quantidade
       {
          delay (100);
          if (digitalRead(Btnsobe)==LOW)
           {
             conta=conta+1;
             sobe4:
             ;
             if (digitalRead(Btnsobe)==LOW)
              {
               goto sobe4;
              }
           }
          if (conta >9)
           {
             conta=0;
           }
          lcd.setCursor(12,1);
          lcd.print(conta);      
          if (digitalRead(BtnEnter)==LOW)
           {
             q4=conta; // armazena o valor escolhido para casa de milhar na variavel Q4
             enter4:
             ;
             if (digitalRead(BtnEnter)==LOW)
              {
               goto enter4;
              }
              pronto=1;
           }
     
       } while (pronto==0);
     
       conta=0;
       pronto=0;
       do  //rotina para definir a quantidade
       {
          delay (100);
          if (digitalRead(Btnsobe)==LOW)
           {
             conta=conta+1;
             sobe3:
             ;
             if (digitalRead(Btnsobe)==LOW)
              {
               goto sobe3;
              }
           }
          if (conta >9)
           {
             conta=0;
           }
          lcd.setCursor(13,1);
          lcd.print(conta);      
          if (digitalRead(BtnEnter)==LOW)
           {
             q3=conta; // armazena o valor escolhido para casa de milhar na variavel Q4
             enter3:
             ;
             if (digitalRead(BtnEnter)==LOW)
              {
               goto enter3;
              }
              pronto=1;
         }
     
       } while (pronto==0);
       conta=0;
       pronto=0;
       do  //rotina para definir a quantidade
       {
          delay (100);
          if (digitalRead(Btnsobe)==LOW)
           {
             conta=conta+1;
             sobe2:
             ;
             if (digitalRead(Btnsobe)==LOW)
              {
               goto sobe2;
              }
           }
          if (conta >9)
           {
             conta=0;
           }
          lcd.setCursor(14,1);
          lcd.print(conta);      
          if (digitalRead(BtnEnter)==LOW)
           {
             q2=conta; // armazena o valor escolhido para casa de milhar na variavel Q4
             enter2:
             ;
             if (digitalRead(BtnEnter)==LOW)
              {
               goto enter2;
              }
              pronto=1;
         }
     
       } while (pronto==0);
       conta=0;
       pronto=0;
       do  //rotina para definir a quantidade
       {
          delay (100);
          if (digitalRead(Btnsobe)==LOW)
           {
             conta=conta+1;
             sobe1:
             ;
             if (digitalRead(Btnsobe)==LOW)
              {
               goto sobe1;
              }
           }
          if (conta >9)
           {
             conta=0;
           }
          lcd.setCursor(15,1);
          lcd.print(conta);      
          if (digitalRead(BtnEnter)==LOW)
           {
             q1=conta; // armazena o valor escolhido para casa de milhar na variavel Q4
             enter1:
             ;
             if (digitalRead(BtnEnter)==LOW)
              {
               goto enter1;
              }
              pronto=1;
         }
     
       } while (pronto==0);
       conta=(q4*1000)+(q3*100)+(q2*10)+q1; //formula da contagem
       total=conta;
       delay(50);
       lcd.clear();
       lcd.setCursor(0,0);
       lcd.print("T.: ");
       lcd.print(conta);
       lcd.setCursor(14,0);
       lcd.print("    ");
       lcd.setCursor(14,0);
       lcd.print("X");
       lcd.print(m);
       lcd.setCursor(0,1);
       lcd.print("F.: ");
     
       do // Rotina para a contagem das peças
       {
         if(digitalRead(BtnPulso)==LOW) // verifica se chegou o pulso para gravação
           {
             delay(120); // tempo que o botão deve ficar pressionado
             if(digitalRead(BtnPulso)==LOW) // O botão precisa ficar pressionado por mais tempo para ir adiante, evita ruido.
                    {
                   digitalWrite(relay2,HIGH);
                   delay(300);
                   digitalWrite(relay2,LOW);
                   digitalWrite(buzz,HIGH);
                   delay(100);
                   digitalWrite(buzz,LOW);
                   conta=conta-m; // diminui do total a ser gravado o valor do Multiplo
                   if ((conta-m<=0)||(conta-m>65500)) // Vai acionar o alarme quando estiver na penúltima gravação
                      {
                     digitalWrite(buzz,HIGH);
                     delay(250);
                     digitalWrite(buzz,LOW);                      
                      }
                    }
           if ((conta<=0)||(conta>65500)) //qdo chegar a ZERO ou passar dele, encerra a contagem, FIM
            {
            conta=0; // deixa a contagem em ZERO
            lcd.setCursor(13,0);
            lcd.print("FIM");
            //lcd.setCursor(4,1);
            //lcd.print("0   ");
            //lcd.setCursor(10,1);
            //lcd.print(total);
            digitalWrite(buzz,HIGH);
            delay(3000);
            digitalWrite(buzz,LOW);
            digitalWrite(relay1,HIGH);
            }
           delay(250);
           lcd.setCursor(4,1);
           lcd.print("    ");
           lcd.setCursor(4,1);
           lcd.print(conta);
           lcd.setCursor(10,1);
           lcd.print("G:"); // G de peças já gravadas
           gravados=total-conta; // coloca na variavel GRAVADOS a diferença do TOTAL, ou seja, as peças já gravadas
           lcd.print(gravados); // imprime quantas peças já foram gravadas
           p:
           ;
           if(digitalRead(BtnPulso)==LOW) // verifica se o botão continua pressionado
             {
               goto p;
             }
         
         }
       }while (conta!=0);
       fim:
       ;
       goto fim;
     }
}

   







terça-feira, 19 de março de 2013

Pinos da placa de um teclado MTEK USB.

Como parte do meu projeto CONTADOR DE PEÇAS. Precisei utilizar duas funções via teclado para ajudar a automatizar o meu processo de gravação a laser.
Estás duas funções(teclas) serão ligadas em dois botões na mesma caixa do Contador, para facilitar. No programa de gravação a laser as funções que eu vou ativar são: WORK MODE e RED LASER. Normalmente o operador da máquina utiliza o mouse para clicar, e isso não é nada eficiente.
A solução é utilizar a placa interna do teclado e ligar apenas os dois botôes.

Esquema de ligação das teclas F2 e F3.

Clique na imagem para ampliar.

sexta-feira, 22 de fevereiro de 2013

Contador de peças digital com pic 16F877a + LCD V3.6

Nesta nova postagem eu vou mostrar o máximo possivel os passos da montagem da versão 3.6.
Comegando pela caixa que vai abrigar o projeto. Vou utilizar a caixa PB 900 da PATOLA.  R$ 26,81
As medidas da furação interna, ou seja, as distancias entre os pinos são: 87 mm e 109 mm. São 6 pinos na parte interna, usarei 4 para fixar a placa PCB.



- A furação farei na máquina de corte a laser. A precisão é melhor.
- Vou utilizar uma placa de fenolite dupla face de 10X15 cm.
- Conectores PCF para ligação da placa PCB. São bons de trabalhar, e baratos.



 - Para ligação externa, utilizarei os conectores LS 3003 4 vias, LS 3004 5 vias e LS 3005 6 vias. São conectores metálicos e resistentes. A fixação será feita na parte trazeira da caixa. Usarei estes conectores para ligação da máquina a ser controlada.

- Continuando, a imagem abaixo mostra o recorte da tampa da caixa em MDF, papel, e plástico. Eu substituí a tampa original de plástico por esses materiais. Tudo cortado no laser CO2.
Note que a camada de plástico que é a primeira, não tem o corte do LCD, justamente para ser uma proteção para o LCD, mais o papel que tem as impressões.

Próximas fotos já com os botões push button instalados.


Na caixa.
Nesta foto a caixa está deitada, mas eu a utilizarei em pé, fixado na máquina.

Foto da placa PCB feita em serigrafia, dupla face, ainda sem furos, envernizada.
O verniz não ficou muito legal, mas funciona.
Tamanho 10X15 CM.


Desenho em 3D da placa montada. Esta placa foi confeccionada errada, sendo assim logo postarei o projeto correto.


 Para corrigir a falha de desenvolvimento da placa, fiz uma placa separada 
para os relês.

Esquema placa relê.
No conector J2, os pinos 1 e 2 são ligados ao interruptor tipo push-button para acionar a gravação. Quando o Contador estiver desligado, ou ligado mas não programado para contar, o relê RL1 mantêm o botão de acionamento da gravação ligado diretamente na máquina laser. Como no projeto original sem o Contador. 
Ao ligar a contagem, o RL1 é ativado desligando o botão da máquina laser e ligando diretamente no Contador no pino 5 da 16F877A. A PIC fica lendo o estado deste pino, quando o pino 5 passar do nivel 0 para 1 (+5v), botão pressionado, a PIC vai levar ao nivel 1 o pino 36 por uma fração   segundos, e ativar o RL2, que por sua vez ativará a máquina laser. A verdadeira função do RL2 é fazer o papel do botão de acionamento da gravação. 
Os conectores J1 e J2 são do tipo PCF, conforme foto acima.





terça-feira, 5 de fevereiro de 2013

Contador V3.5

Efetuei várias modificações no projeto inicial e agora estou na versão 3.5

Mudanças:
-Removi o LED de aviso, já que não preciso dele, pois tenho todos os dados no display.
-Removi o botão DESCE bem com as rotinas sobre ele no programa em C.
-Adicionei um botão para ativar o motor de passo(projeto futuro).
-Adicionei um sensor óptico para interagir com o motor de passo (fim de curso). Ainda em testes.
-Adicionei um aviso sonoro curto apó a penúltima gravação. Para avisar o operador em caso de gravações múltiplas. Desta forma ele vai checar se precisa preencher o gabarito com todas as peças, ou somente o necessário.
-Mudei o valor dos resistores dos transistor de acionamento dos reles para 100 Ohms.
-Adicionei um capacitor eletrolítico de 100uf na entrada do PULSO. Para evitar ruídos.

Aqui todos os arquivos desta última versão.

Obs.: A parte de acionamento do motor de passo ainda será testada.

sexta-feira, 18 de janeiro de 2013

Botões de acionamento

CONTADOR V2.5

- Devido a necessidade de melhorias no projeto, criei a versão 2.5.
Mudanças:

Hardware:
- Adicionei mais um relê.  Fiz essa mudança porque o botão de acionamento era duplo, as vezes dava mal contato e acionava apenas o Contador e não a máquina, e vice-versa.

- O que estou fazendo agora é a partir do momento que o contador entra em ação (quando o ENTER for pressionado pela última vez)  o relê RL01 ativa e interrompe o acionamento manual da máquina Laser. Deste ponto em diante será o Contador quem vai acionar a máquina utilizando o relê RL02. O RL02 fará o papel do botão de acionamento. Desta forma não terei o risco de uma mal contato, gerando falhas na contagem. Afinal, precisa ser confiável.
 Se houver a necessidade de utilizar a máquina Laser sem contar peças, sem utilizar o Contador, basta pressionar o RESET.
Neste esquema temos o botão B1 que é PULSO, e B2 que é da máquina laser. Note que eles não tem ligação elétrica entre si. Obs.: Esses dois botões são acionados juntos mecanicamente, ou seja, são duas chaves independentes mas acionadas por um único botão.
Chamados Botão de Acionamento tipo Cogumelo.
Mudanças no programa:
- Eu mantive o botão DESCE, mas não estou utilizando, nem montei ele no protótipo, já que a contagem com o botão SOBE zera automaticamente depois de chegar no 9.
- MULTIPLOS é principal mudança, foi incluído logo no início do programa, e seu valor já começa com 1, e no meu caso vai até 4. Isso quer dizer que eu posso querer gravar até 4 peças ao mesmo tempo. Ou seja, cada aperto do botão quatro peças são gravadas ao mesmo tempo pela máquina. 
Ex.: Eu costumo gravar chaveiros e as vezes a quantidade é grande, eu tenho um gabarito para 4 chaveiros. Eu posiciono os quatro e máquina grava todos de uma só vez, mas com único acionamento.
Neste caso o calculo é feito através da variavel M.

conta=conta-m;
Ex.: Eu defini MULTIPLOS de 4 e 100 peças para gravar.
No começo a variável CONTA tem o valor 100. Depois de apertar o botão PULSO, a variável CONTA ficará com 96. Conforme conta abaixo.

1- conta=conta-m;
   (100)=(100-4);
2 - conta=96
3 - conta=92
4 - conta=88...

Todos os arquivos do projeto aqui.
Atenção: Os arquivos são diferentes da versão 1.0

Um problema que eu tive no começo foi que ao pressionar um botão, o mesmo repetia como se estivesse sendo pressionado várias vezes rapidamente. Já que o programa corre muito rápido no processador, era um resultado esperado.
Eu resolvi esse problema desta forma:
- Verifica SE o BOTÃO foi pressionado, se foi, executa uma função, algo como acrescentar uma valor numa variável. Logo em seguida dentro do próprio laço existe mais uma verificação SE o BOTÃO foi pressionado. Neste laço enquanto o BOTÃO estiver pressionado, ele volta e faz um loop para verificar o botão novamente. Quer dizer que enquanto eu não soltar o botão ele não continuará. Isso o impedira de repetir.
Veja a rotina abaixo. Obs.: Isto é apenas uma parte do programa.

if (pulso==1) // verifica se o botão PULSO foi pressionado
       {
       rele2=1; //liga o relê que aciona a contagem da máquina, faz o papel do botão original
       conta=conta-m;// diminui a contagem
       delay_ms(100); // da um tempo antes de desligar o rele.
       rele2=0; // desliga o relê
       p: // sub-rotina, para detectar o botão PULSO pressionado continuamente
       ;
       if (pulso==1) //se o boão continuar pressionado
         {
         goto p; // fica em loop até ser solto
         }
       }


Neste link tem um vídeo mostrando o funcionamento do protótipo. Incluindo o final da contagem.




Continua...

terça-feira, 15 de janeiro de 2013

Contador de peças PIC16F877a

Na empresa onde trabalho surgiu a necessidade de controlar a quantidade de peças gravadas nas máquinas laser; como parte de um processo de melhorar o controle de qualidade .
Sendo técnico em eletrônica, e tendo paixão pela mesma, resolvi voltar a ativa e desenvolver este projeto. 
A dificuldade inicial estava justamente na linguagem de programação C para microcontroladores, da qual sei apenas o básico.

Eu gostaria de escrever este blog com o intuito de ajudar os leigos (como eu), mas não sei se conseguirei me expressar. De qualquer forma vou tentar.

Qual a função do deste contador? Por que ele foi criado?
- Contar peças, uma a uma, inserir a quantidade desejada e iniciar a contagem regressiva até ZERO. Impedindo a máquina de continuar.
- Aviso sonoro e visual ao término da contagem.
- Contagem regressiva.
- contagem máxima 9999. Pode ser facilmente alterada pelo software C.

Funcionamento:



-Ao ligar, o cursor no display começa com ZERO, que é o valor do MILHAR. As teclas SOBE e DESCE alteram o valor de 0 á 9. Após escolhido o valor a tecla ENTER armazena o valor escolhido e salta para o próximo digito, a CENTENA. E assim vai até que os quatro dígitos estiverem inseridos.
Apertando ENTER no último dígito. o valor total aparecerá na primeira linha do display e o contador ficará aguardando o sinal de PULSO para começar a contagem.

Exemplo: 1  0  0 0
              ^ ^ ^ ^
               !  !  !  Unidade
               !  !  Dezena
               !  Centena
               Milhar.



 
Exemplo de 1000 gravações com uma já gravada(PULSO já acionado uma vez).

Projetei este dispositivo para interagir com a máquina laser através do botão PULSO, na minha máquina tem um botão simples que é acionado para gravar. Vou mudar esta chave e colocar uma dupla, ou seja, um botão que vale por dois, são isolados eletricamente, não tem ligação uma com a outra. Desta forma eu garanto uma isolamento entre a máquina laser e o contador. 
Também vou utilizar um relê para cortar a ligação desta chave quando o valor chegar a ZERO.
Para começar uma nova contagem, basta pressionar o botão RESET.
E se precisar utilizar a máquina sem contagem, basta não digitar nada.

O projeto dividido em etapas.
- Hardware:
               - Placa de Circuito impresso (fabricar). O layout da placa será disponibilizado em breve.
               - Montagem dos componentes eletrônicos.
               - Ligações elétricas externas.
               - Fonte de alimentação DC 12V 500 ma.
- Software:
               - Programação da PIC.
               - Compilador para possíveis alterações e adaptações a gosto.

Lista de peças:
1x PIC 16F877A.  Link do mercado livre.
1x Display LCD 16X2L, muito comum no mercado, com várias cores. Dê preferencia com BACK LIGHT, para o display ficar bem iluminado.
Link do mercado livre para o LCD.
1x Relê Metaltex AX1RC-5V - bobina 5v. Ou qualquer outro compatível
2x Transistor BC 548.
1x Cristal 4mhz.
2x Capacitor cerâmico 27pf.
1x Regulador de tensão 7805. Você pode dispensá-lo se for ligar numa fonte de 5v DC.
1x Capacitor eletrolítico 100 uf.
1x Capacitor eletrolítico 1uf.
1x Diodo 1N4148.
4x Resistor 1k.
2x Resistor 330 ohms.
1x Trimpot 10k.
1x Resistor 10k.
1x LED vermelho comum.
4x Botões tipo push button.

Demais peças:
Cabo muito vias (16) para o LCD.
Soquete 40 pinos para a PIC.
Conectores para a ligação da placa com a fonte e o botão PULSO.






Softwares utilizados:
- Proteus 7.9.

- Compilador PCW HD 4.078
Para gravar na PIC eu utilizo o programa DIY K150 PCmicro Programmer.
Baixe aqui.
Eu tenho um gravador universal, nem sei a marca.

Arquivos do projeto:
- Eu incluí no projeto o arquivo MOD_LCD.C - Biblioteca de manipulação de módulo LCD do autor : Fábio Pereira. Facilita muito o manuseio do LCD.
- O arquivo main.h e 16F877A.H, este último já disponibilizado pelo compilador PCW HD. Obs.: O arquivo 16F877A.H foi alterado(comentado a linha) //#define VREF_HIGH 0x80. Esta linha comentada desabilita os resistores PULL-UP internos do chip, para as entradas. Isto quer dizer que da forma que deixei as portas de entradas por padrão estarão em nível baixo, utilizando os resistores da placa, ficarão em PULL-DOWN. Já que fiz o projeto eletrônico desta forma.
Você deve ter em mente que o arquivo 16F877A.H que deve ser alterado está dentro da pasta do C:\Program Files (x86)\PICC\Devices, e protegido contra gravação. Voce vai precisar alterar as permissões para poder gravar nele. Pelo windows explorer clique no arquivo com o botão direito, em propriedades/segurança e mude os atributos para MODIFICAR o arquivo. Faça isso para seu usuário.

Pasta com os arquivos deste projeto.


Esquema elétrico desenvolvido no Proteus e testado na prática.





A placa PCB você deve projetar. Pode utilizar o próprio ARES do Proteus.
Como o circuito é simples, eu utilizei uma placa padrão perfurada, e fiz as ligações com fios. É facil.
Falando um pouco do display LCD.
- Um detalhe importante na montagem é não esquecer de ligar o pino 3 no trimpot ou potenciômetro. Muitas pessoas fazem projetos de testes e não ligam este pino. 

Teste do LCD.
- Um teste simples para saber se o LCD esta funcionando, é ligar ele sem conectar os pinos dos dados. A primeiro linha do LCD aparece toda preenchida.