2014.06.17.
17:47

Írta: harsanyireka

09. Soros kommunikáció

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.

 9_1.jpeg

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!

 9_2.png

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:

 

9_4_2.png

 

9_4.png

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

9_5.png

Processing kód futásának eredménye

Soros adat küldése Max/MSP segítségével

 

9_6.png

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

9_7.png

A processing kódunk kimenete

Karakterek küldése Max/MSP segítségével

9_8.png

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. 

9_9.png

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:

9_10.png

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

9_11.png

Processinggel vizualizált grafikon

Adatok grafikus ábrázolása Max/MSP segítségével

9_12.png

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.

9_13.png

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

9_14.png

A potméterek elforgatásával virtuálisan színeket keverhetünk.

Virtuális színkeverő Max/MSP-ben 

9_15.png

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.

9_16.png

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

9_17.png

Körlap mozgatása két analóg szenzorral

 

Handshaking módszer Max/MSP oldalról

9_18.png

Max/MSP handshaking patch

 


forrás: http://arduino.cc/en/Tutorial/HomePage

 

Szólj hozzá!

Címkék: processing leckék soros port lektorált

A bejegyzés trackback címe:

https://harsanyireka.blog.hu/api/trackback/id/tr506307576

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.
süti beállítások módosítása