Tento návod je zaměřen na propojení dvou a více Arduino desek pomocí I2C rozhraní. Se samotnou sběrnicí I2C jste se už zajisté setkali dříve, když jste připojovali k Arduinu nějaký senzor či displej. Jedná se o jednoduše použitelnou sběrnici, která potřebuje pouze dva datové vodiče. Aby bylo možné následně komunikovat mezi různými zařízeními na sběrnici, tak má každé zařízení svoji unikátní adresu. U zmíněných senzorů a displejů je tato adresa nastavena při výrobě a v některých případech je možné ji ovlivnit pomocí adresních pinů.
Při komunikaci mezi Arduiny si ale adresu určujeme sami a můžeme tedy mezi sebou propojovat i desky stejného typu. Co se týká komunikačních úrovní ale i zde platí, že není možné jednoduše propojovat zařízení s 5V a 3,3V úrovněmi. Pro tyto účely ale stačí jako mezikus vložit převodník napěťových úrovní.

Komunikace po I2C mezi Arduino deskami

Pro úspěšné propojení dvou Arduino desek po I2C sběrnici stačí zapojit celkem tři vodiče. Propojíme SDA piny spolu, SCL piny spolu a GND piny spolu. Pro piny SDA a SCL musíme vybrat vždy vyhrazené I2C piny na námi vybrané desce, u Arduino UNO i Nano jsou to piny A4 a A5. A pin GND slouží jako komunikační reference. Pokud máte obě Arduina připojené k jednomu počítači či zdroji napětí, tak už jsou zemní piny automaticky propojené. Pokud byste ale například každé zařízení napájeli z jiného zdroje, tak je nutné zajistit propojení zemí pro spolehlivou komunikaci.

Komunikace po I2C mezi Arduino deskami schéma

Ukázkový kód je rozdělen na dvě částí – pro hlavní desku (master) a vedlejší desku (slave). Avšak toto nás neomezuje v obousměrné komunikaci, takže to berte spíš jako označení pro lepší pochopení.
Ukázkový kód pro master desku obsahuje na svém začátku připojení potřebné knihovny a vytvoření proměnné pro ukládání výsledků.
V podprogramu setup zahájíme komunikaci po sběrnici I2C, kdy v závorce můžeme specifikovat adresu pro tuto desku. Pokud byste ale chtěli používat jeden bod čistě jako master, adresu uvádět nemusíte.
V prvním kroku nekonečné smyčky loop provedeme zahájení komunikace s adresou 0x02 (adresa slave). Poté pomocí funkce write pošleme hodnotu proměnné X a ukončíme komunikaci. V dalším kroku si přičteme do naší proměnné jedničku a pokud bychom se dostali přes hodnotu 5, tak proměnnou vynulujeme. Na konci programu je pak už jen pauza před novým během smyčky.

// I2C komunikace mezi Arduiny, master

// připojení potřebné knihovny
#include <Wire.h>

// proměnná pro uložení posílaného čísla
int x = 0;

void setup() {
  // zahájení komunikace po I2C, adresa 0x01
  Wire.begin(0x01);
}

void loop() {
  // zahájení přenosu dat na I2C adresu "0x02"
  Wire.beginTransmission(0x02);
  // poslání proměnné x
  Wire.write(x);
  // ukončení aktuálního přenosu
  Wire.endTransmission();
  // přičtení hodnoty 1 do proměnné
  x++;
  // pokud je x větší než 5, vynulujeme ho
  if (x > 5) x = 0;
  // pauza před novým během smyčky
  delay(1000);
}

Ukázkový kód pro slave desku obsahuje také na začátku připojení potřebné knihovny, nastavení čísla pinu s LED diodou a vytvoření proměnné pro ukládání dat.
V podprogramu setup zahájíme komunikaci po sériové lince, poté nastavíme LED diodu jako výstup a provedeme start komunikace po sběrnici I2C, kdy si nastavíme pro slave adresu 0x02. Posledním příkazem si připojíme podprogram prichoziZnakI2C k detekci příchozí I2C komunikace, takže se tento podprogram zavolá při každém přijatém znaku.
Ve zmíněném podprogramu prichoziZnakI2C provedeme pouze dva jednoduché kroky. Nejprve si uložíme přijatý znak do proměnné a poté vytiskneme informaci o počtu přijatých znaků a aktuálně přijatý znak ve formě dekadického čísla. Tento podprogram volaný při I2C komunikaci by měl být vždy co nejkratší, takže proto data zpracujeme až ve smyčce loop.
Nekonečná smyčka loop v tomto případě obsahuje jednoduchou detekci přijatého znaku. Jak vidíte, tak LED dioda může blikat ve dvou různých režimech. Pokud je aktuálně nastavená proměnná Y na hodnotu 1, tak LED dioda bliká s intervalem 100ms. A pokud bude hodnota Y=4, tak budeme blikat pomaleji s 400ms intervalem.

// I2C komunikace mezi Arduiny, slave

// připojení potřebné knihovny
#include <Wire.h> 

// nastavení čísla pinu s LED
#define LED 13
// proměnná pro uložení přijatého čísla
int y = 0;

void setup() {
  // zahájení komunikace po sériové lince
  Serial.begin(9600);
  // nastavení LED diody jako výstupu
  pinMode (LED, OUTPUT);
  // zahájení komunikace po I2C, adresa 0x02
  Wire.begin(0x02); 
  // nastavení podprogramu, který bude zavolán při přijetí dat po I2C
  Wire.onReceive(prichoziZnakI2C);
}

void prichoziZnakI2C(int pocet) {
  // načtení přijatého znaku do proměnné
  y = Wire.read();
  // vytištění informace o velikosti fronty dat
  // a aktuálně přijatého znaku (tištěn jako DECimální číslo)
  Serial.print("Ve fronte je: ");
  Serial.print(pocet);
  Serial.print(" znak(u). Prijaty znak: ");
  Serial.println(y, DEC);
}
void loop() {
  // pokud je proměnná Y rovna hodnotě 1,
  // zablikáme rychle
  if (y == 1) {
    digitalWrite(LED, HIGH);
    delay(100);
    digitalWrite(LED, LOW);
    delay(100);
  }
  // pokud je proměnná Y rovna hodnotě 4,
  // zablikáme pomaleji
  if (y == 4) {
    digitalWrite(LED, HIGH);
    delay(400);
    digitalWrite(LED, LOW);
    delay(400);
  }
}

Po nahrání obou kódů do samostatných desek byste měli začít pozorovat na slave desce blikání vestavěnou LED diodou s dvěma různými režimy – krátký a dlouhý interval, případně v ostatních režimech LED dioda svítit nebude. A pokud si otevřete sériovou linku na slave desce, tak získáte například tento výsledek.

Ve fronte je: 1 znak(u). Prijaty znak: 0
Ve fronte je: 1 znak(u). Prijaty znak: 1
Ve fronte je: 1 znak(u). Prijaty znak: 2
Ve fronte je: 1 znak(u). Prijaty znak: 3
Ve fronte je: 1 znak(u). Prijaty znak: 4
Ve fronte je: 1 znak(u). Prijaty znak: 5
Ve fronte je: 1 znak(u). Prijaty znak: 0

Komunikace po sběrnici I2C je jedna z nejvíce používaných cest, jak získávat data z různých senzorů či pracovat s displeji a podobně. Díky její jednoduchosti a malému počtu zabraných pinů se pak nabízí možnost využít tuto sběrnici i na komunikaci mezi Arduino deskami. A vzhledem k adresovatelnosti na sběrnici pak můžete pracovat s vícero body, přičemž máte zajištěno, že se zprávy dostanou jen tam, kam chcete. Komunikaci mezi dvěma či více Arduiny pak můžete využít v projektech jako je například meteostanice, chytrá domácnost či taková zařízení, kde se vyplatí jednou deskou nějaká data zpracovávat a do další desky už posílat zpracované údaje, abychom jí nezatěžovali výpočty.

Seznam použitých komponent:
https://dratek.cz/arduino/1511-original-arduino-uno-rev3-1485165418.html
https://dratek.cz/arduino/1069-arduino-zakladni-deska-nano-v-30-driver-ch340-1500635974.html

FB tw

Další podobné články