Szilágyi Sándor Zoltán hobbielektronika és amatőr robottechnika oldala

Arduino kezdőknek cikksorozatom, melynek első 13 része publikálásra került. Amatőr robotok, robot autók és LED-kockák építése.

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

A 15.2 cikket megírtam: 2025.

A 15.3 cikket megírtam: 2025. 11.

 

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._abra_-_dmx_8bites_futofeny_ad_converteres_leptetese.png

77. ábra

 

 78._abra_-_dmx_8bites_futofeny_ad_converteres_leptetese.jpg

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._abra_-_dmx_8bites_futofeny_ad_converteres_leptetese.png

79. ábra

 

 

15.2 - 8-bites demultiplexeres astabil futófény sebességének változtatása potenciométeres AD átalakítóval (40. program)

  

     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._abra_-_dmx_8bites_futofeny_adc_sebesseg_valtoztatasa.png

80. ábra

 

15.3 - 8-bites demultiplexeres futófény vezérlése soros ellenállásos billenttyűzettel (41. program)

 

     Ez a rész a 15.1-es cikkem folytatása. Multiplexeres nyomógombsort akartam építeni, és 16.1 néven közzétenni, de úgy döntöttem, hogy azt majd egy másik IC-vel fogom megcsinálni, így még a 15-ödik részt bővítem az A/D átalakítók egy újabb változatával.

     Előzmények:

     Egy 8 bites nyomógombsornak indult a feladat a CD4051B analóg multiplexerrel. Ez a szokásos 8 bites demultiplexeres ledsort vezérelte volna. Sajnos az IC élesztése közben derült ki, hogy amit a multiplexerekről tanítanak, az a CD4051B-nél használhatatlan. Azaz ennek a multiplexernek 8 féle bemeneti jeléből kellene egy 3 bites jelsorozatot kiadnia (000 - 111között), mely jelek az Arduino-ra inputként lennének definiálva. Ehelyett ezzel ellentétben az IC fixen 3 db logikai magas jelet vár ide, azaz az IC 3 db output lába valójában input (!!!), mintha demultiplexer lenne, de mégse az, és ráadásul információ nélküli folyamatos feszültséget vár, ami az Arduino esetében outputként van definiálva. Az Arduino-ra a várt 3 bites (2^3=8) jelsorozat helyett csak 1 db jel jut az IC 3-as "I/O com" lábáról, azaz 8-ból 1 bit, kódolás nélkül, de az is rendszertelenül össze-vissza.

     Egy nyomógombsort építettem vele, azaz 8 db nyomógomb jelét kellett volna kódolnia, és 3 bites jelként az Arduino-ra küldenie Egy piezo speaker-t csatlakoztattam a board-hoz, majd írtam egy hanggeneráló programot. A hangok generálása véletlenszerű volt, mert a fent említett IC nem tud kiadni normális jelsorozatot, azaz adott egyforma hangok több különböző gomb lenyomásakor is megszólaltak, random szerűen, illetve egy gomb egymás utáni lenyomása különböző frekvenciájú hangokat eredményezett. A CD4051B multiplexer IC tehát multiplexelési célra használhatatlan! A kísérletezést tovább folytattam más IC típussal (ez az Arduino kezdőknek 16. rész lesz), de előtte még egy utolsó A/D átalakítós megoldást mutatok be.

     Mivel a célom mindenképpen egy 7-8 gombos billentyűzet tervezése volt, ezért úgy döntöttem, hogy multiplexer IC helyett az analóg vonalon megyek tovább, azaz a működőképes 15.1-es programomat fejlesztem úgy, hogy a potenciométert kicserélem sorosan kapcsolt ellenállásokra, melynél minden leágazásnál lesz 1-1 db nyomógomb. Így gyakorlatilag marad a „potméter”, de diszkrét ellenállás értékekkel. A kapcsolás hátránya, hogy lesz egy olyan alapállapot is, amikor egyik nyomógomb sincs megnyomva.

     A fent említett részben a potenciométer elenálláspályája +5V és 0V közé volt kapcsolva, míg a csúszkája az A0 analóg inputra. Ugyanezt a bekötést használtam itt is, azaz a sorosan felfűzött ellenállások +5V és 0V közé vannak kapcsolva. A +5V után egyből jön az első párhuzamos nyomógomb, az első soros ellenállás, majd újra és újra, összesen 7-7-szer. A hetedik ellenállás után nincs semmi más, az a GND-re csatlakozik. Ezt az A0 analóg inputtal össze kell kötni egy 100kΩ-os ellenállással a lebegés megszüntetése miatt. Ugyanis, ha egyik gomb sincs lenyomva, azaz a közös pont nincs határozott GND-n, elektromos szempontból „lebegő” (high-impedance) állapotba kerül, és a demultiplexerre kapcsolt ledek össze-vissza vibrálnak, pislákolnak. A 100 kΩ ellenállás így a közös analóg bemeneti pontról gyengén lehúzza a pontot 0 V felé nyugalmi állapotban (pull-down). Így amikor nincs gombnyomás, a feszültség definiáltan nullához közel lesz, a bemenet nem lebeg, és nincs zajos átmenet. A 100 kΩ nagy érték: kis értékű állandó áramot enged át gombnyomáskor (tehát nem rontja jelentősen a gombok által létrehozott feszültségosztást), ugyanakkor elég kicsi ahhoz, hogy leengedje a lebegő kapacitív töltést és csillapítsa a zajt.

     A másik az R13, 1,8kΩ-os ellenállás. Ez kísérleti úton lett meghatározva. Ha R9-R15-ig csak egyforma 1,2k-s ellenállásokat veszünk fel, a demultiplexer kimenetén nem a megfelelő sorrend a nyomógombok kapcsolgatása után, azaz lesz olyan led, ami kimarad, és az utána jövő két különböző gomb megnyomására is aktív lesz. Így lett ennek az ellenállásnak az értéke kicserélve. Az áramkör kapcsolási rajza a 81. ábrán látható, a próbapanel fényképe pedig a 82. ábrán.

 

81. ábra

 

 

82. ábra

 

 

83. ába

 

 

 

Weblap látogatottság számláló:

Mai: 1
Tegnapi: 29
Heti: 53
Havi: 57
Össz.: 6 994

Látogatottság növelés
Oldal: Arduino kezdőknek 15 - A/D átalakítók 3
Szilágyi Sándor Zoltán hobbielektronika és amatőr robottechnika oldala - © 2008 - 2026 - szilagyi-robot.hupont.hu

A HuPont.hu ingyen adja a tárhelyet, és minden szolgáltatása a jövőben is ingyen ...

ÁSZF | Adatvédelmi Nyilatkozat

X

A honlap készítés ára 78 500 helyett MOST 0 (nulla) Ft! Tovább »