Arduino + Raspberry Pi - Lectura de datos
¡Hola! En el tutorial de hoy seguimos con la conexión de Arduino y Raspberry Pi. En este artículo, haremos una lectura de varios componentes que habrá conectados a Arduino. Serán un LDR, un botón y un potenciómetro.
Exposición del proyecto
Desde Raspberry Pi, y mediante un código en Python (muy sencillo), mandaremos comandos al Arduino para que nos devuelva los datos que esté leyendo. Si por ejemplo mandamos una 'P', nos devolverá el valor del potenciómetro. Si mandamos una 'B', Arduino nos informará de si el botón está pulsado o no. Finalmente, si mandamos una 'L', podremos leer el valor del LDR.
Realización del proyecto
Del mismo modo que en el tutorial anterior de Arduino y Raspberry Pi, dividiré el artículo en dos partes distintas:
- Parte 1: Arduino (código y montaje)
- Parte 2: Raspberry Pi (código y ejecución)
- Parte 1: Arduino
Antes de nada, veremos el montaje. Utilizaré un LDR, un botón y un potenciómetro. Si no disponéis de ellos, no importa, simplemente mandaremos un mensaje de ejemplo para saber que funciona.
El código de Arduino en caso de que NO realices el montaje (no tienes los componentes) es:
void setup () { Serial.begin(9600); //Inicializo el puerto serial a 9600 baudios } void loop () { if (Serial.available()) { //Si está disponible char c = Serial.read(); //Guardamos la lectura en una variable char if (c == 'H') { //Si es una 'H', enciendo el LED Serial.println("'H' pulsada"); } else if (c == 'L') { //Si es una 'L', apago el LED Serial.println("'L' pressed"); } else { Serial.println("Caracter no reconocido"); } } }
El código de Arduino en caso de que SÍ realices el montaje (sí tienes los componentes) es:
int LDRPin = 0; int valor; int min = 0; int max = 1023; int boton = 8; void setup () { Serial.begin(9600); pinMode( boton, INPUT ); } void loop () { if(Serial.available()) { char c = Serial.read(); if (c=='B') { valor = digitalRead(boton); if (valor == 0) { Serial.println("Boton no pulsado"); } else { Serial.println("Boton pulsado"); } } else if (c=='L') { valor = analogRead(LDRPin); valor = map(valor, min, max, 0, 100); Serial.println(valor); } else if (c=='P') { Serial.println(analogRead(1)); } } }
- Parte 2: Raspberry Pi
A continuación, veremos la parte de Raspberry Pi. Crearemos un archivo llamado Arduino_ReadData.py con el fin de poder mandar comandos por serial al Arduino. Este código es muy parecido al del tutorial anterior, así que no veréis nada raro.
Antes de nada, si no lo habéis hecho ya, tenéis que introducir el siguiente comando en la Raspberry Pi. Si es la primera vez que lo hacéis, se os instalará la librería python-serial, para que podáis usar la conexión serie. Si ya lo habíais hecho antes, os dirá que ya estaba instalado, como me pasa a mí:
sudo apt-get install python-serial
import serial import time arduino=serial.Serial('/dev/ttyACM0',baudrate=9600, timeout = 3.0) arduino.open() txt='' while True: var = raw_input("Introducir un Comando: ") arduino.write(var) time.sleep(0.1) while arduino.inWaiting() > 0: txt += arduino.read(1) print txt txt = '' arduino.close()
Únicamente hemos añadido una parte del código, que se encarga de esperar a que Arduino se comunique con él, es decir, que devuelva los datos que se le han pedido:
while arduino.inWaiting() > 0: txt += arduino.read(1) print txt txt = ''
Ejecutaremos el código de la siguiente manera:
python Arduino_ReadData.py
Aquí tenemos algunos resultados:
Si queréis verlo funcionando, aquí os dejo el vídeo. Además, también está la explicación de este mismo post, por si queréis que os lo cuente mientras lo programo:
El código está también en GitHub:
Esto es todo por este tutorial ¡Nos vemos en el próximo!
¡Un saludo!