terça-feira, maio 20, 2014

Examinando um Display de 7 Segmentos de 10cm de Altura

Eu já tinha visto de relance um destes displays na Santa Efigênia. Recentemente o meu amigo Luciano Ramalho comprou alguns para montar um painel para o seu Dojo Arduino e encontrou algumas dificuldades ao interfaceá-lo ao Arduino. Neste post documento as minhas experiências e apresento alguns circuitos para controle tanto da versão anodo comum como da versão catodo comum.


Analisando o Datasheet

Os datasheets dos displays podem ser vistos aqui.

As "Características Absolutas Máximas" nos trás uma informação importante: a máxima corrente direta (contínua) suportada pelos LEDs é de 30mA.

Nas "Características  Opto-elétricas" observamos que a tensão típica conduzindo (Vf) do LED vermelho é de 1.8V.

Um detalhe importante que pode passar desapercebido é o "Diagrama Elétrico Interno", ao lado das dimensões mecânicas. Neste diagrama é indicado que os segmentos possuem 5 LEDs em série e o ponto decimal um único LED. Isto é crucial. Com o segmento aceso, a tensão sobre os 5 LEDs será da ordem de 5*1.8 = 9.0V. Portanto não será possível acender um segmento diretamente a partir de uma saída digital de um microcontrolador operando a 5V (como o Arduino).

Primeiros Testes

O objetivo destes primeiros testes é confirmar que lemos corretamente o datasheet. Vamos tentar acender um segmento e o ponto decimal diretamente usando uma fonte. Para evitar danificar o display, vamos colocar um resistor de valor relativamente alto em série com o display. No meu caso usei uma fonte de 12V e um resistor de 1K (o que limita a corrente a um máximo de 12 mA mesmo com o display em curto).

Com um multímetro, conferi a tensão da fonte e medi a tensão sobre o display. O resultado confirmou que o segmento possui 5 LEDs, o ponto decimal apenas um; a tensão medida no LED foi exatamente os 1.8V ditos como típicos no datasheet.

Controlando pelo Catodo

Vamos começar pelo circuito mais simples, em que o anodo comum dos LEDs é ligado ao positivo da fonte e o catodo de cada segmento e ponto decimal é ligado a um resistor. Acendemos os LEDs ligando a outra extremidade o resistor ao negativo da fonte ("terra").

Supondo que queremos uma corrente de 20mA, o resistor de cada segmento deverá ser de (12-9)*1000/20 = 150 ohms. Já o resistor do ponto decimal deverá ser de (12-1.8)*1000/20 = 510 ohms.

Como fazer para ligar ao terra o resistor com um Arduino? Uma primeira ideia seria ligar o resistor diretamente a um pino do microcontrolador. O ATmega328 do Arduino suporta até 40mA por pino e 200mA no total. Com todos os LEDs acesos (pinos em nível baixo), teremos um corrente total de 160mA, o que está dentro das especificações (mas vai exigir uma boa dissipação de calor no microcontrolador). Entretanto, ao colocar a tensão de saída em nível alto (5V), não vamos conseguir apagar o ponto decimal; ele acenderá com uma corrente de (9-5-1.8)/510 = 4,3mA. O ideal é usarmos um transistor NPN, como o 2N2222:

Neste circuito, um nível alto no resistor de 1K fará o transistor conduzir, acendendo os LEDs. Um nível baixo  (ou se ficar em alta impedância) abrirá o circuito, apagando os LEDs.

Controlando pelo Anodo

O controle pelo anodo é um pouco mais complexo. Em primeiro lugar, ao invés de um transistor NPN precisamos usar um PNP. O controle deste transistor é o contrário do NPN: um nível baixo faz o transistor conduzir e um nível alto abrirá o circuito. Para complicar, neste contexto um nível alto é próximo à tensão da fonte do display (12V). Portanto não dá para ligar diretamente a base do transistor a uma saída do Arduino. A solução é colocar um transistor NPN na base do PNP, chegando ao nosso circuito final:



4 comentários:

OCoisa disse...

O ULN2003 faz bem esse tipo de trabalho. Parabens pelo blog.

Daniel Quadros disse...

Sim, o ULN2003 pode ser usado, mas somente para o controle por catodo.

Anônimo disse...

el 2n2907 mostrado en la imagen no es PNP, es NPN, la imagen de referencia esta mal

Daniel Quadros disse...

As fontes que eu consultei dizem que o 2N2907 é PNP: https://pt.wikipedia.org/wiki/2N2907, https://en.wikipedia.org/wiki/2N2907 e https://www.st.com/resource/en/datasheet/cd00003088.pdf (só para mencionar algumas). O 2N2907 é o complementar do 2N2222.