Manual

do

Maker

.

com

Sensor de moedas com PIC e Arduino

Sensor de moedas com PIC e Arduino

No post anterior discorrí sobre IOC (Interrupt On Change) em PIC, mais especificamente no modelo 16F1827. Nesse post vamos aplicar esse recurso sobre um conjunto mecânico doméstico simples para sensor de moedas e seus respectivos valores.

Além de fazermos a parte lógica em PIC, vou apresentar também o código para Arduino, de forma que possa agradar ambos os públicos.

Você poderá construir esse sensor em casa e já nesse post você terá a opção "Preguiça", onde você pode comprar os planos da parte mecânica devidamente detalhado (é simples DEMAIS, mas facilita ainda mais o trabalho porque você pode imprimir, colar na madeira e cortar sem erros), assim como poderá opcionalmente utilizar a opção "Mega-Preguiça", comprando o conjunto de peças pronto para montar!

Agora, antes de seguirmos adiante, vamos aos prós e contras do sensor de moedas doméstico. Primeiramente, o lado positivo:

  • Baixo custo para comprar
  • Baixo custo para fazer
  • Possibilidade quase nula de apresentar problemas
  • Mecânica compacta

Nada nesse mundo é só vantagem, então do lado negativo foram apenas os obstáculos encontrados - a moeda de 5 centavos tem exatamente o mesmo tamanho da moeda de 10 centavos prateada, - esse problema foi solucionado com uma técnica muito bacana, mas que incrementou o preço do projeto em quase 1 real; 25 centavos prata (família antiga) casa com 50 centavos da nova família de moedas, então foi necessário aplicar mais uma técnica aqui, o que também aumentou o custo.

Como o objetivo é fazer um cofrinho eletrônico com alguns efeitos (sendo esse o primeiro projeto a utilizar esse sensor), não devemos considerar como terrivelmente grave o problema. Além do mais, o projeto final tem vários atrativos:

  • Incentivar seu filho, irmão ou você mesmo a economizar motivado pelos diferentes efeitos ao depositar moedas de diferentes valores.
  • Contabilização dos depósitos, de forma a não precisar abrir o cofrinho pra matar a curiosidade
  • Contabilização dos diferentes valores das moedas
  • Contabilização do número de moedas depositados
  • Estimativa de peso do total de moedas depositados

Isso para o projeto inicial, podendo posteriormente ser incrementado alguns recursos como por exemplo:

  • Separação dos tipos de moedas
  • Timer para abertura do cofre em data programada
  • Senha para abertura do cofre

Espero que esteja empolgado como eu estou. Agora sigamos adiante!

Mecânica do sensor de moedas

Chamo de "mecânica" porque não sei que nome dar ao dispositivo sensor de moedas, mas é algo relativamente simples, como pode ser visto na imagem.

A peça retangular em MDF recebe uma segunda peça em do mesmo material com o ângulo preciso para correr as moedas para suas respectivas posições. As peças são grudadas e lixadas para um acabamento mais preciso, sem imperfeições. A cola leva até 8 horas para secar completamente e as peças devem ficar juntas sob pressão, como pode ser visto na imagem a seguir, onde confirmo a posição de 1 real e 10 centavos. Isso significa que você deve ter o mesmo capricho para que o resultado seja o esperado.

moedeiro.webp

A outra metade é bastante simples; um retângulo idêntico ao primeiro, mas dessa vez sem o MDF de 3 mm da canaleta. Ambas as peças serão emparelhadas de forma que a moeda possa correr por entre os retângulos e sob a canaleta. Essa parte não será grudada, ela deve ser furada e pinada (ou parafusada), porque ainda teremos que fazer furos verticais para os sensores que serão nada mais nada menos que: INTERRUPÇÕES !!!

Então, após a furação, será necessário um novo acabamento para evitar que hajam rebarbas que possam interferir na passagem das moedas. Além disso, os pontos de interrupção deverão ser devidamente calibrados - e isso tem que ter uma certa precisão, pois algumas das moedas tem diferenças mínimas no diâmetro e não devem parar no local errado.

No post anterior apresentei superficialmente a manipulação de interrupções na mudança de estado. Nesse post veremos como implementá-lo por completo e de maneira 100% funcional, não apenas conceito - mas isso será apenas em PIC, com Arduino vamos utilizar polling, uma técnica que serviria também para PIC, mas será no mínimo interessante apresentar pelo menos essas duas maneiras de fazer a mesma coisa. Além disso, o Arduino UNO e Leonardo tem apenas 2 pinos de interrupção externa e para fazer algo da mesma forma que com esse PIC pequeno, seria necessário o Arduino Mega. Então, logo se vê que em termos de custo pode ser muito mais vantajoso utilizar PIC. Se você não leu sobre IOC, sugiro que veja esse post para uma breve compreensão. No código atual várias coisas estão diferentes, mas seus "porquês" serão aclarados nos comentários do código.

coinCounter.webp

Tendo então as partes em mãos, o resultado da junção dessas três primeiras peças é algo como a imagem mostra, semelhante à canaleta do leitor de cartões com tarja.

Após ter montado essa primeira parte, vem a furação. Os furos da esquerda e direita estão desalinhados quando olhando por fora, mas olhando pelo lado de dentro pode-se observar a razão para tal.

O furo entre os cantos está mais alto e deslocado propositalmente. Esse furo está vazado apenas nessa peça, não ultrapassando o conjunto. Isto é porque pode ser necessário ajustar o ângulo e abertura entre as peças e ele tem a função de manter esse espaço, porém deve ser ajustado antes de apertar os parafusos dos cantos - cuidado na hora de fazer esse ajuste.

Cuidei de detalhes como por exemplo, fazer um espaço concavo para esconder a cabeça dos parafusos. Os furos podem ser feitos com uma furadeira convencional e o concavo pode ser feito posteriormente um uma broca de maior diâmetro. No meu caso, fiz o acabamento com uma Dremel e os furos fiz com uma furadeira vertical.

Com um pouco de esforço essas ferramentas de precisão podem ser dispensadas, mas "um pouco de erro aqui" e "um pouco de erro ali" pode acabar resultando em uma peça feia.

Por fim, a beleza nessa peça também não é fundamental, uma vez que ela estará alocada internamente, mas seguindo a leitura você entenderá o porquê de tantos cuidados também com a aparência.

Chegou o momento de entrar em detalhes sobre como é feita a identificação da moeda.

Cada moeda tem um diâmetro diferente (exceto as citadas como obstáculo, mais no início do post), então o que faremos é simplesmente interromper seu curso durante sua entrada no contador. Quando a moeda chega ao diâmetro limite, gera uma interrupção e o processador trata o evento conforme descrito no código.

O primeiro desafio que encontrei foi pensar como interromper a moeda em curso. Outro desafio seria então medir o diâmetro para validá-la. Já pensando na interrupção no trajeto e no contato eletrônico, nada mais sensato que utilizar sensores metálicos para gerar a interrupção, mas ainda assim tinha mais um obstáculo a vencer, que seria a calibragem dessa interrupção, de forma que nenhuma moeda passante venha a ser interrompida na posição errada, mesmo que apenas esbarrando (afinal a diferença entre uma moeda e outra é de apenas 2 milímetros). Para facilitar a calibragem, me pareceu sensato utilizar parafusos e igualmente sensato utilizar os próprios parafusos como sensores para gerar as interrupções (lembrando que essa é a primeira versão do contador de moedas, na segunda versão haverá modificações no design).

coinCounter-inside.webp

Repare que a furação para os parafusos é bastante precisa e não está ao centro. Isso porque não quis gerar atrito intenso nas partes coladas, portanto desloquei a broca para furação entre a união da terceira peça e o lado sem cola do MDF mais fino.

Olhando agora a peça, fica fácil entender o porque dos furos deslocados (visualmente, pelo lado externo). Repare o quão ajustado estão os furos entre as distâncias que gerarão as interrupções. A distância vertical e horizontal dos furos tem enorme importância nessa peça. Repare também algo que agora pode lhe parecer estranho - a peça está na posição correta, ou seja, a moeda não correrá sobre a peça central do conjunto de madeira, mas sim sob ela.

A profundidade dos furos dos parafusos sensores não é importante, desde que passe a peça central, por isso existe uma variação nos comprimentos como pode-se notar na imagem.

Absolutamente todas as medidas estão devidamente descritas no plano do projeto de forma que você poderá executar toda a construção sem se preocupar. O projeto foi desenhado em CAD (mais precisamente no QCAD), está com camadas coloridas, quotas e perspectiva das peças individualmente e em conjunto.

Você poderá optar por fazer cada uma das peças seguindo o projeto, aplicando as medidas manualmente sobre a madeira ou poderá imprimir o projeto e grudar sobre a madeira para lhe servir de guia de corte e furação, uma vez que o desenho está em escala de tamanho natural.

coinCounter-led.webp

Alguns parágrafos acima citei uma técnica bacana para diferenciar as moedas de 10 centavos prata das moedas de 5 centavos. Primeiramente eu havia pensado em utilizar um sensor de efeito hal e medir o campo magnético gerado, considerando a diferença dos tipos de material empregados na fabricação das moedas. Porém isso não seria barato nem prático de fazer, e olhando para as moedas, pensei em diferenciá-las por sua reflexão. Para testar a possibilidade, liguei a tela do celular sobre as duas moedas em paralelo e percebi que realmente a moeda prateada refletia muito mais a luz do que a moeda bronze de 5 centavos. Aí decidi utilizar um truque usado também para gerar interrupção - LDR + LED, identificando assim a moeda por reflexão.

Já utilizei também essa ideia no meu sensor de cores (descrito nesse post), então só o que me faltava era o teste que executei com o celular. Por isso que na posição de 5 centavos encontram-se 2 furos; um com o LED verde posicionado e o outro com o LDR acoplado por trás da peça.

Sobre o que falei de precisão, reafirmo - nada como ter as ferramentas certas para cada tarefa.

Como pode-se notar nessa imagem, essa é uma retífica de bancada (Dremel acoplada), utilizada para fazer a canaleta por onde passarão os fios dos sensores e resistores.

Não é exagero nenhum e não sei que outro modo isso poderia ser feito manualmente. Talvez queimando com um pirografo, mas certamente haveria variação devido à mudança de resistência da madeira durante o trajeto da ponteira.

Enfim, a beleza não é fundamental para essa peça desde que ela seja utilizada internamente. Já vou revelando por aqui nesse parágrafo que o intuito é ir um pouco além, ficando entre um automata e marble machine, então será interessante mostrar todas as traquitanas envolvidas no projeto. Infelizmente a parte eletrônica não é algo que possa causar espanto, mesmo que o código pudesse ser exibido em um display, mas exibir elegantemente a interconexão das partes causará uma melhor impressão sobre o projeto como um todo.

coin-ldr.webp

Então, este é o resultado final da peça com os trilhos devidamente esculpidos pela Dremel. Graças à profundidade e espessura, dá até pra "camuflar" os cortes de diversas maneiras, inclusive formicas, contacts, silver tape ou até mesmo serragem fina com cola e um bom lixamento. Optarei por deixar tudo exposto, mas de qualquer modo a madeira receberá um acabamento final interessante, tornando-a mais resistente a umidade e dando-lhe mais beleza (e não, não é verniz).

Ajustar o LED e o LDR não é a tarefa mais complexa, nem na parte física, nem na parte lógica. Para fazer a devida calibragem no LDR, utilizaremos um pino com CPP, para controlar a intensidade do LED via PWM invés de resistores (mas de qualquer modo será utilizado um resistor de 330 ohms). As conexões eletrônicas pelo lado externo também receberam alguns toques especiais, mas repare primeiramente nos parafusos das interrupções.

Graças à micro-retífica, pude dar uma incrementada na face externa, praticamente embutindo os componentes que se atrelam ao mecanismo. Aproveitei para fazer uma minúscula furação para encaixar as pontas dos componentes e assim facilitar a soldagem. No final isso ajudará também a manter tudo fixado na madeira. O LED+LDR ficam numa altura um pouco desconfortável e preferi levar as duas pernas do LED para a base, por ser o caminho mais curto. Então fiz as canaletas para as pernas e na base fiz uma canaleta funda o suficiente para manter o LED realmente embutido na madeira, de forma a não atrapalhar a movimentação do mecanismo.

Mais uma vez, todas as medidas estão devidamente dispostas nos planos e para atingir esse resultado bastou uma Dremel com as peças de retífica. Exceto os furos de encaixe dos componentes, os demais são bastante comuns. Se não tiver as peças do tamanho ideal, você tem duas opções; ou faz o furo maior, ou não faz os furos de interconexão dos componentes. Como eles se soldarão, caso o furo seja maior bastará preenchê-lo com solda e o visual deverá ficar agradável o suficiente, além de evitar que os componentes se desloquem durante o movimento do mecanismo completo.

Para que você tenha uma idedia do acabamento do sensor de moedas (que não é perfeito, mas bom o suficiente) repare a imagem sem os componentes encaixados.

Calibragem

A parte de sensoramento está completa, mas agora é hora de calibrar antes de seguir adiante. O primeiro ajuste a ser feito é o das interrupções das moedas. É uma parte bastante delicada, considerando a proximidade entre os três últimos parafusos e após finalizada essa etapa, então deve-se calibrar o medidor de refração.

Calibrar a refração não é uma tarefa complexa, porém deve-se atentar à quantidade necessária e suficiente de luz. Se você gerar uma super-nova, de nada adianta acoplar o LDR porque toda a luz voltará e esse sensor é analógico, além de que a MCU tem apenas 10 bits de resolução. Veremos os detalhes mais adiante, mas agora precisamos da base de aterramento da interrupção.

A primeira opção não era lá uma idéia muito boa, mas como nada mais me havia ocorrido, a opção era uma base metálica ligada ao servo que faz a abertura para que a moeda possa descer, a outra seria um tipo de 'pente' com as interrupções ligadas, onde o pente levanta e permite a passagem da moeda após identificado. Essa segunda opção é boa, mas não é ideal para esse projeto que tem o intuito de minimizar custos. Então, para fazer o aterramento, a opção foi nada mais nada menos que utilizar um revestimento em uma das paredes da canaleta - mais precisamente, papel alumínio.

Apesar de o motor não ser parte integrada do conjunto, será fundamental para permitir a liberação das moedas para o fundo do cofre. Desse modo, temos aqui o conjunto inicial exclusivamente para o sensor de moedas:

  • LDR + LED para medir reflexão.
  • Interrupções nos parafusos.
  • Servo-motor para liberação das moedas.

À parte disso, obviamente será necessário algum tipo de display. Entre as opções, multiplexar com 2 digitos ou com um display de 4 digitos, já no segundo caso utilizando 4 pinos da micro-controladora -e nesse caso, também utilizando um driver.

Ainda, os valores deverão ser armazenados em algum lugar. Obviamente a EEPROM parece ser a melhor e mais barata opção. O próximo post será sobre gravação em EEPROM interna e externa, para podermos dar continuidade ao projeto íntimos dos recursos envolvidos.

Tudo esteve perfeito até esse ponto, mas na calibragem pude perceber um erro bastante grave que cometi em relação ao sensor das moedas de 5 centavos; deixei espaço demasiado entre o LDR e o LED, além de ter utilizado um resistor errado para a ocasião. Eu teria que refazer as duas faces de madeira novamente devido à furação do projeto, então optei por seguir com o segundo modelo para prová-lo também, e o resultado foi muito bom.

Minha dica em relação ao resistor entre o LDR e a leitura analógica é simples:

  • ambiente claro, resistor baixo.
  • ambiente escuro, resistor alto.

Eu estava utilizando um 330ohms, o que me deixou com uma margem ínfima, praticamente invisível porque a escuridão predominou, o LED não tem um ângulo abrangente e o LDR estava acoplado demais para perceber qualquer coisa. Enfim, após o erro pelo excesso de confiança, prototipei antes de repetir a dose.

coins.webp

E já que parti para o segundo modelo, reduzi o custo de produção, apesar de aumentar o tamanho.

Como você pode reparar, todas as moedas cabem alinhadas e com sobra agora. Existem diversas outras possibilidades, apenas foquei em reduzir custo por agora. O primeiro modelo é compacto e fácil de calibrar e corrigindo o posicionamento do LED, LDR e resistor pode ser utilizado como opcional.

coiner.webp

Achei bastante interessante o resultado das canaletas e furos de encaixe simulando trilhas. No primeiro modelo os fios dos sensores estariam expostos, já nesse segundo modelo optei por embutir o máximo possível, inclusive mantendo tudo em apenas uma das faces, uma vez que espaço deixou de ser problema.

O formato de escada me permitiu identificação visual da área de contato de interrupção, sem interferir na próxima moeda. Repare que não coloquei a interrupção no canto (na verdade, haveria de ser na quina se o limite da moeda fosse uma opção). Os pinos de contato são pregos, podendo ser de aço ou barra de aço ou ainda se preferir parafusos, tal qual na versão anterior. COmo o preço do parafuso está altíssimo, optei pelos pregos e economizei pouco mais de 5 reais nessa mudança.

coin-wire.webp

Repare a distância entre o LDR e o LED, agora quase colados. O LDR deve ser acoplado ao furo de seu exato diâmetro, o mais próximo da superfície interna da madeira a que está acoplado. O Led deverá ficar inicialmente no limite da linha, mas não deixe que o bulbo ultrapasse o limite da madeira para que não veze luz para o lado. Se posteriormente for necessário expor mais o LED, empurre-o por trás com a ponta do multímetro ou algo do tipo.

Os fios das interrupções devem ser descascados e pressionados junto com o prego/pino dentro do furo. Assim pressionados, os fios não escaparão e nesse ponto a soldagem está dispensada. Os fios estão devidamente encaixados cada um em seu trilho vertical e há uma canaleta maior onde todos se conduzem para o lado de fora do conjunto.

coin-done.webp

Creio que não é necessário citar, mas ao acoplar o fio ao pino, tenha em mente que a parte encapada do fio deve ficar à direita para não interferir na interrupção da moeda. Resolvi caprichar um pouco no cuidado da madeira também, então fiz o teste apenas na face lisa do conjunto, dando algumas demãos de betume. Fechei a peça para ter uma idéia do formato final e confesso que gostei do resultado.

Calibrando o LDR

Como citei anteriormente, você deverá fazer seu próprio ajuste porque o LDR é um sensor analógico que varia conforme a temperatura e influência de luz. Também tenha em mente que a calibragem foi feita com 5v alimentando uma das pernas do LDR.

O resistor utilizado para gerar valores sensíveis no escuro foi um 47k. A dispersão que obtive entre o limítrofe de 5 centavos bronze e início da leitura na moeda de 10 centavos prata foi de estáveis 12 pontos, sendo que a leitura no LDR deve ser feita através de amostragem e média. Então na bronze obtive valores que variavam entre 40 e 58, enquanto na prata obtive uma leitura entre 70 e 80. Com isso já é possível identificar seguramente o tipo de moeda, o problema é que quando as moedas inseridas forem de 10 centavos prata ou 5 centavos, o tempo consumido para liberação será maior porque será necessário recolher amostras no LDR e é fundamental um delay entre as leituras.

Calibrar no Arduino é bastante simples, bastando seguir esse esquemático:

arduino-ldr-wire.webp

Para o LED, utilizei um resistor de 330ohms. Não aterre no mesmo fio que aterrará o LDR para não receber influência na leitura. O pino utilizado no teste também foi um PWM (9) para poder controlar a intensidade de luz facilmente, caso necessário.

Utilizei o mesmo acoplamento desse post para calibrar o LDR, apoiando as moedas sobre ele. O código que você pode utilizar (de acordo com o esquemático, e considerando um resistor de 47k) é esse a seguir:


int LDR;
int cont;
int i;

void setup()
{
  Serial.begin(9600); 
  pinMode(9,OUTPUT);
}
void loop()
{
  analogWrite(9,255);
  LDR=0;
  for(i=0;i<=10;i++) {
      cont=analogRead(0);
      LDR = LDR+cont;
      delay(1000);
      Serial.println(cont);
  }
  LDR=LDR/10;
  Serial.println(LDR);
}

Esse código exibe todos os valores, mas ao final do loop imprime a média. Opte por uma das duas saidas ou ambas, mas não deixe de fazer a calibragem.

A base de aterramento pode ser vista no vídeo. Na verdade, não é "aterramento", pelo contrário - deve-se colocar 5v na base para fazer a interrupção. Sugiro uma canaleta de alumínio, pode ser trilho de cortina ou uma peça comprada em casa de ferragens. Sinceramente, fiz uma base bonitinha em madeira, comi um bombom e utilizei o papel alumínio para forrar a madeira. Você pode utilizar papel alumínio de forno. Será durável, leve, barato e dá um acabamento bonito. No cofrinho farei isso e mostrarei as peças bem acabadas.

IOC - código limpo

Como pode ser visto no post anterior, a utilização de interrupções na mudança de estado é um recurso disponível nessa versão do PIC (PIC16F1827). O código foi mal implementado apenas para mostrar o conceito, mas agora necessitamos dele 100% funcional. O código está devidamente comentado para tentar deixar o mais claro possível.


//Mapeamento do PIC16F1827 para esse projeto
/*
LED        RA2 - 1.18 - RA1 LDR
Servo      RA3 - 2.17 - RA0
           RA4 - 3.16 - RA7
           RA5 - 4.15 - RA6
           Vss - 5.14 - Vdd
           RB0 - 6.13 - RB7 5  cents
1  real    RB1 - 7.12 - RB6 10 cents
           RB2 - 8.11 - RB5 50 cents
25 cents   RB3 - 9.10 - RB4

*/

//LED externo reagindo a interrupcao
sbit LED_TRIS  at  TRISA3_bit;   
sbit LED_PINO  at  RA3_bit;  

sbit LED_VERDE_TRIS at TRISA1_bit;
sbit LED_VERDE      at RA1_bit;


int i = 0;
int j = 0;

void blink(int numBlinks){
    for (j=0;j<numBlinks;j++){
        LED_PINO = 1;
        Delay_ms(20);
        LED_PINO = 0;
        Delay_ms(10);
    }
}
void interrupt(void){
//  if (INTCON.IOCIF){
/*INTF acontece com qualquer interrupcao, inclusive periferica
. Como sera usado PWM, sera gerado interrupcao periferica e aqui
so interessa a interrupcao IOC */

  if (INTCON.IOCIF == 1){ //|| INTCON.INTF == 1){
    //desativar chave geral para tratar interrupcao
    INTCON.GIE   = 0;
    INTCON.IOCIE = 0;
   
    if (IOCBF1_bit == 1){
      IOCBF1_bit = 0;
      INTCON.IOCIF = 0;
      INTCON.IOCIE = 1;
      IOCBF = 0;
       blink(1);
    }
    else if (IOCBF2_bit == 1){
      IOCBF2_bit = 0;
      INTCON.IOCIF = 0;
      INTCON.IOCIE = 1;
      IOCBF = 0;
      blink(2);
    }
    else if (IOCBF3_bit == 1){
      IOCBF3_bit = 0;
      INTCON.IOCIF = 0;
      INTCON.IOCIE = 1;
      IOCBF = 0;
      blink(3);
    }
    else if (IOCBF5_bit == 1){
      IOCBF5_bit = 0;
      INTCON.IOCIF = 0;
      INTCON.IOCIE = 1;
      IOCBF = 0;
      blink(5);

    }
    else if (IOCBF6_bit == 1){
      IOCBF6_bit = 0;
      INTCON.IOCIF = 0;
      INTCON.IOCIE = 1;
      IOCBF = 0;
      blink(6);
    }
    else if (IOCBF7_bit == 1){
      IOCBF6_bit = 0;
      INTCON.IOCIF = 0;
      INTCON.IOCIE = 1;
      IOCBF = 0;
      blink(7);
      // um segundo led para reagir a mudanca de estado.
      // esta exemplificado no video a seguir
      LED_VERDE = ~LED_VERDE;
    }

    /*Final 'F' eh Flag.
      A Flag eh levantada a cada interrupcao, portanto
      deve ser limpa antes  de  levantar as chaves que
      reativam as interrupcoes, ou  a  interrupcao  se
      repetira. 
   */
    INTCON.IOCIF = 0;
    INTCON.INTF = 0;
    IOCBF = 0;
    
    INTCON.IOCIE = 1;
    INTCON.GIE = 1;
  }
}

void main() { 
  ANSELA = 0;   //desabilita analog portas A e B
  ANSELB = 0;
  C1ON_bit = 0; //desabilita comparadores
  C2ON_bit = 0;

  //Interrupt On Change (P)ull-up bits
  /* Quando 5v entrar no pino, a flag levantada eh IOCBPF:
  Interrupt On Change B Pull-up Flag. Eh simplesmente como um HIGH

  */
  IOCBP0_bit   = 1;
  IOCBP1_bit   = 1;
  IOCBP2_bit   = 1;
  IOCBP3_bit   = 1;
  IOCBP4_bit   = 0;
  IOCBP5_bit   = 1;
  IOCBP6_bit   = 1;
  IOCBP7_bit   = 1;

  /* Aqui eh muito parecido, representando a queda do pino.
     O video a seguir mostra como o processador reage a cada
     estado e em que condicao.
  */
  IOCBN0_bit   = 1;
  IOCBN1_bit   = 1;
  IOCBN2_bit   = 1;
  IOCBN3_bit   = 1;
  IOCBN4_bit   = 0;
  IOCBN5_bit   = 1;
  IOCBN6_bit   = 1;
  IOCBN7_bit   = 1;



  //TRIS do LED é OUTPUT
  LED_TRIS   = 0;
  TRISB  = 1;

  //led verde  aterra no pic    - pino 1, esquerda
  LED_VERDE_TRIS = 0; //Output. Parece estranho mas eh assim
  LED_VERDE      = 1; // 0 liga
  
  //Desligar conversor AD0
  ADCON0 = 0;

  //Ativa chave geral das interrupcoes
  INTCON.GIE  = 1;
  //peripheral interrupts - como so importa IOC, melhor desabilitar
  //porque PWM gera interrupcao periferica
  INTCON.PEIE = 0;
  //Ativa chave Interrupt Enabled
  INTCON.INTE = 1;
  //interrupt on change
  IOCIE_bit    = 1;
  
  //pull ups porta b
  /*
   Para evitar flutuacao nos pinos quando se quer uma leitura digital (0  ou 1),
   os resistores de pull-up manter um sinal estavel no pino.
  */
  WPUB = 0xFF;

  INTCON.IOCIE = 1;
  INTCON.IOCIF = 0;
  IOCBF        = 0;

  while (1){

  }
}

Diversos recursos importantes estão dispostos nesse código. Nesse ponto ele só serve para testar as interrupções no dispositivo de moedas. Os sinais podem ser validados com um multímetro simples, mas nada como ver o processador reagindo dentro da normalidade, além de verificar se as conexões estão devidamente organizadas ou se há algo fora de ordem.

Confesso que não sou hábil para produzir videos, ainda mais explicativos, mas dessa vez o farei para mostrar os recursos de IOC, como a MCU se comporta em cada momento, o que está na mão do programador e o que é intrínseco da controladora.

Repare que o loop infinito (while) não contém nenhum código. O loop foi gerado apenas para manter o programa em execução. O que faz a tarefa é a implementação da função interrupt(), de forma que o programador tem pouco tratamento a fazer no código.

Polling é uma técnica de varredura, onde o programador se encarrega de verificar se houve mudanças. Será exemplificado para Arduino, mas apenas para aclarar, um exemplo seria a interrupção de um LDR constantemente iluminado por um LED. Então o programador verifica a cada X tempo se houve modificação no estado do LDR. Caso positivo, faz a varredura num conjunto de pinos.

Um outro exemplo poderia ser a mistura de ambos os recursos. Um receptor/emissor IR tratado com interrupção e caso ela aconteça, então faz-se uma varredura nos demais pinos. As possibilidades na programação são muitas e essas MCUs tem mais recursos do que podemos utilizar nesses projetos domésticos.

Controle do Servo motor do sensor de moedas

A liberação da moeda pode ser feita por um servo motor, apesar de utilizar um motor DC aqui. 

O servo tem 3 fios, sendo o Marrom, Vermelho e Laranja. Marrom é o terra, Vermelho 5v e o Laranja deverá ir para um pino PWM. No Arduino é bastante simples implementá-lo utilizando a biblioteca Servo.h, que manipula inclusive o prescaler da controladora (mas tudo isso em background, não se preocupe).

Em PIC não encontrei nada realmente útil e por sorte não precisei mexer com o prescaler nem nada mais além de um pino PWM. O código de exemplo para testar o servo no PIC:


unsigned short current_duty, old_duty, current_duty1, old_duty1;
sbit SERVO_GT at TRISA2_bit;
sbit SERVO_GP at RA2_bit;
void InitMain() {
  ANSELA  = 0;                         
  ANSELB = 0;
  C1ON_bit = 0;                       
  C2ON_bit = 0;

  PORTA = 255;
  TRISA = 255;     
  PORTB = 0;       
  TRISB = 0;       
                      SERVO_GT = 0;
                      SERVO_GP = 1;
  PWM3_Init(4000); 
  
}

void main() {
  InitMain();
  current_duty  = 0;                 

  PWM3_Start();                       
  PWM3_Set_Duty(current_duty);        
  

  while (1) {                      
    PWM3_Set_Duty(8);
    Delay_ms(100);
    PWM3_Set_Duty(178);
    Delay_ms(110);                      
  }
}

A palavra de ordem é "economia", e para tanto o servo motor pode ser substituído por um motor DC, desde que o conjunto mecânico proposto seja seguido. Se realmente não estiver pensando em economia e achar mais elegante minimizar o mecanismo, bastará um servo preso abaixo da plataforma que a moeda corre, permitindo ângulo suficiente para que a moeda possa cair após ser contabilizada.

Particularmente, além da economia achei bem mais interessante o projeto como proposto na foto, e o projeto está documentado da forma que aqui apresento.

Não precisa necessariamente ser um círculo de madeira com o diâmetro utilizado aqui, mas acredite ou não, isso foi sobra de madeira retirada de um furo. Até esse ponto já foram economizados 5 reais sobre os parafusos e 10 reais sobre o servo motor. Só isso já é quase um Arduino standalone e com certeza um PIC!

O video a seguir tem como objetivo mostrar apenas o funcionamento das interrupções com o código atual em PIC e com o código em Arduino. O sensor é exclusivamente a peça escura que aparece no vídeo do sensor de moedas, os demais itens são peças de protótipo para o projeto do cofrinho eletrônico, por isso ainda a apresentação está bastante feia.

E lá em cima citei o custo alto de um Arduino UNO ou Leonardo para os poucos recursos que possui. Você não economiza dinheiro, nem energia, nem processamento, nem espaço. Em compensação o código é simples assim:


int i,j,inversor;
int buttonState;

void blinking(int pinS){
   inversor = 0;
   for (j=0;j<i;j++){
     inversor = ~inversor;
     digitalWrite(8,inversor);
     delay(120);
   }
   digitalWrite(8,LOW);
}

void setup(){
 //pinos para leitura de estado
 for (i=3;i<8;i++){
   pinMode(i,OUTPUT);
 }
 //para fazer o blink
 pinMode(8,OUTPUT);
 buttonState = 0;
}

void loop(){
 for (i=3;i<8;i++){
   buttonState = digitalRead(i);
 if (buttonState){
   blinking(i);
   delay(1000);
   buttonState = 0;
 }
 buttonState = 0;
 }
}

O Vídeo, como não poderia faltar (acho que falei "interrupção" e "interrupções" umas 4.560 vezes, assista e ria):

Nos próximos posts será continuada a implementação de recursos como WDT, Sleep, gravação na EEPROM e qualquer outro que possa ser aplicado ao sensor de moedas.

Outros recursos serão aplicados como multiplexação para utilização de display de 2 ou 4 dígitos, sonorização com buzzer, mais truques de mecânica com madeira e alguns efeitos visuais para o cofre, que poderá ser vendido como um item de decoração.

Esse cofrinho também é atrativo utilizando-o de forma temática em época de festas para arrecadar alguns trocados, afinal é muito mais interessante do que uma caixa revestida com papel vermelho.

O projeto será finalizado no mês de Setembro de 2015, de forma que alunos de escolas estaduais, universitários e hobbistas possam fazê-lo de forma tão simples quanto possível, com material acessível em papelaria. 

Se gostou, não deixe de compartilhar; dê seu like no video e inscreva-se no nosso canal Manual do Maker Brasil no YouTube.

Próximo post a caminho!

Nome do Autor

Djames Suhanko

Autor do blog "Do bit Ao Byte / Manual do Maker".

Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.