Lectura y escritura del puerto serial con Python

pyserialEn ocasiones cuando estamos procesando datos desde el puerto serial desde otra interfaz o desde un Arduino es necesario saber como interactuar con con el puerto, ya sea para leer, escribirlo o los fines que gustes. Para lograr este fin tienes que tener en tu ordenador las librerías necesarias de Python como lo es python-serial.

Si aun no estas familiarizado con la programación en python te recomiendo que leas esta entrada Primeros pasos con Python. Luego puedes continuar leyendo el resto de esta entrada, lo primero es instalar la librería la cual lo hacemos de la siguiente forma

apt-get install python-serial

Con la librería instalada procedemos a escribir y leer  el puerto, el cual lo hacemos corriendo el siguiente script

#!/usr/bin/python
import serial
import time

arduino=serial.Serial('/dev/ttyUSB0',baudrate=9600, timeout = 3.0)
cadena=''
 
while True:
      var = raw_input("Introduzca  un Comando: ")
      arduino.write(var)
      time.sleep(0.1)
      while arduino.inWaiting() > 0:
            cadena += arduino.readline()
            print cadena.rstrip('\n')
            cadena = ''
arduino.close()

Guarda el script como leer_puerto.py. Mucho cuidado en la linea donde agregas el puerto al que te conectaras, las versiones de arduino pueden variar puede ser que te lo reconozca como

ttyUSB0
ttyACM0
arduino=serial.Serial('/dev/ttyUSB0',baudrate=9600, timeout = 3.0)

Para poder buscarlo en consola solo escribe el siguiente comando

 ls -ls ttyACM0

Si no lo encuentras pues estará como /dev/ttyUSB0. Si no lo en cuantras puedes hacer uso de las tools de python-serial con el siguiente comando

python -m serial.tools.list_ports -v

El cual te mostrará la lista de los dispositivos conectados a tu ordenador en mi caso la salida es la siguiente.

/dev/ttyACM0        
    desc: Arduino Uno
    hwid: USB VID:PID=2A03:0043 SER=95336333635351C04242 LOCATION=1-1
/dev/ttyS0          
    desc: ttyS0
    hwid: PNP0501
2 ports found

El resto del script lo que hace es escribir el puerto y luego leer lo que esta escrito en el puerto siempre y cuando existan datos en el puerto y lo almacenara en la variable cadena.

Ejecuta el script en la terminal de la siguiente manera

 python leer_puerto.py

obtendrás una salida como la siguiente

Introduzca  un Comando:

En el cual debes de escribir lo que tu gustes y evaluarlo ya sea en arduino o en la misma terminal.

Ahora nos hace falta preparar el arduino para leer o escribir en el puerto, es de mencionar que el puerto no se puede usar al mismo tiempo por el sistema o por el arduino ya que la lectura o escritura es lineal. Procedemos a crear el Sketch en el arduino.

int ledPin = 13; // usamos un pin de salida al LED
int state = 0; // Variable lectrura serial
 
void setup() {
    pinMode(ledPin, OUTPUT);   //Declara pin de Salida
    digitalWrite(ledPin, LOW); //Normalmente Apagado
    Serial.begin(9600);
}
 
void loop() {
  if(Serial.available()){
       state = Serial.read(); 
       switch (state)
       {
       case 'L':
       digitalWrite(ledPin, LOW);
       Serial.println("LED: OFF");
       break;
       
       case 'H':
       digitalWrite(ledPin, HIGH);
       Serial.println("LED: ON");
       break;
       
       default:
       Serial.println("Opcion no valida");
       break;
       
       
       }
  } 
 
}

Solo queda hacer las pruebas enviar la letra L desde el sistema operativo para que sea interpretada por arduino y apague el led, si se envía la letra H, enciende el Led de lo contrario mostrará opción no valida.

python-serial

 

 

 

 

 

 

 

Como puedes observar en la imagen del sketch, la terminal y el monitor serial tendrás una idea de como funcionan en ambas direcciones. Cabe mencionar que el mismo script en python te puede servir para interpretar señales desde el arduino y que en tu sistema haga algo, ejemplo, al presionar un pulsador en arduino que envíe un correo electrónico a todos tus amigos.

Comparte este contenido!.Tweet about this on TwitterShare on Google+Share on FacebookEmail this to someone

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *