Jak propojit dvě desky Arduino pomocí I2C

Jak propojit dvě desky Arduino pomocí I2C
Čtenáři jako vy pomáhají podporovat MUO. Když provedete nákup pomocí odkazů na našich stránkách, můžeme získat provizi přidružené společnosti. Přečtěte si více.

Zatímco jediné Arduino může plnit mnoho úkolů, některé projekty mohou vyžadovat použití více než jedné desky pro zpracování různých funkcí. Aby byl umožněn přenos dat mezi dvěma mikrokontroléry, musí být nastaven komunikační protokol jako CAN, SPI, I2C nebo UART.





V této příručce pokryjeme základy toho, jak I2C funguje, hardwarová připojení a softwarovou implementaci potřebnou k nastavení dvou desek Arduino jako I2C master a slave zařízení.





VYUŽÍVÁNÍ VIDEA DNE POKRAČOVÁNÍ V OBSAHU POKRAČUJTE PŘEJÍMÁNÍM

Co je I2C?

Inter-Integrated Circuit (I2C) je široce používaný komunikační protokol ve vestavěných systémech a mikrokontrolérech, který umožňuje přenos dat mezi elektronickými zařízeními. Na rozdíl od SPI (Serial Peripheral Interface) vám I2C umožňuje připojit více než jedno hlavní zařízení ke sběrnici s jedním nebo více podřízenými zařízeními. Poprvé byl použit společností Philips a je také známý jako komunikační protokol TWI (Two Wire Interface).





Jak funguje komunikace I2C?

I2C používá dvě obousměrné linky: Serial Data (SDA) a Serial Clock (SCL) pro přenos dat a synchronizaci komunikace mezi zařízeními. Každé zařízení připojené ke sběrnici I2C má jedinečnou adresu, která jej identifikuje během komunikace. Protokol I2C umožňuje více zařízením sdílet stejnou sběrnici a každé zařízení může fungovat jako master nebo slave.

V hlavním panelu Windows 10 chybí ikona baterie
  Ukázka komunikace I2C

Komunikace je zahájena hlavním zařízením a nesprávné adresování podřízených zařízení může způsobit chyby při přenosu. Podívejte se na našeho podrobného průvodce na jak funguje sériová komunikace UART, SPI a I2C abych vám dal nějaký kontext.



Hlavní výhodou I2C komunikace, která stojí za zmínku, je flexibilita, kterou nabízí, pokud jde o správu napájení. Zařízení, která pracují na různých úrovních napětí, mohou stále efektivně komunikovat pomocí měničů napětí. To znamená, že zařízení pracující při 3,3 V potřebují pro připojení k 5V I2C sběrnici měniče napětí.

The Wire Library

Knihovna Wire je vestavěná knihovna Arduino, která poskytuje funkce pro komunikaci přes I2C. Pro komunikaci I2C používá dva piny – SDA a SCL – na desce Arduino.





I2C piny na Arduino Uno:

  Piny Arduino I2C Uno

Piny Arduino Nano I2C:





  Pinout Arduino nano I2C

Chcete-li používat knihovnu, musíte zahrnout Wire.h hlavičkový soubor na začátku vaší Arduino skici.

 #include <Wire.h>

Knihovna Wire poskytuje funkce pro zahájení komunikace se zařízením I2C, odesílání dat a přijímání dat. Některé důležité funkce, které byste měli znát, zahrnují:

  • Wire.begin() : používá se pro připojení ke sběrnici I2C a zahájení komunikace.
  • Wire.beginTransmission() : používá se k zadání adresy podřízeného zařízení a zahájení přenosu.
  • Wire.write() : používá se k odesílání dat do zařízení I2C.
  • Wire.endTransmission() : slouží k ukončení přenosu a kontrole chyb.
  • Wire.requestFrom() : používá se k vyžádání dat ze zařízení I2C.
  • Wire.available() : používá se ke kontrole, zda jsou k dispozici data ke čtení ze zařízení I2C.
  • wire.read() : používá se ke čtení dat ze zařízení I2C.

Použijte Wire.beginTransmission() funkce pro nastavení adresy senzoru, která se vloží jako argument. Například pokud je adresa senzoru 0x68 , použili byste:

 Wire.beginTransmission(0x68);

Nastavení hardwaru Arduino I2C

Pro připojení dvou desek Arduino pomocí I2C budete potřebovat následující hardwarové komponenty:

  • Dvě desky Arduino (master a slave)
  • Breadboard
  • Startovací dráty
  • Dva 4,7kΩ pull-up odpory

Připojte SDA a SCL kolíky obou desek Arduino na prkénko. Připojte pull-up odpory mezi SDA a SCL špendlíky a 5V napájecí lišta na prkénku. Nakonec spojte dvě prkénka dohromady pomocí propojovacích vodičů.

Obvod Arduino Uno

  Připojení Arduino_I2C na prkénku

Nano obvod Arduino

  nano33BS_06_illustration pro komunikační protokol I2C
Kredit obrázku: Dokumentace Arduino I2C

Nastavení desek Arduino jako I2C Master a Slave zařízení

Použijte Wire.requestFrom() funkce pro zadání adresy podřízeného zařízení, se kterým chceme komunikovat. Poté použijte wire.read() funkce pro získání dat z podřízeného zařízení.

Hlavní kód zařízení:

 #include <Wire.h> 
void setup() {
Wire.begin(); // join i2c bus
Serial.begin(9600); // start serial for output
}
void receiveData() {
int address = 8;
int bytesToRead = 6;
Wire.requestFrom(address, bytesToRead);
while (Wire.available()) {
char data = Wire.read();
Serial.print(data);
}
delay(500);
}
void loop() {
receiveData();
}

The Wire.onReceive() Funkce se používá k určení, co se má dělat, když slave přijme data z hlavního zařízení. Ve výše uvedeném kódu je Wire.available() funkce zkontroluje, zda jsou k dispozici data, a wire.read() funkce čte data odeslaná hlavním zařízením.

Kód slave zařízení:

 #include <Wire.h> 
void setup() {
Wire.begin(8); // join the I2C bus with address 8
Wire.onReceive(receiveEvent); // call receiveEvent when data is received
}
void loop() {
delay(100);
}
void receiveEvent(int bytes) {
Wire.write("hello "); // respond with message of 6 bytes as expected by master
}

Odesílání a příjem dat pomocí I2C

V tomto příkladu odečteme teplotu z teplotního senzoru DHT11 propojeného s podřízeným Arduinem a vytiskneme ji na sériovém monitoru hlavního Arduina.

  Příklad DHT11 I2C se 2 deskami Arduino

Upravme kód, který jsme napsali dříve, aby zahrnoval měření teploty, které pak odešleme na hlavní desku přes sběrnici I2C. Hlavní deska pak může přečíst hodnotu, kterou jsme odeslali, a poté ji zobrazit na sériovém monitoru.

Hlavní kód zařízení:

 #include <Wire.h> 
void setup() {
Wire.begin();
Serial.begin(9600);
Serial.println("Master Initialized!");
}
void loop() {
Wire.requestFrom(8, 1); // Request temperature data from slave
if (Wire.available()) {
byte temperature = Wire.read(); // Read temperature data from slave
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.println(" &deg;C");
}
delay(2000); // Wait for 2 seconds before requesting temperature again
}

Kód slave zařízení:

 #include <Wire.h> 
#include <DHT.h>

#define DHTPIN 4 // Pin connected to DHT sensor
#define DHTTYPE DHT11 // DHT sensor type
DHT dht(DHTPIN, DHTTYPE);
byte temperature;

void setup() {
Wire.begin(8); // Slave address is 8
Wire.onRequest(requestEvent);
dht.begin();
}

void loop() {
delay(2000); // Wait for 2 seconds for DHT to stabilize
temperature = dht.readTemperature(); // Read temperature from DHT sensor
}

void requestEvent() {
Wire.write(temperature); // Send temperature data to master
}

Tento kód můžete přizpůsobit tak, aby vyhovoval jakýmkoli senzorům, které můžete mít ve svém projektu, nebo dokonce zobrazit hodnoty senzorů na zobrazovacím modulu, abyste vyrobit si vlastní pokojový teploměr a vlhkoměr .

hrajte nes hry na snes classic

Slave Addressing s I2C na Arduinu

Chcete-li číst hodnoty z komponent přidaných do sběrnice I2C v takovém projektu, je důležité, abyste při kódování zahrnuli správnou adresu slave. Naštěstí Arduino nabízí knihovnu skenerů, která zjednodušuje proces identifikace podřízených adres, eliminuje potřebu probírat zdlouhavé datové listy senzorů a matoucí online dokumentaci.

Pomocí následujícího kódu identifikujte adresu libovolného podřízeného zařízení na sběrnici I2C.

 #include <Wire.h> // Include the Wire library for I2C communication 

void setup() {
Wire.begin(); // Initialize the I2C communication
Serial.begin(9600); // Initialize the serial communication with a baud rate of 9600
while (!Serial); // Wait for the serial connection to establish
Serial.println("\nI2C Scanner"); // Print a message indicating the start of I2C scanning
}

void loop() {
byte error, address; // Declare variables to store errors and device addresses
int nDevices; // Declare a variable to store the number of devices found

Serial.println("Scanning..."); // Print a message indicating the start of I2C scanning

nDevices = 0; // Set the number of devices found to 0
for (address = 1; address < 127; address++) { // Iterate over all possible I2C addresses
Wire.beginTransmission(address); // Start a transmission to the current address
error = Wire.endTransmission(); // End the transmission and store any errors

if (error == 0) { // If no errors were found
Serial.print("I2C device found at address 0x"); // Print a message indicating a device was found
if (address < 16) Serial.print("0"); // If the address is less than 16, add a leading 0 for formatting purposes
Serial.print(address, HEX); // Print the address in hexadecimal format
Serial.println(" !"); // Print a message indicating a device was found

nDevices++; // Increment the number of devices found
}
else if (error == 4) { // If an error was found
Serial.print("Unknown error at address 0x"); // Print a message indicating an error was found
if (address < 16) Serial.print("0"); // If the address is less than 16, add a leading 0 for formatting purposes
Serial.println(address, HEX); // Print the address in hexadecimal format
}
}
if (nDevices == 0) { // If no devices were found
Serial.println("No I2C devices found\n"); // Print a message indicating no devices were found
}
else { // If devices were found
Serial.println("done\n"); // Print a message indicating the end of I2C scanning
}
delay(5000); // Delay for 5 seconds before starting the next scan
}

Rozšiřte svůj projekt ještě dnes

Propojení dvou desek Arduino pomocí komunikačního protokolu I2C nabízí flexibilní a efektivní způsob dosažení složitých úkolů, které nemůže zvládnout jediná deska. S pomocí knihovny Wire je komunikace mezi dvěma deskami pomocí I2C snadná a umožňuje vám přidat do projektu další komponenty.

Kategorie DIY