I2C -kommunikasjon mellom to Arduino -tavler

I2C -kommunikasjon mellom to Arduino -tavler
I2C er en kommunikasjonsprotokoll som brukes til å koble enheter til et Arduino UNO Microcontroller Board. Protokollen bruker en delt datalinje (SDA) og klokkelinje (SCL) for kommunikasjon. Det innebygde trådbiblioteket i Arduino IDE gir enkel kommunikasjon med I2C-enheter gjennom funksjoner på høyt nivå og støtter flere I2C-busser.

Denne artikkelen dekker:

  • Hva er I2C -kommunikasjon i Arduino
  • I2C -pinner i Arduino
  • Hva er I2C Wire Library
  • Koble til to Arduino -brett ved hjelp av I2C som mester og slave
  • Skjematisk
  • Master Code
  • Slavekode
  • Produksjon
  • Konklusjon

Hva er I2C -kommunikasjon i Arduino

I2C (Inter-integrert krets) er en populær protokoll for kobling av mikrokontrollere med periferiutstyr som sensorer og skjermer. Arduino Uno, et mye brukt mikrokontrollertavle, kan konfigureres til å kommunisere med andre enheter ved hjelp av I2C -kommunikasjonsprotokoll.

Noen hovedhøydepunkter ved I2C -kommunikasjon inkluderer:

Multi-master og multi-slave-evne: I2C støtter flere masterenheter og flere slaveenheter på en enkelt buss, noe som gir mulighet for kommunikasjon mellom flere enheter samtidig.

Lav teller: I2C bruker bare to linjer, SDA og SCL, for kommunikasjon, noe som reduserer antall nødvendige tilkoblinger og forenkler ledning.

Adresserbare enheter: Hver I2C -enhet på bussen har en unik adresse, noe som gir enkel identifikasjon og kommunikasjon med spesifikke enheter.

Høy hastighet: I2C er i stand til høye datahastigheter på opptil 3.4 Mbps, noe som gjør det egnet for høyhastighetsdataoverføringsapplikasjoner.

Strømsparing: I2C gjør det mulig.

I2C -pinner i Arduino

I I2C -kommunikasjon brukes to linjer:

  • Datalinje (SDA): Datalinje for utveksling av data mellom master- og slaveenheter.
  • Klokkelinje (SCL): Klokkelinje for synkronisering av I2C -kommunikasjonen mellom enheter.

Master Arduino kontrollerer I2C -klokkelinjen og starter kommunikasjonen med periferiutstyr, mens slaveenhetene reagerer på mesterens forespørsler.

I tabellen nedenfor finner du pinoutsene til I2C -grensesnittet på forskjellige Arduino -brett:

Borde I2C -pinner
Arduino Nano SDA-A4 | SCL-A5
Arduino Mega SDA-A4 | SCL-A5 og SDA-20 | SCL-21
Arduino Leonardo SDA-A4 | SCL-A5
Arduino Uno SDA-A4 | SCL-A5
Arduino Micro SDA-02 | SCL-03*

*I2C -pinner kan variere avhengig av hvilken tavleversjon du bruker vennlig, se respektive datablad for mer informasjon.

Hva er I2C Wire Library

I2C Wire -biblioteket er forhåndsinstallert i en IDE som bygger kommunikasjon mellom I2C -enheter. Biblioteket inneholder funksjoner for konfigurering og kommunikasjon på I2C -bussen, inkludert funksjoner for å initialisere bussen som en master- eller slaveenhet, sende og motta data og kontrollere klokkehastigheten.

Biblioteket gjør det enkelt å kommunisere med I2C-enheter ved å abstrahere bort de lave nivåene i I2C-protokollen og gi enkle funksjoner på høyt nivå som kan brukes i Arduino-skisser. For eksempel begynne() Funksjon brukes til å initialisere I2C -bussen som en master- eller slaveenhet

Biblioteket støtter også bruk av flere I2C -busser, noe som gir kommunikasjon med flere enheter samtidig. Hvis du har å gjøre med flere sensorer eller skjermer for et prosjekt, er dette nyttig.

Koble til to Arduino -brett ved hjelp av I2C som mester og slave

For å etablere I2C -kommunikasjon mellom to Arduino Uno -brett, må SDA- og SCL -pinnene på begge brettene være koblet sammen og dele en felles grunn. Kommunikasjonen kan oppnås ved å bruke det innebygde trådbiblioteket i Arduino som inneholder funksjoner for konfigurering og kommunikasjon på I2C -bussen.

Skjematisk

Under bildet viser to Arduino Uno-tavler koblet i master-slave-konfigurasjon:

Master Code

Last opp nedenfor kode for å mestre Arduino Board:

#include /*Wire Library for I2C -kommunikasjon* /
int x = 0; /*Initialiser en variabel for lagring av et nummer*/
void setup ()
/*Start i2c -bussen som master*/
Metalltråd.begynne();

void loop ()
/*I2c bussadresse er satt som 9 for slaveenhet*/
Metalltråd.BeginTransmission (9);
Metalltråd.skriv (x); /*sender x*/
Metalltråd.EndTransmission (); /*Slutt å overføre*/
x ++; /*Økning x*/
if (x> 5) x = 0; /*Tilbakestill x når den først blir 6*/
forsinkelse (1000);

Kode startet med å inkluderer I2C Master Library. En variabel initialiseres som vil lagre heltallverdiene fra 0 til 5. I2C -adressen for slaveenheten er definert som 9. Bruke Wire Library -funksjonen

På hovedstyret, begynne() Funksjonen vil initialisere I2C -bussen som en masterenhet

Når tavlene er konfigurert, kan de kommunisere med hverandre over I2C -bussen. Master Arduino Request Data fra Slave Arduino Board og slaven kan svare med de forespurte dataene.

Slavekode

Last opp nedenfor kode til Slave Arduino Board hvor LED er tilkoblet:

#inkludere
int LED = 13; /*LED -pinne for utgang*/
int x = 0; /*Variabel for å motta verdi fra Master Arduino*/
void setup ()
pinmode (LED, output); /*LED -pinne satt som utgang*/
Metalltråd.Begynn (9); /*I2C slaveenhet vil lese dataene fra master på adresse nr. 9*/
Metalltråd.OnReceive (Mottarvent); /*Fest en funksjon for å utløse når noe mottas*/

void mottaksevent (int byte)
x = ledning.lese(); /*Les ett tegn fra I2C -mesteren*/

void loop ()
/*Hvis mottatt verdi er 0 blink LED i 200 ms*/
if (x == 0)
digitalwrite (LED, høy);
forsinkelse (200);
DigitalWrite (LED, lav);
forsinkelse (200);

/*Hvis mottatt verdi er 3 blink -ledet i 400 ms*/
if (x == 3)
digitalwrite (LED, høy);
forsinkelse (400);
DigitalWrite (LED, lav);
forsinkelse (400);

Kode startet med å inkludere trådbibliotek og neste gang satte vi den innebygde LED på pinne 13 av Slave Arduino som utgang. Neste en variabel x er definert som vil motta data fra master Arduino. Ved å bruke denne heltallverdien, vil vi blinke ledet på et bestemt tegn når den er mottatt.

I Løkke(), Den mottatte karakteren blir deretter oversatt til en annen hastighet av LED -blinkende avhengig av mottatt karakter. Hvis tilstanden brukes når den mottatte karakteren fra hovedenheten er 0, vil LED blinke med 200 ms, og hvis den mottatte karakteren er 3 LED vil blinke med forsinkelse på 400ms.

I tilfelle andre karakterer vil LED forbli av.

Produksjon

I output kan vi se LED koblet til slave Arduino blinks hver gang Master sender et tegn 0 eller 3.

Konklusjon

I2C -kommunikasjon lar flere enheter kommunisere med hverandre ved hjelp av en felles buss. Arduino -tavler kan konfigureres til å kommunisere med hverandre ved hjelp av I2C ved å koble til SDA- og SCL -pinnene og konfigurere tavlene som master og slave ved hjelp av Wire Library i Arduino. Å bruke I2C kommunikasjon med flere enheter i et prosjekt er derfor enklere og mer effektivt.