Cessna 172 cockpit otthon

Építsünk szimulátort

É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.

16 kapcsoló ellenőrzése 8 digitális lábbal

A szimulátorunk műszerfalán számos kapcsoló helyezkedik el. Egy arduino micrót asználunk arra, hogy ezek állapotát ellenőrizzük és továbbítsuk a szimulátort futtató számítógépre. Az arduinóval egy joystickot emulálunk, amivel 32 nyomógomb állapotot tudunk küldeni. Ez a része nem gond. A probléma az, hogy ennyi digitális vagy analóg lába nincs ennek a kicsi arduino boardnak, így valamit ki kellett találni, hogyan lehetne ezt mégis kezelni. A megoldás egy kapcsoló mátrix építése.

tinkercad.jpg

Ez igazából egy példa, a mátrix mérete voltaképp tetszőlegesen növelhető. Nézzük, hogy működik ez a 4x4-es mátrix.

4 lábat kimenetként használunk, 4 lábat pedig bemenetként. A kimeneti lábak lesznek a sorok, a bemeneti lábak pedig az oszlopok. Ez annyit tesz, hogy az egy sorban levő kapcsolók egyik vége ugyanarra a kimeneti lábra lesznek kötve, az egy oszlopban levő kapcsolók másik lába pedig ugyanarra a bemenetre.

Például az első sor így néz ki:

tinkercad_sor.jpg

Az arduino 2-es lába a kimenet, ide egy diódán keresztül rákötjük a kapcsolókat. A kapcsolók másik lábait pedig rendre a bemeneti lábakra kötjük, Ezt ismételjük soronként.

Ha egy oszlopot nézünk, azt látjuk, hogy minden sor külön kimeneti lábról egy diódán keresztül csatlakozik a kapcsolóhoz, a kapcsolók másik lába pedig ugyanarra a bemenetre megy.

tinkercad_oszlop.jpg

A működési elv:

Alaphelyzetben a bemeneti lábakra bekapcsoljuk a PULL_UP regisztert (ha nincs földelve, stabil HIGH érték legyen), a kimeneti lábakat pedig HIGH értékre állítjuk (+5V -ot kapcsolunk rá, azaz nem földeljük!).

A kapcsolók állapotát soronként ellenőrizzük. Először földeljük az első kimeneti sort (LOW értékre állítjuk az első kimeneti lábat). Végig ellenőrizzük a bemeneti lábakat. Ahol az érték LOW, ott a kapcsolónk be van kapcsolva. Értelemszerűen ahol HIGH, ott a kapcsoló ki van kapcsolva. Ahogy megvizsgáltuk a bemeneteket, a kimeneti lábat HIGH értékre visszaállítjuk, így alaphelyzetbe kerül megint a mátrixunk és jöhet a következő sor. Itt ugyanezt kell tenni. A sorhoz tartozó kimeneti lábat LOW-ra, majd az oszlopokhoz tartozó bemeneti lábakat beolvassuk. A beolvasások végén mindig tegyük vissza a sorhoz tartozó kimenetet HIGH-ra!

Miért kell a dióda?

A sorokat úgy ellenőrizzük, hogy rendre leföldeljük őket. Mivel oszloponként a kapcsolók lábai is össze vannak kötve, ezért ha egy oszlopban bekapcsolunk egy kapcsolót, akkor ott az összes kapcsoló lábán megjelenik a föld. Itt gyönyörű áramkörök alakulhatnak ki, ráadásul mivel mindig csak egy kimenet van földelve, a többi pedig +5V-ra rakva, jó eséllyel akár a boardunkat is elfüstölhetjük egy remek kis rövidzárral (bár lehet van erre benne valami védelem, én inkább nem próbálom ki).

A dióda katódját a kimeneti lábra kötjük, az anódját pedig a kapcsolóra. Ezzel biztosítjuk, hogy csak az adott sor kimeneti lábáról érkező föld tud megjelenni a bemeneten (egy másik soron keresztül nem fog záródni a kör a dióda miatt), illetve két kimenet sosem kerülhet összezárásra (kivéve, ha mindkettő föld, de azzal meg nincs gond).

Mekkora mátrixot lehet így kezelni?

Elméletileg csak az arduino I/O lábainak száma korlátoz minket.  Íme egy teljesen felesleges táblázat, mert nem igényel bonyolult számítást, de kiváló térkitöltő ebben a posztban. Feltétlenül jelezd, ha te is így gondolod.

Mátrix  I/O láb  Kapcsoló 
3x3 6 9
3x4 7 12
4x4 8 16
4x5 9 20
5x5 10 25

 

 Tinkercad-en összeraktam egy áramkört erre (a képek onnan kerültek kivágásra), megmutatom az arduino code-ot és hogyan fut a szimuláció:

 

 

 

 

 

A műszerfal 3D terve

A műszrefalról eddig nem volt 3D terv, mert nagy lendülettel felrajzolásra került a faanyagra és már meg is munkáltuk. Mivel csak egy része van kész, a továbbhaladáshoz mégiscsak kell valamiféle terv, így jöhetett egy kis reverse egineering... A lényeg, hogy van most már terv, ráadásul így dokumentálva is lett, hátha jól jön még valakinek.

muszerfal_front.jpg

A műszerfal két nagy részből áll, van egy 8mm-es rétegelt lemez, amiből a műszerek körei vannak fent kivágva és van egy 18mm-es bútorlap, ami a monitorokat foglalja keretbe és adja a műszerfal alját.

muszerfal_back.jpg

A kormány rúdja valahol be kell, hogy menjen a műszerfal mögé. Egy C172-ben ez a fordulatszámláló mellett történik, amit mi sajnos nem tudunk megtenni, mivel nekünk ott monitor lesz.

kormany_helye.jpg

Ezért lentebb helyeztük a kormányt 9cm-el. Mivel a kormány magasságát jó lenne megtartani (elférjen majd az ember lába), valószínűleg a teljes műszerfalat fogjuk 9cm-el magasabbra tenni.


muszerfal_kapcsolosor_front.jpg

A gyűjtáskapcsoló, főkapcsoló és a világítás kapcsolók sora így még elfér, az avionics viszont már nem fér be a kormány rúdja alá, ezért azt egy bő 5cm-el jobbra kellett tolni. 

muszerfal_kapcsolosor_back.jpg

A szimulátorban ez túl sok gondot nem okoz majd, mert ott csak néhány biztosítékhoz kerül közelebb, amit egyelőre még úgysem tudunk szimulálni. A kapcsolósor felett van amúgy egy biztosíték sor, erre majd kitalálunk valamit, egyelőre nem jellemző a szimulátorokra, hogy kezelné ezeket. Ha mégis találunk rá módot, akkor lesz ott majd egy nyomógomb sor is.

Most jöhetne a kapcsolók elektronikája, és programozása. Ez 10 kapcsolót jelent, így ugyanazt az arduinót, amit a műszerekhez használtunk, nem használhatjuk, kell belőle egy másik. Itt azért még jön egy kis gondolkozás, hogy lehetne ügysesen megoldani azt, hogy ne vegyen el 10 digitális bemenetet az arduionótól ez a 10 kapcsoló, mert ezzel gyakorlatilag elhasználnánk még egy Arduino micro-t és lenne még mit vezérelni.

 

 

 

 

 

A műszerek vezetékelése

Nem habozok, mutatom a végeredményt, mi látszik majd a kabinból. Persze még kell némi képzelőerő hozzá: lefestve a műszerfal, műszerkeretek, gombok felrakva, minden feliratozva...

00_muszerfal_bekotve_kicsi.jpg

Kezdjük az elején. Van nyolc darab rotary encoderünk, darabonként három vezeték. Van egy OAT-unk három nyomógombbal, darabonként két vezeték. Gyors fejszámolás után, harminc vezeték fog kilógni valahol egy helyen, jó lenne hát tudni melyik hova tartozik. A vezetékek jelölésére a szín a legegyszerűbb. Na de harminc színt ember legyen a talpán, aki megkülönböztet, meg amúgy sincs ennyi színű vezetékem. Sima maszkolószalagot használtam már régebben vezetékjelölésre, ráírom mi a vezeték funkciója és ráragasztom. Harminc vezetéknél ez sem célravezető, mert mindenhol csak ragasztószalag darabok lógnának. Valahol egyszerűsíteni kellett. Először is, forgójeladónként a három vezetékből egy mindig föld. Ezeket a földeket össze lehetne kötni, célszerűen feketével kábelezve. A kapcsolók is igazából földelést fognak adni az arduino lábaira, tehát kapcsolónként is lesz egy föld, ezek is simán összeköthetőek a jeladók földjével, így elég ha egy föld lóg ki. Tíz vezetékkel máris kevesebb, már csak huszat kell megkülönböztetni. A föld fekete, tehát már csak 19-et. Haladás...

A vezetékeimet egy 12 eres ún. riasztókábelből hámozom ki, ez bizony kevés szín. Ekkor kaptam az ötletet, miért nem csinálok színpárokat. Párosával vezetem ki a színeket, csak arra kell figyelni, hogy ugyanaz a színkombináció ne legyen kétszer. Zseniális ötlet, ezt fogom tenni. Kiméregettem hát a hosszokat és összegyűjtöttem a kiindulási helyükre.

01_szinparok_vagott_kicsi.jpg

Jöhet a jeladók és a nyomógombok lábainak forrasztása. Pont passzoló zsugorcső ráhúz a vezetékre, majd forraszt, zsugorcsövet forrasztásra húz, öngyújtóval rámelegít. Egyszerű, mint az 1x1. Csak van belőle bőven. Mondanám, hogy zökkenőmentesen ment minden, de nem. Mint a mesében, a 3. jeladó 3. lábának forrasztásakor letört a láb. Egy könnycseppet elmorzsol, jeladóról meglevő vezetékeket levág,  mivel a zsugorcső már ráolvaszta, így a forraszanyag eltávolítása lehetetlen, új jeladót vesz, folytatja a munkát.

02_rotary_forrasztva_kicsi.jpg

Majd jön ugyanez a művelet a három nyomógombbal. Ott már nem volt fennakadás.

03_kapcsolo_forrasztva_kicsi.jpg

Elkészült mind, a boldogság mérhetetlen, hát nem gyönyörű látvány, ahogy minden szépen a helyén?

04_rotary_es_kapcsolo_forrasztva_kicsi.jpg

Teljesen érthetetlen okokból a behelyezéskor az egyik rotary három lábából kettő letört. Én is letörtem. Pici csonk maradt, gondoltam nem dobom ezt most ki, vezeték visszavág és megpróbáltam arra az 1-2 mm-es csonkra visszaforrasztani. Teljesen stabil lett. Szóval ne keseredjünk el, ha letörik a lába, simán lehet még oda forrasztani.

Már beszámoltam ebben a bejegyzésben arról az egyszerű PCB-ről, amit azért terveztem, hogy egy 20 eres szalagkábellel egyszerűen és oldhatóan tudjak csatlakozni az arduinóhoz.A nyákra forrasztás után csak azt teszteltem, hogy megöltem-e a mikrokontrollert, vagy túlélte a műveletet. Túlélte, de a kérdés most az, hogy a szalagkábelről jövő adatok eljutnak-e a lábakra. Legegyszerűbb módja a tesztelésnek, hogy beforrasztottam a szalagkábelre a földet a műszerfalról, majd egy rotary encoder két lábáról jövő vezetékeket. Feltöltöttem az arduinóra a rotary tesztelő programot (amit ebben a bejegyzésben is használtam) és vártam a csodát.

Na itt követtem el az első hibát

A tesztelés sikeres volt, a boldogság még mindig mérhetetlen. Ha egyet már bekötöttem, miért ne kössek be még egyet. Láss csodát, az is működik elsőre.

Itt követtem el a második hibát, ezek után felesleges már számolni.

Hipp-hopp ráforrasztottam a nyolc jeladóból hatot, mindegyik működik. Az utolsó kettőt és az OAT kapcsolóit egyelőre nem, mert azokat még a szimulátorban nem tudtam működésre bírni (de ez egy másik történet lesz...). A lényeg, hogy minden működik. Szalagkábelre szépen ráforrasztva, zsugorcsővel szigetelve. Aztán rájöttem mekkorát hibáztam, mikor megláttam mit műveltem:

05_szalagkabel_rotary_kicsi.jpg

Vezeték-káosz-dzsungel-őserdő. Pazar ötlet volt párosítani a színeket. Csak így haszontalan. Először szépen, párban ki kellett volna vezetni oldalra mindent, és csak utána elkezdeni a tesztelgetést. Jó eséllyel bő egy órás munka lenne most a forrasztásokat szétszedni, rendezni a vezetékeket, majd újra forrasztani a szalagkábelre, aztán letesztelni. Bő egy óra alatt egy csomó más hasznos dolgot csinálhatok, így ez most így marad. Mentem, ami menthető és némi rendezgetés után ez lett a végeredmény:

06_vezetekek_rendezve_kicsi.jpg

Végülis így, hogy a szalagkábelre lett forrasztva, egyértelműen meg tudom határozni melyik műszervezérlő melyik kábelhez tartozik, hisz a sorrend adott az arduino lábaihoz. Tehát voltaképp még szerelhető is maradt, csak egy icikepicikét ronda a vezetékelés. A biztonság kedvéért még egy utolsó teszt a végén, hogy minden bekötött jeladót lát-e rendesen az arduino

07_arduino_teszt_kicsi.jpg

Minden remek, jöhet egy kis arduino programozás, majd a műszerfal tesztelése az FSX-el és az AirManager-el.

 

 

 

 

 

 

süti beállítások módosítása