Lektorált tananyag, ami a BKF Digitális és Kollaboratív Művészet (DIKOM) pályázatnak keretén belül valósult meg. Szerző: Harsányi Réka, Társszerző: Juhász Márton András, Lektor: Fernezelyi Márton
A következő alfejezetekben különböző eszközöket fogunk digitális pinekre kötni: LED-et, nyomógombot, kis hangszórót, miközben újabb típusú változókkal és – többek között – az if kondícióval, a for ciklussal, a tone és a millis függvényekkel ismerkedünk meg, valamint az Arduino belső felhúzó-ellenállását is használni fogjuk.
LED villogtatása delay() nélkül
Néha azt szeretnénk, hogy párhuzamosan történjenek dolgok, pl. miközben villog a LED egy nyomógomb állapotát is vizsgálni szeretnénk. Ilyenkor a delay()-t nem tudjuk használni, hiszen az az egész kód lefutását késlelteti, és lehet hogy pont akkor nyomjuk meg a gombot, amikor a kód áll, így elmumlasztjuk a kiolvasását. Ezért az alábbi kódban változók segítségével hozzuk létre a villogást úgy, hogy az eltelt idő mértékét vizsgáljuk.
A következő példában a LED mindig az ellenkező állapotába kerül, mint amilyenben épp van, tehát ha be van kapcsolva, akkor kikapcsol, és fordítva. Mivel a loop() folyamatosan fut, minden alkalommal megvizsgálja, hogy az if feltétel igaz-e, és ahhoz képest lép tovább a kódban. Használhatjuk az Arduino beépített LED-jét vagy beköthetünk egyet a szokásos módon – a pozitív lábát 220 ohmos ellenállásom keresztül a 13 pinbe, a negatív lábát pedig a földelésbe (Gnd).
LED bekötése 13 pinbe
Arduino kód: 06LEDmillis
Nyomógomb LED-del
Ismét a beépített, 13 digitális pinre kivezetett LED-ünket fogjuk használni, valamint egy nyomógombot, amit a 7.2.1. számú ábra szerint kötünk be a digitális 2 pinbe, a feszültségbe (5 V) és egy 10 kiloohmos ellenálláson keresztül a földbe (Gnd).
Nyomógomb bekötése
Amikor a nyomógomb nyitva van (tehát nincs lenyomva), akkor a lábak között nincs összeköttetés, így – mivel a gombon át a földeléshez vagyunk kötve – a pinünkből LOW jelet tudunk kiolvasni. Ha a gomb lenyomásával zárjuk az áramkört, akkor a jelünk az 5 V pinből érkezik, azaz HIGH lesz.
Ha fordítva kötjük az áramkört, azaz az ellenállással a HIGH jelet tartjuk meg, akkor gombnyomásra LOW-t kapunk, így a LED akkor alszik el, ha nyomjuk a gombot.
Arduino kód: 07nyomogomb
Késleltetés (debounce)
Ehhez a feladathoz az előző példa alkatrészeit és bekötési ábráját használjuk. A nyomógombot kapcsolóként használjuk, mely először bekapcsolja, majd második megnyomásnál kikapcsolja a LED-et. Késlelteti a bemeneti jelet, mely azt jelenti, hogy nagyon rövid időn belül kétszer is leellenőrzi, meg van-e nyomva a gomb. Késleltetés használata nélkül előfordulhat, hogy az egyszeri gombnyomást a kód többszörinek veszi. Millis() függvény segítségével követhetjük a gombnyomás időtartamát. Ugyanúgy HIGH jelet kap a bemeneti pinünk, ha lenyomjuk a gombot, mit az előző példában, és LOW jelet, ha nincs. Amikor a 2 bemeneti pin állapota LOW-ról HIGH-ra változik, átkapcsolja a kimeneti pint LOW-ról HIGH-ra, és a következő alkalommal vissza.
Arduino kód: 08kesleltetes
Nyomógombos számláló
Ebben a példában egy nyomógombbal működő számlálót készítünk. Ahhoz, hogy a megnyomások számát követni tudjuk, ugyanúgy a bemeneti pin állapotát (HIGH, LOW) kell figyelnünk, és azt kell számolnunk, hogy ez a változás hányszor történt meg. Ezt „állapotváltozás érzékelés”-nek vagy „szélsőérték érzékelés”-nek hívjuk.
A következő kód folyamatosan kiolvassa a gomb állapotát és összehasonlítja az előzőleg kiolvasott értékkel. Amennyiben a két állapot különböző és az aktuális állapota HIGH, akkor a gomb be van nyomva, így a kódban eggyel nő a nyomógomb számlálóértéke. Ezt szintén megvizsgáljuk, és ha az a négy többszöröse, akkor bekapcsolja a beépített (13 pin) LED-ünk, egyéb esetekben kikapcsolja. Továbbra is a második példa alkatrészeit és bekötési ábráját alkalmazzuk.
Arduino kód: 09szelsoertek
Pinek beépített felhúzó ellenállása
Minden pin rendelkezik egy beépített, programozható felhúzó ellenállással. Ez a példa azt mutatja meg, hogyan használjuk az INPUT_PULLUP parancsot a pinMode() függvény segítségével. A kapcsoló állapotát figyeli azáltal, hogy soros kommunikációt létesít az USB porton keresztül az Arduino és a számítógép között. A kommunikáció a (belső) soros porton (más néven: COM) történik, általában ki kell választani, hogy melyiket használjuk.
Ezen felül a kódban, ha a bemenet HIGH, akkor az Arduino boardba beépített LED bekapcsol, és LOW állapot esetén a LED kikapcsol.
Kössünk be egy nyomógombot a 7.5.1.számú ábra szerint, az egyik lábát a földbe (GND), a másikat pedig a digitális 2 pinbe.
Nyomógomb bekötése INPUT_PULLUP példához
A nyomógombok vagy a kapcsolók alapállapotban nyitva vannak (amennyiben ilyen típust használunk, hiszen több fajta létezik), ami azt jelenti, hogy a két lába között nincs kapcsolat. Mivel a belső ellenállás a digitális 2 pinen aktív és 5 V-ra van csatlakoztatva (mivel ennyi feszültséget kap az USB-ből az Arduino, tehát ennyi jön a digitális pinből is), ezért ekkor HIGH jelet olvasunk ki. Ha a gombot lenyomjuk vagy bekapcsoljuk a kapcsolót, azzal zárjuk az áramkört, így – mivel közvetlen lesz a kapcsolat a földeléssel – LOW jelet kapunk.
A kódban először létrehozzuk a soros kommunikációt 9600 bit/sec-on, majd engedélyezzük a 20 kiloohmos belső felhúzó ellenállást, illetve beállítjuk kimenetként a 13 LED-pint. Utána egy változó segítségével kiolvassuk a gomb állapotát, amelynek decimális értékét kiíratjuk serial monitoron – jelen esetben ez 0 vagy 1 lesz (0 = benyomva, 1 = alapállapotban).
Arduino kód: 10felhuzo
Dallam lejátszása tone() függvénnyel
Bekötése: A 8 ohmos kis hangszóró (0,25 wattos elég) pozitív oldala a 100 ohmos ellenálláson keresztül a digitális 8 pinbe, a negatív szára a földelésbe (GND) megy.
Hangszóró bekötése
Szükségünk van a „pitches.h” file-ra, melyhez a következő kódot egy alap szövegszerkesztőbe be kell illeszteni és elmenteni a file-t ezen a néven. A .h a header file kiterjesztése, ez tartalmazza a függvény meghatározásokat és definíciókat a library számára.
Az arduino mappa libraries mappájában hozzuk létre a Melody nevű mappát és tegyük bele a most készített pitches.h file-t – csak így fog működni. Az Arduino program újraindítása után bekerül a Sketch/Import Library legördülő menübe a Melody, innen fogjuk használni. Nyissunk egy új sketch-t, és másoljuk be az Arduino kódot (lejjebb található). Az #include „pitches.h” sort kitörölhetjük, majd vegyük elő az előbb említett legördülő menüből a melody-t, így megjelenik a következő sor: #include <pitches.h>. Most már működik a kód.
A pitches.h file kód letöltése.
Arduino kód: 11dallam
Írjuk át a kódot tetszőleges dallamra!
Amennyiben standard library-ket akarunk használni a hivatalos oldalról, akkor letöltés után előbb telepíteni kell azokat. Kicsomagolás után egy .h és egy .cpp kiterjesztésű file-t találunk. Az arduino mappában lévő libraries mappába kell elmenteni, bár az már alapból tartalmazza őket. Esetleg itt létrehozhatunk egy saját library-t is. Az Arduino program újraindítása után a Sketch/Import Library menüből elérhetőek és használhatóak.
Tone Library: https://code.google.com/p/rogue-code/wiki/ToneLibraryDocumentation
Generált hajlítás lejátszása tone() függvénnyel
Következő feladatunknál megtartjuk az előzőleg beszerelt 100 ohmos ellenállást és a 8 ohmos (0,25 wattos) kis hangszórót és bekötünk még egy fotóellenállást is egy 4,7 kiloohmos ellenállással.
Fotóellenállást eddig nem használtunk. Ez egy olyan alkatrész, amelynek vezetőképessége fény hatására – a fényelektromos hatás következtében – megnő, ezért fényérzékelőként használható. (LDR = Light Dependent Resistor) Működését tekintve minél jobban megvilágítjuk a fényérzékeny rétegét, annál kisebb lesz az ellenállása. Legnagyobb érzékenységét egy megadott fényhullámhossznál éri el, így vannak speciális fajtái, amelyek adott színekre érzékenyek, ezt spektrális érzékenységnek hívjuk. Jellemző tulajdonságai a világos-ellenállás értéke, melyet megvilágítással lehet elérni: 1000 luxhoz számolják és 100 ohmtól 2 kiloohmig terjedhet a skála; a másik a sötét-ellenállás érték, ami megvilágítás nélküli állapotában jellemző, ez megaohm nagyságrendű.
Fotóellenállás rajzjele
Fotóellenállás (LDR)
Bekötése: A hangszóró pozitív szára az ellenálláson keresztül a 9 pinbe, negatív oldala a földelésbe kerül bekötésre. A fotóellenállás egyik lábát (mindegy, milyen irányba kötjük be) az 5 V-ba, a másikat az analóg 0 pinbe és a 4,7 kiloohmos ellenálláson át a földelésbe is bekötjük.
Hangszóró bekötése fotóellenállással
Az analóg szenzorból kiolvasott értéket követi le majd a generált hangunk, ezáltal egy hajlítás jön létre. A kód nagyon egyszerű, a kiolvasott analóg értékeket szétosztja a hallható hangok értékéhez arányosítva (ebben az esetben leszűkítjük ezt a tartományt 120–1500 Hz közé). Az analóg szenzor által használt tartományt is beállítjuk 0–1023 helyett most 400–1000 közé, hogy jobban működjön a kód. A map() utasításban lévő paraméterek átállításával kísérletezhetünk.
Arduino kód: 12hajlitas
Analóg billentyűzet tone() függvénnyel
A következő feladathoz szükségünk lesz a 8 ohmos hangszórónkra a 100 ohmos ellenállással és három erőkifejtés-érzékelő ellenállásra, valamint hozzájuk három 10 kiloohmos ellenállásra.
Az FSR = Forse Sensitive Resistor, azaz erőkifejtés-érzékelő ellenállás olyan alkatrész, amelyben összenyomás hatására megváltozik az ellenállás: minél erősebben nyomjuk össze, annál kisebb lesz, tehát annál több áram jut át rajta.
Elektronok útja az FSR-ben.
Bal oldalon az alap, jobb oldalon az összenyomott állapot látható.
Több méretben, formában kapható
Bekötése: A hangszóró negatív lába a földelésbe, a pozitív a 100 ohmos ellenálláson keresztül a 8 pinbe kerül bekötésre. A nyomásérzékeny ellenállásokat párhuzamosan bekötjük az 5 V-ba, másik lábukat pedig az analóg 0, 1, 2 pinbe, valamint a 10 kiloohmos ellenállásokon át a földelésbe is a 7.8.3 számú ábra szerint.
Analóg billentyűzet bekötése
Arduino kód: 13analoghang
A kód kiolvassa a szenzorok értékeit – mindegyik egy hangnak felel meg a hangértékeket tároló tömbben. Ha a szenzorok értékének bármelyike a megadott küszöbérték felett van, akkor a hozzárendelt hang megszólal.
Ugyanazt a pitches.h fájlt használjuk, mint a dallam lejátszáskor. (Létrehozása a 7.6 alfejezetben található.) Ez tartalmazza a szokásos hangjegyek Hz-ben definiált generált hangját, pl. NOTE_C4 a közepes C hang.
Hang lejátszása több kimeneten tone() függvénnyel
Ez a példa megmutatja, hogyan játsszunk le különböző hangokat három hangszórón, több digitális kimenet használatával. A tone() utasítás az Atmega egyik belső időzítőjét használja, beállítja azt az általunk megadott frekvenciára és az időzítővel rezegteti a kimeneti pint. Mivel egy időzítőt használ, csak egyesével tudjuk lejátszani a hangokat, azonban több pinen egymást követően több hangot is lejátszhatunk. Ehhez ki kell kapcsolni az időzítőt az adott pinen, mielőtt a következő pinnel használni kezdjük.
A kód sorban minden egyes hangszórón egy hangot játszik le, úgy, hogy ez előző hangszórót előbb kikapcsolja – a hangok hosszát ebben az esetben a késleltetés idejével szabályozzuk.
Alkatrészek bekötése: A 100 ohmos ellenállásokon át a digitális 6, 7, 8 pinbe kötjük a hangszórók pozitív oldalát, a negatívokat pedig a földelésbe.
Több hangszóró bekötése
Arduino kód: 14tobbhangszoro
TONE library letöltése: https://code.google.com/p/rogue-code/downloads/detail?name=Arduino-Library-Tone.zip&can=2&q=
forrás: http://arduino.cc/en/Tutorial/HomePage, http://en.wikipedia.org/wiki/Photoresistor, http://en.wikipedia.org/wiki/Force-sensing_resistor, http://www.openmusiclabs.com/learning/sensors/fsr/