En este artículo pretendo documentar el procedimiento para establecer comunicación entre Arduino y Digispark por medio del protocolo de comunicación I2C. Para los que no lo conocen, el Digispark es una placa de desarrollo basada en el microcontrolador ATtiny85. Se caracteriza por su tamaño, consumo energético y costo reducido.
Este dispositivo resulta muy útil cuando se necesita realizar tareas que requieren poca capacidad de procesamiento o pocas entradas/salidas analógicas o digitales.
Es posible hacer diseños de sistemas con múltiples dispositivos esclavos basados en Digisparks que responden a una unidad máster central. Sería como tener múltiples subnúcleos que responden a un procesador principal. Por supuesto que es necesario que estos subnúcleos se comuniquen con la unidad central, para lo cual es necesario un medio y un protocolo de comunicación.
El protocolo I2C permite la interconexión de múltiples dispositivos en un solo bus. La interconexión de los dispositivos es en paralelo, donde cada dispositivo posee una dirección única dentro del bus. El máster puede solicitar información a cada esclavo de la red haciendo referencia a su dirección dentro de la misma.
El protocolo de comunicación I2C es muy utilizado para la interconexión de múltiples dispositivos a través de cables, siempre y cuando las distancias no sean demasiado largas. Casi siempre la distancia máxima de cable se ubica entre 6 y 20 pies. El bus de comunicación I2C consiste en 3 conexiones cableadas: una línea SDA, una línea SCL y una linea de puesta a tierra (GND). La conexión de cada dispositivo al bus de comunicación se hace en paralelo.
Tanto Arduino como Digispark poseen la capacidad de conectarse a un bus de comunicación I2C. Ambos dispositivos pueden actuar como máster o esclavos, dependiendo de la necesidad del usuario. Esto permite que este protocolo sea una gran opción para interconectar múltiples dispositivos de este tipo.
Para los efectos de este post utilizaré un Arduino Nano como referencia, aunque casi cualquier modelo de Arduino puede ser utilizado.
Según el diagrama de pines del Arduino Nano, los puertos SDA y SCL se ubican en los pines A4 y A5, respectivamente. Es a través de estos puertos que el Arduino puede unirse a un bus I2C y establecer comunicación con otros dispositivos a través del mismo.
Según el diagrama de pines del Digispark, los puertos SDA y SCL se ubican pines D0 y D2, respectivamente. El siguiente diagrama muestra la interconexión entre un Digispark y un Arduino Nano a través de un bus I2C.
Para habilitar la comunicación entre los dos dispositivos es necesario programar ambos microcontroladores con las librerías adecuadas. En el caso del Arduino Nano, la librería Wire.h, nativa en el Arduino IDE, permite unirnos a un bus I2C e intercambiar datos. Para este post consideraremos el siguiente código para el Arduino Nano:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#include <Wire.h> void setup() { Wire.begin(); //Se inicia el bus I2C Serial.begin(9600); //Se inicia comunicación serial } void loop() { Wire.requestFrom(10, 4); //Se solicitan 4 bytes a la dirección #10 if (Wire.available() > 0) { //Si hay bytes disponibles para leer... String msg = ""; //Se crea una variable tipo String while (Wire.available()) { //Se empiezan a leer los bytes msg += (char) Wire.read(); //Se concatenan los bytes en el String } Serial.println(msg); //Se imprime el mensaje recibido } delay(2000); //Se esperan 2 segundos antes de repetir el algoritmo } |
Este código hará una solicitud a la dirección 10 en el bus I2C cada dos segundos, imprimiendo la respuesta recibida en el puerto serie. Para programar el Digispark será necesario utilizar una librería especial, TinyWire, disponible en Github. El código es el siguiente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#include <TinyWire.h> //Se inicia la librería TinyWire byte own_address = 10; //Dirección del Digispark en el bus I2C void setup() { TinyWire.begin(own_address); //Se entra al bus I2C en la direccion 10 //Se prepara el Digispark para contestar las peticiones del master TinyWire.onRequest(onI2CRequest); } void loop() { } //Cuando se reciba la peticion, se imprime "hola" en el bus I2C void onI2CRequest() { String msg = "hola"; //Mensaje a enviar for (int i = 0; i < msg.length(); i++) { TinyWire.send(msg.charAt(i)); //Se envia el mensaje caracter por caracter } } |
Al subir estos códigos, tanto en el Arduino Nano como en el Digispark, podemos empezar a recibir mensajes en el Nano a través del Monitor Serie.
A este bus de comunicación se pueden unir múltiples dispositivos, siempre y cuando cada uno tenga una dirección distinta. La integración de Arduino y Digispark es una alternativa de bajo costo que permite lograr resultados muy interesantes. El protocolo de comunicación I2C resulta ser un medio de comunicación eficiente y fácil de implementar.
hola, muy interesante explicación, hasta cuantos esclavos puedo tener con arduino uno?
necesito enlazar 6000 attiny85, cuantos máster debo utilizar y q arduino debo usar?
gracias infinitas ruego me ayuden
Hola. En teoría se pueden instalar 128 dispositivos en un solo bus de comunicación. También es posible usar multiplexores de I2C. Si necesitas usar 6000 unidades, entonces se trata de un diseño avanzado de ingeniería. Te toca pensar bien qué es lo que vas a hacer