Arduino i2c


En este post iniciaremos con el entendimiento de la comunicación i2c en la placa arduino

oscar Escrito por oscar 31 December 2020 3546 0

Acerca del proyecto

En este post iniciaremos con el entendimiento de la comunicación i2c en la placa arduino, vamos a dar un repaso de este protocolo donde entenderemos como es que se da la comunicación del dispositivo principal a los dispositivos secundarios, el entendimiento de las direcciones que tiene cada uno de los dispositivos y cómo se hace la comunicación a 2 hilos todo esto viéndolo desde el arduino utilizando la librería wire.

En este post veremos algunas definiciones, algo de código muy sencillo y trabajaremos con el programa Scanner el cual se encarga de buscar en la red i2c todos los dispositivos que contengan y mostrarnos su dirección para establecer una comunicación.

Conocimiento previo

Para realizar este proyecto se requiere conocimiento previo de los siguientes temas, si aun no has trabajado con lo que se menciona en la siguiente tabla, allí están los links a los post para que puedas dar un repaso adicional o puedas recordar el conocimiento necesario para poder realizar este proyecto.

Proyecto Descripción
i2c Damos la definición donde encontrar a cada uno de los conceptos necesarios para poder entender el protocolo.
Librería wire Aquí encontrará la documentación de la librería wire donde podrá consultar cada una de las funciones y saber qué parámetros requiere y que información devuelve.

Bus I2c en arduino

Arduino o para ser más específico los circuitos integrados atmel cuentan con comunicación i2c, si observamos en su documentación oficial de cada uno de los chips podemos encontrar las características de este protocolo, aunque todas tienen en común lo siguiente, es una comunicación a 2 hilos y que esta comunicación permite conectar hasta 128 dispositivos utilizando diferentes direcciones, estos dos hilos básicamente se utilizan uno para el reloj y el otro para los datos y para poder implementar este protocolo lo único que tenemos que hacer es conectar dos resistencias pull-up acabado las líneas para que funcione correctamente la comunicación ya les explicaré más abajo él porque estas dos resistencias. A continuación dejo más información que le pueden ayudar a entender el protocolo en arduino:[1]

Caracteristicas

  • Interfaz de comunicación simple pero potente y flexible, solo se necesitan dos líneas de bus.
  • Compatible con la operación de maestro y esclavo.
  • El dispositivo puede funcionar como transmisor o receptor.
  • El espacio de direcciones de 7 bits permite hasta 128 direcciones esclavas diferentes.
  • Soporte de arbitraje multimaestro.
  • Velocidad de transferencia de datos de hasta 400 kHz.
  • Controladores de salida limitada de velocidad de respuesta.
  • El circuito de supresión de ruido rechaza picos en las líneas de bus.
  • Dirección de esclavo totalmente programable con soporte de llamada general.
  • El reconocimiento de direcciones hace que se despierte cuando el AVR® está en modo de suspensión.
  • Compatible con el protocolo I2C de Phillips.

i2c pines en arduino

A continuación tenemos una tabla donde colocamos las principales placas de arduino y los fines que utiliza para hacer la comunicación i2c:

Modelo SDA SCK
Uno A4 A5
Nano A4 A5
Mini Pro A4 A5
Mega 20 21
Due 20 21
Leonardo 2 3

Ejemplo con arduino

Ahora para este ejercicio vamos a trabajar con uno de los ejemplos que nos proporciona el entorno de arduino que es un escáner i2c, este primer ejemplo consiste en conectar varios dispositivos con este protocolo, a verificar y averiguar cuáles son sus direcciones en este protocolo y vamos a comprobar si se encuentran conectados para establecer comunicación.

Para este ejercicio vamos a conocer la librería que nos proporciona arduino para trabajar con este protocolo cubos a crear un pequeño proyecto para eso vamos a utilizar los siguientes materiales y los que puedan conseguir y vamos a utilizar el código que ya se encuentran los ejemplos de arduino.[2]

Librería wire

Esta librería le permite comunicarse al arduino por medio de modulo interno i2c, ya sea como principal a otros dispositivos o como secundario recibiendo peticiones y respondiendo datos. Esta librería esta incluida por defecto en el entorno de desarrollo del arduino y no requiere descargarla.

Para conocer más detalles de esta librería en el siguiente link de librería wire encontrarás todas las características y las funciones que posee allí También tenemos la documentación donde explico como se utiliza cada una de las funciones.

Materiales

Para realizar este ejemplo necesitamos cualquier dispositivo que realice la comunicación i2c, principalmente necesitamos un arduino y en este caso como menciona la siguiente tabla cuento con estos dispositivos los cuales nos pueden servir para el ejemplo:

Material Cantidad Descripción
Arduino uno 1 Controlador del circuito
LCD i2c 2x16 1 Pantalla lcd con modulo i2c
DS3231 1 Reloj de tiempo real

Conexión

La conexión de los módulos i2c es relativamente sencilla, pero debemos tener cuidado al momento de hacer la conexión, ya que al estar en una misma red, podemos afectar la comunicación o incluso quemar todos los módulos o circuitos si conectamos mal la alimentación eléctrica de alguno de ellos.

Primero debemos conectar las resistencias pull up de 4.7k a los pines SCL y SDA, estos los identificamos según el modelo de arduino con el que vamos a trabajar, ahora en los dispositivos que vamos a conectar también identificamos los pines del i2c y estos los conectamos directo al arduino, observemos la siguiente imagen:

i2c conexión arduino
i2c conexión arduino

Podemos observar en esta imagen de referencia que tenemos varios módulos conectados al bus i2c, están las resistencias al pull up y solo necesitamos de dos cables.

Código i2c scanner

El primer código que vamos a trabajar es un scanner que identifica y muestra las direcciones en el bus, con este código vamos a entender el funcionamiento del modulo de comunicación y como usar la librería wire que esta incluida en el entorno de arduino, esta librería contiene todas las configuraciones, funciones y parámetros necesarios para usar el modulo i2c de forma correcta sin tener que complicarnos, a continuación usare el código que lo podemos encontrar en los ejemplos del ide de arduino.

//El códilo lo encuentra en IDE arduino > archivo > ejemplo > wire > i2c_scanner 

// Paso 1
#include <Wire.h>

void setup() {
    // Paso 2
    Wire.begin();

    Serial.begin(9600);
    while (!Serial);
    Serial.println("Escaner I2C");
}

void loop() {
    // Paso 3
    int nDevices = 0;

    Serial.println("Escaneando ...");
    
    // Paso 4
    for (byte address = 1; address < 127; ++address) {
        // Paso 5
        Wire.beginTransmission(address);
        // Paso 6
        byte status = Wire.endTransmission();

        // Paso 7
        if (status == 0) {
            Serial.print("I2C disposiivo encontrado en 0x");
            if (address < 16) {
                Serial.print("0");
            }
            Serial.print(address, HEX);
            Serial.println("  !");

            ++nDevices;
        } else if (status == 4) {
            Serial.print("Error desconocido en la dirección 0x");
            if (address < 16) {
                Serial.print("0");
            }
            Serial.println(address, HEX);
        }
    }
    // Paso 8
    if (nDevices == 0) {
        Serial.println("No se encontraron dispositivos I2C");
    } else {
        Serial.println("Se encontraron: ");
        Serial.print(nDevices)
        Serial.print(" disposiivos ");
    }
    delay(5000);
}
  • Vamos a incluir la librería, esta no necesita ser descargada ya esta integrada en el entorno arduino.
  • Con begin inicializamos la librería donde realizara las configuraciones necesarias para poder trabajar con el protocolo.
  • Para este ejemplo vamos a mostrar los dispositivos detectados, para ello creamos un contador de los dispositivos que logre encontrar.
  • Como nos menciona las características del protocolo podeos conectar hasta 127 dispositivos, así que creamos un clico desde 1 a 127, esto con el fin de buscar en cada una de las direcciones el dispositivo para que nos de una respuesta de que este conectado.
  • Iniciamos la trasmisión con beginTransmission, pasamos como parámetro la dirección que esta en el contador address del ciclo.
  • Después de iniciar la trasmisión de datos a la dirección la detenemos con endTransmission, esta devolverá el estado que puede ser correcta o un error, estos códigos los podemos ver en el post de librería wire buscando la función.
  • Si el estado es correcto "0" mostramos la dirección del dispositivo encontrado y aumentamos el contador, de lo contrario si detecto un error, mostramos un mensaje indicando que el dispositivo no funciona, por ultimo si no encontró nada no muestra ningún mensaje.
  • Finalizamos mostrando la cantidad de dispositivos encontrados.

Referencias

[1] microchip https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf, Consultado Diciembre 2020

[2] hetpro-store https://hetpro-store.com/TUTORIALES/i2c/, Consultado Diciembre 2020


Comentario

Debe aceptar antes de enviar