Raspberry Pi

¡Hola! Bienvenido a Geeky Theory. Puedes participar y escribir tus propios tutoriales si te unes a nuestra comunidad de usuarios, donde competirás con los mejores redactores y programadores de Internet para estar en lo más alto de la tabla y conseguir Rockets. ¡Accede y únete a nosotros! Y si quieres publicar tus propios artículos, lee esta guía de publicación para saber cómo hacerlo.
19 agosto, 2013
|
10.167 22

Arduino + Raspberry Pi – Lectura de datos

raspduino_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í:

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:

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!

Enlaces recomendados:

[catlist name='Raspberry Pi' orderby=time numberposts=100]

Share on Facebook29Share on Google+8Tweet about this on Twitter12Buffer this pageFlattr the authorEmail this to someoneShare on LinkedIn0Share on Reddit0Share on Tumblr

Ingeniero de Telecomunicación especializado en telemática. Apasionado de la programación y del conocimiento libre.

  • Tony

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

    • http://www.geekytheory.com Mario

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

  • Juanlu

    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!

    • http://www.geekytheory.com Mario

      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!

  • http://d jose luis

    Disculpa , prodria husar C , en lugar de py ?

    • Mario Pérez Esteso

      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.

  • http://Website ivangf05

    Parece que no se publican mis comentarios….

  • http://Website ivangf05

    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

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

      • http://Website ivangf05

        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

          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?

          • http://Website ivangf05

            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

            Pues mándanos ambos archivos a info@geekytheory.com y en cuanto pueda le echo un ojo.

  • http://Website David soto

    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

  • https://www.facebook.com/davi.sotodelanoche David soto

    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

  • http://Website Carlos Hernandez

    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

      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.

      • http://Website Carlos Hernandez

        y la funcion map, entonces para que es?

  • Pingback: RPi – Arduino via USB en C# | Raspi Game

  • Carol

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

  • Pingback: INTERNET DE LAS COSAS [PARTE 1] - LEER TEMPERATURA CON ARDUINO Y LM35 | Geeky Theory

  • jose leonardo macalupu herrera

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