Framework Arduino II: Aula 10 Decodificador BCD

Imagem meramente ilustrativa


Recapitulando

    Na aula passada vimos como utilizar um Display de 7 segmentos como uma alternativa barata para ao Display LCD para dispositivos de saída de informação.

    Quando digo "barata" é porque na data em que estou fazendo este post (Nov/2024) os LCDs mais econômicos estão em uma faixa de preço que varia de 10 a 25 reais nas lojas nacionais, enquanto os displays de 7 segmentos são encontrados por 1,50 a 2 reais.

    No entanto, vimos também que ele demanda muitos pinos do Arduino e se fossemos utilizar dois displays para exibir números de dois dígitos, não teríamos pinagem suficiente. Uma alternativa seria a utilização de módulos que são vendidos já com dois displays e com componentes que reduzem a quantidade de pinos necessários para ligação.

    Hoje vamos conhecer alguns desses componentes e mostrar que é possível reduzir a quantidade de pinos necessários para o display de 7 segmentos e viabilizar sua utilização em projetos do Arduino Uno.

Módulo c/ 2 Displays de 7 segmentos que usa apenas 3 terminais
Módulo c/ 2 Displays de 7 segmentos que usa apenas 3 terminais

Conhecendo Decodificadores BCD

    Os decodificadores BCD são circuitos integrados que decodificam, isto é, traduzem do binário para o decimal (Binary-coded Decimal). Eles trabalham com entradas de quatro bits, mas geram saídas que permitem obter os números de 0 a 9 necessários em um display de sete segmentos. 

    Com isso conseguem reduzir o número de entradas necessárias para o obter o mesmo resultado. Ao invés de oito pinos do Arduino, podemos utilizar apenas quatro. Nesse processo geralmente temos a perda de alguns caracteres alfabéticos e do uso do ponto decimal.

    Essa redução de pinagem é possível, pois utilizam a seguinte tabela verdade:

Tabela verdade Decodificador BCD
Tabela verdade Decodificador BCD


    Esses componentes geralmente são estudados nas disciplinas de Eletrônica Digital dos cursos de Sistemas Embarcados quando se aborda Circuitos Integrados de tecnologia TTL e CMOS. A diferença básica entre eles é o tipo de transistor utilizado.

    No mercado geralmente encontramos dois CIs nessa categoria com encapsulamento Dip-16:

  • CI4511: que utilizam tecnologia CMOS e são recomendados para displays de cátodo comum
  • 74LS47: que utilizam tecnologia TTL e são recomendados para displays de anodo comum

    Apesar de diferentes aplicações, ambos utilizam a mesma pinagem, devendo o aluno seguir o mesmo raciocínio para ambos, porém em diferentes tipos de display.

Pinagem do Decodificador BCD

    Como o Wokwi não oferece um Decodificador BCD, utilizaremos o TinkerCAD que possui no seu catálogo o CD4511. Sendo assim, utilizaremos esse CI como exemplo de pinagem e utilizaremos a mesma nomenclatura do TinkerCAD para identificar os pinos para facilitar a vida do aluno.

    No entanto aconselho você a se acostumar com os termos mais utilizados na área para identificação dos pinos, isto é, VCC no lugar de potencia, GND no lugar de solo, Display Test ao invés de teste de lâmpada, Blanking ao invés de limpando e Latch Enable no lugar de Ativação de Trava.

Pinagem do CI4511 com a nomenclatura usada no TinkerCAD
Pinagem do CI4511 com a nomenclatura usada no TinkerCAD

    Com essa identificação fica fácil presumir que os pinos de A a G serão ligados nos respectivos pinos do display de 7 segmentos, passando antes por um resistor e as entradas de 1 a 4 serão ligadas a pinos do Arduino ajustados para saída. O potencia e o solo serão ligados no VCC e no GND, porém a grande dúvida paira sobre os outros pinos.

    O pino de "Teste de Lâmpada", como o nome diz, serve para testar todos os leds. Se vc fizer todas as conexões, mas deixar ele desconectado, isso acenderá todos os leds. No caso do pino "limpando", ele apaga todos os leds se ficar desconectado. 

  Eles se comportam assim quando desconectados, por possuírem um inversor de entrada. Sendo assim, esses pinos precisam estar ligados para o display funcionar normalmente.

    Já "ativação de trava" ou Latch Enable, quando ligada deixa registrado o último digito mostrado no display. Isso pode ser útil em projetos específicos, mas para a maioria dos casos, essa funcionalidade atrapalha. Para que isso não ocorra, ele precisa estar desligado.

    Por essas razões os pinos Lamp Test e Blanking devem ser conectados ao Vcc para sempre ficarem ligados durante a execução. Já o pino Latch Enable deverá ficar conectado ao GND para sempre ficar desligado.

Especificações

    Nas nossas pesquisas encontramos lojas oferecendo o CI4511 com uma grande variação nas tensões e correntes de trabalho. Alguns para 5 Volts, já outros aceitando de 2 a 18 Volts. Alguns trabalhando numa faixa de corrente de 10 a 20 mA. Por isso muita atenção aos datasheet antes de adquirir um produto.

A Montagem

    Estou disponibilizando uma montagem pronta no TinkerCad. Para acessá-la o aluno deverá ter um cadastro na plataforma ou utilizar sua conta Google. Ao abrir a tela de entrada clique em COPIAR E USAR para salvar uma cópia no seu perfil. 

Montagem no TinkerCad
Montagem no TinkerCad


     Link do TinkerCad: clique aqui

    Note que fiz as ligações dos pinos do CI4511 seguindo o que foi dito no tópico anterior. A montagem possui dois displays: um que será utilizado para a casa das dezenas dos números que serão exibidos e o outro para a casa das unidades.

    Deixei uma protoboard vazia para lhe propor um desafio: Insira potenciômetros nela para simular leituras de sensores e modifique o código para mostrar essas leituras no display. 

O Sketch

    Nesse Sketch eu defini constantes de acordo com os valores do pinos que seriam utilizado. Do pino 4 a a 7 eu tenho o decodificador para cuidar do display das dezenas e do pino 8 a 11 o decodificador para o display das unidades. A função setup apenas configura esses pinos como saída.

    Na função loop eu comecei declarando uma variável número e gerando para ela um valor aleatório com a função random(), mas eu sugiro que você coloque algum sensor ou potenciômetro simulando um sensor para gerar uma leitura numérica no lugar disso.

    Eu estou pegando esse número e passando para duas funções, uma para mostrar o digito das dezenas e outra para o dígito das unidades desse número. 

    Para pegar o digito das dezenas basta pegar a parte inteira da divisão desse número por 10. Já para pegar o digito das unidades, basta pegar o resto da divisão desse número por 10. Isso feito pelas duas funções criadas. Depois essas verificam qual dígito que é e chamam a respectiva função para mostrar o número. Aqui adotamos funções parecidas com as da aula passada para mostrar os números um, dois, três, etc no display. 

  1. //define pinagem dos displays de 7 seg
  2. //dezenas
  3. #define PinoA0 4
  4. #define PinoA1 5
  5. #define PinoA2 6
  6. #define PinoA3 7
  7. //unidades
  8. #define PinoB0 8
  9. #define PinoB1 9
  10. #define PinoB2 10
  11. #define PinoB3 11

  12. void setup()
  13. {
  14.   //display 7 seg
  15.   //Define os pinos como saida
  16.   pinMode(PinoA0, OUTPUT);
  17.   pinMode(PinoA1, OUTPUT);
  18.   pinMode(PinoA2, OUTPUT);
  19.   pinMode(PinoA3, OUTPUT);

  20.   pinMode(PinoB0, OUTPUT);
  21.   pinMode(PinoB1, OUTPUT);
  22.   pinMode(PinoB2, OUTPUT);
  23.   pinMode(PinoB3, OUTPUT);

  24. }

  25. void loop()
  26. {
  27.   int numero=random(100);
  28.   Dezenas(PinoA0,PinoA1,PinoA2,PinoA3,numero);
  29.   Unidades(PinoB0,PinoB1,PinoB2,PinoB3,numero);
  30.   delay(1000);
  31. }
  32. void Unidades(int p0, int p1, int p2, int p3, int valor)
  33. {
  34.   int digito= 0;
  35.   digito=valor%10;
  36.   if (digito==0) {
  37.     Zero(p0,p1,p2,p3);
  38.   }
  39.   if (digito==1) {
  40.     Hum(p0,p1,p2,p3);
  41.   }
  42.   if (digito==2) {
  43.     Dois(p0,p1,p2,p3);
  44.   }
  45.   if (digito==3) {
  46.     Tres(p0,p1,p2,p3);
  47.   }
  48.   if (digito==4) {
  49.     Quatro(p0,p1,p2,p3);
  50.   }
  51.   if (digito==5) {
  52.     Cinco(p0,p1,p2,p3);
  53.   }
  54.   if (digito==6) {
  55.     Seis(p0,p1,p2,p3);
  56.   }
  57.   if (digito==7) {
  58.     Sete(p0,p1,p2,p3);
  59.   }
  60.   if (digito==8) {
  61.     Oito(p0,p1,p2,p3);
  62.   }
  63.   if (digito==9) {
  64.     Nove(p0,p1,p2,p3);
  65.   }

  66. }
  67. void Dezenas(int p0, int p1, int p2, int p3, int valor)
  68. {
  69.   int digito= 0;
  70.   digito=valor/10;
  71.   if (digito==0) {
  72.     Zero(p0,p1,p2,p3);
  73.   }
  74.   if (digito==1) {
  75.     Hum(p0,p1,p2,p3);
  76.   }
  77.   if (digito==2) {
  78.     Dois(p0,p1,p2,p3);
  79.   }
  80.   if (digito==3) {
  81.     Tres(p0,p1,p2,p3);
  82.   }
  83.   if (digito==4) {
  84.     Quatro(p0,p1,p2,p3);
  85.   }
  86.   if (digito==5) {
  87.     Cinco(p0,p1,p2,p3);
  88.   }
  89.   if (digito==6) {
  90.     Seis(p0,p1,p2,p3);
  91.   }
  92.   if (digito==7) {
  93.     Sete(p0,p1,p2,p3);
  94.   }
  95.   if (digito==8) {
  96.     Oito(p0,p1,p2,p3);
  97.   }
  98.   if (digito==9) {
  99.     Nove(p0,p1,p2,p3);
  100.   }

  101. }
  102. void Zero(int pin0, int pin1, int pin2, int pin3)
  103. {
  104.   
  105.   digitalWrite(pin0, LOW);
  106.   digitalWrite(pin1, LOW);
  107.   digitalWrite(pin2, LOW);
  108.   digitalWrite(pin3, LOW);
  109.   
  110. }
  111. void Hum(int pin0, int pin1, int pin2, int pin3)
  112. {
  113.   
  114.   digitalWrite(pin0, HIGH);
  115.   digitalWrite(pin1, LOW);
  116.   digitalWrite(pin2, LOW);
  117.   digitalWrite(pin3, LOW);
  118.   
  119. }
  120. void Dois(int pin0, int pin1, int pin2, int pin3)
  121. {
  122.   
  123.   digitalWrite(pin0, LOW);
  124.   digitalWrite(pin1, HIGH);
  125.   digitalWrite(pin2, LOW);
  126.   digitalWrite(pin3, LOW);
  127.   
  128. }
  129. void Tres(int pin0, int pin1, int pin2, int pin3)
  130. {
  131.   
  132.   digitalWrite(pin0, HIGH);
  133.   digitalWrite(pin1, HIGH);
  134.   digitalWrite(pin2, LOW);
  135.   digitalWrite(pin3, LOW);
  136.   
  137. }
  138. void Quatro(int pin0, int pin1, int pin2, int pin3)
  139. {
  140.   
  141.   digitalWrite(pin0, LOW);
  142.   digitalWrite(pin1, LOW);
  143.   digitalWrite(pin2, HIGH);
  144.   digitalWrite(pin3, LOW); 
  145.   
  146. }
  147. void Cinco(int pin0, int pin1, int pin2, int pin3)
  148. {
  149.   
  150.   digitalWrite(pin0, HIGH);
  151.   digitalWrite(pin1, LOW);
  152.   digitalWrite(pin2, HIGH);
  153.   digitalWrite(pin3, LOW);  
  154.   
  155. }
  156. void Seis(int pin0, int pin1, int pin2, int pin3)
  157. {
  158.   
  159.   digitalWrite(pin0, LOW);
  160.   digitalWrite(pin1, HIGH);
  161.   digitalWrite(pin2, HIGH);
  162.   digitalWrite(pin3, LOW);  
  163.   
  164. }
  165. void Sete(int pin0, int pin1, int pin2, int pin3)
  166. {
  167.   
  168.   digitalWrite(pin0, HIGH);
  169.   digitalWrite(pin1, HIGH);
  170.   digitalWrite(pin2, HIGH);
  171.   digitalWrite(pin3, LOW);  
  172.   
  173. }
  174. void Oito(int pin0, int pin1, int pin2, int pin3)
  175. {

  176.   digitalWrite(pin0, LOW);
  177.   digitalWrite(pin1, LOW);
  178.   digitalWrite(pin2, LOW);
  179.   digitalWrite(pin3, HIGH);  
  180.   
  181. }
  182. void Nove(int pin0, int pin1, int pin2, int pin3)
  183. {

  184.   digitalWrite(pin0, HIGH);
  185.   digitalWrite(pin1, LOW);
  186.   digitalWrite(pin2, LOW);
  187.   digitalWrite(pin3, HIGH);  
  188.   
  189. }
  190. void Limpa(int pin0, int pin1, int pin2, int pin3)
  191. {
  192.   
  193.   digitalWrite(pin0, HIGH);
  194.   digitalWrite(pin1, HIGH);
  195.   digitalWrite(pin2, HIGH);
  196.   digitalWrite(pin3, HIGH);  
  197.   
  198. }

    Você deve ter reparado que, apesar de usar dois displays de 7 segmentos ainda sobrou bastante pino livre no Arduino para fazer o seu projeto. No entanto, com muitas conexões é importante você pensar em fontes alternativas de alimentação no seu projeto físico. Só o cabo USB ligado ao computador pode não dar conta.

    Eu lhe propus o desafio de implementar alguns sensores nesse projeto e mostrar as leituras no display, mas se você estiver perdido clique aqui para ver um exemplo. 

    Na próxima aula veremos mais uma alternativa em termos de display.

Próxima Aula                                                                                                                        Aula Anterior

Referências

ARDUINO E CIA. Decodificador CD4511 com Arduino e display 7 segmentos. Disponível em <https://www.arduinoecia.com.br/como-usar-decodificador-cd4511-arduino-display-7-segmentos> Acesso em 07 nov 2024.

EMBARCADOS. Aprenda a usar o CD4511: Circuito decodificador para Display de 7 Segmentos. Disponível em <https://embarcados.com.br/cd4511-decodificador-display-7-segmentos/> Acesso em 07 nov 2024.

DRIVER BCD PARA SETE SEGMENTOS. In: WIKIPÉDIA, a enciclopédia livre. Flórida: Wikimedia Foundation, 2024. Disponível em: <https://pt.wikipedia.org/w/index.php?title=Driver_BCD_para_sete_segmentos&oldid=68303625>. Acesso em: 07 nov. 2024.

LISTA DOS CIRCUITOS INTEGRADOS DA SÉRIE 7400. In: WIKIPÉDIA, a enciclopédia livre. Flórida: Wikimedia Foundation, 2022. Disponível em: <https://pt.wikipedia.org/w/index.php?title=Lista_dos_circuitos_integrados_da_s%C3%A9rie_7400&oldid=64284779>. Acesso em: 07 nov. 2024.

LÓGICA TRANSISTOR-TRANSISTOR. In: WIKIPÉDIA, a enciclopédia livre. Flórida: Wikimedia Foundation, 2024. Disponível em: <https://pt.wikipedia.org/w/index.php?title=L%C3%B3gica_transistor-transistor&oldid=68407003>. Acesso em: 07 nov. 2024.

MAKER HERO. 74LS47 CI Decodificador 7 Segmentos. Disponível em <https://www.makerhero.com/produto/74ls47-ci-decodificador-7-segmentos/> Acesso em 07 nov 2024.

MAKER HERO. CD4511 CI Decodificador. Disponível em <https://www.makerhero.com/produto/ci-decodificador-cd4511/> Acesso em 07 nov 2024.