Arduino kezdőknek 15 - A CD74HC238E demultiplexerek A/D átalakítós vezérlései
Szilágyi Sándor Zoltán villamosmérnök, mérnök-informatikus
A 15.1 cikket megírtam: 2025. 03. 27-28
15.1 - 8-bites demultiplexeres, ide-oda astabil futófény potenciométeres AD átalakítóval(39. program)
2022. Augusztusában jelent meg a rádiótechnikában az "Arduino kezdőknek" cikksorozatom 7. része, melyben az alap analóg beviteli eszközökről írtam. Ez 1 db potenciométert tartalmazott, mely 0-5VDC feszültségjelet vitt be az Arduino egy adott analóg bemenetére, majd mintavételezés-kvantálás-kódolás után a soros monitoron megjelentette valós időben a feszültség éréket.
2022 szeptemberében megjelent az "Arduino kezdőknek" cikksorozatom 8. része, melyben tovább vittem az A/D átalakítók alapjait 3 különböző programon át, a led kapcsolgatás potenciométerrel (de nem PWM-el), led fényerő változtatás és led villogtatási sebesség változtatás PWM-el (impulzus szélesség modulációval), szintén potméterrel.
Tehát eddig 2 db publikációm jelent meg ebben a témában, összesen 3 féle alap kapcsolással és 4 féle alap programmal. Ezt a gyakorlati tudást bővítem tovább, az utóbbi cikkeimben megszokott demultiplexeres futófényekkel. Az eddigiekhez hasonlóan ezek is csak modellek lesznek a folyamatosan felépítendő gyakorlati tudás miatt, konkrét alkalmazások majd később jönnek.
A hardver a 77. ábrán látható. Az áramkör két részből tevődik össze. Az egyik az 50. ábra, mely az Arduino kezdőknek 11 alapkapcsolása. A 13, 12, 11 digitális kimenetekre 3 bites jelsorozatot adunk, mellyel a demultiplexer 3 adatbemenetét vezéreljük, és a megfelelő jelkombinációhoz tartozó Y0-Y7 kimenet aktív lesz. A másik rész a 35. ábra, mely az Arduino kezdőknek 8. rész egyik kapcsolása. A potenciométert 5V és 0 V közé kapcsoljuk úgy, hogy a csúszkája az A0 analóg bemenetre csatlakozik. Az Arduino egy belső programozható AD átalakítót tartalmaz. Mint ahogy a fent említett cikkemben írtam, az analóg bemenetről beolvasott feszültség értéket egy 0-1023 közötti számmá alakítja át. 0V esetén tehát 0-át, 5V esetén 1023-at ad, köztes állapotban pedig az adott értékhez tartozó 0-1023 közötti értéket. A két áramkör résznek villamos szempontból semmi köze egymáshoz, a potenciométer input, az Arduino a feldolgozó egység, a demultiplexeres futófény pedig az output szerepét tölti be. A próbapanel fényképe a 78. ábrán látható.
77. ábra
78. ábra
A program a 79. ábrán látható. A deklarációs részben felvesszük a 6 db digitális kimenetet a DMX vezérléséhez, illetve két integer típusú változót az A/D átalakító működéséhez. A pinMode()-okkal csak a 6 db digitális kimenetet kell konfigurálni.
A főprogram két szekvenciával kezdődik. Először beolvassa a potenciométer csúszkájáról vett analóg feszültségjelet (pot), majd áthelyezi a "value"-ba, ahol a map() függvény újraképezi a változó értékét.
A map() függvény szerkezete: map(value, fromLow, fromHigh, toLow, toHigh);, ami a 79. ábrán így néz ki: „value=map(value, 0, 1023, 0, 1023);”. Öt paramétere van:
- value: ez a feltérképezendő szám. Ebbe töltötte át a program a "pot"-ba beolvasott értéket
- fromLow: a szám aktuális tartományának alsó határa, azaz a "0".
- fromHigh: a szám aktuális tartományának felső határa, azaz a "1023".
- toLow: a céltartomány alsó határa, azaz a "0".
- toHigh: a céltartomány felső határa, azaz a "1023".
A mi esetünkben tehát az aktuális tartomány (fromLow) alsó határa "0", (fromHigh) felső határa "1023". Az analogRead() ezen tartományon belüli értéket ad vissza. Teljesen letekert potméternél 0-t, míg teljesen feltekert potméternél 1023-at. A céltartomány (toLow) alsó határa szintén "0", míg a (toHigh) felső határa szintén "1023". Azért 0-1023, mert erre a cél értéktartományra képezi le az új számot.
A következő szekvencia 3 sorból áll, melyben a demultiplexer engedélyező/tiltó bemeneteit állítjuk be, melyek közül a G0n és a G1n általános digitális kimenet helyett a 10-es és a 9-es PWM jellegű digitális kimenetre lett kötve. A PWM jelentése: Pulse-Width Modulation, azaz impulzusszélesség moduláció. Ez egy olyan vezérlés, ahol állandó periódusidő mellett a jel bekapcsolási idejét, azaz az impulzus szélességét változtatjuk. Minél nagyobb az amplitúdó változása, annál nagyobb az impulzusszélesség. A board AD átalakítója az A0 bemenetről beolvasott értéket a fentebb említettek alapján feldolgozza, adott szélességű impulzusra alakítja. A potenciométer adott állásától függően tehát adott szélességű impulzus jelenik meg a PWM kimeneteken.
A szekvenciák után egy szelekció következik, mely 8 db független feltételt vizsgál meg, azaz az if-es szerkezeteknek nincs else ága. Ezek a lehetséges zárt-zárt intervallumok a következők:
1: 0 <= value and value <= 127
2: 128 <= value and value <= 255
3: 256 <= value and value <= 383
4: 384 <= value and value <= 511
5: 512 <= value and value <= 639
6: 640 <= value and value <= 767
7: 768 <= value and value <= 895
8: 896 <= value and value <= 1023.
A <= azaz a 'kisebb egyenlő' az 'egyenlő' miatt lesz zárt, azaz az egyik feltétel végén levő egész szám érték már nem szerepelhet a következő intervallum elején, attól 1 egész számmal nagyobbnak kell lennie. Továbbá fontos, hogy egész számokat használjunk.
Ha tehát nem teljesül a feltétel az első feltételvizsgálatnál, a program tovább adja a vezérlést a következő vizsgálatnak, majd tovább és tovább egészen addig, ahol a feltétel teljesül. Ekkor a kapcsos zárójelek közötti szekvenciális utasítások végrehajtódnak, azaz megtörténik a demultiplexer adatbemeneteinek 3 bites vezérlése (analogWrite() helyett digitalWrite() van, mivel nem egy LED-et, hanem a demultiplexert fogjuk kivezérelni), majd végül a pergésmentesítés. Ha tehát egy if-es ág lefutott, kezdődik a folyamat elölről, az analóg jel beolvasásával...
79. ábra
15.2 - 8-bites demultiplexeres astabil futófény sebességének változtatása potenciométeres AD átalakítóval
A hardver az előző ponthoz képest változatlan marad, csak a programot kell átírni. A feladat, hogy a potenciométer ide-oda forgatásával ne az épp világító led pozíciója változzon, hanem a 8-bites astabil futófény sebessége. Ehhez két korábban megírt programot használhatunk fel. Az egyik a 31-ik, mely "Demultiplexer teszt" néven jelent meg a 2023 februári Rádiótechnikában (Arduino kezdőknek 11). A másik a 22. program, "LED villogtatása (logaritmikus) potenciométerrel", mely az Arduino kezdőknek 8-adik cikkem egyik programja volt, (Rádiótechnika 2022 szeptemberi szám).
A program a 80. ábrán látható. A deklarációs részben felvesszük a 6 db digitális kimenetet a DMX vezérléséhez, illetve két integer típusú változót az A/D átalakító működéséhez, akárcsak az előző feladatnál. A pinMode()-okkal itt is csak a 6 db digitális kimenetet kell konfigurálni.
A főprogram csak szekvenciákat tartalmaz. Először beolvassa a potenciométer csúszkájáról vett analóg feszültségjelet (pot), majd áthelyezi a "value"-ba. Ezután feltételvizsgálat nélküli lefutó szekvenciák sorozata jön. Az 2-4 sor a demultiplexer engedélyezése, majd 8x4 sor jön (a 80. ábrán a 4-edik sor a 3-adik végén található helytakarékossági okokból). Minden négy soros rész egy-egy 3 bites adatot küld ki a DMX adatbemeneteire, mely a hozzá tartozó 0-7 kimenetek valamelyikét logikai igaz állapotba kapcsolja át. Egy kimenete mindig igaz állapotú, azaz nincs szünet két led aktív állapota között. A negyedik szekvenciális sor pedig egy késleltetés, azaz a "value" változó értékét használja fel a program. Az adott kombinációhoz tartozó led tehát a változóban eltárolt értéknek megfelelő ideig aktív, utána a soron következő led lesz aktív, mely szintén ugyanezt a változót használja fel a saját időzítésére úgy, hogy annak az értéke folyamatosan változhat a potenciométer forgatása miatt, de ameddig a ciklus nem fut le, addig az előzőleg beolvasott-feldolgozott értéket használja. Ha tehát a ciklus lefutott, kezdődik előröl, beolvasva az úgy analóg feszültségjelet, melyet a korábban ismertetett A/D átalakítás után újra felhasznál az időzítésre. Így tehát a potméter forgatása miatti sebességváltozás mindig csak az adott ciklus lefutása után lesz érzékelhető. A program végén ennél a feladatnál nincs szükség pergésmentesítésre.
80. ábra