Raspberry Pi es una plataforma a tener en cuenta para el desarrollo de aplicaciones domóticas y de control. Sin embargo, Raspberry PI tiene una pequeña limitación en cuanto al número de entradas/salidas disponibles así como problemas relacionados con los tiempos de respuestas que se consiguen programando en python.
Una posible solución a esta limitación puede ser combinar el Raspberry Pi con Arduino y relegar todo el control hardware al Arduino y utilizar el Raspberry como controlador maestro. En esta entrada voy a hacer un simple ejemplo en que conecto mi Raspberry Pi con un Arduino a través de USB y mi Raspberry controla los puertos de salida del Arduino a través de comunicación serie.
Para ello, lo primero que vamos a hacer es crear un programa para nuestro Arduino que simplemente lee información del puerto serie y en función de la información leída actúa sobre los puertos (9 – 13) del Arduino poniendo a nivel alto o a nivel bajo. El programa que utilizamos se muestra a continuación.
char incomingData;
String receivedCommand;
int stringToNumber(String thisString)
{
int i, value, length;
length = thisString.length();
char blah[(length+1)];
for(i=0; i<length; i++) { blah[i] = thisString.charAt(i); } blah[i]=0; value = atoi(blah); return value; } void setup() { Serial.begin(9600); Serial.println("Arduino Ready"); pinMode(13, OUTPUT); pinMode(12, OUTPUT); pinMode(11, OUTPUT); pinMode(10, OUTPUT); pinMode(9, OUTPUT); } void loop() { if (Serial.available() > 0)
{
incomingData = Serial.read();
receivedCommand+=incomingData;
if (receivedCommand.length()==3)
{
digitalWrite(stringToNumber(receivedCommand.substring(0,2)),(receivedCommand[2]=='0')?LOW:HIGH);
Serial.print("pin: ");
Serial.print(receivedCommand.substring(0,2));
Serial.print(" at level: ");
Serial.println((receivedCommand[2]=='0')?"LOW":"HIGH");
receivedCommand="";
}
}
}
Veamos en detalle que hace este código. Primero declaramos algunas variables globales (líneas 1-2) luego nos encontramos con una función para convertir de String a int (lineas 4-16). Esta función la he conseguido desde este hilo. Luego llegamos a la función de configuración de Arduino donde inicializamos el puerto serie y configuramos los puertos del 9 al 13 como salidas digitales (Lineas 18-27). Finalmente llegamos a la función loop (Lineas 29-45).
La función loop escucha continuamente al puerto serie, y espera hasta recibir 3 caracteres. Una vez recibidos 3 caracteres simplemente divide la cadena de la siguiente forma: Los dos primeros caracteres codifican el puerto sobre el que quieres actuar y el tercer carácter codifica el estado que quieres fijar a ese puerto. Por ejemplo “121” sería poner el puerto 12 a nivel alto y por ejemplo “090” seria forzar un nivel bajo en el puerto 9.
Con esto ya terminamos el trabajo en el lado del Arduino. vamos ahora a trabajar en el lado del Raspberry. En este caso lo primero que tenemos que hacer es instalar las librerías para el control del puerto serie desde python. Para ellos ejecutamos el siguiente comando desde consola en nuestro Raspberry Pi:
sudo apt-get install python-serial
Con esto ya tenemos listo nuestro Raspberry Pi para trabajar con el puerto serie desde python. Lo único que nos queda es determinar que puerto utiliza nuestro Arduino cuando esta conectado al Raspberry Pi. Para ello antes de conectar el Arduino ejecutamos el siguiente comando
ls /dev/tty*
Y veremos que nos proporciona un listado de diferentes dispositivos. Luego simplemente conectamos el Arduino, volvemos a ejecutar el comando y veremos como aparecerá un dispositivo adicional. Nuestro Arduino!! En mi caso mi arduino aparece como: /dev/ttyACM0.
Con nuestro arduino identificado solamente tenemos que irnos a python y escribir el programa para controlar nuestro Arduino. en mi caso he hecho un ejemplo muy sencillo, mi código simplemente enciende y apaga el pin 9 cada segundo y a su vez también lee la información de realimentación que proporciona Arduino cuando cambia el estado del pin:
import serial
import time
ser=serial.Serial('/dev/ttyACM0',9600)
while 1:
print(ser.readline())
ser.write('091')
time.sleep(1)
ser.write('090')
time.sleep(1)
Como resultado si todo funciona correctamente podemos obtener algo como la siguiente imagen en la consola de nuestro Raspberry Pi.
Con estos sencillos pasos ya tenemos los dos dispositivos conectados y compartiendo información entre ellos. Llegados a este punto todavía podemos ir más allá y hacer que nuestro Raspberry pueda ser controlado a través de internet y de esa forma poder acceder a nuestro Arduino de forma totalmente remota, pero eso será ya el tema de otra entrada.