Tot sobre el bus I2C d'Arduino

Arduí bus I2C

Amb Arduino es poden crear gran quantitat de projectes com has pogut comprovar si llegeixes Hwlibre, programant el microcontrolador d'una manera senzilla. Però entre les connexions analògiques i digitals d'aquesta placa de hardware libre, se'n troben algunes que encara segueixen sent una mica desconegudes per a molts principiants, com el veritable potencial de les connexions PWM, el SPI, els pins RX i TX del port sèrie, o el propi bus I2C. Per això, amb aquesta entrada podràs almenys conèixer tot allò que necessites de l'I2C.

Amb el bus I2C es poden connectar i fer servir bastants dispositius de tercers que disposen d'aquest tipus de protocol per comunicar-se amb la placa Arduino. Entre ells, podràs connectar acceleròmetres, displays, comptador, brúixoles, i molts més circuits integrats gràcies a aquest invent de Philips.

Què és I2C?

I2C fa referència a Inter-Integated Circuit, És a dir, circuit inter-integrat. És un bus sèrie de comunicació de dades desenvolupat el 1982 per l'empresa Philips Semiconductors, el que avui dia és NXP Semiconductors després de desfer d'aquesta secció. En un inici es va crear per a les televisions d'aquesta marca, per comunicar diversos xips interns de forma senzilla. Però des de 1990 el I2C s'ha estès i és usat per molts fabricants.

Actualment el fan servir desenes de fabricants de xips per a múltiples funcions. Atmel, el creador dels Microcontroladors de les plaques Arduino, va introduir la designació TWI (Two Wired Interface) per motius de llicència, encara que és idèntic a I2C. Però el 2006, la patent original va caducar i ja no està subjecte a drets d'autor, per la qual cosa s'ha tornat a fer servir el terme I2C (només segueix protegint el logo, però no es restringeix la seva implementació o l'ús del terme).

Detalls tècnics de l'bus I2C

bus I2C

El bus I2C s'ha transformat en un estàndard en la indústria, i Arduino ho ha implementat per a la comunicació amb els perifèrics que ho necessitin. Només necessita de dues línies o cables per al seu funcionament, un per al senyal de rellotge (CLK) i un altre per a l'enviament de dades sèrie (SDA). Això resulta avantatjós enfront d'altres comunicacions davant el bus SPI, encara que el seu funcionament és una mica més complex per la circuiteria addicional necessària.

En aquest bus, cada dispositiu connectat a ell disposa d'una adreça que s'empra per accedir a aquests dispositius de manera individual. Aquesta adreça és fixa per maquinari, modificant els últims 3 bits mitjançant jumpers o DIPs d'interruptors, encara que també es pot fer per programari. Cada dispositiu tindrà una direcció única, encara que pot que diversos d'ells la tinguin igual i que es necessiti utilitzar un bus secundari per no generar conflictes o canviar-la si és possible.

A més, el bus I2C té una arquitectura tipus Master-Slave, és a dir, mestre-esclau. Això vol dir que quan s'inicia la comunicació per part d'un dispositiu mestre, aquest podrà enviar o rebre dades dels seus esclaus. Els esclaus no podran iniciar la comunicació, només ho pot fer el mestre, i tampoc poden parlar els esclaus entre si de forma directa sense que intervingui el mestre.

si tens diversos mestres al bus, Només un podrà exercir de mestre simultàniament. Però no val la pena, ja que el canvi de mestre demanda d'una alta complexitat, pel que no és freqüent.

Tingues en compte que el mestre proporciona el senyal de rellotge per sincronitzar tots els dispositius de l'bus. Això elimina la necessitat que cada esclau necessiti tenir el seu propi rellotge.

El protocol de el bus I2C també preveu l'ús de resistències pull-up a les línies de voltatge (Vcc) d'alimentació, tot i que amb Arduino no se solen utilitzar aquestes resistències pull-up perquè les biblioteques de programació com Wire activa les internes amb valors de 20-30 k. Això pot resultar massa tou per a alguns projectes, po tant, els flancs de pujada del senyal seran menys ràpids, per la qual cosa es poden usar velocitats menors i distàncies de comunicació inferiors. Per corregir això és possible que necessitis posar resistències externes pull-up de 1k a 4k7.

senyal

I2C senyal

La trama de comunicació de què consta un senyal de l'bus I2C es compon dels bits o estats (els empleats en Arduino, ja que l'estàndard I2C permet altres):

  • 8 bits, 7 d'ells de Direcció de el dispositiu esclau a què es vol accedir per enviar o rebre dades d'ell. Amb 7 bits es poden crear fins a 128 adreces diferents, de manera que es podria accedir teòricament a 128 dispositius, però només es pot accedir a 112, ja qu 16 es reserven per a usos especials. I el bit addicional que indica si es vol enviar o rebre informació de el dispositiu esclau.
  • També hi ha un bit de validació, Si no està actiu la comunicació no serà vàlida.
  • Després vindrien els bytes de dades que es volen enviar o rebre pels esclaus. Cada byte, com saps, està compost per 8-bits. Tingues en compte que per cada 8 bits o 1 byte de dades enviades o rebudes es necessiten 18 bits addicionals de validació, adreça, etc., el que significa que el bus està molt limitat pel que fa a velocitat.
  • Un bit final de validació de la comunicació.

A més, la freqüència de rellotge per a les transmissions és de 100 MHz de forma estàndard, encara que hi ha una manera més ràpida a 400 MHz.

Avantatges i desavantatges de l'bus I2C

Les avantatges són:

  • senzillesa a el sol usar dues línies.
  • disposa de mecanismes per saber si el senyal ha arribat enfront d'altres protocols de comunicació.

Les desavantatges són:

  • Velocitat de transmissió bastant baixa.
  • No és un full duplex, És a dir, no pot enviar i rebre de forma simultània.
  • No fa servir paritat ni un altre tipus de mecanisme de verificació per saber si els bits de dades que es reben són correctes.

I2C a Arduino

Arduí bus I2C

En Arduino, segons el model, Els pins que es poden habilitar per usar aquest bus I2C varien. Per exemple:

  • Arduino UNO, Nano, Mini Pro: S'usa l'A4 per SDA (dades) i A5 per SCK (rellotge).
  • Arduino Mega: Pin 20 per SDA i 21 per a SCK.

Recorda que per usar-lo has fer ús de la biblioteca Wire.h per als teus codis d'Arduino IDE, encara que existeixen altres com I2C y I2Cdevlib. Pots llegir els documents d'aquestes biblioteques o els nostres articles sobre els projectes que t'interessin per obtenir codis de com es programaria.

Com saber la direcció d'un dispositiu per usar-la amb I2C?

Només un últim advertiment, i és que quan compres ICs de fabricants europeus, japonesos o americans, et indiquen la direcció que has de fer servir per al dispositiu. En canvi, els xinesos de vegades no te la detallen o no és la correcta, per la qual cosa no funcionarà. Això es pot solucionar fàcilment amb un escàner d'adreces per saber a quina direcció t'has de referir al teu sketch.

La comunitat d'Arduino ha creat aquest codi per escanejar la direcció i identificar-la de forma senzilla. Encara que et mostro el codi aquí mateix:

#include "Wire.h"
 
extern "C" { 
    #include "utility/twi.h"
}
 
void scanI2CBus(byte from_addr, byte to_addr, void(*callback)(byte address, byte result) ) 
{
  byte rc;
  byte data = 0;
  for( byte addr = from_addr; addr <= to_addr; addr++ ) {
    rc = twi_writeTo(addr, &data, 0, 1, 0);
    callback( addr, rc );
  }
}
 
void scanFunc( byte addr, byte result ) {
  Serial.print("addr: ");
  Serial.print(addr,DEC);
  Serial.print( (result==0) ? " Encontrado!":"       ");
  Serial.print( (addr%4) ? "\t":"\n");
}
 
 
const byte start_address = 8;
const byte end_address = 119;
 
void setup()
{
    Wire.begin();
 
    Serial.begin(9600);
    Serial.print("Escaneando bus I2C...");
    scanI2CBus( start_address, end_address, scanFunc );
    Serial.println("\nTerminado");
}
 
void loop() 
{
    delay(1000);
}


Sigues el primer a comentar

Deixa el teu comentari

La seva adreça de correu electrònic no es publicarà. Els camps obligatoris estan marcats amb *

*

*

  1. Responsable de les dades: Miguel Ángel Gatón
  2. Finalitat de les dades: Controlar l'SPAM, gestió de comentaris.
  3. Legitimació: El teu consentiment
  4. Comunicació de les dades: No es comunicaran les dades a tercers excepte per obligació legal.
  5. Emmagatzematge de les dades: Base de dades allotjada en Occentus Networks (UE)
  6. Drets: En qualsevol moment pots limitar, recuperar i esborrar la teva informació.