Cessna 172 cockpit otthon

Építsünk szimulátort

LED vezérlés: MAX7221 + Arduino

2019. augusztus 06. - C172Peti

Az épülő szimulátornál jópár számjegyet kell megjeleníteni 7 szegmenses LED kijelzővel. Próbálkoztam korábban arduinóval vezérelni őket, majd kaptam a tippet, hogy miért is nem használok MAX7221 IC-ket hozzá?

max7221.jpg

Gyorsan kiderült, hogy közös anódos kijelzőim vannak, ami a MAX7221-el nem, vagy csak igen körülményes úton vezérelhetőek. Elmélyedve a témában, simán megérte a zsáknyi közös anódos kijelzőimet félrerakni és rendelni közös katódosokat belőle. A MAX7221 által nyújtott kényelem és teljesítmény kárpótol mindenért.

Röviden pár szó az IC-ről. 8 darab 7 (+1) szegmenses kijelzőt képes vezérelni egy IC. Az adatokat SPI-n tolhatjuk bele (soros kommunikáció), az IC pedig cserébe multiplexeli a szegmensek között. Vezérlés szempontjából teljesen mindegy, hogy több darab egy digites, vagy több digites kijelzőt használunk. Érdemes megjegyezni, hogy ez a remek tulajdonsága, hogy 8 digitet tud egyszerre kezelni, kényelmes lehetőséget biztosít arra, hogy egyetlen IC-vel akár egy 8x8-as LED mátrixot is vezérljünk, amire az adatlapján példát is találunk.

max7221_pin_configuration.jpg

A lábkiosztás és az alap áramköri séma egyszerű, könnyen értelmezhető/össze rakható. Igazából egy dologra érdemes figyelni: az áramkorlátozó ellenállásra, ami a fenti ábrán 9.53kOhm. Az adatlap szerint ez a minimális érték, a tapasztalat nekem azt mutatta, hogy 22k ellenállással működött rendesen. Ennél kisebbnél néha lezárt az IC és nem volt hajlandó tovább működni (tönkre nem ment ugyan, de áramtalanításra volt szükség, hogy újra végezze a dolgát).

Van még egy rendkívül hasznos tulajdonsága ennek az IC-nek: sorba köthetőek. Így gyorsan kitágul a világ és néhány IC-t sorbakötve néhányszor nyolc digit válik vezérelhetővé.

Gondoltam ki is próbálom, 11 digit kijelzésére az alábbi áramkört raktam össze

max7221_schematic.jpg

Itt két MAX7221 IC-t látunk sorbakötve, az első 8 a második 3 digitet vezérel. Az arduino boardról 3 lábat használok, a CLK, LOAD(CS) és DataInput-hoz.

A vezérléshez a LedControl arduino könyvtárat használtam, megtalálod itt: http://wayoda.github.io/LedControl/index.html

Nem csak az API leírása pazar, hanem részletes útmutatást ad az áramkör felépítéséhez is. Van pár példaprogram LED mátrix és 8 szegmenses LED kijelzők vezérléséhez is. Érdemes megjegyezni, hogy az itt található áramkörökben a zajok szűrésére használ két kondenzátort. Én ezt nem pakoltam bele az áramköreimbe, nem észleltem problémát, pedig egyszerű breadboardokon pakoltam össze mindent, ami nem a stabil kontaktról híres. Valószínűleg ha az arduino board messzebb van az IC-ktől, akkor hosszabb kábelek már összeszedhetnek annyi zajt, ami gondot okozhat az üzemelésben és megéri a kondikat berakni az áramkörbe.

Röviden a teszt programom, amit használtam a lenti videóban:

#include "LedControl.h"
/* Now we need a LedControl to work with. 

***** These pin numbers will probably not work with your hardware ***** 

pin 2 is connected to the DataIn  

pin 3 is connected to the CLK  

pin 4 is connected to LOAD  

we have two MAX7221 */

LedControl lc=LedControl(2,3,4,2);

A LedControl inicializálásához 4 paraméter kell megadni. Ezek rendre: DataIn, CLK, LOAD lábak (digitális outputként lesznek használva). Negyedik paraméterként pedig meg kell mondanunk, hogy hány IC van sorbakötve. A könyvtár 8 IC-t kezel egy sorban. Ha ennél többet szeretnénk vezérelni egy boardról, az is megtehető, ekkor viszont "indítanunk kell egy új sort", azaz inicializálunk egy másik változót és újabb 3 arduino lábat jelölünk ki a vezérléshez.

void setup() {
  /*
  The MAX72XX is in power-saving mode on startup,
  we have to do a wakeup call
  */
  lc.shutdown(0,false);
  lc.shutdown(1,false);
  /* Set the brightness to a medium values */
  lc.setIntensity(0,1);
  lc.setIntensity(1,1);
  /* and clear the display */
  lc.clearDisplay(0);
  lc.clearDisplay(1);
}

Amikor az IC-k feszültés alá kerülnek, energiatakarékos módban vannak. A shutdown(0, false) utasítással ébreszthetjük fel, ahol az első paraméter az IC sorszáma a sorban, a második pedig, false esetén felébreszti, true esetén energiatakarékos módba küldi az IC-t. Ha több IC-nk van, mindegyiket "ébreszzük" fel itt.

A setIntensity(0,1) szolgál az a LEDek intenzitásának megadására, itt is az IC sorszáma az első paraméter, majd maga az intenzitás.

Az alábbi writeArduinoOn7Segment 11 digiten a következőt jeleníti meg: ArduinoArdu.  Ez voltaképp egy minta, miként lehet karaktereket megjeleníteni. Gyakorlatilag mindegyik utasításnál igaz, hogy az első paraméter az IC sorszáma, míg a második paraméter az adott IC-n a megjelenítendő digit sorszáma. Harmadik paraméterként jön a megjelenítendő karakter, míg az utolsó paraméter jelöli, hogy a pontot meg akarjuk-e jeleníteni.

void writeArduinoOn7Segment() { 

lc.setChar(0,0,'a',false);  delay(delaytime); 

lc.setRow(0,1,0x05); 

delay(delaytime); 

lc.setChar(0,2,'d',false); 

delay(delaytime); 

lc.setRow(0,3,0x1c); 

delay(delaytime); 

lc.setRow(0,4,B00010000); 

delay(delaytime); 

lc.setRow(0,5,0x15); 

delay(delaytime); 

lc.setRow(0,6,0x1D); 

delay(delaytime); 

lc.setChar(0,7,'a',false); 

delay(delaytime); 

lc.setRow(1,0,0x05); 

delay(delaytime); 

lc.setChar(1,1,'d',false); 

delay(delaytime); 

lc.setRow(1,2,0x1c); 

delay(delaytime);  

A szegmensek külön-külön megjelenítéséhez szerintem a setRow használható legjobban, itt megadhatjuk bináris számokkal, hogy mely szegmens világítson (1 byte = 8 bit = 8 szegmens). A fenti példában a B00010000 egyetlen szegmenst jelenít meg, ami a kiírt szövegünkben az "i" betű lesz.

Számok megjelenítéséhez a setDigit a legkényelmesebb, ahol 0-15 közötti számot adhatunk meg és értelemszerűen 0-9, A-F -ig jeleníti meg a számokat.

Így a végére egy kis videó, hogyan is működik mindez:

 

 

 

 

 

 

A bejegyzés trackback címe:

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

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.

Nincsenek hozzászólások.