Close

Propojujeme Arduino s jinými zařízeními

Sběrnice I2C a propojení dvou Arduin

V dnešním článku se budeme zabývat možnostmi připojení více desek Arduino k sobě a jejich vzájemné komunikace. Na začátku si předvedeme propojení přes sériovou linku, poté si ukážeme, jak k Arduinu připojit bluetooth modul. Nakonec si představíme sběrnici I2C.

 

Sériová linka

Většinu funkcí, které se pro sériovou komunikaci používají, jsme si popsali v pátém článku. Ve článku desátém jsme si je poté předvedli více prakticky ve spojení s prostředím Processing. Dnes si připojíme k sobě dvě Arduina (v mém případě Arduino Leonardo a Arduino Mega) a ukážeme si, jak spolu můžou komunikovat.

 

Propojení

V první řadě musíme Arduina správně spojit. To zde ale bude velmi jednoduché. Na obou deskách najdeme piny Rx (receive = přijmout) a Tx (transmit = odeslat). Tyto dva piny slouží právě pro sériovou komunikaci a za chvíli si ukážeme, jak sem připojit bluetooth modul. Desky k sobě propojíme tak, že Rx jedné desky bude připojeno na Tx druhé (jedna odesílá, druhá přijímá). Pozor! Jak už jsem zmínil dříve, některé typy desek mají více sériových portů. Ty jsou označeny Rx0, Rx1 atd. V tomto případě nezáleží na tom, jaké piny použijeme. Musíme ale použít vždy dvojici se stejným číslem. Také musíme mírně změnit kód. Pro piny Rx0 a Tx0 použijeme většinou funkce začínající Serial., pro Rx1 a Tx1 to budou funkce Serial1. atd. V našem případě budeme využívat Rx1 a Tx1 u Leonarda a Rx0 a Tx0 u Arduino Mega. Většinou platí, že Tx nalezneme na pinu 1 a Rx na pinu 0. Pokud bude napájená pouze jedna deska, musíme spojit 5V a GND obou desek.

Poznámka: Pozor! U Arduino Leonardo se situace ještě trochu komplikuje – má totiž od sebe oddělenou hardware a USB sériovou linku. Pro komunikaci přes USB využijeme funkci začínající Serial., pro hardware komunikaci (náš případ) využijeme Serial1..

Jelikož jsme si jednotlivé funkce popsali již v minulých dílech, přejdeme rovnou na příklad. Na Arduino Leonardo připojíme tlačítko. Pokud bude stisknuté, po sériové lince budeme odesílat hodnotu ‚H‘, jinak odešleme hodnotu ‚L‘. Jak už jsem napsal před chvílí – zapojení je velmi jednoduché. Rx jedné desky připojíme na Tx druhé a GND a 5V obou desek připojíme k sobě.

Propojení Arduina Leonardo s Arduinem Mega

Propojení Arduina Leonardo s Arduinem Mega

Arduino, na kterém je připojeno tlačítko (u nás Leonardo), bude fungovat jako vysílač. Jeho úkolem bude zjišťovat, jestli je tlačítko stisknuté. Pokud bude, odešle po sériové lince funkcí Serial.print() znak ‚H‘, v opačném případě odešle ‚L‘.

byte tl = 3; //tlačítko void setup(){ pinMode(tl, INPUT); Serial1.begin(9600); } void loop(){ if(digitalRead(tl) == HIGH){ Serial1.print("H"); } else{ Serial1.print("L"); } delay(100); } 

Druhé Arduino (zde Mega) bude mít za úkol přijímat zprávy ze sériové linky a pokud nalezne znak ‚H‘, tak rozsvítí LED diodu. Ke zpracování dat použijeme funkce Serial.available() a Serial.read(). Co tyto funkce dělají, si můžete připomenout v pátém článku .

void setup(){ pinMode(13, OUTPUT); Serial.begin(9600); } void loop(){ while(Serial.available()){ char a = Serial.read(); if(a == 'H'){ digitalWrite(13, HIGH); } else if(a == 'L'){ digitalWrite(13, LOW); } } } 

Další příklady by byly pouhé opakování věcí z minula. Pojďme se nyní podívat, jak může Arduino komunikovat s BT.

Poznámka: Na Arduino Esplora piny Rx a Tx nenajdete.

 

Bluetooth

Naštěstí pro nás existuje celá řada modulů (a nejenom bluetooth), které jsou určeny pro ovládání přes sériovou linku. K jejich ovládání se většinou nepoužívá nic jiného, než nám známé funkce pro sériovou komunikaci. U některých si musíme dát pozor na napájení. Nemusí být totiž určeny na napětí 5V a mohly by být poškozeny. To však neplatí o modulech přímo určených pro Arduino. Jedním z takovýchto bluetooth modulů je BlueSMiRF Silver, popřípadě o třídu vyšší BlueSMiRF Gold.

Bluetooth modul BlueSMiRF Silver

BlueSMiRF Silver

Modul zapojíme stejným způsobem jako Arduino v minulém příkladu.

Arduino Modul
Tx Rx
Rx Tx
+5V VCC
GND GND

 

Tímto je modul zapojen a my se můžeme pustit do programování.

 

Odeslání a zpracování dat z potenciometru

Na pin A0 si připojíme potenciometr. Na něm naměřené hodnoty budeme přes bluetooth odesílat do PC a pomocí Processing zpracovávat. PC identifikuje bluetooth zařízení stejným způsobem jako připojené Arduino. Náš modul tedy bude také připojen na nějaký COM port. Výchozí rychlost komunikace obou uvedených modulů je 115200 bps. Program v Arduinu má velmi jednoduchou funkci – přečti hodnotu a pošli ji přes bluetooth do PC.

void setup(){ Serial.begin(115200); } void loop(){ Serial.println(analogRead(A0)); delay(10); } 

Před začátkem komunikace musíme PC s modulem spárovat. Zapneme bluetooth u PC a vyhledáme BT zařízení. Po nalezení našeho modulu jej přidáme. Pokud budeme vyzváni k zadání kódu, výchozí PIN je 1234. Modul zabere v PC dva COM porty. V Processing musíme pomocí indexu u funkce Serial.list()[] vyzkoušet, jaký je ten správný. Kód pro vykreslování grafu je převzatý z příkladu na konci minulého dílu.

import processing.serial.*; Serial port; String h; int inth, i = 0; int eol = 10; //ASCII znak pro zalomení řádku void setup(){ size(512,512); println(Serial.list()); port = new Serial(this, Serial.list()[1], 115200); } void draw(){ while(port.available() > 0){ if(i == 512){ background(255); i = 0; } h = port.readStringUntil(eol); if(h != null){ inth = int(trim(h)); line(i,512,i,512-inth/2); i++; println(inth); } } } 

Poznámka: Může se stát, že program po připojení modulu k Arduinu nepůjde nahrát. Stačí ale na dobu nahrávání odpojit modul od Arduina, čímž by se měl problém vyřešit.

 

Arduino a Android

Existuje celá řada aplikací pro Android, která je přímo určená pro práci s Arduinem. Velmi zajímavá je aplikace SensoDuino, která umí přes bluetooth odesílat data snad ze všech dostupných senzorů. Po instalaci aplikace se nám zobrazí následující rozhraní.

SensoDuino pro Android

SensoDuino

Zde si můžete vybrat, jaký senzor bude zapnutý a jestli se z něj budou odesílat informace. Data jsou vždy odeslána v pořadí: číslo senzoru (integer), číslo měření (integer) a tři naměřené hodnoty (float). Některé senzory odesílají pouze jednu hodnotu. V tom případě jsou zbylé dvě nastaveny na 99.99. Část senzorů odesílá tři hodnoty. Jde většinou o měřené hodnoty v jednotlivých osách. Tyto čísla můžeme získat pomocí funkcí Serial.parseInt() a Serial.parseFloat() – tu jsme si ještě nepředstavili, ale funguje stejně jako Serial.parseInt, pouze čeká na číslo typu float. Ještě před tím ale musíme nastavit jinou rychlost komunikace s modulem. Výchozí rychlost přenosu je totiž s aplikací nekompatabilní. U představených modulů to provedeme příkazy Serial.print(„$“) a poté Serial.println(„U,9600,N“). Pouhé vypsání hodnot zajistí program:

int a,b; float c,d,e; void setup(){ Serial.begin(115200); // výchozí rychlost našich modulů // tříkrát vypíšeme dolar - tím se dostaneme do módu pro nastavování Serial.print("$"); Serial.print("$"); Serial.print("$"); delay(100); // dočasně nastavíme rychlost modulu na 9600 bps Serial.println("U,9600,N"); Serial.begin(9600); } void loop(){ while(Serial.available() > 0){ a = Serial.parseInt(); //typ senzoru b = Serial.parseInt(); //číslo měření c = Serial.parseFloat(); //první hodnota d = Serial.parseFloat(); //druhá hodnota e = Serial.parseFloat(); //třetí hodnota Serial.println(a); Serial.println(b); Serial.println(c); Serial.println(d); Serial.println(e); } } 

To není vskutku žádný div. Je to ale vše, co potřebujeme k dalšímu programování. Ještě si ale musíme uvést, jaké označení mají jaké senzory (typ senzoru). V následujícím seznamu, převzatém z oficiální dokumentace aplikace, naleznete číslo typu senzoru, jednotky a další doplňkové informace.

  • 1 – ACCELEROMETER (m/s^2 – X,Y,Z)
  • 2 – MAGNETIC_FIELD (uT – X,Y,Z)
  • 3 – ORIENTATION (Yaw, Pitch, Roll)
  • 4 – GYROSCOPE (rad/sec – X,Y,Z)
  • 5 – LIGHT (SI lux)
  • 6 – PRESSURE (hPa millibar)
  • 7 – DEVICE TEMPERATURE (C)
  • 8 – PROXIMITY (Centimeters or 1,0)
  • 9 – GRAVITY (m/s^2 – X,Y,Z)
  • 10 – LINEAR_ACCELERATION (m/s^2 – X,Y,Z)
  • 11 – ROTATION_VECTOR (Degrees – X,Y,Z)“ );
  • 12 – RELATIVE_HUMIDITY (%)
  • 13 – AMBIENT_TEMPERATURE (C)
  • 14 – MAGNETIC_FIELD_UNCALIBRATED (uT – X,Y,Z)
  • 15 – GAME_ROTATION_VECTOR (Degrees – X,Y,Z)
  • 16 – GYROSCOPE_UNCALIBRATED (rad/sec – X,Y,Z)
  • 17 – SIGNIFICANT_MOTION (1,0)
  • 97 – AUDIO (Vol.)
  • 98 – GPS1 (Lat., Long., Alt.)
  • 99 – GPS2 (Bearing, Speed, Date/Time)

Se získanými informacemi už je poměrně jednoduché například udělat z Arduina vozítko ovládané pomocí náklonu telefonu a podobně.

Poznámka: Pro hlubší nastavení modulu, jako rychlost připojení, jméno, nebo PIN se používají tzv. AT commands. Ty ale pro základní činnost nejsou potřeba. Jejich výpis naleznete například zde.

Pokud chcete na telefonu pouze zobrazit přijatá data jako číslo, můžete použít jednoduchý Bluetooth terminál.

 

Sběrnice i2c

I2c je sběrnice, která umožňuje mít na dvou vodičích (jeden pro udávání taktu a druhý pro data) připojeno až 128 zařízení (každé má svoji 7-bitovou adresu). Vodič, který udává takt komunikace, se nazývá SCL (clock line). Druhý vodič přenášející data je označován SDA (data line). U tohoto typu komunikace je vždy jedno zařízení řídící (master) a ostatní jsou řízená (slave). Zařízení master nemusí mít definovanou adresu. Piny, ke kterým se sběrnice připojuje, jsou u různých desek nastaveny různě. Přehled naleznete v následující tabulce:

Deska SDA pin SCL pin
Uno, Ethernet A4 A5
Mega 2560 20 21
Leonardo 2 3
Due 20, SDA1 21, SCL1

Ke správné funkci budeme potřebovat dva rezistory o odporu asi 4700 Ohm. Jeden zapojíme mezi SDA a +5V a druhý mezi SCL a +5V.

Sběrnice I2C a propojení dvou Arduin

Sběrnice I2C

Tím máme za sebou zapojení obou desek. Nyní ž se můžeme podívat na software.

 

Funkce pro práci s i2c

Funkce, které si zde ukážeme, jsou velmi podobné těm, se kterými jsme se setkali u sériové komunikace. Na začátku programu musíme vložit knihovnu Wire.h pomocí příkazu #include <Wire.h>. Další funkce jsou pro přehlednost popsány v tabulce.

Funkce Kdo používá Popis
Wire.begin(adr) master, slave Připojí zařízení ke sběrnici. Pokud je zařízení master, nemusí mít žádný parametr. U slave je parametrem adresa zařízení (číslo mezi 0 a 127).
Wire.beginTransmission(adr) master Zahájí komunikaci se zařízením s adresou danou v parametru.
Wire.endTransmission() master Ukončí komunikaci se zařízením.
Wire.requestFrom(adr,p) master Touto funkcí si master vyžádá data od slave. Prvním parametrem je adresa slave zařízení. Druhým je počet bytů, které očekáváme.
Wire.available() master, slave Stejně jako u Serial.available() i tato funkce vrátí počet bytů čekajících na zpracování.
Wire.write(data,delka) master, slave Tato funkce slouží k odeslání informací po i2c. Může mít buďto jeden parametr, a to číselnou hodnotu či řetězec, nebo dva parametry – pole bytů a jejich délku.
Wire.read() master, slave Používá se ke čtení hodnot z i2c.
Wire.onReceive(fce) slave Parametrem této funkce je jméno jiné funkce, která je volána, pokud jsou od zařízení master přijata nějaká data. Volaná funce by měla mít jeden parametr a to počet přijatých bitů.
Wire.onRequest(fce) slave Zde je parametrem jméno funkce volané, když jsou od master požadována data.

Nyní si tyto funkce ukážeme v praxi.

 

Přenos master -> slave

V tomto případě bude master číst data ze sériové linky. Pokud mu pošleme hodnotu H nebo L, pošle ji dále do slave zařízení (ale tentokrát přes i2c). Pokud slave obdrží hodnotu H, rozsvítí LED, v případě L ji zhasne.

Kód pro master zařízení

//master #include <Wire.h> char a = ' '; void setup(){ Wire.begin(); Serial.begin(9600); } void loop(){ while(Serial.available() > 0){ a = Serial.read(); } if(a != ' '){ Wire.beginTransmission(100); Wire.write(a); Wire.endTransmission(); } a = ' '; delay(500); } 

Kód pro slave zařízení

//slave #include <Wire.h> char a; void setup(){ Wire.begin(100); pinMode(13, OUTPUT); Wire.onReceive(priPrijmu); } void loop(){ delay(100); if(a == 'H'){ digitalWrite(13, HIGH); } else if(a == 'L'){ digitalWrite(13, LOW); } } void priPrijmu(int b){ while(Wire.available() > 0){ a = Wire.read(); } } 

 

Přenos slave -> master

V minulém příkladu bylo hlavním úkolem zařízení master odesílat data. V této ukázce bude mít úkol opačný, a to informace přijímat. Slave na vyžádání master zařízení změří hodnotu na A0. Tuto hodnotu ale musíme ještě před odesláním rozebrat na dva byty (odesílají se jednotlivě). Algoritmus rozkladu je stejný, jako kdybychom chtěli číslo převést z desítkové soustavy do „dvěstěpadesátšestkové“ soustavy. Dva odeslané byty by potom odpovídaly dvěma znakům z této soustavy reprezentující naši hodnotu. Více o číselných soustavách naleznete na Wikipedii. Master si tedy vyžádá dva byty, které mu vzápětí přijdou. Následně je musí spojit, což probíhá obdobně jako u rozebírání, jen postup otočíme. Nakonec získanou hodnotu vypíšeme pomocí sériové linky.

//master #include <Wire.h> int hodnota; byte mb[2]; void setup(){ Wire.begin(); Serial.begin(9600); } void loop(){ Wire.requestFrom(100, 2); while(Wire.available() > 0){ mb[0] = Wire.read(); //nižší byte mb[1] = Wire.read(); //vyšší byte //nyní hodnoty opět spojíme dohromady hodnota = mb[0] + mb[1]*256; Serial.println(hodnota); } delay(1000); } 
//slave #include <Wire.h> int mereni; byte mb[2]; void setup(){ Wire.begin(100); Wire.onRequest(odeslatData); } void loop(){ delay(100); } void odeslatData(){ mereni = analogRead(A0); //nyní rozebereme hodnotu mereni na dva byty //kolik celých 256 se vejde do naměřené hodnoty mb[1] = (mereni-(mereni%256))/256; //byte s vyšší hodnotou //jaký je zbytek po dělení 256 mb[0] = mereni%256; //byte s nižší hodnotou - Wire.write(mb, 2); } 

Stejně jako u sériových modulů, i zde existuje celá řada součástek, vybavená možností komunikovat přes i2c. Patří mě například různé typy pamětí, převodníků, řadičů ale i displejů. Tím se nám otevírá celá škála dalších možností, co s Arduinem dělat.

 

Zdroje obrázků

[SensoDuino]

V případě jakýchkoliv dotazů či nejasností se na mě neváhejte obrátit v komentářích.

Zbyšek Voda

Zbyšek Voda

Už nějaký čas se zajímám o věci kolem Internetu věcí a otevřeného hardware a software. Tak jsem se také v roce 2010 dostal k Arduinu, pro které dodnes programuji a taky píšu články o práci s ním. Baví mě vymýšlet, jak staré věci používat novým způsobem.
Zbyšek Voda

16 Comments on “Propojujeme Arduino s jinými zařízeními

Tomáš
15.7.2015 at 20:47

Dobrý den, chtěl bych se zeptat, jestli jde nastavit frekvence SCL na sběrnici IIC. Jestli jo a jak? Moc děkuji.

Zbyšek Voda
Zbyšek Voda
15.7.2015 at 20:56

Dobrý den,

myslím, že v základu to Arduino neumí, ale některé knihovny by to mohly zvládnout.
Zkuste třeba tuto http://playground.arduino.cc/Main/WireLibraryDetailedReference

Tomáš
16.7.2015 at 16:34

Děkuji za odpověď. Pokusím se tím nějak prokousat, jde mi o vyzkoušení sběrnice IIC na delší vzdálenost, 10-20m. Plánuji použít transceiver P82B96. Máte nějakou zkušenost s větší vzdáleností než pár centimetrů?

Zbyšek Voda
Zbyšek Voda
16.7.2015 at 19:04

Přiznám se, že jsem to nikdy nepotřeboval, takže nevím. Budu rád, když dáte vědět s výsledky 🙂

Martin331
5.6.2015 at 2:40

Dobry den,
Ze vsech for, jste zrejme jediny, kdo se nezdraha mi pomoci nebo se o to aspon pokouset.
Rad bych toho vyuzil v nadchazejicim projektu (zatim alfa verze programu),
ve ktere dochazi v programu k nejakym zmenam nevim, kde je hledat a prijde mi,
ze to v poradku urcite nebude. Soucasny project vychazi z 50% puvodniho programu,
ktery jsem zde popisoval v nasi drivejsi komunikaci.
Problem popisi… Arduino Mega / Uno naprogramuji a vzhledem ke cteni nekolika senzoru po urcite dobe (delay) problikne TX kontrolka, to je vporadku… ale po nejake dobe (pokazde jina) zustane svitit dokud neprovedu zmenu na Arduinu jako je – otevreni seriov. monitoru, resetu, odpojeni – pripojeni napajeni. Pokud tuto zmenu provedu po nejake dobe se to stane znovu. Zkousel jsem jine programy a u nich k tomuto jevu nedochazelo, pokladam to tedy za problem, ktery bych v prubehu dokoncovani finalniho programu mel vyresit.
Setkal jste se uz stimto jevem, a pokud ano v jake strukture nebo oblasti programu bych mel onu „mouchu“ hledat ?
Jestli muzu navrhnout… na emailove adrese malkovaveronika@seznam.cz mne muzete zkontaktovat, a ja Vam zaslu cely kod… aby jste byl v obraze.

Dekuji za Vasi odpoved
N.

haberturdeur
30.12.2016 at 19:14

Dobrý den,
chyba by mohla být v zacyklení programu, zkuste přidat časovač, který vždy po nějaké době restartuje běh programu, stačí přivést napětí do RST vstupu (funguje stejně jako tlačítko na desce).

Martin331
2.6.2015 at 13:00

Dobry den,
Samotne rele mi funguje na obdobnem kodu, jelikoz je umisten v podmince,
ktera uvadi zda je den/noc a zda je vlhkost nad/pod urcitou % uroven.
Ale pouze v miste podminky –

if(distance>lim)
{analogWrite(piezoPin, 100);
digitalWrite(relay, LOW); }
else
{analogWrite(piezoPin, 0); }

nereaguje vubec.
Pokud budete chtit, mohu Vam zaslat cely kod, treba jej pak vyuzijete i v jinych pripadech,
nez jako ted v lusteni problemu, ale obavam se, ze uz by jsem to tady mohl jeho vlozenim spamovat.

Martin331
28.5.2015 at 16:22

Dobrý den,
Jestli Vás chápu správně, tak se mne ptáte zda jsem zkoušel podmínku se stavem Pieza:

if(distance>lim)
{ analogWrite(piezoPin, 100); }
else
{ analogWrite(piezoPin, 0);
digitalWrite(relay, HIGH); }

pokud ano, tak zkoušel včetně umístění závorek. Piezo funguje perfektne ve své podmínce,
ale když kní přiřadím i ono relé, tak stále funguje jen Piezo… na Relé nebere ohled.
Program pro Piezo nepoužívá LOW / HIGH, on používá tu „regulaci výkonu“ 0-255 atd.
možná díky tomu podmínka nepohlíží na jiné uvedení stavu, je to podivné, ale nic jiného mne nenapadá 🙁 Hledal jsem v návodech a navrzích ostatních lidí, kteří uplatňují podobnou funkci, ale nic jsem nenašel.
M

Zbyšek Voda
Zbyšek Voda
1.6.2015 at 12:55

A ovládání samotného relé jste zkoušel?

Zkuste si třeba jen
digitalWrite(relay, HIGH);
delay(1000);
digitalWrite(relay, LOW);
delay(1000);

Martin331
27.5.2015 at 14:01

Děkuji moc za Vaši odpověď.
Při této příležitosti, bych se Vás ještě jednou zeptal na drobný problém, který tu mám u hotového výrobku..

Pracuji hlavně s výjimkami jako if / else apod.
a rád bych uplatnil takovou výjimku pro svůj prototyp, ale nedaří se mi to aplikovat
do finální podoby..

– část operace co mi UNO provádí je, že zvukově pípá po překročení předem nastavené vzdálenosti pomoci UZ čidla (kit pro Arduino) v této chvíli potřebuji, aby se mi relé odeplo.

Relé je již řízeno ostatními podmínkami, ale implentaci kodu:

if(distance>lim)
{analogWrite(piezoPin, 100);
digitalWrite(relay, LOW); }
else
{analogWrite(piezoPin, 0); }

uvedená výjimka s relé nic neprovede, ačkoliv jako chybu ji kompilace neoznačí,
nazval bych to mrtvou operací, protože neškodí / nepomáhá a nic nedělá.
Nejsem v Arduino tak zdatný, ale pokaždé se mi podařilo několik kodů zkloubit do funkční podoby, toto je mi bohužel překážkou.
Uvedený prototyp mi má zalévat květiny (zapomínám), a v případě nizké hladiny vody v nádrže mi čerpadlo stále jede. Je to jeden z problémů, se kterým se u tohoto prototypu setkávám, druhým je špatná čitelnost kitu jenž měří vlhkost v květináčích – používám jej v misce a po cca 4. měsících špatně detekuje přítomnost vody i po očištění měřících ploch (poté funguje jen na pár hodin, poté při plné misce s vodou tj. ponořeném stavu naměří velmi nízkou vlhkost a spustí čerpadlo), ale to bych časem nějak vyřešil, jde mi hlavně o výše uvedený problém s výjimkou pro relé.
Předem Děkuji za Vaši odpověď a omlouvám se za případný spam.
M

Zbyšek Voda
Zbyšek Voda
27.5.2015 at 15:19

To je zvláštní. Asi bych v tomto případě hledal chybu jinde. Zkoušel jste třeba digitalWrite(relay, HIGH)?

Martin331
27.5.2015 at 11:49

Dobrý den,
Chtěl bych se zeptat k vzajemné komunikaci Arduin…
Zmiňoval jste komunikaci mezi dvěma deskami… existuje způsob, aby se aplikovalo vícero Arduin (2 – 4). Rád bych jedno zařízení umístil do „Arduino bloků“, kdy hlavní deska, která bude o blokách rozhodovat by bylo také Arduino.
Budu moc rád za Vaši odpověď děkuju.
M.

Zbyšek Voda
Zbyšek Voda
27.5.2015 at 12:01

Dobrý den,
to určitě půjde. Asi bych použil I2C komunikaci, kdy hlavní deska bude master a ostatní slaves. Pak stačí, aby slaves měli rozdílné adresy. Poté je můžete přímo adresovat a tak i ovládat.

Ed
13.12.2015 at 9:31

Dobrý den, právě se chystám řešit obdobný problém s komunikaci 4 arduin. I2C sběrnice je ale nepoužitelná pro delší vzdálenosti (cca 30m). Uvažuji o RS485, ale neumím právě ty zazačátky, např. jak se adrsují jednotlivá arduina. Poradí nebo pomůže někdo?

Zbyšek Voda
Zbyšek Voda
13.12.2015 at 10:41

Dobrý den,
neuvažoval jste o bezdrátu? 🙂

Jestli si dobře pamatuji, jak funguje RS485, tak je to vlastně jenom sériová linka – čili byte, který po ní pošlu, přečtou všechna zařízení. Je to tedy jakýsi nástroj, kterým spolu mohou Arduina komunikovat.

Samotné adresování ale není věc sériové linky, ale nějakého komunikačního protokolu. Ten už záleží na vás, jaký použijete.

Vesměs fungují tak, že master zařízení pošle: „Chci 10 bytů od zařízení 5“. Tuto informaci přečtou všechna zařízení, ale jenom zařízení 5 odpoví odesláním deseti bytů.

Pokud nechcete vytvářet vlastní komunikační protokol, můžete zkusit použít nějakou knihovnu. Mohla by fungovat například knihovna s Modbus – http://playground.arduino.cc/Code/ModbusMaster.

ZV

Daniel
15.3.2015 at 11:22

Moc hezkej tutoriál. Je super že je do toho zakomponován i processing.

Napsat komentář