Kuinka yhdistää kaksi Arduino-levyä I2C: llä

Kuinka yhdistää kaksi Arduino-levyä I2C: llä
Kaltaisesi lukijat auttavat tukemaan MUO:ta. Kun teet ostoksen käyttämällä sivustollamme olevia linkkejä, voimme ansaita kumppanipalkkion. Lue lisää.

Vaikka yksi Arduino voi suorittaa monia tehtäviä, jotkut projektit voivat vaatia useamman kuin yhden levyn käyttöä eri toimintojen käsittelemiseksi. Joten tiedonsiirron mahdollistamiseksi kahden mikro-ohjaimen välillä on määritettävä tietoliikenneprotokolla, kuten CAN, SPI, I2C tai UART.





Tässä oppaassa käydään läpi I2C:n toiminnan perusteet, laitteistoliitännät ja ohjelmistototeutus, joka tarvitaan kahden Arduino-levyn asettamiseen I2C-isäntä- ja orjalaitteiksi.





PÄIVÄN VIDEON TEKEMINEN JATKA SISÄLLÖLLÄ VIERÄTÄ

Mikä on I2C?

Inter-Integrated Circuit (I2C) on laajalti käytetty viestintäprotokolla sulautetuissa järjestelmissä ja mikro-ohjaimissa tiedonsiirron mahdollistamiseksi elektronisten laitteiden välillä. Toisin kuin SPI (Serial Peripheral Interface), I2C mahdollistaa useamman kuin yhden isäntälaitteen liittämisen väylään, jossa on yksi tai useampi orjalaite. Sitä käytti ensin Philips, ja se tunnetaan myös nimellä Two Wire Interface (TWI) -viestintäprotokolla.





Kuinka I2C-viestintä toimii?

I2C käyttää kahta kaksisuuntaista linjaa: SDA (Serial Data) ja Serial Clock (SCL) tiedonsiirtoon ja laitteiden välisen viestinnän synkronointiin. Jokaisella I2C-väylään kytketyllä laitteella on yksilöllinen osoite, joka tunnistaa sen viestinnän aikana. I2C-protokolla sallii useiden laitteiden jakaa saman väylän, ja jokainen laite voi toimia isäntänä tai orjana.

  I2C-viestinnän esittely

Tietoliikenteen aloittaa isäntälaite, ja orjalaitteiden väärä osoitus voi aiheuttaa virheitä siirrossa. Tutustu perusteelliseen oppaaseemme kuinka UART-, SPI- ja I2C-sarjaviestintä toimii antaakseen sinulle kontekstin.



I2C-viestinnän suuri etu, joka kannattaa huomioida, on sen tarjoama joustavuus virranhallinnan suhteen. Eri jännitetasoilla toimivat laitteet voivat silti kommunikoida tehokkaasti jännitteensiirtimien avulla. Tämä tarkoittaa, että 3,3 V:n jännitteellä toimivat laitteet tarvitsevat jännitteensiirtimiä kytkeytyäkseen 5 V:n I2C-väylään.

kuinka löytää kuvan dpi

Wire Library

Wire-kirjasto on sisäänrakennettu Arduino-kirjasto, joka tarjoaa toimintoja viestintään I2C:n kautta. Se käyttää kahta nastaa - SDA ja SCL - Arduino-kortilla I2C-viestintään.





I2C-nastat Arduino Unossa:

  Arduino I2C Uno -nastat

Arduino Nano I2C -nastat:





  Arduino nano I2C pinout

Jotta voit käyttää kirjastoa, sinun on sisällytettävä Wire.h otsikkotiedosto Arduino-luonnoksen alussa.

 #include <Wire.h>

Wire-kirjasto tarjoaa toimintoja tiedonsiirron aloittamiseksi I2C-laitteen kanssa, tiedon lähettämiseksi ja tiedon vastaanottamiseksi. Joitakin tärkeitä toimintoja, jotka sinun pitäisi tietää, ovat:

  • Wire.begin() : käytetään liittymään I2C-väylään ja aloittamaan viestintä.
  • Wire.beginTransmission() : käytetään orja-osoitteen määrittämiseen ja lähetyksen aloittamiseen.
  • Wire.write() : käytetään tietojen lähettämiseen I2C-laitteeseen.
  • Wire.endTransmission() : käytetään lähetyksen lopettamiseen ja virheiden tarkistamiseen.
  • Wire.requestFrom() : käytetään tietojen pyytämiseen I2C-laitteelta.
  • Wire.available() : käytetään tarkistamaan, onko tietoja saatavilla luettavaksi I2C-laitteesta.
  • lanka.read() : käytetään tietojen lukemiseen I2C-laitteesta.

Käytä Wire.beginTransmission() funktio asettaa anturin osoitteen, joka lisätään argumenttina. Esimerkiksi jos anturin osoite on 0x68 , käyttäisit:

 Wire.beginTransmission(0x68);

Arduino I2C -laitteiston asennus

Kahden Arduino-levyn yhdistämiseen I2C:llä tarvitset seuraavat laitteistokomponentit:

kuinka tehdä valokuvia vierekkäin iPhonessa
  • Kaksi Arduino-levyä (master ja slave)
  • Leipälauta
  • Jumper johdot
  • Kaksi 4,7kΩ vetovastusta

Yhdistä SDA ja SCL molempien Arduino-levyjen nastat leipälautaan. Liitä vetovastukset väliin SDA ja SCL nastat ja 5V leipälaudan virtakisko. Yhdistä lopuksi kaksi leipälautaa yhteen hyppyjohtimilla.

Arduino Uno piiri

  Arduino_I2C-liitäntä leipälevyllä

Arduino Nano Circuit

  nano33BS_06_kuvaus I2C-viestintäprotokollalle
Kuvan luotto: Arduino I2C -dokumentaatio

Arduino-levyjen asettaminen I2C-isäntä- ja orjalaitteiksi

Käytä Wire.requestFrom() toiminto määrittää sen orjalaitteen osoitteen, jonka kanssa haluamme olla yhteydessä. Käytä sitten lanka.read() toiminto tietojen saamiseksi orjalaitteesta.

Päälaitteen koodi:

 #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() -toimintoa käytetään määrittämään mitä tehdään, kun orja vastaanottaa tietoja isäntälaitteelta. Yllä olevassa koodissa Wire.available() toiminto tarkistaa, onko tietoja saatavilla, ja lanka.read() toiminto lukee päälaitteen lähettämät tiedot.

Orjalaitteen koodi:

 #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
}

Tietojen lähettäminen ja vastaanottaminen I2C:n avulla

Tässä esimerkissä luetaan lämpötila DHT11-lämpötila-anturista, joka on liitetty orja-Arduinoon, ja tulostetaan se pää-Arduinon sarjanäytölle.

  DHT11 I2C esimerkki kahdella Arduino-levyllä

Muokkaamme aiemmin kirjoittamaamme koodia sisältämään lämpötilamittauksen, jonka lähetämme sitten pääkortille I2C-väylän kautta. Päälevy voi sitten lukea lähettämämme arvon ja näyttää sen sitten sarjanäytössä.

Päälaitteen koodi:

 #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
}

Orjalaitteen koodi:

kuinka lähettää tekstiä Androidissa
 #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
}

Voit mukauttaa tämän koodin sopimaan projektissasi mahdollisesti oleville antureille tai jopa näyttää anturiarvot näyttömoduulissa tee itse huonelämpö- ja kosteusmittari .

Slave Addressing I2C:llä Arduinossa

Jos haluat lukea arvoja komponenteista, jotka on lisätty I2C-väylään tällaisessa projektissa, on tärkeää, että sisällytät oikean orjaosoitteen koodattaessa. Onneksi Arduino tarjoaa skannerikirjaston, joka yksinkertaistaa orjaosoitteiden tunnistamista, eliminoi tarpeen selata pitkiä anturitietolehtiä ja hämmentävää verkkodokumentaatiota.

Käytä seuraavaa koodia tunnistaaksesi minkä tahansa I2C-väylässä olevan orjalaitteen osoitteen.

 #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
}

Laajenna projektiasi jo tänään

Kahden Arduino-levyn liittäminen I2C-tiedonsiirtoprotokollalla tarjoaa joustavan ja tehokkaan tavan saavuttaa monimutkaisia ​​tehtäviä, joita ei voida käsitellä yhdellä levyllä. Wire-kirjaston avulla tiedonsiirto kahden kortin välillä I2C:n avulla on helppoa, jolloin voit lisätä projektiisi enemmän komponentteja.