Jak wysterować wyświetlacz 7-segmentowy za pomocą Arduino?

Wyświetlacz segmentowy to nic innego jak połączone ze sobą diody led. Każda dioda odpowiada jednemu segmentowi wyświetlacza (oznaczane najczęściej literami od A do G). Istnieją dwa rodzaje wyświetlaczy: ze wspólną anodą oraz ze wspólną katodą. Obrazuje to poniższy schemat.

W przypadku wspólnej anody, aby "wystartować" wyświetlacz należy do anody przyłożyć "plus", a następnie do każdego segmentu doprowadzić "minus". W przypadku wspólnej katody, do wspólnej końcówki przyłożyć "minus", a do odpowiedniego segmentu "plus".
Jeżeli posiadamy wyświetlacz z odzysku i nie wiemy jakiego rodzaju jest, najlepiej znaleźć dwie wspólne końcówki za pomocą miernika (każdy z 7-segmentowych ma 10 nóżek, z czego 2 są wspólne i jest to albo anoda albo katoda) i przyłożyć odpowiednie napięcie do jednej z nich oraz do dowolnej nóżki z pozostałych. Jeśli dany segment się nie zaświeci, należy odwrócić polaryzację.
Należy pamiętać o tym, że diody led są sterowane prądowo. Dlatego należy odpowiednio ograniczyć prąd płynący przez dany segment by zabezpieczyć wyjście cyfrowe Arduino. Wartość rezystora można dobrać z zależności (Uzas-Udiody)/Iseg. Dla Arduino i przykładowo czerwonej diody będzie to wartość (5V - 2V)/0.02A = 150Ω. Wartości Udiody i Iseg należy odczytać z not katalogowych. Iseg można ewentualnie zmierzyć amperomierzem. Aby zmniejszyć jasność danego segmentu należy dać większy rezystor.
Schemat połączeń przygotowany w środowisku fritzing:

Po tym krótkim wstępie możemy przejść do programowania naszej platformy. W pierwszym podejściu wykorzystam 7 wyjść cyfrowych. Będę nimi wysterowywał odpowiednie segmenty wyświetlacza. W pętli programu wyświetlana będzie "1" na zmianę z "2". Jest to aplikacja pod wyświetlacz ze wspólną anodą.
Kod:
Przy okazji tej aplikacji przetestowałem Serial Monitor w Arduino IDE. Wykorzystałem do tego celu następujące metody:

A tak wygląda Arduino z wyświetlaczem finalnie:

Powyższy kod aplikacji nie jest może zbyt elegancki, ale jego celem jest pokazanie sposobu zapalania poszczególnych segmentów. Niebawem usprawnienie kodu oraz dalsze zabawy z wyświetlaczami.
Aktualizacja - kosmetyka kodu:

Wyświetlacz segmentowy to nic innego jak połączone ze sobą diody led. Każda dioda odpowiada jednemu segmentowi wyświetlacza (oznaczane najczęściej literami od A do G). Istnieją dwa rodzaje wyświetlaczy: ze wspólną anodą oraz ze wspólną katodą. Obrazuje to poniższy schemat.

W przypadku wspólnej anody, aby "wystartować" wyświetlacz należy do anody przyłożyć "plus", a następnie do każdego segmentu doprowadzić "minus". W przypadku wspólnej katody, do wspólnej końcówki przyłożyć "minus", a do odpowiedniego segmentu "plus".
Jeżeli posiadamy wyświetlacz z odzysku i nie wiemy jakiego rodzaju jest, najlepiej znaleźć dwie wspólne końcówki za pomocą miernika (każdy z 7-segmentowych ma 10 nóżek, z czego 2 są wspólne i jest to albo anoda albo katoda) i przyłożyć odpowiednie napięcie do jednej z nich oraz do dowolnej nóżki z pozostałych. Jeśli dany segment się nie zaświeci, należy odwrócić polaryzację.
Należy pamiętać o tym, że diody led są sterowane prądowo. Dlatego należy odpowiednio ograniczyć prąd płynący przez dany segment by zabezpieczyć wyjście cyfrowe Arduino. Wartość rezystora można dobrać z zależności (Uzas-Udiody)/Iseg. Dla Arduino i przykładowo czerwonej diody będzie to wartość (5V - 2V)/0.02A = 150Ω. Wartości Udiody i Iseg należy odczytać z not katalogowych. Iseg można ewentualnie zmierzyć amperomierzem. Aby zmniejszyć jasność danego segmentu należy dać większy rezystor.
Schemat połączeń przygotowany w środowisku fritzing:

Po tym krótkim wstępie możemy przejść do programowania naszej platformy. W pierwszym podejściu wykorzystam 7 wyjść cyfrowych. Będę nimi wysterowywał odpowiednie segmenty wyświetlacza. W pętli programu wyświetlana będzie "1" na zmianę z "2". Jest to aplikacja pod wyświetlacz ze wspólną anodą.
Kod:
int pinA = 6;
int pinB = 7;
int pinC = 8;
int pinD = 9;
int pinE = 10;
int pinF = 11;
int pinG = 12;
int timer = 500;
void setup()
{
Serial.begin(9600);
pinMode(pinA, OUTPUT);
pinMode(pinB, OUTPUT);
pinMode(pinC, OUTPUT);
pinMode(pinD, OUTPUT);
pinMode(pinE, OUTPUT);
pinMode(pinF, OUTPUT);
pinMode(pinG, OUTPUT);
}
void loop()
{
digitalWrite(pinA, HIGH);
digitalWrite(pinB, LOW);
digitalWrite(pinC, LOW);
digitalWrite(pinD, HIGH);
digitalWrite(pinE, HIGH);
digitalWrite(pinF, HIGH);
digitalWrite(pinG, HIGH);
Serial.println("show 1");
delay(timer);
digitalWrite(pinA, LOW);
digitalWrite(pinB, LOW);
digitalWrite(pinC, HIGH);
digitalWrite(pinD, LOW);
digitalWrite(pinE, LOW);
digitalWrite(pinF, HIGH);
digitalWrite(pinG, LOW);
Serial.println("show 2");
delay(timer);
}
Przy okazji tej aplikacji przetestowałem Serial Monitor w Arduino IDE. Wykorzystałem do tego celu następujące metody:
Serial.begin(9600); //ustawnienie prędkości portu szeregowego na 9600 bodów
Serial.println("show 1"); //wyświetlenie komunikatu na konsoli

A tak wygląda Arduino z wyświetlaczem finalnie:

Powyższy kod aplikacji nie jest może zbyt elegancki, ale jego celem jest pokazanie sposobu zapalania poszczególnych segmentów. Niebawem usprawnienie kodu oraz dalsze zabawy z wyświetlaczami.
Aktualizacja - kosmetyka kodu:
int timer = 500;
int numbers[]={0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09,0x03};
void setup() {
for (int i=6;i<14 bitread="" delay="" digitalwrite="" displaynum="" for="" i="" int="" loop="" num="" numbers="" pinmode="" pre="" timer="" void="">
Kilka słów objaśnienia. Wyświetlacz zbudowany jest z segmentów A-G oraz kropki H.
--A--
| |
F B
| |
--G--
| |
E C
| |
--D-- H
Jak opisywałem wcześniej, dany segment zapalamy stanem niskim (dla wspólnej anody).
Cyfry można zakodować w taki sposób:
cyfra 1:
A B C D E F G H
1 0 0 1 1 1 1 1
heksadecymalnie jest to liczba 0x9F
cyfra 2:
A B C D E F G H
0 0 1 0 0 1 0 1
heksadecymalnie jest to liczba 0x25
Analogicznie należy postąpić z kolejnymi cyframi, jakie chcemy wyświetlać. W taki sposób zadeklarowałem tablicę cyfr. W głównej pętli programu w pętli for pobierane są po kolei elementy tablicy, które następnie są "dekodowane" na postać bitową za pomocą funkcji bitRead(). Każdy z bitów przypisywany jest odpowiedniemu segmentowi.
Wkrótce kolejne przygody z Arduino oraz wyświetlaczami.14>
Dlaczego nie można dać jednego rezystora na anodzie, tylko dajesz 7 rezystorów na każdej katodzie?
OdpowiedzUsuńJeden rezystor na anodzie wpłynie na pracę wyświetlacza. Może spowodować, że niektóre z segmentów będą świeciły z inną jasnością lub wcale.
UsuńPodłączenie jednego rezystora na anodzie spowoduje, że diody będą podłączone równolegle, a takie podłączenie nie jest zalecane.
Bardzo dobrze jest to opisane tutaj:
http://mikrokontrolery.blogspot.com/2011/03/Diody-LED-Zrodlo-pradowe-Laczenie-rownolegle.html
A tutaj fajnie zobrazowane:
http://electronics.stackexchange.com/questions/22291/why-exactly-cant-a-single-resistor-be-used-for-many-parallel-leds