Cessna 172 cockpit otthon

Építsünk szimulátort

Építsünk szimulátort

Szerelhető tokozás a dupla encoderhez

2019. június 27. - C172Peti

Kissé bosszantott, hogy a dupla enkóder tokozása ragasztva volt. Egyrészt azért, mert ott van benne két encoder, amihez nem férek hozzá, pedig lenne még mit kísérletezni vele, másrészt azért, mert nem szép megoldás. Mindig jó, ha valamit szét lehet szedni szükség esetén.

double_encoder_repairable_1.jpg

Így hát elmenten egy közeli műszaki boltba és vettem hernyócsavarokat. 3mm átmérőjűből szerettem volna 4-5mm hosszúságút. Készleten nyilván 6mm hosszúság volt csak, így megnéztem mire tudom ezt használni.

3D nyomtatóval M3-as menetet nyomtatni nem igazán lehet (legalábbis nem egy átlagembernek elérhető árú nyomtatóval), így csak egy furatot terveztem az alkatrészbe, amin egy 3-as menetmetszővel nyomtatás után átmentem. Meglepően erős menetet kaptam, őszintén szólva nem gondoltam volna, hogy PLA anyagba tudok ilyet metszeni. 

Innen már nem volt megállás. Némi méregetés után a furatokat sikerült úgy beletervezni, hogy a felső enkódert a hernyócsavarok stabilan rögzítik, nincs szükség ragasztásra. Itt mondjuk szerencsém is volt, hogy csak 6mm hosszúságút kaptam, a 4-5mm-esek már valószínű pont rövidek lettek volna.

 double_encoder_repairable_2.jpg

A csavarok az oldallapokat is stabilan összefogják, nyilván arra kell figyelni, hogy csavarozáskor szorítsuk össze az anyagokat. Ha hézag lesz köztük, azt a hernyócsavarral már nem lehet összehúzni.

double_encoder_repairable_3.jpg

A fém tengely probléma is megoldódni látszik, kaptam több tippet is (köszönet érte még egyszer). Ilyenek voltak pl a kerékpár küllö, illetve hegesztőpálca. Mivel ez utóbbiból kaptam is egy méretes darabot, ezzel kezdtem el dolgozni. Ezt a pálcát oxigénnel való hegesztéshez használják, aminek a közepe valamilyen nem túl kemény fém, talán rézbevonattal. Első próbára tökéletesnek tűnik, nagyon merev cuccnak néz ki.

double_encoder_repairable_4.jpg

Fusion 360-al a gombokra is gyorsan összedobtam valamit, ami közel az eredeti méret és hasonlít is rá. Ezek tengelyhez rögzítéséhez is ugyanilyen hernyócsavart használok. Itt még van mit finomítani. A 6mm-es csavar a kis tekerőgombnál pont kilóg kb fél milimétert. Ennek a gombnak megnövelem még az átmérőjét, nem igazán van jelentősége szerintem 1-2mm kölünbségnek.

double_encoder_repairable_5.jpg

Ami már picit izgalmasabb kérdés, hogy a nagy gomb belső átmérője most már 2mm-el nagyobb, mint a kicsi külsője és néha még így is szorul. Szóval itt az arányokkal még picit játszanom kell, hogy ne legyen túl nagy hézag a külső és belső gomb között, de semmiképp ne szoruljon.

Az egyetlen rész, amit még nem tudtam szerelhetőre megoldani, az a másik encoderhez ragasztott rész, ami a kapcsolót kapcsolja. Itt még a 3D tervezgetés, bár leginkáb kísérletezgetés megy. Tetszik az a rögzítés, ami a felső enkódernél van, valami hasonlóval próbálkozom. 

Remélem hamar találok rá valami megoldást, és elindulhat ennek a dupla enkódernek a "sorozatgyártása". Kell belőle pár darab a szimulátorba.

 

 

Dupla enkóder #2 (tokozás + kapcsoló)

Vegyünk két olcsó enkódert, ami nem rendelkezik nyomógombbal és nincs fémtokozás az alján. Középpontosan átfúrva bele tudunk rakni egy tengelyt és már kész is a dupla enkóderünk. Egy korábbi videóban megmutattam nagyjából hogyan is csináltam, de akkor még a tokozással nem foglalkoztam.

Az épülő C172 szimulátor műszerfalán található rádió panel az egyik hely, ahol szükségem van rá. Ehhez jön még, hogy ott a középső gombot kapcsolóként is tudnom kell használni. Ha be van nyomva, akkor 8.33kHz-es, kihúzott állapotban pedig 25kHz-es léptékkel kell tudnom állítani a frekvenciát (de pl. az ADF-nél is kell majd, ott a második illetve harmadik számjegyet állíthatom vele).

double_rotary_encoder_with_switch.jpg

Próbáltam a tokozást szerelhetővé tenni, de azzal a méretei mindig elszálltak. Ezért első körben egy olyan megoldás készült, ahol az elemeket össze kell ragasztani. A terveket Fusion 360 -al készítettem, az STL-eket szívesen megosztom, ha igény van rá, bár még nem vagyok benne biztos, hogy ez lesz a végleges verzió.

doubleencoderwithswitch_coversketch.jpg

Jelenleg úgy, áll, hogy a teteje és az alja voltaképp ugyanaz. A lapján levő furat épp akkora, hogy az enkóder fém része kis szorulással átmenjen rajta. A téglalap kivágást tartalmazó oldalán az alsó furat a kapcsoló helye. Az összerakást célszerű a kapcsoló csavarozásával kezdeni.

doublerotarywithswitchback.jpg

A másik két oldala egyforma, a furatok rajta csak azért vannak, hogy belássak oldalról is, mi történik odabent. Nincs jelentősége, ha véglegesítem lehet azokat meg is szüntetem, így azokon az oldalakon több lehetőség lesz majd a rögzítésre. Az enkóderek lábainak egy oldalt teljesen szabadon hagytam. Egyrészt így könnyebb összeszerelni, másrészt az alsó enkóder mozog a kapcsolási lehetőség miatt, kell a hely a forrasztásnak és a vezetékeknek. 

doublerotarywithswitchfront.jpg

Ez így, ebben az összeszerelésben használhatónak tűnik és nem foglal sok helyet (a műszerfal mögé eső része kb. 60x25x25mm). Egyetlen gondolkozós dolog maradt még: a tengely. Első körben arra gondoltam, hogy egy szög tökéletesen megteszi. Ez valóban jó is lett volna, amíg nem alakítottam ki, hogy kapcsolható legyen. Most viszont legalább egy 60-as szög kell bele, hogy a két állító gombot rá lehessen szerelni. A 60-as szögnek viszont 3mm az átmérője, ami meg sok. Az enkóder műanyag részét átfúrva a 2mm átmérő ami még "kényelmes", így lehet a felső enkóder (külső tekerő gomb) rögzítő részét használni. 

rotary_knob_fix.jpg

3mm-es átmérővel fúrva már átszakad a lapított rész, ami annyit tesz, hogy a külső gomb is érintkezhet a belső tengellyel. Szóval itt még a feladat, hogy egy fém tengelyt találjak, ami legalább 60mm hosszú, de az átmérője nem nagyobb, mint 2mm. Hústű, vagy kötőtű esélyes lehet, szétnézek hamarosan, jó lesz-e valamelyik.

 ... és a végére egy kis összefoglaló videó:

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

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.

 

 

 

 

 

 

 

DIY Double Rotary Encoder #1

Elkezdődött a munka a rádió/navigáció panelen. Az első dolog, amire nagy szükség van, egy dupla encoder, mellyel a frekvenciákat lehet állítani. Itt a belső körrel általában 8.33/25/50kHZ -et lehet léptetni, a külső körrel pedig a megákat. Dupla jeladót találni nem egyszerű és amit találtam, azok ráadásul nagyon drágák. 16USD/darab volt a legolcsóbb. Talán nem tűnik első hallásra húzósnak, de kell belőle legalább 6 darab, az már bizony 100USD körül van. Egy sima, olcsó encoder megvan 5USD/20 (!!!)darab áron, tehát beleteszek egy kis munkát, hátha... (Ha tudsz dupla encodert olcsóbban, feltétlenül dobj egy linket, köszi). A képeken az első próbálkozás eredményei láthatóak, van még vele munka (betokozni), de bizonyosan fogok még a koncepcióval is foglalkozni, mert a mélysége itt kritikus (monitor lesz mögötte, minél "laposabb" megoldásra van szükségem, hogy minél közelebb maradjak a monitorhoz. Jó lenne a 10-12mm-t nem túl lépni, jelenleg 16mm körül járok). A kísérletezgetésemet összefoglaltam egy videóban is (hangot levettem, feliratoztam inkább, jobb ha nem hallja senki néha miket mondtam közben)

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