Protocolul I2C explicat: ghid Arduino, ESP32 și Raspberry Pi

Grafic care ilustrează magistrala I2C cu liniile SDA și SCL

Dacă ai conectat vreodată un senzor, un afișaj sau o placă breakout la un Arduino, la un ESP32 sau la un Raspberry Pi, ai văzut literele I2C.

La început pare mult de digerat. Există pini numiți SDA și SCL, fiecare dispozitiv are o adresă, iar mai multe module împart aceleași două fire. Ideea de bază este însă mică, iar odată ce se așază în cap, restul protocolului decurge din ea.

I2C îi permite unei plăci să vorbească cu senzori, afișaje, ceasuri, cipuri de memorie și expandere de IO prin două fire de semnal. Nu îi dai fiecărui modul propriul set de pini. Toate stau pe aceeași pereche, iar placa alege pe nume cu care dintre ele vorbește.

Ce este I2C?

I2C vine de la Inter-Integrated Circuit, scris uneori I²C. Este un protocol de comunicație care permite cipurilor de pe aceeași placă, sau modulelor aflate la capătul unui cablu, să facă schimb de date prin două fire partajate.

Într-un proiect de maker, controlerul este un Arduino, un ESP32, un Raspberry Pi sau altă placă de dezvoltare. Dispozitivele de la celălalt capăt sunt senzori, afișaje, ceasuri de timp real, memorii EEPROM, convertoare ADC și expandere de IO.

Motivul pentru care îl întâlnești peste tot este cablarea. Un afișaj SPI cu patru linii plus un senzor SPI cu patru linii te costă opt pini. Ambele componente pe I2C te costă doi, iar al treilea și al patrulea dispozitiv nu te mai costă nimic în plus. Pe o placă cu cincisprezece pini utilizabili, diferența asta decide ce poți construi.

Ce înseamnă SDA și SCL?

I2C folosește două linii de semnal, iar fiecare dispozitiv de pe magistrală se conectează la amândouă.

SDA înseamnă Serial Data. Transportă informația propriu-zisă, bit cu bit, în ambele direcții.

SCL înseamnă Serial Clock. Transportă sincronizarea. Controlerul îl comandă, iar fiecare bit de pe SDA este citit pe un front de ceas, așa că toate dispozitivele rămân în pas.

SDA duce mesajul, iar SCL dă ritmul. Ambele linii au nevoie și de alimentare și de masă alături, motiv pentru care în practică o conexiune I2C are patru fire, chiar dacă doar două dintre ele duc semnal.

Cum funcționează comunicația I2C?

Un singur schimb urmează de fiecare dată aceiași cinci pași:

  1. Controlerul trage SDA la zero cât timp SCL este încă sus. Asta este condiția de start și le spune tuturor dispozitivelor de pe magistrală să fie atente.
  2. Controlerul trimite adresa dispozitivului pe care îl vrea, plus un bit care spune dacă intenționează să citească sau să scrie.
  3. Dispozitivul cu acea adresă răspunde cu un bit de confirmare. Restul se întorc la a ignora magistrala.
  4. Octeții de date circulă în direcția cerută de controler, fiecare dintre ei confirmat.
  5. Controlerul eliberează SDA cât timp SCL este sus. Asta este condiția de stop, iar magistrala este din nou liberă.
Diagramă de timp a unui transfer I2C, cu liniile SDA și SCL, condiția de start, biții de date numerotați și condiția de stop
S marchează condiția de start, iar P condiția de stop. Tot ce se află între ele aparține unui singur dispozitiv.

Nimic de pe magistrală nu vorbește dacă nu i se vorbește. Ăsta este întregul truc din spatele împărțirii a două fire între o duzină de componente.

Ce este o adresă I2C?

O adresă I2C este numele dispozitivului pe magistrală. I2C standard folosește 7 biți, deci există 128 de adrese posibile, iar câteva dintre ele sunt rezervate. Adresa este stabilită de producătorul cipului și este trecută în datasheet ca număr hexazecimal, de exemplu 0x27 sau 0x51.

Majoritatea cipurilor îți permit să schimbi o parte din adresă, de obicei ultimii doi sau trei biți, cu jumperi de lipit sau cu un pin de adresă. Afișajul LCD 16x2 pe I2C este un exemplu clar: primii patru biți sunt fixați la 0100, iar jumperii A2, A1 și A0 aleg restul.

Schema unui octet de adresă I2C pe 7 biți, cu patru biți ficși, biții A2, A1 și A0 selectabili hardware și bitul de citire sau scriere
Patru biți sunt înscriși în cip și trei sunt ai tăi, ceea ce îți dă opt astfel de afișaje pe o singură magistrală.

Două dispozitive cu aceeași adresă pe aceeași magistrală este defecțiunea peste care vei da mai devreme sau mai târziu. Răspund amândouă deodată, datele se întorc ca gunoi, iar la cablare nimic nu pare greșit. Rezolvarea este să schimbi o adresă cu jumperii sau să împarți componentele pe două magistrale.

Când un proiect nu mai răspunde, rulează mai întâi un sketch de scanare I2C. Parcurge toate cele 128 de adrese și afișează ce răspunde. Dacă senzorul tău nu este în listă, problema este la alimentare sau la cablare, nu la codul tău.

Breakout cu ceas de timp real PCF85063A și conector Qwiic

Modul RTC PCF85063A, vedere detaliată a plăcii

Real Time Clock RTC PCF85063A Breakout

De ce este I2C util în proiectele cu Arduino și ESP32

Avantajele practice se adună repede:

  • Doi pini pentru toată magistrala, indiferent câte dispozitive atârnă de ea.
  • Adăugarea unui modul înseamnă o modificare de cablare de zero pini și câteva linii de cod.
  • Aproape fiecare senzor și afișaj care merită folosit are o bibliotecă Arduino întreținută.
  • Funcționează prin cablu, deci senzorul poate sta la distanță de placă.
  • Se potrivește montajelor mici, unde rămâi fără pini cu mult înainte să rămâi fără spațiu.

Un expander de IO este ilustrarea cea mai clară. Este un cip I2C a cărui singură menire este să îți dea mai mulți pini, așa că doi pini de pe placa ta se transformă în șaisprezece pe expander. Butoanele, LED-urile și releele care ți-ar fi mâncat GPIO-ul se mută toate pe magistrală.

Breakout cu expander de IO MCP23017 și conector Qwiic

Expander de IO MCP23017, vedere detaliată a plăcii

IO Expander MCP23017 Breakout

De ce conectorii Qwiic fac I2C mai ușor

Cablarea I2C clasică înseamnă patru fire jumper de fiecare modul: SDA, SCL, alimentare și masă. Încurcă unul dintre ele și modulul tace, sau mai rău, se încălzește. Înmulțește asta cu patru senzori pe un breadboard și cea mai mare parte din depanare ține de cablare, nu de cod.

Qwiic înlocuiește acele patru fire cu un singur cablu cu patru pini, cu cheie de poziționare. Intră doar într-un singur fel, ordinea pinilor este fixă pe fiecare placă care îl folosește, iar conectorii se leagă în lanț, așa că al doilea senzor se conectează în primul, nu înapoi în placă.

Placă de dezvoltare NULA cu conectorul Qwiic evidențiat pe marginea PCB-ului
Conectorul este aceeași piesă pe fiecare placă care îl are, iar asta face cablurile interschimbabile.

Nimic din toate astea nu schimbă protocolul. Aceleași două semnale circulă prin aceiași doi conductori, iar un senzor Qwiic și unul cablat cu fire jumper arată identic pentru codul tău. Ce se schimbă este numărul de moduri în care poți greși. Fiecare breakout Soldered are conectorul, iar ghidul despre ecosistemul Qwiic acoperă ce mai cuprinde el.

Cablu Qwiic JST-SH cu 4 pini pentru conexiuni I2C

Cablu Qwiic de 10 cm pentru module compatibile easyC

Qwiic Cable

Qwiic Hub pentru conectarea mai multor module easyC pe aceeași magistrală I2C

Qwiic Hub din ecosistemul easyC, vedere detaliată a conectorilor

Qwiic Hub

I2C cu Arduino, ESP32 și Raspberry Pi

Toate trei citesc aceleași componente I2C. Ce se schimbă sunt pinii, tensiunea și software-ul din jur. Dacă încă alegi între ele, comparația Arduino vs Raspberry Pi vs ESP32 trece prin compromisurile fiecăreia.

I2C cu Arduino

Plăcile Arduino gestionează I2C prin biblioteca integrată Wire. Pe un Uno sau pe orice altă placă cu ATmega328, pinii sunt ficși: A4 este SDA și A5 este SCL. Apelezi Wire.begin() în setup, iar biblioteca dispozitivului face restul.

Două greșeli explică majoritatea problemelor de început. Prima este cablarea la pinii greșiți, pentru că I2C nu se află pe pinii marcați SDA și SCL la fiecare variantă de placă. A doua este să lași adresa la valoarea implicită din bibliotecă atunci când modulul tău vine cu alta.

I2C cu ESP32

Alocarea pinilor pe ESP32 este flexibilă. Majoritatea nucleelor folosesc implicit GPIO 21 pentru SDA și GPIO 22 pentru SCL, dar poți transmite propria ta pereche către Wire.begin(sda, scl) și poți duce magistrala oriunde cere cablajul. Cipurile mai noi, cum este ESP32-C6, folosesc alte valori implicite, așa că verifică pinout-ul plăcii în loc să copiezi un tutorial.

Motivul pentru care alegi un ESP32 este ce se întâmplă după citire. Wi-Fi-ul este pe cip, așa că valoarea unui senzor poate merge direct în Home Assistant, într-un broker MQTT sau într-un dashboard web. Selecția noastră de proiecte ESP32 pentru începători are exemple funcționale pentru asta.

Pinii ESP32 sunt de 3,3 V. Majoritatea breakout-urilor I2C funcționează fără probleme la oricare dintre tensiuni, dar un modul de 5 V pe o placă de 3,3 V trebuie verificat înainte să îl conectezi.

I2C cu Raspberry Pi

Pe un Raspberry Pi, I2C este dezactivat implicit. Îl activezi în raspi-config, apoi i2cdetect -y 1 listează tot ce se află pe magistrală, adică exact treaba pe care o face un sketch de scanare pe Arduino. SDA este pe pinul fizic 3, iar SCL pe pinul 5.

Un Pi merită atunci când citirile au nevoie de un loc în care să stea. Rulează o bază de date, un dashboard Grafana sau un server local în paralel cu bucla de citire a senzorilor, lucru pe care un microcontroler nu îl poate face. GPIO-ul de pe Pi este doar de 3,3 V, fără toleranță la 5 V, așa că asta este platforma pe care nivelurile logice chiar contează.

Raspberry Pi 5 cu 4 GB RAM, vedere de sus a plăcii

Raspberry Pi 5 de 4 GB, vedere detaliată a porturilor

Raspberry Pi 5, 4GB

Raspberry Pi 5 cu 8 GB RAM, vedere de sus a plăcii

Raspberry Pi 5 de 8 GB, vedere detaliată a porturilor

Raspberry Pi 5, 8GB

I2C vs SPI vs UART

Protocol Fire Viteză tipică Cel mai potrivit pentru Avantajul principal
I2C 2 fire de semnal, partajate 100 kHz până la 400 kHz Senzori, afișaje cu caractere și afișaje grafice mici, module RTC, expandere de IO Multe dispozitive pe aceiași doi pini
SPI 4 fire, plus câte un chip select per dispozitiv Câțiva MHz și peste Afișaje color, carduri SD, memorie flash, senzori cu rată mare de citire Mult mai rapid
UART 2 fire de semnal, punct la punct De obicei 9600 până la 115200 baud Module GPS, radiouri, legături între plăci Fără adresare și fără linie de ceas de care să te împiedici

Alege I2C atunci când ai mai multe dispozitive lente și puțini pini liberi. Alege SPI atunci când un dispozitiv trebuie să mute multe date, cum este un afișaj color care reîmprospătează un cadru. Alege UART atunci când exact două lucruri trebuie să facă schimb de octeți, motiv pentru care aproape orice modul GPS îl folosește.

Ce sunt rezistențele de pull-up în I2C?

Dispozitivele I2C nu își duc niciodată liniile în sus. Pot doar să le tragă în jos sau să le elibereze, iar asta face sigură împărțirea unui fir între o duzină de cipuri: două dintre ele care vorbesc în același timp nu pot scurtcircuita o alimentare la masă. Ceva trebuie să readucă linia sus, iar acel ceva este rezistența de pull-up.

Majoritatea plăcilor breakout au propriile rezistențe de pull-up, așa că un prim proiect funcționează de obicei fără să adaugi nimic. Problema apare la al patrulea sau al cincilea modul: acele rezistențe ajung în paralel, iar suficient de multe în paralel trag magistrala în jos până când nimic nu mai poate elibera o linie cum trebuie. Plăcile care se așteaptă la asta pun rezistențele de pull-up pe jumperi de lipit, ca să le poți tăia.

Când un proiect I2C devine nesigur, verifică în ordinea asta rezistențele de pull-up, lungimea cablului, tensiunea de alimentare și adresele duplicate. Traseele lungi sunt cealaltă cauză frecventă: peste un metru, capacitatea cablului rotunjește fronturile, iar citirile încep să se piardă. Un extender de magistrală rezolvă asta ca la carte, în loc să cobori frecvența de ceas și să speri.

Breakout extender de magistrală I2C P82B715 de la Soldered

Extender de magistrală I2C P82B715, vedere detaliată a plăcii

Soldered I2C bus extender P82B715 breakout

Dispozitive și module I2C uzuale

Tip de modul Ce face Exemplu de proiect
Senzor de temperatură și umiditate Măsoară temperatura și umiditatea aerului Stație meteo
Modul RTC Ține ora exactă chiar și la pene de curent Ceas digital sau logger de date
Afișaj LCD Afișează text și valori Dashboard cu senzori
Expander de IO Adaugă șaisprezece pini de intrare și ieșire Panou cu butoane sau comandă de relee
Senzor de lumină Măsoară luminozitatea Afișaj cu reglare automată a luminozității
Senzor de calitate a aerului Măsoară CO₂ sau compuși organici volatili Monitor de confort pentru cameră
Controler tactil Transformă o suprafață în dispozitiv de intrare Panou de comandă inteligent
Afișaj e-paper Afișează informații fără să consume energie ca să le mențină Calendar sau dashboard

Ultimul rând merită o precizare. Panoul e-paper în sine nu este un dispozitiv I2C, dar controlerul tactil, modulul RTC și senzorii din jurul lui sunt, și așa ajunge un afișaj e-paper să fie interfața din față a unui proiect I2C.

Idei de proiecte I2C pentru începători

1. Afișaj de temperatură pe LCD I2C

Citește un senzor de temperatură și scrie valoarea pe un LCD 16x2. Senzorul nu trebuie să fie neapărat I2C ca asta să funcționeze, iar DS18B20 este one-wire, dar afișajul îți economisește șase pini față de un LCD paralel. Este drumul cel mai scurt de la un număr în monitorul serial la un număr pe un ecran.

Senzor de temperatură DS18B20 impermeabil cu sondă din inox

Senzor DS18B20 impermeabil, vedere detaliată a cablului și a sondei

Waterproof DS18B20 Temperature Sensor

2. Proiect cu ceas de timp real

Construiește un ceas sau adaugă marcaje de timp într-un logger de date. Orice este construit pe millis() derivează cu minute pe zi și o ia de la zero după o pană de curent, așa că un log fără RTC nu are în el ore utilizabile.

3. Senzor de casă inteligentă cu ESP32

Pune unul sau mai mulți senzori I2C pe un ESP32 și publică citirile în Home Assistant sau într-un broker MQTT. Ăsta este proiectul în care magistrala pe două fire își arată valoarea, pentru că adăugarea unui al doilea și al treilea senzor nu schimbă absolut deloc cablarea.

4. Panou cu butoane pe expander de IO

Conectează opt butoane și opt LED-uri la un expander în loc să le pui pe placă. Doi pini duc tot, iar codul citește un registru în loc de șaisprezece intrări.

5. Dashboard cu senzori pe e-paper

Adună temperatura, umiditatea, calitatea aerului și ora prin I2C și desenează-le pe toate pe un Inkplate. E-paper se potrivește pentru că panoul consumă energie doar când se schimbă imaginea, așa că numerele pot sta pe un perete luni întregi. Dacă ai deja Home Assistant pornit în casă, ghidul despre afișaje e-paper pentru dashboard-uri Home Assistant acoperă acel montaj.

De ce Soldered este un punct bun de plecare pentru proiecte I2C

Merită să înveți I2C devreme, pentru că apare în aproape orice proiect care trece de LED-ul care clipește. Odată ce SDA, SCL, adresele și magistrala partajată încep să aibă sens, un datasheet încetează să mai fie un zid de text și devine o listă de registre pe care le poți citi.

Soldered produce plăcile, senzorii, afișajele și kiturile pentru asta, construite ca să funcționeze împreună, iar pe BazaIoT le găsești pe cele pe care le avem pe stoc. Fiecare breakout are conector Qwiic și o bibliotecă Arduino întreținută, așa că un senzor nou înseamnă un cablu și un sketch de exemplu. Începe cu un RTC sau cu un LCD, adaugă un senzor când vrei să măsori ceva și pune un Inkplate în față atunci când numerele trebuie citite și de altcineva în afară de tine.

Întrebări frecvente

Ce este I2C?
I2C este un protocol de comunicație care permite dispozitivelor să vorbească prin două fire de semnal partajate, SDA și SCL. Este folosit pentru senzori, afișaje, module RTC, expandere de IO și majoritatea plăcilor breakout.

De la ce vine I2C?
De la Inter-Integrated Circuit. Se scrie și I²C și se pronunță fie „i pătrat ce", fie „i doi ce".

Ce sunt SDA și SCL?
SDA înseamnă Serial Data și transportă informația. SCL înseamnă Serial Clock și dă sincronizarea, astfel încât fiecare dispozitiv citește fiecare bit în același moment.

Cum funcționează I2C?
Controlerul trimite o condiție de start, apoi adresa dispozitivului pe care îl vrea. Răspunde doar dispozitivul cu acea adresă. Datele circulă în oricare direcție, iar o condiție de stop eliberează magistrala pentru următorul schimb.

Ce este o adresă I2C?
Un identificator pe 7 biți care îi spune unui dispozitiv de pe magistrală să răspundă, iar restului să tacă. Este stabilit de producătorul cipului, iar majoritatea modulelor îți permit să schimbi biții cei mai puțin semnificativi cu jumperi, ca să poți folosi mai multe exemplare din aceeași componentă.

Poate Arduino să folosească I2C?
Da, prin biblioteca Wire. Pe un Uno, pinii sunt A4 pentru SDA și A5 pentru SCL.

Poate ESP32 să folosească I2C?
Da, iar pinii sunt configurabili. Majoritatea nucleelor folosesc implicit GPIO 21 și GPIO 22, dar poți transmite propria ta pereche către Wire.begin().

Poate Raspberry Pi să folosească I2C?
Da, odată ce îl activezi în raspi-config. Folosește i2cdetect -y 1 ca să listezi ce este conectat.

Care este diferența dintre I2C și SPI?
I2C folosește două fire partajate și adrese ca să aleagă un dispozitiv. SPI folosește patru fire plus o linie de chip select pentru fiecare dispozitiv și este de câteva ori mai rapid. I2C se potrivește senzorilor și afișajelor mici, SPI se potrivește afișajelor color și memoriei.

Care este diferența dintre I2C și UART?
I2C este o magistrală cu adresare, așa că un singur controler poate ajunge la mai multe dispozitive. UART este o legătură punct la punct între exact două dispozitive, fără adresare și fără ceas partajat.

De ce are nevoie I2C de rezistențe de pull-up?
Dispozitivele I2C pot doar să tragă o linie în jos, niciodată să o ducă în sus, așa că o rezistență trebuie să o readucă în starea de repaus. Majoritatea breakout-urilor au propriile rezistențe, dar cu mai multe module pe o singură magistrală rezistența echivalentă în paralel poate ajunge suficient de mică încât să creeze probleme.

Câte dispozitive pot conecta pe o singură magistrală I2C?
În teorie 112 adrese utilizabile, iar în practică rămâi fără altceva mai întâi. Limitele reale sunt adresele duplicate și capacitatea totală a cablului, nu spațiul de adrese.

Ce proiecte pot construi cu I2C?
Afișaje de temperatură, ceasuri, loggere de date, senzori de casă inteligentă, stații meteo, panouri cu butoane, dashboard-uri e-paper și sisteme de monitorizare cu senzori.

Articol tradus și publicat pe BazaIoT cu acordul Soldered Electronics. Versiunea originală în limba engleză: I2C protocol explained: Arduino, ESP32 and Raspberry Pi guide.

0 comments

Leave a comment

Please note, comments need to be approved before they are published.