Adatáramlás Arduinók között

|

Szeretnél projektedben egyszerre több mikrovezérlőt is bevetni? Mutatjuk, miként érdemes megvalósítanod az eszközök közötti jelátvitelt.

Komplexebb projektekben előbb-utóbb eljutsz arra a pontra, amikor már nem elegendő egyetlen mikrovezérlő az összeállítás megfelelő kezeléséhez. Több készülék együttes irányításához azonban tudnod kell, hogy miként zajlik az adatáramlás e modellek között. Természetesen számos módszer és protokoll közül választhatod ki a számodra legideálisabb megoldást, sőt, ha igazán elszánt vagy, akár vezeték nélkül is elérheted, hogy az Arduinók információt osszanak meg egymással.

A kezdőknek azonban nem igazán érdemes egyből a legkomplexebb megoldásokkal kísérletezni. Számos olyan kapcsolat kialakítása lehetséges, amely ideális bevezetést nyújt ebbe a világba, és hosszútávon is problémamentesen használható. Közülük is talán a legegyszerűbben az I2C (Inter-Integrated Circuit, integrált áramkörök közötti) segítségével hozhatod közös nevezőre a mikrovezérlőidet.

A protokoll lényege, hogy alárendeltségi kapcsolatot alakít ki a két eszköz között: az inputokat fogadó és továbbító lapka a master pozíciót tölti be, míg a másik Arduino (amire leggyakrabban csak slave-ként hivatkozunk) végrehajtja a kapott paraméterek alapján a rábízott feladatokat. Cikkünkben egy egyszerűen megvalósítható, ám mégis látványos projekten keresztül mutatjuk be, hogy mit is takar az I2C kommunikáció.

Hardverek induláshoz

Komolyabb kiegészítők nélkül is belevághatsz két eszköz programozásába, mindössze arra van szükséged, hogy a megfelelő kapcsolatot kínáló kábelmennyiség (minimum kettő) a rendelkezésedre álljon, ezekkel már élesítheted az alapvető adatáramlást közöttük. Ha a cikkben bemutatott projekttel szeretnél haladni, akkor javaslunk beszerezni egy prototípus lapkát, valamilyen beviteli komponenst (gomb, szenzor, potméter) és az összekapcsoláshoz szükséges vezetékeket, esetleg még egy LED-et is (igaz az Arduino 13-as portja melletti beépített diódát is használhatod).

Ezzel a néhány extra kellékkel már látványos eredményt érhetsz el, és éles szituációkban is megtapasztalhatod az I2C kommunikáció működését, ami a későbbi alkalmazásaid elkészítése során rendkívül hasznos lehet. Alapvetően a két Arduino fizikai összeköttetését az A4-es és az A5-ös portok segítségével valósíthatod meg, emellett az analóg oldal földelési portjai (GND feliratú) között is érdemes vezetned egy kábelt.

Ezenkívül a prototípus lapkán helyezd el a bevitelhez használni kívánt hardverelemet (ami mintaprojektünkben egy gomb), majd kapcsold is azonnal egy kábellel a 2-es digitális bemenethez és természetesen az 5 V-os és a digitális oldal földcsatlakozójához is. Ha minden alkatrész elfoglalta a helyét, a konfigurációd el is készült, jöhet a kód.

Mesterkód

Első lépésként indítsd el az Arduino fejlesztői környezetét, és nyiss egy új projektet. Mivel külön kell kódot készítened mindkét modelledre, akár rögtön indíthatsz egy második új projektet is. Különösen figyelj a mikrovezérlők csatlakoztatást követően elfoglalt portsorrendjére - főleg, hogy az alapvető áramellátáshoz érdemes mindkét eszközt egyidejűleg számítógépedre kötni -, mert egyáltalán nem mindegy, hogy melyik kommunikációs csatornán továbbítod az épp befejezett kódodat.

Elsőként a masterrel jelzett Arduinót érdemes felprogramoznod, az alkalmazásod pedig mindenképp arra a készülékre kerüljön, amelyikhez a beviteli gombodat csatlakoztattad, mert csak így leszel képes majd kezelni a beérkező jeleket. A főnökmodelledre szánt kódban a setup() függvény előtt üss néhány Entert, és az üres sorokba illeszd be az #include<Wire.h> kifejezést, majd jöhet a változóid felsorolása.

Elsőként egy állapotváltozót hozz létre gomb néven, ami egy egész szám, és az alapértelmezett értékét 0-ra állítjuk (int gomb=0). A későbbiekben ezt az információt kell majd módosítanod 1-re abban az esetben, ha valaki megnyomta a gombot, illetve visszaállítani 0-ra, ha épp nem történt semmi.

Természetesen a fizikai kapcsolódhoz ezen a változón kívül hozzá kell rendelned azt a pint, amire csatlakoztattad, ami jelen esetben a 2-es digitális bemenet (const int gombPin = 2; ). A pin mellett szükséged lesz még egy olyan változóra is, amelyben eltárolhatod a gombról érkező (HIGH és LOW) állapotokat, ehhez szintén egy számtípust használj, aminek kezdeti értéke legyen 0 (int gombStatusz =0; ).

A függvények módosítgatásához már csak egyetlen deklaráció szükséges, ami ismételten egy egész szám, melyben a második Arduino azon pinjét kell megadnod, amire a LED-et kapcsolatd. Mivel a fedélzeti diódát szeretnénk elérni, ezért jelen esetben a 13-as portra kell majd hivatkoznod (int masodikEszkoz=13; ).

Ha idáig eljutottál, akkor a setup belseje következik, ahol az induláskor szükséges társításokat kell megadnod. Először a gombot állítsd be bemeneti adatként ( pinMode(gombPin, INPUT); ), majd a Wire.begin(); segítségével élesítsd az I2C kapcsolatot, végül pedig a soros monitort is kapcsold be ( Serial.begin(9600); ).

Ezek után át is léphetsz a loop függvény törzsébe, ahol a ciklikus olvasások során tárold el az aktuális gombállapotot a gombStatusz változóba (gombStatusz = digitalRead(gombPin); ). A következő sorokban pedig jöhet is a státuszok összevetése és ez alapján a gomb változó beállítása ( if(gombStatusz == HIGH){ gomb=1;} else{ gomb=0;} ), végül pedig ezt az aprócska információt postázd a másik eszközöd címére ( Wire.beginTransmission(slaveCim); Wire.write(gomb); Wire.endTransmission(); ).

Egy minimális késleltetéssel zárd is le a kódot (delay(200); ), ami mehet is fel az elsődleges eszközödre (ha valamilyen külső áramforrással rendelkezel, érdemes kihúzni a csatlakoztatott kábelt, hogy a feltöltésnél ne legyen keveredés).

Szolgasors

Hasonlóan nyúlj majd a slave-re szánt kódod üres felületéhez is, mint a master esetén tetted, elsőként itt is az #include<Wire.h> kifejezéssel kell kiegészítened, majd szintén a változók megadása következik. Jelen esetben ebből csak kettőre lesz szükséged: egyre, amely a LED-ed 13-as portját hívja meg ( int LED = 13; ), valamint egyre, amely majd a másik mikrovezérlőtől érkező adatot tárolja el ( int gomb=0; ).

Ezek megadása után a setup törzsében állítsd be a LED-et rejtő csatlakozót kimenetként ( pinMode(LED,OUTPUT); ), majd a Wire.begin(13); kóddal aktiváld a kapcsolatot a két készüléked között, és fogadd a beérkező jelet (Wire.onReceive(bejovoErtek); ) is. Természetesen ezt a bejovoErtek függvényt el kell még készítened, hisz itt olvashatod be a masterről érkező jeleket, és adhatod meg az x értékét (void bejovoErtek(int bytes){ gomb = Wire.read();} ).

Ezek után a loopban már nem lesz más dolgod, mint összehasonlítani a gomb értékét a bejövő információkkal, és 1-es esetén felkapcsolni, 0-nál pedig lekapcsolni a LED-et. Ezzel nagyjából el is készültél a második kód összeállításával is, vagyis mehet fel a slave eszközre is a programod.

Amint mindkét modellen fut a megfelelő alkalmazás, tesztelheted is a végeredményt: a mester Arduinóról küldött utasítás alapján a második számú mikrovezérlőd képes elvégezni a rábízott feladatot. Ezzel a kommunikációs protokollal könnyedén összeköthetsz több mikrovezérlőt is. Ha úgy tűnik, hogy egy komplexebb projekthez kevés a rendelkezésedre álló csatlakozó, viszonylag egyszerűen bővítheted extra slotokkal a bemenetek számát.

Kódok

Mester:

#include <Wire.h>

int gomb=0; int masodikEszkoz = 13; const int gombPin = 2; int gombStatusz = 0;

void setup(){ pinMode( gombPin, INPUT ); Wire.begin(); Serial.begin(9600); }

void loop(){

gombStatusz = digitalRead(gombPin); Serial.print(gombStatusz);

if (gombStatusz== HIGH){ gomb = 1;} else{gomb = 0; }

Wire.beginTransmission(masodikEszkoz); Wire.write(gomb); Wire.endTransmission(); delay(200);

}

Slave:

#include <Wire.h>

int LED = 13; int gomb = 0;

void setup(){ pinMode (LED, OUTPUT);Wire.begin(13);Wire.onReceive(bejovoErtek);}

void bejovoErtek(int bytes){ gomb = Wire.read();}

void loop(){

if (gomb == 1) { digitalWrite(LED, HIGH);delay(200);}

if (gomb == 0) {digitalWrite(LED, LOW);delay(200);}

}

Úgy tűnik, AdBlockert használsz, amivel megakadályozod a reklámok megjelenítését. Amennyiben szeretnéd támogatni a munkánkat, kérjük add hozzá az oldalt a kivételek listájához, vagy támogass minket közvetlenül! További információért kattints!

Engedélyezi, hogy a https://www.helloworldonline.hu értesítéseket küldjön Önnek a kiemelt hírekről? Az értesítések bármikor kikapcsolhatók a böngésző beállításaiban.