Hvordan bruke flere I2C -enheter med Arduino

Hvordan bruke flere I2C -enheter med Arduino

Arduino er et elektronisk brett bygget for utforming av prosjekter. Mens du bygger Arduino -prosjekter, spiller kommunikasjon en stor rolle. Arduino har flere kommunikasjonsprotokoller som Serial USAart, SPI og I2C. Disse protokollene forbedrer Arduino -funksjonalitet og bruk over et stort utvalg av produkter. Hvis enheten vår ikke støtter en spesifikk protokoll, har vi en fordel av å bruke de to andre. Blant alle disse I2C er en av de mest avanserte protokollene som brukes i Arduino -brett. La oss diskutere hvordan du konfigurerer I2C -protokollen for flere enheter.

I2C med Arduino

I2C også kjent som Inter Integrated Circuit er en kommunikasjonsprotokoll som brukes i Arduino -tavler. Den bruker bare to linjer for kommunikasjon og en av de mest komplekse protokollene å implementere med et Arduino -brett. Ved hjelp av I2C kan vi koble opp til 128 enheter med et Arduino -brett over en enkelt datalinje.

I2C bruker to linjer som er SDA og SCL. Sammen med disse to linjene brukes en opptreden motstand for å opprettholde både SDA- og SCL -linjen høy.

I2C -protokoller støtter flere master slavekonfigurasjon, som betyr å bruke en master arduino vi kan kontrollere flere slaveenheter.

Hvordan bruke flere I2C med Arduino

Siden I2C har master-slavekonfigurasjonsstøtte slik at vi kan kontrollere flere enheter samtidig. I noen prosjekter bruker vi forskjellige moduler, sensorer og maskinvare som støtter I2C -kommunikasjon, alle disse kan kobles til på en enkelt I2C -buss hvis de har en unik I2C -adresse. Men hvis vi har mer enn en enhet som deler den samme I2C -adressen, kan det forårsake problemer for begge enhetene, og vi kan ikke kontrollere dem ved å bruke den samme I2C -bussen. Imidlertid kan dette problemet løses ved hjelp av en TCA9548A I2C Multiplexer, denne MUX bruker en enkelt I2C -buss fra Arduino og konverterer til 8 forskjellige kanaler med alle som har separate adresser.

Alle I2C -adresser er hovedsakelig av to typer enten 7 biter eller 10 biter. De fleste av tiden enheter bruker 7 biter I2C, men 10-bit I2C brukes sjelden på enheter. Så det betyr å bruke en 7-bits adresse Arduino kan koble til 128 enheter.

Nå vil vi koble to forskjellige enheter som har unike I2C -protokoller med Arduino UNO I2C -linjer.

Kretsdiagram

Figuren nedenfor viser en OLED -skjerm festet til Arduino ved hjelp av I2C -linjer SDA og SCL. Mens en 16x2 LCD -skjerm også er koblet sammen med den samme I2C -bussen parallelt med OLED -skjermen. En viktig ting å merke seg her er at 16x2 LCD bare bruker 4 I2C -ledninger i stedet for 8 ledninger for sin kontroll. Sammen med LCD brukte vi en I2C -modul med Arduino som bare trenger 4 pinner for LCD -skjerm: VCC, GND, SDA, SCL. Ved å bruke I2C -modulen med LCD har vi lagret 4 digitale pinner på Arduino, som vil redusere over alle ledninger og forbedre Arduino -funksjonaliteten.

Hvordan sjekke adresser til I2C -enheter

Før vi kobler til en I2C -enhet med Arduino, er det viktig å merke seg at adressen er tilkoblet den spesifikke enheten er tilkoblet. Noen moduler har standard I2C -adresser skrevet på mens noen av dem ikke har noen instruksjoner for å sjekke I2C -adresser. For å løse dette problemet har vi en metalltråd Bibliotekskode som sjekker for alle I2C -enheter tilkoblet og på hvilken adresse de er koblet til Arduino. Dette vil hjelpe deg med å feilsøke og forbedre Arduino -kretsen.

Kode

#include /*Inkluder ledning.H bibliotek*/
ugyldig oppsett ()

Metalltråd.begynne(); /*Wire I2C Kommunikasjonsstart*/
Serie.Begynn (9600); /*baudfrekvens satt for seriell kommunikasjon*/
samtidig som (!Seriell); /*Venter på seriell utgang på seriell skjerm*/
Serie.println ("\ ni2c skanner");

ugyldig sløyfe ()

byte feil, adr; /*Variabel feil er definert med adresse på I2C*/
int number_of_devices;
Serie.println ("skanning.");
number_of_devices = 0;
for (ADR = 1; ADR < 127; adr++ )

Metalltråd.BeginTransmission (ADR);
feil = ledning.EndTransmission ();
if (err == 0)

Serie.print ("I2C -enhet på adresse 0x");
hvis (adr < 16)
Serie.print ("0");
Serie.trykk (ADR, Hex);
Serie.Println (" !");
NUMMER_OF_DEVICES ++;

ellers hvis (err == 4)

Serie.print ("ukjent feil på adresse 0x");
hvis (adr < 16)
Serie.print ("0");
Serie.Println (ADR, Hex);


if (number_of_devices == 0)
Serie.println ("NO I2C -enheter vedlagt \ n");
ellers
Serie.println ("gjort \ n");
forsinkelse (5000); /*Vent 5 sekunder på neste I2C -skanning*/

Denne koden vil bidra til å finne antall I2C -enheter og adressen deres som de er tilkoblet. Denne koden blir ofte referert til som I2C -skannerkode.

Først inkluderte vi en "Metalltråd.h ” bibliotek. Så i installasjonsdelen av koden har vi begynt dette biblioteket. Etter det initialiserer vi seriell kommunikasjon ved å definere baudfrekvens 9600. Dette vil bidra til å se utdata over seriemonitoren.

I seksjonen for sløyfen definerte vi to variabler “Feil” og “ADR”. Så definerte vi en annen variabel “Enheter” og sett den til null. Etter det en til Loop initialiseres med verdier mellom 0 og 127.

Deretter legger vi inn adressen til ledningen ved hjelp av metalltråd.BeginTransmission (), I2C -skanneren vil se etter bekreftelse av enheter og deres adresse. Verdien som leses vil bli lagret i variabelen "feil". Returverdien vil være lik 0 hvis enheten erkjenner at adressen ellers vil bli 4. Deretter har vi brukt en IF -tilstand som vil skrive ut I2C -enhetsadressen hvis verdien er <16. Final address of the device is printed in Hexadecimal form.

Krets

Produksjon

Utgang av enheter festet til Arduino over I2C -protokoller vil se ut som vist i diagram nedenfor. Her 0x3c er adressen til I2C LCD samtidig som 0x27 er adressen til OLED skjerm.

Konklusjon

Kobleenheter ved hjelp av I2C i Arduino kan lagre et antall pinner. Flere enheter kan kobles til ved hjelp av I2C i master-slavekonfigurasjon, men det viktigste å vurdere er at alle enheter må ha en unik I2C-adresse, ingen to enheter som har samme adresse, kan ikke betjenes ved hjelp av en enkelt I2C-buss. Så vi foreslår at en løsning på dette problemet bruker en TCA9548A I2C Multiplexer, den kan konvertere en enkelt I2C -buss til 8 forskjellige kanaler.