Loading...

Arduino + Raspberry Pi - Lectura de datos

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. Arduino_ReadData_bb

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 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

arduino raspberry serial tutorial conexión

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:

arduino raspberry pi conexión python serial

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:

github

Esto es todo por este tutorial ¡Nos vemos en el próximo!

¡Un saludo!

21 comentarios


Raul DE LA CRUZ ARBIZU · Hace 4 meses

Gracias por compartirnos parte de tu conocimiento Mario. En cuanto a mi comentario, me gustaría preguntarte sobre el Sistema Operativo que debo utilizar, y que otros softwares debo tener para realizar la programación de los codigos. Por tu atencion, muchas gracias y quedo a tu respuesta..

Raul DE LA CRUZ ARBIZU · Hace 4 meses

Gracias por compartirnos parte de tu conocimiento Mario. En cuanto a mi comentario, me gustaría preguntarte sobre el Sistema Operativo que debo utilizar, y que otros softwares debo tener para realizar la programación de los codigos. Por tu atencion, muchas gracias y quedo a tu respuesta.

lucas · Hace 7 meses

Buenas, excelente tutorial, esta muy bueno, una consulta, es posible abrir dos puertos usb en caso de tener dos arduinos conectados a la raspberry con una sola linea? ttyACM0 ttyACM1 arduino=serial.Serial('/dev/ttyACM',baudrate=9600, timeout = 3.0) De esa manera no crear un archivo python para cada arduino, o que me reconozca por si meto un tercero. Muchas Gracias

Elmer · Hace 1 año

Tengo un inconveniente al momento de abrir el puerto, me dice puerto ya esta en uso o algo asi, este es el error que me aparece: Traceback (most recent call last): File "/home/pi/ubidots/Serial_ard.py", line 6, in arduino.open() File "/usr/lib/python3/dist-packages/serial/serialposix.py", line 271, in open raise SerialException("Port is already open.") serial.serialutil.SerialException: Port is already open.

Jeff. · Hace 7 meses

me paso el mismo error, lo que hice fue eliminar la linea de "arduino.open()" y compiló, pero el problema que me paso es que al hacer lecturas me muestra los valores en vertical, por ejemplo, si el valor es 345, lo muestra asi: 3 4 5 no he encontrado solución :/

lalo · Hace 1 año

si quisiera usar solo la raspberry como adquiero datos y los muestro en una pagina web

enrique · Hace 1 año

hola disculpa estoy encendiendo un foco con un circuito de transistor y rele y ya hice la programacion de el arduino y raspberry segui paso a paso tu tutorial y no se imprime en el terminal de la rasberry m podrias decir por que pasa eso x favor aqui te envio las imagenes de programacion de los 2 .... ayudam por favor q ver q estoy haciendo mal

Cesar Tamez · Hace 1 año

Una duda, porque cuando el Arduino me manda la respuesta al Raspberry, el raspberry lo imprime asi Introducir un Comando: L ' L ' p r e s s e d Y no todo en una misma linea. Saludos y gracias!

Jeff. · Hace 7 meses

soluciaste el problema? me pasa lo mismo :/

andres · Hace 1 año

Hola estoy realizando el control de un Arduino a través de la RASPI pero cuando corro el código en Python me aparece un error que dice: Traceback (most recent call last): File “serial.py”, line 1, in import serial File “/root/Software/serial.py”, line 5, in ser=serial.Serial(‘/dev/ttyACM0′,9600) AttributeError: ‘module’ object has no attribute ‘Serial’ y no sé cómo solucionarlo te agradecería mucho si me echas una mano

Mario Pérez Esteso · Hace 1 año

Hola andres. Creo que esto te pasa porque no tienes instalado el módulo Serial de Python. Ejecuta este comando: <pre>sudo apt-get install python-serial</pre>

Davio · Hace 2 años

Mi duda es como puedo hacer que la rasberry valla leyendo solo sin la necesidad de pedírselo por un comando.

Mario Pérez Esteso · Hace 1 año

Con un bucle podrías hacerlo.

jose leonardo macalupu herrera · Hace 2 años

hola como hago para que el raspberry me envié los datos mediante una aplicación con app inventor con botones

INTERNET DE LAS COSAS [PARTE 1] - LEER TEMPERATURA CON ARDUINO Y LM35 | Geeky Theory · Hace 2 años

[…] hemos hechos en Geeky Theory varios tutoriales sobre estos temas: Arduino y Raspberry Pi, bases de datos, gráficas con MySQL, Internet de las Cosas, etc. Tenemos la información […]

Carol · Hace 2 años

A ver si me podéis ayudar...estoy haciendo un programa trabajando con varios sensores en el que desde arduino envío los datos por el puerto serie, envío todos los valores (7) de golpe separados por (,). Desde el código Python la idea es recibir todos esos datos y almacenarlos en la bd, para ello recibo la cadena de golpe y con la función split separo y obtengo los 7 valores. Ahora bien, el problema es q a veces si los recibo correctamente pero otras veces no recibe todos y me salta un error, es como si pillase la cadena a medias y no cogiese todos. Me salta el error : valué Error: need more than 2 values to unpack. A veces me dice con 2, o 4, o. 6....vamos que según en que valor se encuentra de la cadena. Si alguien me da alguna idea...se lo agradezco. Esq no se porq :s me pasa con una arduino mega,con una Leonardo no pasaba....

RPi – Arduino via USB en C# | Raspi Game · Hace 2 años

[…] Una desventaja que tiene la Raspberry Pi es que no esta pensada para proyectos que contengan mucha electrónica, y nos encontramos, que cuando tenemos que leer una señal analógica, debemos usar un conversor AC/DC externo o un Arduino. Si usamos un chip AC/DC (tutorial), se comunica con la RPi con el protocolo I2C, y si usamos el Arduino, tenemos la ventaja de poderlo hacer, vía USB. Voy a usar el Arduino via USB y programando (la RPi) en C#. (tutorial con codigo python) […]

Carlos Hernandez · Hace 2 años

Hola muy buen post, y tengouna duda, tal vez tonta, quiero hacer algo parecido con un sensor de temperatura yuno de humedad, sin embargo miduda es, como hago para digitalizar sus valores y enviarlos por el perto serial, y el simple de hecho de conectarlos a analog imputs ya los digitaliza o es nesesario algun codigo? jeje espero me hayas entendido, gracias

Mario Pérez Esteso · Hace 2 años

Hola Carlos. El Arduino tiene un conversor analógico digital para las lecturas analógicas. No tendrás problema en mandar los datos por puerto serie. Un saludo.

Carlos Hernandez · Hace 2 años

y la funcion map, entonces para que es?

David soto · Hace 3 años

BUENO DESPUES DE MI COMENTARIO ME PUSE A ESTUDIAR A FONDO UN POCO Y E SACADO LO PRIMERO LECTURA DE UN BOTON ESPERO K EN PYTHON SE MEJORE ALGO PARA APRENDER MAS GRACIAS LECTURA DE UN BOTON ARDUINO 1,1 int boton=8; //PIN ASIGNADO A BOTON int valor=0; // VARIABLE QUE GUARDA EL VALOR DE BOTON char mychar ='R'; // VARIABLE TIPO CHAR PARA SU COMPARACION POR PUERTO SERIAL void setup(){ //CONFIGURACION DE LA PLACA Serial.begin(9600); // ABRE PUERTO COMUNICACION pinMode(boton,INPUT); // PIN DE LA PLACA COMO ENTRADA } void loop(){ //BUCLE INFINITO if(Serial.available()>0){ //ESTO ES COMO DECIR A ARDUINO HAY DATOS Y SON MAYOR QUE CERO PUES SI ES ASI HAZ LO SIGUIENTE mychar = Serial.read(); // escucha algo igual R o R sera la llamada a la que coresponda la siguente funciones por lo que aquí interactuamo en tre las dos maquinas (arduino escucha python manda && phayton escuha arduino manda) if (mychar == 'R'){ //si R es igual R me ejecutas lo siguiente valor=digitalRead(boton);//lectura del boton en valor delay(250); // esto es solo para los rebotes del boton if(valor==HIGH){ // si el valor del boton es alto ejecuta lo siguiente Serial.println("Boton pulsado"); //mandamos datos serie a python diciendo el valor en estado imprimido } else if (valor==LOW) { // si el boton no esta pulsado en su lectura valor en estado imprimido Serial.println("Boton no pulsado"); } else { // y si hay algun fallo con el boton manda lo siguiente Serial.println("Boton no reconocido"); } } } } LECTURA BOTON PYTHON 1,1 # Importamos la libreira de PySerial import serial # Abrimos el puerto del arduino a 9600 PuertoSerie = serial.Serial('/dev/ttyACM0', 9600 ) # Creamos un buble sin fin while True: comando = raw_input('Introduce un comando: ') #nos pide un comando a introducir si mandamos R sArduino = PuertoSerie.write(comando) #manda la informacion arduino puerto serial sArduino = PuertoSerie.readline() #escuchamos el valor que manda arduino # Mostramos el valor leido y eliminamos el salto de linea del final print "Valor Arduino: " + sArduino.rstrip('\n') imprimimos los valores que mandamos por arduino David soto noche

David soto · Hace 3 años

Hola buenas veo muy el tuto y muy sencillo, a aunque tengo que decir que lo e montado y no va me da error de sintaxis en la linea 6 (python) y no furula creo que deveria hacer uno nuevo y elementos separador con el comentario de cada acción de cada código para diferenciar de una lectura digital analógica espera de escucha y envío. así con el tuto del led ya uno si puede iniciar cosas por si solo ya que por lo menos aunque no tenga una gran idea de python sabe cuales comandos debe utilizar tanto para saber poner a raspberry de máster como esclavo y lo mismo con arduino no tengo mucha idea de python a un que si llevo 7 años ya con gnome y me encanta hace poco que empecé a programar pero empezado por arduino C y ahora estoy enganchadisimo a la raspb y la verdad me encantaría saber que se comunicaran sin ningún problema ahora creo y expongo que para todos que la base de este enlace mas o menos seria la siguiente arduino máster rasp esclavo : tuto botón (dg), tuto pot(ang), serial usb rasp máster arduino esclavo : tuto boton (dg), tuto pot(ang), serial usb montaje circuito comunicación i2c arduino máster rasp esclavo : tuto botón (dg), tuto pot(ang), gpio i2c rasp máster arduino esclavo : tuto botón (dg), tuto pot(ang), gpio i2c bueno yo creo que estos serian lo primeros pasos y muy importante comentar cada linea con cada acción por favor me parece muy buena la web y espero que esto sirva para tod@s :) SI ALGUIEN SABE DE ESTOS TUTO PORFAVOR CORREO URGENTE A sotodelanoche@gmail.com si encuento algo lo subire

ivangf05 · Hace 3 años

Bueno parece que ahora si que se publican mis comentarios... mi problema es el siguiente, en lugar de var = raw_input("Introducir un Comando: ") arduino.write(var); quiero poner un: var = "H" arduino.write(var); El problema es que si hago lo segundo no entra en el bucle de arduino: if (Serial.available()) { ¿Por que? ¿Que estoy haciendo mal? PD: no estoy haciendo un bucle while, solamente una peticion quiero hacer. Saludos

Mario Pérez Esteso · Hace 3 años

Hola ivangf5. Puede parecer algo obvio pero, ¿Estás poniendo ';' en tu código Python al final de las instrucciones? Un saludo.

ivangf05 · Hace 3 años

No, no tengo punto y coma, mi codigo exacto es comando = "A" #comando = raw_input('Introduce un comando: ') #Input print (comando) arduino.write(comando) #Mandar un comando hacia Arduino y en el codigo arduino no cambie nada de nada Hablando de ';' me fijo que lo tienes en la sentencia -> arduino.write(var); Estoy bastante desconcertado

Mario Pérez Esteso · Hace 3 años

Sí, lo del punto y coma en mi código es errata al escribir el tutorial. Gracias por avisar. En cuanto a tu código, ¿te devuelve algún error?

ivangf05 · Hace 3 años

No, el codigo no devuelve ningun error, de echo me comunico con arduino, es decir, pongo 'print' fuera del if que te comento y eso se ejecuta, pero en el if no entra, sin embargo con el raw_input si que entra.... algo se me debe estar pasando, pero no se el que :s Es raro ¿ verdad ? PD: Por cierto enhorabuena por tu blog!!!

Mario Pérez Esteso · Hace 3 años

Pues mándanos ambos archivos a <a href="mailto:info@geekytheory.com" target="_blank" rel="nofollow">info@geekytheory.com</a> y en cuanto pueda le echo un ojo.

ivangf05 · Hace 3 años

Parece que no se publican mis comentarios....

jose luis · Hace 3 años

Disculpa , prodria husar C , en lugar de py ?

Mario Pérez Esteso · Hace 3 años

Hola jose luis. Efectivamente, puedes utilizar C en lugar de Python. Puedes también usar Java o incluso node.js. ¡Lo que quieras! Un saludo.

Juanlu · Hace 3 años

Una pregunta (ignorante completo): ¿no podríamos suprimir la Raspberry Pi del montaje y simplemente ejecutar el programa Python desde nuestro ordenador, conectado por serial al Arduino? ¿Qué me estoy perdiendo? ¡Un saludo!

Mario · Hace 3 años

Hola Juanlu. Para nada es de ignorante. Es una pregunta lógica, pero utilizo la Raspberry, entre otras cosas porque tenerla conectada no cuesta nada. En los siguientes tutoriales verás la razón por la que usaremos la Raspberry Pi. ¡Saludos!

Tony · Hace 3 años

Impresionante, muy buen post. Espero poder utilizarla algún día.

Mario · Hace 3 años

¡Gracias Tony! Seguiremos subiendo tutoriales de este tipo. ¡Un saludo!

Deja un comentario