lunes, 1 de junio de 2015

Puerto serial con python y Arduino Mega2560

Siguiendo con las entradas al blog y aprovechando que ésta semana he tenido un poco de tiempo y teniendo a la madrugada como espacio de inspiración, publico un tema que tenía en el tintero desde ya hace tiempo. Manejo de puerto serial de la pc y comunicación a través de éste con el mundo exterior.
Si bien es cierto que el puerto serial está rezagado por el puerto USB, es necesario indicar que la comunicación serial es aún muy usada, ya que la comunicación bluetooth la usa, los xbee también, así como muchos otros equipos aún usan la comunicación serial bajo el protocolo RS232.
En este caso, el ejercicio que he realizado es el siguiente: Realizar una programación en python (lenguaje que últimamente he venido trabajando y en el cual he encontrado mucho potencial en la aplicación a mi maestría) que escriba datos en el puerto serial de tal manera que sean reconocidos por la interfaz externa y ejecute eventos en base a lo que reciben.
La interfaz externa usada es Arduino, que contiene 4 puertos seriales y cuya programación está diseñada para usar uno de ellos para recibir los datos que son enviados por python y ejecutar los eventos configurados.
El programa escrito en python envía a través del puerto serial 4 caracteres: R, G, Y, C que hacen referencia a los colores Red, Green, Yellow y el caracter C que hace referencia a la palabra Clear. Los caracteres RGY son generados y enviados de forma aleatoria. Esto lo realiza en un bucle que realiza 100 iteraciones ha razón 20 combinaciones por segundos y después de ello envía el caracter C para apagar los leds.
El programa escrito en Arduino configura el puerto Serial1 en modo escucha; al momento de recibir los caracteres enviados por la pc. Si recibe el caracter R, prende el led rojo, si recibe G, prende el verde y si recibe Y, prende el led amarillo. Cada color reconocido apaga los otros dos restantes.

Ahora, vamos a ver los programas escritos. Ambas configuraciones usan 9600 baudios de velocidad.

1. Programa en python
#!/usr/bin/python
#User: linux-pipux
#Ver : 0.1
#S.O.: debian 8
#Python 2.7
import serial
import time
import random

### parametros para el puerto serial ####
port = "/dev/ttyUSB0"
baurate = "9600"

### configuracion del puerto serial #####
s=serial.Serial(port, baurate, timeout=1)

#bucle
for i in range(100):
    a = random.choice(["G", "Y", "R"])
    s.write(str(a).encode() + '\r\n')
    time.sleep(0.05) # tiempo de transicion ON-OFF


#terminado el bucle, se escribe C para apagar los LED's
s.write(str('C').encode() + '\n')

exit();

2. Programa en arduino mega2560

#include <SoftwareSerial.h>
int red=7;
int yellow=6;
int green=5;
int entrada;
void setup() {
Serial1.begin(9600);
pinMode(red,OUTPUT);
pinMode(green,OUTPUT);
pinMode(yellow,OUTPUT);
}
void loop() {
if(Serial1.available()>0){
int entrada=Serial1.read();
if(entrada=='G'){
  digitalWrite(green, HIGH);
  digitalWrite(yellow, LOW);
  digitalWrite(red, LOW);
  Serial1.write(entrada);
}
if(entrada=='Y'){
  digitalWrite(green, LOW);
  digitalWrite(yellow, HIGH);
  digitalWrite(red, LOW);
  Serial1.write(entrada);
}
if(entrada=='R'){
  digitalWrite(green, LOW);
  digitalWrite(yellow, LOW);
  digitalWrite(red, HIGH);
  Serial1.write(entrada);
}
if(entrada=='C'){
  digitalWrite(green, LOW);
  digitalWrite(yellow, LOW);
  digitalWrite(red, LOW);
  Serial1.write(entrada);
}
}
}


En la placa arduino, los LED's están conectados a los puertos 5, 6, 7 con los colores verde, amarillo, rojo respectivamente.
Como mi placa no tiene puerto serie, estoy usando un convertidor USB-TTL que tiene salidas de 5V que alimenta a la placa arduino una vez programado.

imagen



Imagen de la programación en python y arduino.


En el siguiente enlace pongo un video donde se verifica su funcionamiento.
Video

En una próxima entrega, publicaré un post donde python lea temperatura de un sensor DS18B20 y que en función a la temperatura, se prenda un led en el arduino. Por ejemplo si la temperatura está por encima de los 25°C que se prenda el led rojo, si está entre los 23-25°C que se prenda el led amarillo y si está por debajo de los 23°C que se prenda el led verde. Esta vez lo haré con arduino, RaspberryPi y python.

No hay comentarios:

Publicar un comentario