A szimulátorunk műszerfalán néhány visszajelzőt nem tudunk a monitoron megoldani (nincs rá hely), így azokat megépítjük külön. Ezek konkrétan a hibajelzők (annunciator) és a navigációs forrás választója (NAV/GPS). Ezek megjelenítéséhez 9 darab ledet kell az állapotoknak megfelelően külön-külön vezérelni. Kilenc digitális lábat elhasználni erre az arduino boardon elég nagy pazarlás lenne (bár ez lenne a legegyszerűbb). Két darab 8 bites shift regiszter használatával (pl SN74HC595) viszont egy minimális áramkörrel három digitális lábról tudunk vezérelni akár 16 ledet.
A vezérlés
Arduino
A vezérléshez tetszőlegesen kiválasztunk három lábat az arduino boardunkon (hogy milyen arduino boardot használunk, itt most egyáltalán nem lényeges, elég egy Uno vagy Nano).
Szükségünk lesz még egy föld és egy 5V (vagy akár 3V) lábra a tápellátáshoz.
74HC595
Három lábat használunk most ezen az IC-n a vezérléshez:
- SRCLK - shift register clock: az adat tárolása és a bitek eltolása
- SER - serial data: a tárolandó bit
- RCLK - register clock: a tárolt bitek kimeneten való megjelenítése
A működés dióhéjban:
- A SER lábra beállítjuk, mit karaunk tárolni (HIGH - világító a led, LOW - nem világít).
-
Az SRCLK lábra adunk egy órajelet (HIGH majd LOW jelet küldünk rá egymás után). Ennek hatására az első biten eltárolja a SER lábon levő jelet úgy, hogy közben eggyel jobbra eltol minden tárolt bitet (soros bemenet).
- Az 1-2 lépést addig ismételjük, amíg minden egyes led-re be nem állítottuk a kívánt értéket.
-
Az RCLK lábra adunk egy órajelet, ezzel a kimeneti lábakon megjelenik a tárolt érték, ami a következő órajelig ott is marad.
A nevében is benne van, hogy ez egy 8 bites tároló, de van egy remek tulajdonsága, ami miatt sorba lehet kötni belőle többet is. A kimeneti lábak QA-QH -ig vannak elnevezve. Ezen felül azonban van még egy kimeneti lába, a QH' .Erről azt kell tudni, hogy itt az SRCLK jel hatására megjelenik a QG lábon levő jel (nem kell hozzá az RCLK-ra órajelet adni). Ez a gyakorlatban nekünk azért jó, mert ezt a lábat így ráköthetjük egy másik IC SER lábára. Ha az így összekötött IC-ket egyszerre vezéreljük (SRCLK és RCLK lábait összekötjük), akkor a második IC mindig pont azt a bitet tudja tárolni, ami a QH (nyolcadik) bitről eggyel jobbra tolódva épp "eltűnne". Ezt lehet alkalmazni többször is, tehát akár több IC sorbakapcsolásával annyiszor nyolc led vezérelhető.
Az IC lábainak bekötése számozásuk sorrendjében (zárojelben a második IC):
- QB - 2. (10.) led
- QC - 3. (11.) led
- QD - 4. (12.) led
- QE - 5. (13.) led
- QF - 6. (14.) led
- QG - 7. (15.) led
- QH - 8. (16.) led
- QH' - 2. IC SER lába ( - )
- SRCLR - Arduino +5V (Arduino +5V)
- SRCLK - Arduino 1. láb (Arduino 1. láb)
- RCLK - Arduino 2. láb (Arduino 2. láb)
- OE - Arduino GND (Arduino GND)
- SER - Arduino 0. láb (1. IC QH' láb)
- QA - 1. (9.) led
- VCC - Arduino +5V (Arduino +5V)
Az arduino kód vezérlő részei
void setHighLowOnPin(int pinNum){
digitalWrite(pinNum, HIGH);
digitalWrite(pinNum, LOW);
}
void writeBitToSegment(uint8_t bitToWrite){
digitalWrite(pinRCLK, LOW);
digitalWrite(pinSER, bitToWrite );
setHighLowOnPin(pinSRCLK);
digitalWrite(pinRCLK, HIGH);
}
setHighLowOnPin : az adott lábon lead egy órajelet (HIGH majd LOW)
writeBitToSegment: az adot bitet rögzíti a tárolóban (az első helyen, a többi bitet 1-el jobbra tolva)
void writeBitsToSegments(uint8_t count[]){
digitalWrite(pinRCLK, LOW);
for ( int j = countasize - 1; j >= 0 ; j-- )
for ( int i = 7; i >= 0; i-- ) {
digitalWrite(pinSER, bitRead(count[j], i) );
setHighLowOnPin(pinSRCLK);
}
digitalWrite(pinRCLK, HIGH);
}
writeBitsToSegments: paraméterként egy uint8_t (8 bites egész szám) tömböt vár, amiből a countasize elemet bitenként rögzít a tárolóban és egyszerre megjeleníti a lábakon. A gyakorlatban a ledeken ilyenkor az egész számot látjuk bináris számrendszerben megjelenítve (ezért vannak a bitek visszafele sorrendben tárolva).
A bekötés részletesebben és az arduino kód TinkerCad-en itt:
Összeraktam gyorsan egy sima breadboardon is az áramkört, minden gond nélkül működik, szóval nem tűnik túl érzékenynek.
Ne terheljük túl az arduino boardot! A fenti példában 1k ellenállásokkal földeltem a ledeket.. Ez egy 5V-os rendszerben 5mA áramfelvételt jelent. Általában egy arduino board 500mA körüli áramot tud leadni (célszerű megnézni azért a board adatlapját), ami azt jelenti, hogy 100 körüli ledet már nem igazán bír el. Főleg, ha figyelembe vesszük az IC-k áramfelvételét, illetve ha mást is szeretnénk kötni a boardra, hisz csak 3 lábat használunk. Ha 1k -nál kisebb ellenállásokra van szükség a ledekhez, az nagyobb áramot, tehát kevesebb led vezérlését engedi. Ilyen esetben célszerű a 3 vezérlőlábat egy optocsatolón keresztül leválasztani az arduino áramköréről és egy megfelelő teljesítményű adapterrel táplálni az IC-ket és ledeket.
Most jöhet az, hogy kiszedjük a szimulátorból a szükséges infókat és azokat felhasználva "villogtatjuk" a ledeket.