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
Az Arduino mikrovezérlőjén (AVR ATmega) van két olyan I/O csatorna (D0 és D1), amelyeknek megkülönböztetett funkciójuk van – a két kivezetést együtt soros portnak nevezzük, amin keresztül adatokat cserélhetünk a környezet és a mikrovezérlő között. Az egyik csatorna az adatok fogadásáért (Rx – receiver), a másik pedig küldéséért felel (Tx – transmitter). A soros átvitel szekvenciálisan zajlik, vagyis egy időben egyetlen bit halad át a csatornán. Ennek megfelelően a kommunikáció sebességét a másodpercenként átvitt bitek számával mérjük és BPS-sel (Bits Per Second = Bit per másodperc) jelöljük. Az Arduino maximális átviteli sebessége 115200 bit másodpercenként.
A soros átvitelt jelző LED-ek és az USB átalakító
Ahhoz, hogy számítógépünk könnyedén kapcsolódhasson a mikrovezérlőhöz, az Arduino tartalmaz egy soros USB átalakítót (FTDI), mely a fent említett csatornákhoz kapcsolódik és létrehozza a kapcsolatot az univerzális soros busszal (USB). Az adatok ugyan bitenként, de egymástól jól elhatárolható csomagokban közlekednek. Ezek a blokkok START jelből, 8 bit adatból (1 byte) és két STOP jelből állnak.
Az ASCII, vagyis az American Standard Code for Information Interchange 1963 óta szabványa a szöveg típusú adatok digitális tárolásának és átvitelének. Az általános kódtáblázat 128 karakterből áll, melynek alapját az angol ABC kis- és nagybetűi, írásjelek, számok és matematikai kifejezések képezik. Ezeken felül 33 grafikusan nem megjeleníthető, úgynevezett vezérlőkarakter is helyet kapott, mint a „soremelés”, „fájl vége”, „fejléc kezdete”, melyek egy része ma már nem használatos. A kódtáblát legegyszerűbben egy számozott sorozatként képzelhetjük el, ahol a nulladik helytől a 31-ig a vezérlőkarakterek, 32-től 126-ig a megjeleníthető karakterek találhatók, a sort pedig a „törlés” nevű vezérlőkarakter zárja. Soros kommunikáció esetén az adat értéke egyszerűen a táblázat egyik elemének sorszámát jelöli.
Az ASCII kódtábla
Példánkon keresztül megérthetjük, hogyan értelmezi mindezt az Arduino, és megismerjük a kiterjesztett soros nyomtatási funkciókat. Nyomtassuk ki a soros terminálunkra az ASCII táblázat grafikus elemeit és a hozzájuk tartozó értékeket decimális, hexadecimális, oktális és bináris formátumokban!
A soros terminált a keretprogram jobb oldalán található ikonra kattintva érhetjük el.
Arduino kód: 20ASCII
Csak egy számítógéphez kötött Arduinora lesz szükségünk.
ASCII Table ~ Character Map:
!, dec: 33, hex: 21, oct: 41, bin: 100001
", dec: 34, hex: 22, oct: 42, bin: 100010
#, dec: 35, hex: 23, oct: 43, bin: 100011
$, dec: 36, hex: 24, oct: 44, bin: 100100
%, dec: 37, hex: 25, oct: 45, bin: 100101
&, dec: 38, hex: 26, oct: 46, bin: 100110
', dec: 39, hex: 27, oct: 47, bin: 100111
(, dec: 40, hex: 28, oct: 50, bin: 101000
), dec: 41, hex: 29, oct: 51, bin: 101001
*, dec: 42, hex: 2A, oct: 52, bin: 101010
+, dec: 43, hex: 2B, oct: 53, bin: 101011
,, dec: 44, hex: 2C, oct: 54, bin: 101100
-, dec: 45, hex: 2D, oct: 55, bin: 101101
., dec: 46, hex: 2E, oct: 56, bin: 101110
/, dec: 47, hex: 2F, oct: 57, bin: 101111
0, dec: 48, hex: 30, oct: 60, bin: 110000
1, dec: 49, hex: 31, oct: 61, bin: 110001
2, dec: 50, hex: 32, oct: 62, bin: 110010
3, dec: 51, hex: 33, oct: 63, bin: 110011
stb....
A program kimenete (ezt látjuk a soros terminálban)
Adatátvitel PC-ről Arduinora
Azon túl, hogy a soros terminálban képesek vagyunk adatok megjelenítésére – ami nagyon hasznos lehet az Arduino programjának írása közben hibák felderítésénél (debug), a hozzákapcsolt szenzorok érzékenységének beállításakor, a kiváltani kívánt hatások ellenőrzésekor –, használhatjuk az adatkapcsolatot arra is, hogy a számítógépünkön megírt komplex programok a fizikai környezetet az Arduinon, mint periférián keresztül érjék el.
A következő példában egy Arduinohoz kapcsolt LED fényerejét fogjuk változtatni számítógépről küldött adatokkal. Ahogy a fentiekben, most is byte-okat fogunk küldeni, melyek értéke 0-tól 255-ig változhat. Ezeket beolvassuk az Arduinoval és hozzárendeljük a LED fényerejét meghatározó értékhez.
Bármilyen programot használhatunk a kommunikációhoz, ami képes gépünk soros portját megnyitni. Nézzük meg, hogyan lehetséges ez Processing és Max/MSP5 környezetekből!
Amire szükségünk lesz:
- Arduino,
- LED,
- 220 – 1 kiloohmos ellenállás,
- Processing vagy,
- Max/MSP v. 5.
LED polaritása és bekötése az Arduinoba
Kössük a LED-ünk (10.4. ábrán) negatívval jelölt lábát az Arduino földjéhez (GND), a pozitívval jelölt lábát pedig egy soros ellenálláson keresztül a 9-es I/O csatornájához – amit most impulzusmodulációra (PWM) képes kimenetként fogunk használni.
Arduino kód: 21LEDsoros
Soros adat küldése Processing segítségével
Hozzunk létre egy 256 pixel széles képernyőt, amin az egér aktuális vízszintes koordinátája jelenti majd az Arduinohoz kötött LED fényerejét (0–255). Vizualizáljuk az elvárt kimenetet függőleges vonalakból álló, feketéből fehérbe változó gradienssel. Küldjük ki az egér pozícióját sorosan byte-onként!
Processing kód: 22Processing
Processing kód futásának eredménye
Soros adat küldése Max/MSP segítségével
Byte küldése Max/MSP-vel
Vezérlés karakterekkel
Nézzünk az előző kapcsolással még egy példát! Az Arduinohoz csatlakoztatott LED-et fogjuk ki- és bekapcsolni általunk meghatározott karakterekkel. Bármely soros kommunikációra alkalmas programból elküldhetjük a karaktereket, az Arduino fejlesztőkörnyezetének saját soros termináljából is.
Arduino kód: 23Karakter
Karakterek küldése Processing segítségével
Az alábbi kód egyszerre példa meghatározott karakterek soros küldésére és egy egyszerű egérre reagáló gombra. Amikor egerünket a gombként működő négyzet fölé visszük, az Arduinohoz kapcsolt LED bekapcsolódik.
Processing kód: 24KarakterProc
A processing kódunk kimenete
Karakterek küldése Max/MSP segítségével
Vezérlés karakterekkel Max/MSP-vel
Switch feltétel használata soros kommunikációban
Itt még érdemes kitérnünk az Arduino nyelv egy funkciójára, amelynek segítségével diszkrét értékekhez rendelhetünk végrehajtandó kódrészeket. Ahogy az if esetében két – a feltételnek megfelelő és az annak nem megfelelő – állapot közül választhatunk, addig a Switch (case) feltétel esetében egy változó minden értékével különálló feltételt tudunk megvalósítani.
Amire szükségünk lesz:
- Arduino,
- 5 db LED,
- 5 db 220 – 1 kiloohmos ellenállás,
- próbapanel,
- vezetékek,
- Processing vagy,
- Max/MSP v. 5.
Kapcsolás a switch() feltétel megértéséhez
Csatlakoztassunk az Arduino 2, 3, 4, 5, 6-os csatornáihoz egy-egy LED-et soros ellenállással, az eddigi példáknak megfelelően. Az, hogy melyik LED fog világítani, az a sorosan beolvasott karaktertől függ, ami az alábbi kód szerint a, b, c, d vagy e lehet.
Arduino kód: 25switch
A processing kódot és a MAX patchet az előzőek alapján át tudjuk alakítani. A fent meghatározott L és H karaktereket felválthatjuk a, b, c, d, e bármelyikére és kibővíthetjük a programunkat többgombosra is, az Arduino program kipróbálásához azonban elegendő a soros terminál is.
Adatátvitel Arduinoról PC-re
Fordítsuk meg az eddig taglalt folyamatot, és nézzük meg, hogyan lehet az Arduino által gyűjtött fizikai jeleket a számítógépbe eljuttatni. Legyen a szenzorunk az egyik analóg (ADC) bemenetre kötött potenciométer, amivel a tápfeszültséget leosztjuk annál kisebb feszültségekre, hogy a beolvasott 1024 lehetséges állapot közül a potméter elfordításával tudjunk választani. A beolvasott értéket aztán átadjuk a soros porton keresztül a számítógépnek, ahol grafikusan feldolgozzuk.
Amire szükségünk lesz:
- Arduino
- 10–100 kiloohmos potenciométer (3 db)
- Processing vagy
- Max/MSP v. 5
Potenciométer, mint analóg szenzor bekötése
Kössük a potméterünk egyik szélső lábát az Arduino föld- (GND), a másikat az 5 V-os tápcsatlakozójába. Ha feszültségmérővel a föld és a potméter középső lába között mérünk, azt fogjuk látni, hogy a potméter elforgatásával a feszültség 0–5 V között változik. Ezzel a módszerrel bármikor lemodellezhetjük az összes analóg módon működő szenzort. Az ilyen típusú érzékelők a mért fizikai paramétereket az általuk kibocsátott feszültség szintjével állítják valamilyen arányú összefüggésbe. Kössük a potméter középső lábát az Arduino A0 analóg bemenetére, a digitalizált érték 0–1023 között fog változni.
Arduino kód: 26PotiSoros
Adatok grafikus ábrázolása Processing segítségével
Az alábbi példakód beolvassa az Arduino által sorosan elküldött adatokat, és minden új adatot egy olyan grafikonon ábrázol, amelyen a függőleges vonalak hossza arányos a potméterünkkel beállított feszültséggel.
Processing kód: 27GraphProc
Processinggel vizualizált grafikon
Adatok grafikus ábrázolása Max/MSP segítségével
Max/MSP patch Arduinoból sorosan olvasott adatok vizualizációjára
Több független adat átvitele
Bővítsük ki az előző példát, és nézzük meg, hogyan lehet egyszerre több bemenet értékét eljuttatni a számítógépbe. A kapcsolás lényegében lehet ugyanaz, mint eddig, azzal a különbséggel, hogy 3 db potenciométer kapcsolódik három különálló analóg bemenethez, A0-hoz, A1-hez és A2-höz. Ha rendelkezünk más jellegű érzékelőkkel, például fényérzékeny ellenállásokkal, akkor az alábbi feszültségosztó kapcsolást is használhatjuk.
Több analóg érzékelő bekötése Arduinoba
Arduino kód: 28analog3
Az analóg bemenetek értékeit továbbra is decimális kódolású ASCII karakterekként küldjük el, vagyis egy háromjegyű szám átvitelekor három egymást követő byte-ot továbbítunk. ASCII-ben az 1-es számértéke 49, a 2-es számértéke 50 és így tovább. (Lásd ASCII tábla.) A három szenzor értékét a számítógépes példakódokban három színcsatorna (piros, zöld, kék) intenzitásának változtatására fogjuk felhasználni.
Virtuális színkeverő Processingben
Processing kód: 29szinkeveroProc
A potméterek elforgatásával virtuálisan színeket keverhetünk.
Virtuális színkeverő Max/MSP-ben
A potméterek elforgatásával virtuálisan színeket keverhetünk.
Kétirányú kapcsolat – meghívás és válasz
Előfordulhat, hogy a szenzorértékek beolvasása vagy a kimenetek kapcsolása önmagában nem elegendő, és kétirányú kapcsolatot kell létrehozni az Arduino és a számítógép között. Erre léteznek különféle protokollok, melyek közül a legismertebb a Firmata – aminek működésére később kitérünk. Azonban most nézzünk egy jóval egyszerűbb megoldást, az úgynevezett Handshaking módszert. A példában az Arduino indulásakor egy A karaktert küld a számítógépnek, ezt követően a hozzá kapcsolt három szenzor értékét is továbbítja. Ha a számítógép készen áll és megkapta a „Start jelet” (A), beolvassa a szenzorok értékét és visszaküld egy A karaktert az Arduinonak, hogy folytassa az adatok küldését.
Amire szükségünk lesz:
- Arduino,
- 2 db analóg szenzor,
- 1 db nyomógomb,
- 3 db 10 kiloohmos ellenállás,
- próbapanel,
- vezetékek,
- Processing, vagy
- Max/MSP v. 5.
Két érzékelő és egy gomb bekötése
Kössünk be két analóg érzékelőt az A0 és A1 analóg bemenetekre, illetve egy nyomógombot a 2-es digitális csatornára. A két analóg érzékelő működését modellezhetjük potméterekkel, lásd a virtuális színkeveréskor használt kapcsolást.
Arduino kód: 30ketiranyu
Handshaking módszer Processing oldalról
Az analóg szenzorokkal egy körlapot mozgatunk a képernyőn, a nyomógombbal a körlap színét változtatjuk feketére.
Processing kód: 31ketiranyuProc
Körlap mozgatása két analóg szenzorral
Handshaking módszer Max/MSP oldalról
Max/MSP handshaking patch
forrás: http://arduino.cc/en/Tutorial/HomePage