Denne artikkelen dekker:
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:
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.