viernes, 14 de noviembre de 2014

Python para comunicación con Arduino.

Python para comunicación con Arduino.


Categoría: 1. Programación y electrónica.

Introducción.

Los microcontroladores son dispositivos electrónicos que permiten interactuar elementos electrónicos como sensores, interruptores, entradas y salidas analógicas y digitales y comunicarlos con un PC o con redes de datos como internet, bluetooth WiFi, entre otras. Esto los convierte en equipos muy versátiles para controlar equipos en respuesta a cambios registrados por sensores (retroalimentación o control de lazo cerrado) o bien para operar equipos a distancia.

Una aplicación de bastante utilidad es el censado de variables ambientales en sistemas naturales o en sistemas controlados para registrar el estado real del sistema durante todo el tiempo de operación. No importa si es de día o de noche, el censado se realiza conforme a la frecuencia programada. El resultado puede ser un registro de datos que se puede analizar en tiempo real, o bien, utilizarse para un análisis posterior, o ambas cosas. El sistema permite además controlar equipos en respuesta a cambios ambientales. Desde encender una lámpara cuando la intensidad lumínica baja de un valor establecido o encender un sistema de enfriamiento cuando la temperatura se eleva por encima del límite máximo, hasta controlar el vuelo de un dron equipado con GPS siguiendo un itinerario previamente establecido y registrando variables ambientales de interés o registrando imágenes en archivos electrónicos.

En este blog he publicado otras entradas sobre proyectos con la tarjeta electrónica Arduino. Accede AQUÍ.

Desarrollo del proyecto.

En este ejercicio se utiliza un programa en Python para abrir un puerto de comunicación serial. A través de este puerto se recibe una linea de datos generada por una tarjeta electrónica Arduino, que tiene un sensor de temperatura LM35. El dato se guarda en un archivo de texto, junto con la fecha y la hora en que fue realizada la lectura. 

# Abre un puerto de comunicacion con Arduino. Continuo.
from time import sleep
from time import strftime
import serial
serialPort=3
baudRate=115200
storeFile='E:/ArduinoDataFile.txt'
arduino=serial.Serial(serialPort,baudRate)
if (arduino.isOpen()):
        print "Arduino is available ..."
  arduino.close()
if (~arduino.isOpen()):
  arduino.open()
  print "Arduino is open ..."
  while (arduino.isOpen()):
                hora=strftime("%H:%M:%S")
  fecha=strftime("%Y-%m-%d")
  arduino.flush()
  print fecha,"\t",hora,"\t",arduino.readline()
  f=open(storeFile,'a')
  f.write(str(fecha)+"\t"+str(hora)+"\t"+str(arduino.readline()))
  f.close()
  sleep(2.0)
raw_input()  # Esta linea de codigo para archivo.py.


El programa se hizo para Python 2.7 y se instaló la librería PySerial para poder establecer la comunicación a través del puerto serie. También se utiliza la librería time para obtener la fecha y la hora del sistema.

En la consola de salida se despliega el valore de la temperatura junto con la fecha y la hora en que se realizó la lectura (Figura 1). La lectura se repite cada 2.0 segundos, dejando un tiempo de espera con la instrucción sleep().

El sensor de temperatura se instaló en una tarjeta electrónica ArduinoUNO, en la entrada digital A1. El código que se cargó en el microcontrolador es el siguiente:

void setup()
{
  Serial.begin(115200);
}
void loop()
{
  Serial.print(tempSensor());
  Serial.print("\t");
  Serial.println(analogRead(A0));
  delay(1000);
}

float tempSensor()
{
    analogReference(INTERNAL);
    int sens;
    for (int k=0; k<10;k++)  /* Lecturas mientras estabiliza despues de analogReference. */
    {
        sens=analogRead(A1);
        delay(5);
    }
    float temp=sens/9.31;
    analogReference(DEFAULT);
    return temp;
}

Para tomar la lectura del sensor analógico de temperatura se utilizó un ciclo for con 10 iteraciones. Esto con el fin de estabilizar la lectura y obtener un dato preciso. Normalmente las primeras dos o tres lecturas del LM35 después de cambiar la referencia de voltaje analógico con la instrucción analogReference(), se obtienen lecturas bastante alejadas del valor real.

Figura 1. Salida en Python de la función que abre el puerto serial, obtiene la lectura de temperatura y lo guarda en un archivo de texto.


Figura 2. Salida de Python a un archivo de texto donde se guarda el valor de temperatura (°C) junto con la fecha y la hora en que se realizó la lectura.


Para obtener lecturas de manera ininterrumpida, debe sustituirse la linea de código - while (k<25) - por la linea - while (arduino.isOpen()) -. Para detener la lectura simplemente se cierra la ventana de salida de Python.



Bibliografía

Arduino: www.arduino.cc/

Python 2.7: https://www.python.org/download/releases/2.7/



No hay comentarios:

Publicar un comentario