Ha szeretnéd megérteni, pontosan hogyan működik a soros adatátvitel, akkor itt találsz egy kicsit részletesebb leírást. Az alábbi funkciók használatához ez nem szükséges, de ha van időd, nem árt elolvasni!
A soros port tulajdonképen az Arduino és az ember közötti kommunikáció legolcsóbb módja. A program futásakor keletkező adatokat egyszerűen továbbítjuk a PC-re, és megjelenítjük a képernyőn. A bonyolultabb programok fejlesztésekor, hibakereséskor is ez a legegyszerűbb eszköz a működés nyomon követésére. Kiírhatjuk hol jár a program, mik az aktuális változó értékek. Mindkét fejlesztési környezeteben rendelkezésünkre áll a soros port kezelésére néhány egyszerű program utasítás.
Most pedig mutatok is egy egyszerű példát, hogyan lehet adatokat kinyerni az Arduino-ból, és egyben arra is, hogyan lehet betuszkolni adatokat az Arduino-ba.
A példa program a következőket csinálja:
- Megnyitja a kommunikáció számára a soros portot 9600 baud (bit/sec) sebességgel. A sebesség mértékegysége a soros port esetében a baud, ami a másodpercenként átvitt bitek száma. Mivel egy byte átviteléhez kell egy start, egy stop bit, sőt néha még egy paritás bit is, valamint az egyes byte-ok átvitele között idő is telik el, a tényleges átviteli sebesség 600 byte körül adódik másodpercenként. Mérési eredmények átviteléhez ez bőven sok. Ha videót akarnánk továbbítani, akkor pedig reménytelenül kevés.
- A program az Arduino 12-es kivezetését definiálja bemenetnek, a 13-as kivezetést pedig kimenetnek. Értelem szerűen a 12-es lábra nyomógombot kell kötni felhúzó ellenállással, míg a 13-as lábra egy led-et soros ellenállással. Az alábbi ábrát a tavir.hu weboldalról vettem kölcsön:
Sajnos a programot nem ugyanazokra a kivezetésekre írtam meg mint amit az ábrán
látni, de remélem ez nem zavaró túlságosan.
- A program egy végtelen ciklusában másodpercenként megnézi a 12-es kivezetés állapotát (nyomógomb), és az eredményt kiírja a soros portra.
- A program másodpercenként beolvas egy karaktert a soros portról a PC felől, és megnézi a beolvasott karakter kódját. Ha ez 49, ami a billentyűzeten az „1”-es szám lenyomásának felel meg, akkor fel vagy lekapcsolja a 13-as kivezetésre kötött LED-et. Először megnézi a kimenet állapotát, és ha az 0, akkor beállítja a kimenetet 1-re, ha pedig a kimenet állapota 1-volt, akkor beállítja 0-ra.
- Ha egy kiválasztott billentyű kódját kapja meg, akkor lezárja a soros kommunikációt. Az Arduino C programban erre a „2”-es billentyűt használtam, aminek a kódja 50. A BASCOM programban az ESC billentyűt figyelem, aminek a kódja 27. A két program nem teljesen azonos megoldást tartalmaz, mivel a beépített soros kommunikációs programoknak más a működése. A példa programok után erről még írok pár sort.
A kommunikáció lezárására nem lenne igazán szükség, mégis beépítettem a programba, mert egy számomra érthetetlen jelenséget tapasztaltam a BASCOM környezetben. Az történt, hogy miután beégettem a programot a BASCOM-al az Arduino Uno R3-ba, többé nem tudtam új programot beégetni. Kommunikációs hibát jelzett a BASCOM. Nyilván összefügg a dolog azzal, hogy a program ugyanazt a soros portot használja, amin keresztül a program beégetés is folyna. A problémát kétféle módon sikerült megoldani. Először is kipróbáltam, hogy amikor a BASCOM-al már nem tudok programot égetni, akkor mit csinál az Arduino C program. Meglepő módon minden hiba nélkül beégetett bármilyen programot. Vettem hát a klasszikus „Blink” programot és beégettem az Arduino Uno-ra, így már a BASCOM is tudott újra kommunikálni. A másik megoldás már inkább megelőző jellegű. Beépítettem az említett soros port bezáró programrészt a „2”-es illetve BASCOM-ban a „ESC” billentyűre. Így már nem tapasztaltam a jelenséget.
byte test=0; //deklarálunk egy test nevű változót, kezdő értéke 0 void setup() { Serial.begin(9600); //soros kommunikáció indul 9600boud sebességgel pinMode(13, OUTPUT); //Arduino 13-as kivezetés kimenet lesz pinMode(12, INPUT); //Arduino 12-es kivezetés bemenet lesz } void loop() { Serial.print("Bemenet allapota:"); //kiírjuk a soros portra a szöveget Serial.println(digitalRead(12)); //kiírjuk a soros portra a szöveg mögé a 12-es kivezetés állapotát, és sort emelünk test=Serial.read(); //beolvasunk a soros portról egy byte-ot a test nevű változóba if (test==49){ //ha test változó értéke 49 ("1"-es billentyű), akkor if (digitalRead(13)==LOW) { //ha a 13-as kivezetés alacsony szinten van (led nem világít) digitalWrite(13,HIGH); //akkor magasra kapcsoljuk a 13-as kivezetést (led világít) Serial.println("LED vilagit"); //soros portra kiírjuk a szöveget } else { //ha a 13-as kivezetés magas volt akkor (led éppen világított) digitalWrite(13,LOW); //a 13-as kivezetést alacsony szintre állítjuk (led nem világít) Serial.println("LED nem vilagit"); //a soros portra kiírjuk a szöveget } } if (test==50){ //ha a test változó értéke 50 ("2"-es billentyű) akkor a soros portra kiírjuk a szöveget Serial.println("Soros kommunikacio lezarva!"); Serial.end(); //soros kommunikáció lezárása } delay(1000); //időzítünk 1 másodpercet }
Arduino C
A program beégetése után el kell indítani a soros monitort. Ezt az eszközök menüpontban találjuk:
Miután a menüpontok kiválasztottuk azonnal megjelenik a soros monitor. Ekkor az Arduino Uno kap egy reset jelet és a program újraindul. Másodpercenként megjelenik a „Bemenet allapota:1” felirat, hiszen a programot így írtuk meg. Ha nem jelenne meg ez a sor, akkor ellenőrizzük a soros monitor képernyője alján a portsebességet, és ha nem 9600, akkor állítsuk be.
Ha karaktert akarunk küldeni a soros porton keresztül, akkor az ablak tetején lévő beviteli mezőbe írhatjuk be, és meg kell nyomnunk a küldés gombot, vagy leütni ez entert. Egyszerre akár több karaktert is beírhatunk.
BASCOM
$regfile = “m328pdef.dat” ’ATmega3218P chipet használunk $crystal = 16000000 ’órajel 16Mhz $baud = 9600 ’sorosport sebességet 9600boud-ra állítjuk Config Portb.5 = Output ’13-as arduino láb kivezetés Config Portb.4 = Input ’12-es arduino láb bemenet Dim Test As Byte ’Deklarálunk egy test nevű változót, ebbe ’olvassuk be a lenyomott billentyű kódját, ‘amit a soros porton keresztül kap meg ‘az arduino Test = 0 ’test változó kezdő értéke 0 Do Print “Bemenet allapota:” ; Pinb.4 ’Kiírjuk a soros portra a 12-es arduino ‘kivezetés (bemenet) jelszintjét Test = Inkey() ’az inkey() beolvassa a soros portról ‘az utoljára lenyomott billentyű kódját If Test = 49 Then ’ha az utoljára lenyomott billentyű ‘kódja 49 (ezt az “1”-es számjegy), akkor If Portb.5 = 0 Then ’megnézzük a kimenet állapotát és ha 0, akkor Portb.5 = 1 ’kimenetet 1-re kapcsoljuk, led világit Print “LED vilagit” Else ’egyébként Portb.5 = 0 ’kimenetet 0-ra kapcsoljuk, led elalszik Print “LED nem vilagit” End If End If Waitms 1000 ’várunk 1000ms-ot, és újra lefut a ciklust Loop Until Test = 27 ’ha esc gombot nyomunk, akkor kilépünk a ciklusból End
A terminal programnak futni kell, különben hiába nyomkodjuk a gombokat!
A soros porttal nagyon egyszerűen tudunk adatokat küldeni két Arduino között is. Ennek részleteiről itt található további információ!
Most, hogy láttunk gyakorlati példát a soros port kezelésére és használatára, itt az ideje, hogy megismerkedjünk egy nagyon kényelmes kommunikációs megoldással az I2C busszal. Kattints ide, ha szeretnéd megismerni!