Internet of Things: Comunicación entre Raspberry Pi 3 y Arduino Uno Rev3 (BUS I2C)

Una de las formas de comunicación entre los dispositivos IoT es a través del bus I2C (Inter-Integrated Circuit), que es un bus serie de datos desarrollado en 1982 por Philips Semiconductors (actualmente NXP Semiconductors).  Podéis consultar en detalle toda la información sobre el bus I2C en http://bit.ly/2dzy8Cx.

En el presente artículo mostraré un ejemplo muy básico de cómo realizar la comunicación a través del bus I2C entre una Raspberry Pi 3 y cuatro Arduino UNO Rev3. Puedes encontrar el código completo en GitHub (http://bit.ly/2e1nbWl).

Descripción de la receta: Medidor de temperatura con indicadores luminosos

La receta consiste en preparar un medidor de temperatura que contendrá su correspondiente sensor además de tres indicadores luminosos: azul (si hace frío), amarillo (si hace templado) y rojo (si hace calor).  En otras recetas podrás observar que la preparación del medidor de temperatura se realiza con un único dispositivo IoT pero el secreto para que nuestra receta sea más jugosa consiste en hacer uso de diversos dispositivos IoT y el bus I2C.

Tiempo estimado de cocción: de 30 a 45 minutos. 

Ingredientes necesarios

Para preparar nuestra exquisita receta necesitamos los siguientes ingredientes:

  • 1 x Raspberry Pi 3 con Windows 10 IoT Core versión 10.0.14393.0
  • 4 x Arduino UNO Rev 3
  • 1 x Protoboard
  • 1 x Sensor Temperatura TMP36
  • 3 x Resistencia 220 Ohmios.
  • 1 x LED Rojo
  • 1 x LED Amarillo
  • 1 x LED Azul
  • N x Cable para conexiones
  • 1 x Windows 10 versión 1607 (14393.321)
  • 1 x Visual Studio Professional 2015 versión 14.0.25431.01 Update 3
  • 1 x Visual Studio Tools for Universal Windows Apps versión 14.0.25527.01
  • 1 x Windows IoT Core Project Templates versión 1.0.1 (extensión para VS2015)
  • 1 x Windows Software Development Kit versión 10.0.14393.33
  • 1 x Arduino IDE versión 1.7.11

Preparación de la receta

A continuación se muestra el esquema de nuestro prototipo.

NOTA: Aunque se ha tomado toda precaución en el diseño del prototipo, ni el autor ni Sogeti serán responsables ante cualquier daño causado por las instrucciones contenidas en este artículo.

esquema-prototipo

Primero procedemos a realizar las conexiones relativas al bus I2C. La Raspberry Pi 3 actúa como Master en el bus I2C y los Arduino UNO Rev3 actúan como Slaves. Conectamos con un cable negro el PIN 9 GND de la Raspberry Pi 3 con el PIN GND de los Arduino UNO Rev3. Con un cable amarillo el PIN 3 I2C1 SDA de la Raspberry Pi 3 con el PIN A4 de los Arduino UNO Rev3. Y con un cable verde el PIN 5 I2C1 SCL de la Raspberry Pi 3 con el PIN A5 de los Arduino UNO Rev3.

esquema-prototipo2

esquema-prototipo-3

A continuación procedemos a conectar los LED. Existen tres LED (azul, amarillo y rojo) que estarán controlados cada uno de ellos con tres diferentes Arduino UNO Rev3.

Aquí se muestra el esquema de conexión para un LED. Recuerda que la patilla más larga del LED es el ánodo (+) y es la que se conectará a la potencia (en nuestro caso al PIN DIGITAL 2 con cable naranja). En cambio, la patilla más corta del LED es el cátodo (-) y es la que se conectará a la toma de tierra (GND, en nuestro caso se utilizará la conexión GND existente del bus I2C). Siempre es necesario incluir una resistencia de 220 Ohmios para que no se “queme” el LED.

esquema-prototipo-4

El último Arduino UNO Rev3 que nos queda se conectará al sensor de temperatura TMP36, tal y como, se muestra en el esquema siguiente (para la conexión a tierra GND podemos utilizar la ya existente del bus I2C). Observa que para conectar el sensor de temperatura TMP36 el orden de las patillas es importante (la cara plana del mismo tiene que estar de espaldas al Arduino, igual que en el esquema). La lectura se realizará a través de la entrada analógica A0 del Arduino (cable naranja).

esquema-prototipo-5

Una vez conectados todos los “cacharros” procedemos a la carga de software que controlará a la Raspberry Pi 3 y a los Arduino UNO Rev3.

esquema-prototipo-6

Para la Raspberri Pi 3 creamos un nuevo proyecto .NET Framework 4.6.1, Windows IoT Core, Background Application (IoT).raspberry

En el método Run() inicializamos el controlador para el bus I2C (podemos usar el estándar por defecto o el de la librería Microsoft.IoT.Lightning.

raspberry2

Para cada Arduino UNO Rev3 que actúa como Slave se requiere de una única dirección en el bus I2C, por tanto, definimos las siguientes direcciones:

raspberry3

El método SendData() será el encargado de mandar datos a los Arduino que controlan los LED para encenderlos o apagarlos según proceda.

raspberry4

Y el método ReceiveByte() será el encargado de recibir el valor actual de temperatura gestionado por el Arduino UNO Rev3 que contiene el sensor TMP36.

raspberry5

A través del IDE para Arduino desplegaremos por un lado el programa que gobernará el Arduino UNO Rev3 con el sensor de temperatura TMP36.

raspberry6

Y, por otro lado, desplegaremos el programa que gobernará los Arduino UNO Rev3 con LED (solamente hay que cambiar su dirección de Slave para el bus I2C).

raspberry7

La librería necesaria para usar el bus I2C en los Arduino es la librería Wire.

El método Wire.begin() es el encargado de indicar la dirección Slave del Arduino en el bus I2C.

Cuando el Master envía datos al Slave interviene el manejador definido en Wire.onReceive() y cuando el Master pide datos al Slave interviene el manejador definido en Wire.onRequest().

Espero que os haya gustado esta receta. Nos vemos muy pronto, salu2.

Óscar Fernández González - SOGETIÓscar Fernández González es un desarrollador de software para la plataforma .NET de Microsoft prácticamente desde sus orígenes con la versión 1.0 lanzada en Enero de 2002.  Se incorporó a SOGETI en Octubre de 2007, donde ha desarrollado aplicaciones para clientes de diversos sectores como sector bancario, seguros y publicidad.

One thought

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s