Cessna 172 cockpit otthon

Építsünk szimulátort

16 led egyedi vezérlése 3 digitális lábbal

2019. február 05. - C172Peti

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.

tizenhatledharomlabon.jpg

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:

  1. A SER lábra beállítjuk, mit karaunk tárolni (HIGH - világító a led, LOW - nem világít).
  2. 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). 

  3. 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.
  4. 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ő.

16led3labon_tinkercad.jpg

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.

A bejegyzés trackback címe:

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

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.

kpetya 2019.06.05. 10:40:03

bocs, hogy beleszólok, de használj kapcsoló ic-t pl ulm2003 vagy ulm2803

C172Peti · http://repszim.blog.hu 2019.06.05. 21:48:09

@kpetya: örülök, ha beleszólnak, főleg, ha kapok javaslatot is mellé hogyan lehetne jobb/egyszerűbb :) ránézek a kapcsoló IC-kre, még nem használtam őket. Köszi!

kpetya 2019.06.06. 09:47:31

kb erről van szó, egy led esetén sima tranzisztorral. Az ulm2803 8db "tranzisztor" van (nem egészen de számunkra nem fontos), 8 vmit tudsz kapcsolgatni.
learn.sparkfun.com/tutorials/transistors/applications-i-switches
cdn.sparkfun.com/r/400-400/assets/learn_tutorials/1/9/3/npn-switch-led.png

Nem a mikroproci lábáról veszed a led világításához szükséges áramot, az csak kapcsolóként müködik, í tetszőleges áramfevételű fogyasztót tudsz vezérelni.

C172Peti · http://repszim.blog.hu 2019.06.06. 12:03:47

@kpetya: ez így remekül hangzik, az optocsatolókra így nem lesz szükségem. Mindenképp összerakok egy ilyen vezérlőt is.

C172Peti · http://repszim.blog.hu 2019.06.08. 19:33:28

@kpetya: megnéztem az uml2803 -at, mégsem lesz jó nekem.Ezzel sajnos nem tudok az arduino lábakkal spórolni, annyi lábra van szükségem, ahány ledet külön akarok vezérelni.