Python y Arduino

Iniciado por ANTRAX, Diciembre 29, 2013, 06:52:36 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.


Introducción

Arduino es una plataforma que facilita el desarrollo de proyectos de microcontroladores, que consta de dos partes: hardware y software. El hardware es una placa tan pequeña que cabe en la palma de la mano, está basada en la familia de microprocesadores AVR y tiene todas las especificaciones electrónicas abiertas. El software, por otra parte, es una IDE en conjunto con las librerías que se utilizan para usar la placa (ambas son libres).

Utilizando el Arduino es posible desarrollar proyectos de robótica (incluídos software, electrónica y mecánica) de una forma sencilla y rápida. Además, cómo el proyecto Arduino es abierto, hay muchos módulos de hardware y librerías disponibles, eso hace que el trabajo que tenemos que desarrollar para un proyecto es mayormente recopilar los módulos necesarios y hacerlos trabajar juntos.


La placa tiene un microprocesador de 16MHz, dispone de 32kB de memoria para almacenar el software de control y 2kB de RAM. Parece poco, pero es más que sufiente para el control de los pequeños dispositivos electrónicos, lectura de sensores y toma de decisiones.

Después de esta introducción nos ponemos manos a la obra.

Hello world

Vamos a empezar por mostrar un ejemplo simple de código para Arduino: encendido y apagado de un LED (esto se conoce como el "hola mundo" de la informática embebida) - el lenguaje que usamos es un subconjunto de C++:

Código: python
#define LED 13

void setup() {
    pinMode(LED, OUTPUT); //configures digital port 13 as output
    //in the Arduino board we have a LED connected to digital port 13
}

void loop() {
    digitalWrite(LED, HIGH); //turns LED ON
    delay(1000); //wait for 1000ms = 1s
    digitalWrite(LED, LOW); //turns LED OFF
    delay(1000); //wait for 1000ms = 1s
}


Después de introducir el código, simplemente haga clic en el botón "Upload" en el IDE, de esta manera son compilados y enviados a través de USB a la placa. Después de este proceso, el software ya se está ejecutando en la placa, y ya no necesitaremos la pc para que funcione.


Las funciones utilizadas en este código (pinMode, digitalWrite y delay) ya están definidos en la librería estándar de Arduino (al igual que muchas otras) y por lo tanto no hay necesidad de importación, el IDE ya lo hace automáticamente (por esto el "lenguaje" se llama un subconjunto de C++).

El código anterior se puede traducir como:

        Configurar el puerto 13 como puerto de salida digital, es decir, que control de tensión (0V o 5V) se realiza mediante el software
        Coloque en el puerto 13 5V (el valor de la función HIGH en digitalWrite significa 5V)
        Esperar a 1000ms (usando la función de delay)
        Coloque 0V ('LOW') en el puerto 13
        Espere 1000ms más.

En este ejemplo se utiliza el LED ya instalado en el puerto 13 de la placa Arduino, pero podemos usar un LED externo, o de cualquier otro circuito que "entienda" las señales de salida de la Arduino (0V y 5V), por lo tanto no sólo puede controlarse LEDs, sino también: motores, drivers de relays para el control de electrodomésticos y muchas otras cosas.

Todo lo que está en la función loop se repite continuamente (hasta desconectar el Arduino de la energía), por lo que el LED se enciende y apaga continuamente (1 segundo encedido y 1 segundo apagado).

Comunicación con Python

El primer ejemplo muestra una aplicación stand alone Arduino, es decir, software que se ejecuta en el Arduino y que no necesita una computadora para trabajar. Pero podemos crear una comunicación entre el dispositivo y la computadora, entonces un software en la PC (escrito en Python, por ejemplo) puede tomar decisiones más elaboradas, consultar bases de datos, sitios web y otros recursos y después, enviar un comando al dispositivo. Para esto utilizamos la librería Serial:

Código: python
#define LED 13

void setup() {
    pinMode(LED, OUTPUT);
    Serial.begin(9600);
}

void loop() {
    if (Serial.available()) {
        char c = Serial.read();
        if (c == 'H') {
            digitalWrite(LED, HIGH);
        }
        else if (c == 'L') {
            digitalWrite(LED, LOW);
        }
    }
}


Con el código anterior, el Arduino enciende el LED cuando se recibe el carácter H a través de su puerto serie y apaga el LED cuando recibe L.

Cabe aclarar que Arduino tiene un convertidor USB-serie, por lo que podemos enviar a estos carácter a través de USB, usando el software en Python; y es así como tenemos un código en Python para controlar Arduino.

Antes de escribir el código en Python, es necesario instalar la librería PySerial [1]. Si usas Debian o Ubuntu, podrías usar el siguiente comando:

Código: bash
sudo aptitude install python-serial


Una vez instalada la biblioteca, vamos a crear un código de Python para controlar el LED:

Código: python
 #!/usr/bin/env python

import serial
import time

# /dev/ttyACM0 = Arduino Uno on Linux
# /dev/ttyUSB0 = Arduino Duemilanove on Linux

arduino = serial.Serial('/dev/ttyACM0', 9600)
time.sleep(2) # waiting the initialization...

arduino.write('H') # turns LED ON
time.sleep(1) # waits for 1 second

arduino.write('L') # turns LED OFF
time.sleep(1) # waits for 1 s   :height: 100px
:width: 200 pxecond

arduino.close() #say goodbye to Arduino


¡Listo! Ahora podemos controlar el LED de la placa Arduino con nuestro software en Python. Tambien, como ya se dijo, podemos basar la decisión (de activar o desactivar) en informaciónes externas como contenido de una tabla en una base de datos o los datos devueltos de una API de algún software o sitio web (como Twitter, Facebook, etc.).

En el ejemplo anterior, se utiliza un cable USB para la comunicación entre Python y el software de Arduino; pero podríamos haber conectado en el a la placa un shield, que es una componente que le da una nueva función como puede ser la comunicación vía Ethernet, Bluetooth o el control de un motor.



Como siempre, python superando todo tipo de límites jeje.

Muy buena info!

Saludos!
WhiZ



HOLA !!!! :D

disculpa como podria hacer todo eso pero a través de un interfaz web ???
enviando y recibiendo información????

Buenas christianalatorre,
Django te puede ayudar en este sentido ya estuve estudiando sobre este tema y con django implemente una interfaz web con controladores electrónicos, cualquier duda no me importaría ayudarte ;)
Vive solo por lo que estas dispuesto a morir