Arduino+Python+RBPi+Twitter: TweetMotica

  • Juanito Tapia Juanito Tapia
  • hace 6 años
Arduino+Python+RBPi+Twitter: TweetMotica tweetmotica portada

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.

Tweetmotica1

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.

Foto0315

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).

Foto0314

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!

¿Qué opinas?