Cessna 172 cockpit otthon

Építsünk szimulátort

Többszámjegyes, 7 szegmenses LED, arduinóval vezérelve

2019. június 03. - C172Peti

Az épülő szimulátorban több helyen is szükség lesz 7 szegmenses LED kijelzők használatára. Amíg csak egy számjegyünk van, addig elég egyszerű a vezérlése, minden szegmenst külön ledként kezelve megjelenítjük a kívánt értéket. Amikor már több számjegy megjelenítésére alkalmas a kijelzőnk, akkor ügyeskedni kell egy picit. Rövid utánanézés és egy remek arduino library találása után ez meglepően egyszerű feladat.

arduino_7_segment_3_digit_led.jpg

De nézzük is hogyan működik egy többdigites LED kijelző. 

led7segment3digitschematic.jpg

forrás: https://e-radionica.com/productdata/LD3361BS.pdf

Bekötés szempontjából kétféle létezik: az egyik, amikor a ledek anódja van egy közös lábra kivezetve (common anode) a másik amikor a katódjukkal teszik mindezt (common cathode). Az előbbi ábra egy közös anódos 3 digites 7 szegmenses (+ a pont) kijelző adatait tartalmazza.

Ami látszik belőle, hogy a szegmensek (LED) katódjai vannak kivezetve külön lábakra, viszont mindhárom számjegyhez ugyanazokat a lábakat használja (A:11, B:7, stb...). A digitenkénti közös anódok természetesen külön lábakon vannak (12, 9, 8).

A vezérlése tehát úgy történhet, hogy megjeleníteni kívánt szegmens katódjait földeljük, majd a kívánt digit anód lábát megemeljük pozitív feszültségre. Ugye ilyenkor egy számjegyet jelenítünk csak meg. Ha a többi digit anód lábát is felemeljük pozitívra, akkor mindhárom számjegyen ugyanaz fog megjelenni.

Itt tehát a folyamatos megjelenítésre már nincs lehetőség, át kell verni az ember szemét. Erre két féle megoldás létezik. Az egyik az, amikor egyszerre csak egy szegmenst villantunk fel. Ahogy a LED felvillan, ki is kapcsoljuk és megjelenítjük a következő szegmenst. Ahogy egy számjegy szegmenseivel végeztük lépünk a következőre... majd kezdjük elölről az egészet. Mindezt olyan gyorsan, hogy az emberi szem ne vegyen észre belőle villogást és akkor folyamatosnak fog tűnni. Ehhez a megoldáshoz az alábbi bekötés javasolt:

arduino_7segmentled_resistorsonanode.jpg

A 12, 9 és 8-as lábak a kijelzőn a 3 digit anódjai. Ilyenkor elegendő ide rakni egy ellenállást, mivel egyszerre mindig csak egy LED fog világítani.

A megjelenítést gyorsabbá tehetjük, ha nem szegmensenként, hanem digitenként villantjuk fel a ledeket. Ilyenkor először beállítjuk (földeljük) a megjeleníteni kívánt szegmens lábakat és csak ezután adunk az anódra pozitív jelet. Ehhez azonban feltétlen szükséges, hogy berakjunk egy ellenállást minden szegmens elé, hogy a ledek bizonyosan azonos fényerővel világítsanak. Ilyenkor természetesen az anódokat már közvetlenül köthetjük az arduinóra, valahogy így:

arduino_7segmentled_resistorsonsegments.jpg

Innen már csak egy lépés, hogy több kijelzőt, vagy több digites kijelzőt használjunk. A lényeg, hogy az ellenállások után a többi kijelző szegmenseit kössük rá ugyanúgy mint az elsőét, az anódokat pedig vezessük vissza egy arduino lábra.

Nincs más hátra, mint kódolni. Találtam egy remek arduino library-t ehhez(SevSeg), így a vezérlés gyerekjáték.

Az alábbi kóddal két darab 3 digites kijelzőt vezérlek (a második kijelzőből csak az első digitet használtam. Ez a kód nem a fenti bekötéshez készült, mindjárt részletezem mire figyeljünk ha copy/paste akarjuk kipróbálni.

 

#include "SevSeg.h"
#include <stdio.h>
SevSeg sevseg;
int displayValue;

char* strToLed = new char[8];

void setup() {
  byte numDigits = 4;
  byte digitPins[] = { 10, 11, 12, 13 };
  byte segmentPins[] = {9, 2, 3, 5, 6, 8, 7, 4};
  bool resistorsOnSegments = false;
  byte hardwareConfig = COMMON_ANODE;
  delay(2000);

  sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments);

}

void loop() {
  displayValue = analogRead(A0);
  sprintf(strToLed, "%04d.", displayValue );
  sevseg.setChars(strToLed);
  sevseg.refreshDisplay();
  delay(2);
}

A setup() -ban a configuráljuk a könyvtárat, hogy milyen kijelzőt használunk (sevseg.begin(.... ), a következő paraméterekkel:

  byte hardwareConfig = COMMON_ANODE;

Itt mondjuk meg, hogy a katód vagy az anód közös (COMMON_ANODE / COMMON_CATHODE).

  byte numDigits = 4;

Hány digitet akarunk kijelezni. Ez a könyvtár 7 szegmenses kijelzőket tud kezelni, plusz a pontot hozzá.

  byte digitPins[] = { 10, 11, 12, 13 };

Itt adjuk meg, az arduino melyik lábaira vannak kötve a közös anódok. (A fenti bekötés szerint ez 10, 11, 12 lenne).

  byte segmentPins[] = {9, 2, 3, 5, 6, 8, 7, 4};

Az arduino mely lábaira vannak a szegmensek bekötve (A-G -ig és a pont, a fenti rajz szerint ez 7, 9, 3, 5, 6, 8, 2, 4 lenne).

  bool resistorsOnSegments = false;

Megadjuk, hogy a szemgensekre vannak kötve az ellenállások, vagy nem (hanem a közös lábakra). Ennek megfelelően vagy digitenként, vagy szegmensenként fog a megjelenítéssel pörögni a program.

A loop() -ban mindösszesen annyit teszek, hogy beolvasom a potméter állását (0-1023 közötti számot kapok), az beletolom egy karakterláncba úgy, hogy 0-val előtöltve mindig 4 számjegy legyen és a végére teszek egy pontot (az utolsó digit után világítani fog a pont is, ahogy az a legelső képen, illetve a lenti videóban látható).

sevseg.setChars(strToLed);

Ezzel állítjuk be, milyen számokat akarunk megjeleníteni.

  sevseg.refreshDisplay();

A refreshDisplay segítségével pedig végrehajt egy megjelenítési ciklust.

Érdekességképpen beletettem még a ciklus végére egy 2ms várakozást, játszottam picit vele, hogy mennyit bír az emberi szem, mikortól látom, hogy vibrál a kijelző. 4-5ms 6 digit esetén már észrevehető, sőt egy idő után zavaró tud lenni. Úgyhogy az az arduino board, amelyik sok ilyen led kijelzőt vezérel egyszerre, jobb ha nem csinál semi mást, mert nagyon gyorsan elfogy 2ms :)

Itt egy kis videó is a fent leírtakról. Újdonság nincs benne,  ami érdekes lehet, hogy az elején láthatjátok működés közben is:

 Jöhetnek az adatok a szimulátortól, és lehet azokat megjeleníteni most már :)

***UPDATE***

Úgy néz ki a szimulátorhoz ez a megoldás nem használható, mivel 8-10 digit fölött már elkezd zavaróan villogni, ha a ciklusban bennmarad a 2ms várakozás. Ennyi idő pedig kell majd a boardnak, hogy lekérje a szimulátortól az adatokat. Más megoldást kell találni. Kaptam egy tippet, miszerint MAX7221 IC-t kellene használnom a ledek vezértléséhez. Remek ötletnek tűnik, jövök majd vele, ahogy van eredmény.

 

 

 

 

 

 

 

A bejegyzés trackback címe:

https://repszim.blog.hu/api/trackback/id/tr7814876492

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Könyveslány 2019.06.04. 13:56:29

Igazán érdekes, ahogy lépésről-lépésre látjuk megvalósulni a célt. Ügyes vagy és köszi a dokumentálást! Sok sikert!

C172Peti · http://repszim.blog.hu 2019.06.04. 22:45:03

@Könyveslány: köszi a bíztatást, igazán jólesik

kpetya 2019.06.05. 10:29:00

Arra figyelj, hogy a max7219/7221 az közös katódos vezérlő.
Ha tudsz angolul javaslom ezt:
forum.allaboutcircuits.com/threads/max7219-common-anode.95545/
embedded-lab.com/blog/wp-content/uploads/2013/07/ControlCircuit.jpg

Az IC4-IC6 felcserélésével közön anódos kijelzőhöz való vezérlőt kapsz. Én mind a kettőt megépítettem és müködik.

kpetya 2019.06.05. 11:05:43

még 1, maple mini-t ismered?

C172Peti · http://repszim.blog.hu 2019.06.05. 17:48:03

@kpetya: köszi! Megnéztem őket, azt hiszem egyszerűbb lesz nekem common cathode-ra cserélni a kijelzőket első körben :) Olvastam egy másik cikket amúgy még a common anode megoldásra, ott a led mátrixot fordították át és program logikával oldották meg. Az is egész ügyes megoldás volt (a közös lábakra kötötték a szegmenseket, a szegmenslábakra meg a digiteket).

C172Peti · http://repszim.blog.hu 2019.06.05. 17:48:37

@kpetya: maple minit nem próbáltam még, ha jól látom ez is egy arduinohoz hasonló board?

csúti csüngőhasú tolvaj 2019.06.05. 20:26:39

Mindenki bele van pistulva ebbe a nyüves multiplex vezérlésbe aztán nyavalyog, hogy villog, a tárolós kijelzőket meg kiirtották a piacról. Azzal bőven elég volt csak a változást kiírni.

C172Peti · http://repszim.blog.hu 2019.06.05. 21:35:36

@csúti csüngőhasú tolvaj: a tárolós kijelzőket nem ismertem/ismerem sajnos. Viszont ha az nem villogtatja, hanem folyamatosan világít, akkor 30 digitnél 210 led világít egyszerre. Az több, mint 1A (1k ellenállásokkal). Ehelyett viszont néhány 10 miliamperrel megoldható az egész.

csúti csüngőhasú tolvaj 2019.06.06. 07:21:06

@C172Peti:

Ez így van, takarékossági szempontból biztos jobb. Mondjuk ezért vannak 1 milliamperes kijelzők, akkor multiplexnél még ellenállás sem kell, újabb 8 forint spór a millás buliban. Valamit valamiért, a villogást ki lehet küszöbölni, a tápot meg eleve feljebb kell lőni, nem néhány 10 milliamperen kell, hogy múljon ...
Mondjuk azért ha 30 kijelző 210 ledje egyszerre világít, akkor minek a kijelző, leolvasni semmit nem lehet róla.