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-- HJak opisywałem wcześniej, dany segment zapalamy stanem niskim (dla wspólnej anody). Cyfry można zakodować w taki sposób: cyfra 1:heksadecymalnie jest to liczba 0x9F cyfra 2:A B C D E F G H 1 0 0 1 1 1 1 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>A B C D E F G H 0 0 1 0 0 1 0 1
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