Arduino+Python+RBPi+Twitter: TweetMotica

Este es el primer tutorial que publico, después de aprender mucho en este sitio.

La idea surge por un profesor que me comento:_"como podríamos implementar un control domestico de bajo coste para el laboratorio". Y gracias a los tutoriales Raspduino y Tweepy pude idear algo interesante que espero les guste.

TweetMotica, consiste en un control de la placa arduino como actuador mediante ordenes enviadas por Twitter. Utilizaremos la Raspberry pi como servidor, de igual manera se puede suprimir el arduino y utilizar los puertos GPIO de la Raspberry Pi.

Lo primero es instalar en nuestra Raspberry las librerías de twitter para python, lo cual lo podemos hacer mirando el tutorial Tweepy.

Terminado esto, precedemos a crear nuestro circuito de pruebas, que constará de 5 led conectados a los puertos digitales de nuestra placa arduino (12, 11, 10, 9, 8 respectivamente) con una resistencia de 220 ohms en común.

Seguidamente, compilamos el código en nuestro Arduino:

int led1 = 12; int led2 = 11; int led3 = 10; int led4 = 9; int led5 = 8; void setup () { pinMode(led1, OUTPUT); pinMode(led2, OUTPUT); pinMode(led3, OUTPUT); pinMode(led4, OUTPUT); pinMode(led5, OUTPUT); Serial.begin(9600); //Inicializo el puerto serial a 9600 baudios } void loop () { if (Serial.available()) { //Si está disponible char c = Serial.read(); //Guardamos la lectura en una variable char if (c == 'q') { //enciendo el LED1 digitalWrite(led1, HIGH); } if (c == 'a') { //apago el LED1 digitalWrite(led1, LOW); } if (c == 'w') { //enciendo el LED2 digitalWrite(led2, HIGH); } if (c == 's') { //apago el LED2 digitalWrite(led2, LOW); } if (c == 'e') { //enciendo el LED3 digitalWrite(led3, HIGH); } if (c == 'd') { //apago el LED3 digitalWrite(led3, LOW); } if (c == 'r') { //enciendo el LED4 digitalWrite(led4, HIGH); } if (c == 'f') { //apago el LED4 digitalWrite(led4, LOW); } if (c == 't') { //enciendo el LED5 digitalWrite(led5, HIGH); } if (c == 'g') { //apago el LED5 digitalWrite(led5, LOW); } } }

La base para este código fue gracias el tutorial Raspduino.

Terminado esto, conectamos nuestro Arduino a la Raspberry, es importante que la tengamos conectada a Internet.

Trabajando por SSH

Ahora empieza lo bonito, asumiendo que ya tenemos las raspberry encendida escribimos por consola lo siguiente:

sudo apt-get install python-serial

Esto permitirá que Python pueda trabajar con el puerto donde estará conectado nuestro arduino. Con las Keys obtenidas gracias al tutorial Tweepy completamos nuestro código.

#!/usr/bin/env python import tweepy import time import serial arduino = serial.Serial('/dev/ttyACM0', 9600) CONSUMER_KEY = '????????????????' #Aquí coloca Consumer key CONSUMER_SECRET = '???????????????'#Aquí coloca Consumer secret ACCESS_KEY = '???????????????????'#Aquí coloca Access token ACCESS_SECRET = '????????????????'#Aquí coloca Access token secret #En esta parte nos identifica para poder realizar operaciones auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET) auth.set_access_token(ACCESS_KEY, ACCESS_SECRET) control = "control" #esta variable de control comando = "comando" #variable donde guardaremos el texto del twitter x = tweepy.API(auth) while True: for tweets in x.user_timeline(count=1): #nos permite leer solo el ultimo tweet comando = tweets.text if control != comando: #este if nos ayuda que sol envié una vez por tweet la orden if comando in "Prender led 1": #prender el led 1 #if ... in es in comparador de que nos permite ingresar a la sentencia solo si la palabla esta tal cual. arduino.write("q") print("led 1 prendido") control = comando #asignación para no volver a entrar hasta que se escriba un nuevo tweet elif comando in "Apagar led 1": #apaga el led 1 arduino.write("a") print("led 1 apagado") control = comando if comando in "Prender led 2": #prende led 2 arduino.write("w") print("led 2 prendido") control = comando elif comando in "Apagar led 2": #apaga led 2 arduino.write("s") print("led 2 apagado") control = comando if comando in "Prender led 3": # prende led 3 arduino.write("e") print("led 3 prendido") control = comando elif comando in "Apagar led 3": # apaga led 3 arduino.write("d") print("led 3 pagado") control = comando if comando in "Prender led 4": #prende led 4 arduino.write("r") print("led 4 prendido") control = comando elif comando in "Apagar led 4": # apaga led 4 arduino.write("f") print("led 4 apagado") control = comando if comando in "Prender led 5": # prende led 5 arduino.write("t") print("led 5 prendido") control = comando elif comando in "Apagar led 5": # apaga led 5 arduino.write("g") print("led 5 apagado") control = comando time.sleep(1) #leera el ultimo tweet cada un segundo arduino.close()

Ahora cuando escribamos un tweet "Prender led 1, 2, 3, 4 ó 5 " los encenderá y cuando escribamos " Apagar led 1, 2, 3, 4 ó 5" los apagará. (Tiene que estar escrito tal cual como muestra la sentencia o sino no entra, en mi caso con mayúscula la primera letra ya que mi teléfono la ingresa por defecto).

Las utilidades que se le puede dar a este proyecto son muchas, a mi parecer, desde un simple control domótico hasta utilidades más complejas como para industrias, etc. Pero todo esta en lo que seamos capaces de crear.

Espero que les sea útil y que les guste.

Apunte Final

El tiempo uso al parecer es limitado.

Ya que cuando lo tuve encendido por más o menos 6 horas me arrojo el siguiente error:

ERROR Traceback (most recent call last): File "status.py", line 14, in api.update_status('Tweeting from command line') File "/usr/local/lib/python2.7/dist-packages/tweepy-1.10-py2.7.egg/tweepy/binder.py", line 185, in _call return method.execute() .

Me da la idea de que es por memoria, aunque en el código no lo dice explícito. Si alguien me puede ayudar a solucionarlo estaré muy agradecido.

¡Juan!