sterowanie 7-segmentowym wyświetlaczem

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:

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.

Komentarze

  1. Dlaczego nie można dać jednego rezystora na anodzie, tylko dajesz 7 rezystorów na każdej katodzie?

    OdpowiedzUsuń
    Odpowiedzi
    1. 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.
      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

      Usuń

Prześlij komentarz