Soros port használata

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. Annyi hiányossága van a soros portnak, hogy a magyar ékezetes betűket nem szereti. Legalább is én eddig nem láttam olyan megoldást, ami ne kriksz-kraksz karaktereket jelenített volna meg a képernyőn. Így az egyszerűség kedvéért én egyenlőre lemondtam a magyar ékezetes betűk használatáról.
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:

  1. 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.
  2. 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!

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!

Mennyire volt hasznos amit olvastál?

Kattints egy csillagra az értékeléshez!

Sajnálom, hogy amit olvastál nem volt hasznos számodra!

Szeretném ha elégedett lennél!

Írd le kérlek, hogy mi nem tetszett!?