Últimamente me hacéis mucho esta pregunta ¿Se puede programar Arduino con Python? La respuesta es si, pero no.
A ver Sonia, o se puede o no se puede. Espera, déjame que te lo explico.
El uso clásico que todos conocemos de Arduino consiste en implementar un Sketch desde el IDE de Arduino y a través del puerto serie cargarlo en el microcontrolador para que Arduino lo ejecute. Este proceso hace que Arduino sea totalmente autónomo. Solo será necesario conectarlo a una fuente de alimentación y el propio Arduino podrá ejecutar el programa que hemos implementado.
¿Qué pasa entonces con Python? ¿Se puede implementar un script en Python y cargarlo en un Arduino para que este lo ejecute? La respuesta es un no rotundo.
¿Y por qué no me dices esto desde el principio y no me haces perder el tiempo? ¡No te impacientes! Que aun hay más, y seguro que lo que te voy a contar te interesa.
Python es un lenguaje interpretado, por tanto, necesitamos un equipo que tenga instalado el intérprete de Python para correr scripts escritos en este lenguaje, cosa que no ocurre con Arduino. Como ya sabrás, Arduino no es un ordenador, es un microcontrolador que solo «entiende» el lenguaje especifico de Arduino.
¿A dónde quiero llegar con todo esto? Muy fácil, si Arduino, por si solo, no es capaz de ejecutar scripts escritos en Python, vamos a ayudarle. Será nuestro ordenador el que ejecute el script en vez del Arduino. En otras palabras, vamos a convertir el Arduino en un terminal tonto.
La principal desventaja de esta solución, es que Arduino dejará de ser autónomo. Tendrá que estar siempre conectado al equipo anfitrión puesto que será este ultimo el que ejecute el código. Igualmente, puede ser una solución muy útil en ciertas situaciones.
Mejor vamos a ver un ejemplo para ver cómo funciona todo.
Instalar Firmata en Arduino
Para establecer la comunicación entre el script Python y Arduino usaremos el protocolo Firmata.
Existe una librería en Arduino que nos permite utilizar este protocolo para comunicar los sketch con nuestros programas, en este caso con nuestro script de Python. La usaremos.
Abrimos el IDE de Arduino y pinchamos en Archivo > Ejemplos > Firmata > StandarFirmata.

El sketch que se abre implementa el protocolo Firmata. No hace falta hacer nada sobre el código. Lo cargaremos directamente en Arduino.

Con la placa Arduino conectada a nuestro equipo, pinchamos en el botón subir para cargar el sketch:

Instalar firmata para Python
Antes de implementar el script Python con el que queremos controlar nuestro Arduino necesitamos instalar la librería pyFirmata en el equipo anfitrión para utilizar el protocolo firmata desde Python.
Lo primero es tener Python instalado en el equipo anfitrión. Si no sabes cómo instalar Python aquí te lo explico:
- Cómo instalar Python 3 en Windows 10
- Cómo instalar Python 3 en Ubuntu
- Cómo instalar Python 3 en Mac OS X
Ahora vamos a ver cómo instalar pyFirmata. La descargaremos e instalaremos con el siguiente comando:
pip install pyfirmata
Fácil ¿Verdad? Si todo va bien podemos empezar a implementar el script en Python con el que vamos a controlar el Arduino.
Implementar el script con Python
El ejemplo que voy a implementar para ver cómo utilizar pyFirmata es el clásico led parpadeando. Es un ejemplo muy sencillo, pero para comprender el funcionamiento de pyFirmata es más que suficiente.
Necesitamos un led y una resistencia de 270 ohm. Las conexiones con Arduino son así:

He conectado el ánodo del led al pin digital 9, aunque puedes usar el pin digital que quieras. El cátodo lo he conectado a tierra con la resistencia de 270 ohm.
Ahora que ya tenemos claro lo que queremos hacer, vamos a empezar a implementar el script con Python (Puedes descargar el código completo al final del artículo).
Puedes usar tu IDE favorito para programar con Python. Yo usaré Sublime Text y lo ejecutaré desde el terminal.
Voy a llamar al script parpadeo.py.
Primero importamos pyfirmata y time:
from pyfirmata import Arduino
import time
También vamos a declarar una variable para almacenar el número del pin digital en el que hemos conectado el led:
LED = 9
Ahora tenemos que instanciar un objeto que nos servirá para controlar nuestro Arduino. Tenemos que pasarle como parámetro el puerto serie al que hemos conectado nuestra placa:
arduino = Arduino("/dev/ttyACM0")
¿Cómo podemos saber el puerto serie al que está conectado Arduino? Lo podemos consultar desde el IDE de Arduino con la placa conectada. Pulsamos en Herramientas > Puerto y en la lista de puertos serie disponibles nos aparecerá un check al lado del puerto ocupado por nuestro Arduino. En mi caso es /dev/ttyACM0 porque estoy en Linux:

Para hacer parpadear el led vamos a utilizar un bucle for que se repetirá 10 veces. Se producirán 10 parpadeos (puedes cambiar el 10 por el valor que quieras):
for x in range (10):
arduino.digital[LED].write(1)
time.sleep(.500)
arduino.digital[LED].write(0)
time.sleep(.500)
La instrucción arduino.digital[LED].write(1) nos envía HIGH (5V) al pin digital 9 (LED), por tanto, el led se encenderá. Es el equivalente a digitalWrite(LED,HIGH) en un scketch de Arduino.
Si en vez de un 1 enviamos un 0 (arduino.digital[LED].write(0)) entonces el led se apaga porque estamos enviando LOW (0V). Es el equivalente a digitalWrite(LED,LOW).
Y ya solo falta ejecutar el script. Yo lo haré desde el terminal:
python3 parpadeo.py
Automáticamente comenzará la ejecución y veremos parpadear el led.
Y así es cómo se programa Arduino con Python.
Puedes descargar el script completo aquí.
Un proyecto muy bonito con Arduino seria hacer una agenda de teléfonos, donde se muestre la agenda en el display LCD. Se puedan dar de alta y de baja nombre con teléfonos, ordenarlos en memoria .
Habría que ordenar la lista de nombres. También para hacerlos no volátiles se podría guardar la agenda en eeprom.
Seria una aplicación donde el manejo de buffers, desplazamientos de los mismos, daría una vision muy buena para quienes estamos en los inicios.
Muchas gracias por tu tiempo .
Un saludo cordial desde Cuba