Utilizare afișaj multiplexat cu 7 segmente cu Arduino

 Autor:   Publicat pe:   Actualizat pe:  2018-12-14T20:48:35Z

Conectarea unui afișaj cu 7 segmente la Arduino. Moduri de acționare a segmentelor și cifrelor utilizând mediul de programare Arduino

Afișajele cu 7 segmente sunt utilizate pe scară largă la ceasuri, aparate de măsură și alte dispozitive care afișează informații numerice. Segmentele afișajului, care sunt de cele mai multe ori formate din LED-uri, sunt aprinse coordonat în diverse combinații ce reprezintă numere arabe. Afișajele cu 7 segmente sunt cel mai ușor de procurat, fiind și mai ieftine în comparație cu alte tipuri.

În articolul anterior am arătat cum se conectează un astfel de display la un microcontroller (MCU). Pe scurt, un afișajul necesită rezistoare limitatoare de curent pe LED-urile aferente segmentelor și drivere cu tranzistori pe liniile comune unei cifre. În articolul prezent, voi identifica pinii unui display, îl voi conecta la o placă Arduino pe breadboard și voi scrie codul pentru afișarea de valori numerice.

Utilizare afișaj multiplexat cu 7 segmente cu Arduino

Afișajul pe care îl dețin provine din panoul frontal al unui set-top-box și are 12 pini pe un singur rând. Alte afișaje similare au pinii dispuși pe două rânduri. Pentru a identifica pinii aferenți fiecărui segment și cifră am folosit o sursă de alimentare de 5V pe care am pus un rezistor de 330 ohmi. Acum, chiar dacă aș scurtcircuita din greșeală firele de test, curentul prin rezistor ar fi suficient de mic încât să nu producă probleme. La fel de important este și faptul că pot alimenta fără probleme orice LED.

Verificarea segmentelor afișajului și numerotarea acestora

Verificarea segmentelor afișajului și numerotarea acestora

Dacă vrei să identifici pinii unui astfel de display, procedează în felul următor: atinge unul din firele de alimentare de un pin al display-ului și ține-l pe acel pin. Testează cu celălalt restul pinilor, unul câte unul. S-ar putea să nu se aprindă niciun segment. Inversează firele de alimentare și repetă. Dacă tot nu se aprinde nimic, fie ții firul pe un pin suplimentar, neconectat, fie display-ul nu funcționează. Când reușești să aprinzi segmente, vei observa, la mutarea firului pe alt pin, că se respectă un model.

Mutând firul de pe un pin pe altul, se aprinde același segment dar de la cifre diferite. Asta înseamnă că firul pe care îl muți a atins pini comuni (D1... D4), iar cel pe care îl ții pe loc stă pe pinul segmentului care se aprinde (de la A la G, sau DP - conform notațiilor din schemele din articolul anterior). Dacă firul pe care l-ai ținut pe loc este masa, ai un display anod comun.

Poți avea norocul să nimerești cu firul pe care îl ții pe loc un pin comun. În acest caz, când îl atingi pe celălalt de restul pinilor, vei observa că se aprind segmente diferite de la aceeași cifră. Vor exist și 3 pini care nu aprind nimic. Aceia sunt restul pinilor comuni.

Am descoperit că am un afișaj cu anod comun. Deci aveam nevoie de tranzistoare PNP la realizarea driver-ului de cifre. O altă diferență este că display-ul meu nu are punct zecimal funcțional, doar două puncte după primele două cifre, cum au ceasurile. Acest puncte aparțin de cifra a 2-a și a 3-a. Am realizat conexiunile pe placa de test breadboard urmând schema din articolul precedent (cu 8 rezistoare pentru limitarea curentului prin segmente, 4 tranzistoare 2N3906 și 4 rezistoare pentru limitarea curentului în baza tranzistoarelor).

Pinii display-ului folosit de mine

Pinii display-ului folosit de mine

Codul nu este foarte dificil. Se acționează o cifră și apoi se setează segmentele. Se face acest lucru pe rând cu toate cele 4 cifre, în succesiune foarte rapidă, astfel încât să pară că toate sunt aprinse. Din ce am observat, frecvențe mai mari de 200 Hz produc efectul vizual de aprindere a tuturor cifrelor. O singură cifră stă aprinsă doar un sfert din timp.

Exemplul de cod Arduino pentru cifra 5 arată cam așa:

digitalWrite(SEG_A, LED_ON);
digitalWrite(SEG_B, LED_OFF);
digitalWrite(SEG_C, LED_ON);
digitalWrite(SEG_D, LED_ON);
digitalWrite(SEG_E, LED_OFF);
digitalWrite(SEG_F, LED_ON);
digitalWrite(SEG_G, LED_ON);

Este destul de simplu, dar există o metodă și mai bună: setarea stării pinilor prin scrierea directă a registrului aferent portului. Este metoda de elecție, dar nu pentru Arduino pe platforma ATmega328. Acesta nu expune pentru uz general toți pinii unui port. Pinii de la D2 la D7 fac parte din portul D, dar ceilalți doi pini ai portului D sunt interfața serială. Dacă vei folosi o placă Arduino Pro (Mini), la care nu vei folosi portul serial decât pentru programare, poți seta segmentele prin această metodă care implică atribuirea unui număr de 8 biți fiecărei cifre de afișat. Biții acelui număr indică starea segmentelor, după cum poți vedea pe Wikipedia. Iată cât de mult se simplifică afișarea cifrei 5:

PORTD = 0x6D;

Un singur rând de cod face că făceau alte 7. O altă metodă pentru simplificarea codului este să conectezi display-ul la pini consecutivi. Astfel, poți folosi bucle pentru setarea stării pinilor.

byte digits[10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
for (byte i = 0; i < 7; i++)
  digitalWrite(SEG_A + i, bitRead(digits[digit], i) ? LED_ON : LED_OFF);

Bibliotecile Arduino pentru afișaje cu 7 segmente nu au dat rezultate prea bune, așa că am scris codul fără a utiliza vreuna. Am adăugat un potențiometru pe pinul A0. Schița ajustează frecvența de aprindere a cifrelor în funcție de acest potențiometru între 1 și 250 milisecunde. Dacă frecvența este prea mică, poți vedea fiecare cifră cum se aprinde pe rând. Dacă frecvența este prea mare, MCU-ul nu poate actualiza segmentele suficient de repede și efectul de ghosting va apărea (segmentele persistă aprinse), după cum poți vedea în acest video. Schița completă este 7segment_arduino_with_potentiometer. Actualizarea cifrelor se poate face și printr-o întrerupere generată de un timer. În schița 7segment_arduino_with_timer am folosit timer-ul 2 pentru a actualiza cifrele la 4,8 milisecunde. Utilizarea întreruperii nu necesită cod pentru actualizare în secțiunea main(), deci afișarea nu va fi afectată de eventualele apeluri către funcția delay(). Schița pentru display conectat la pini consecutivi este 7segment_arduino_ordered_pins.

Totuși, cele mai bune rezultate le-am obținut cu schița 7segment_arduino_with_potentiometer, după ordonarea cu atenție a operațiilor de oprire/pornire a cifrelor și segmenelor. În secvența de activare a unei cifre, opresc mai întâi celelalte 3 cifre, apoi setez segmentele și în cele din urmă activez cifra. Astfel, fenomenul de ghosting a fost redus la minim. Recomand această schiță ca punct de plecare pentru un proiect ce folosește un astfel de display. Schița este compatibilă și cu cele tip catod comun, dacă inversezi definițiile LED_ON și LED_OFF.

Niciun comentariu :

Trimiteți un comentariu

Vă recomandăm să citiți regulamentul comentariilor înainte de a scrie un comentariu.