Arduino

Arduino + Raspberry Pi – RaspDuino

raspduino

¡Hola! Hoy os traemos un tutorial que seguro que os gusta y, que pensamos que es de gran utilidad. Vamos a establecer una comunicación a través del puerto serie entre Arduino y Raspberry Pi. Para ello, vamos a hacer uso de Python. Si no sabéis Python, no os asustéis, es muy fácil. Os recomiendo que leáis antes algún tutorial de iniciación, pero ya digo que es fácil el código.

Exposición del proyecto

Vamos a encender y apagar un LED, que estará conectado al pin número 13 de la placa Arduino. ¿Cómo lo vamos a hacer? Fácil. Vamos a conectar el Arduino a la Raspberry Pi con un cable USB (el mismo que usamos para conectarlo al ordenador) y ejecutaremos un programa en Python que nos permitirá controlar dicho LED a nuestro gusto.

Realización del proyecto

Voy a dividir el proyecto en 2 partes:

  • Parte 1: Arduino (código y montaje)
  • Parte 2: Raspberry Pi (código y ejecución)

 - Parte 1: Arduino

El código de Arduino es realmente sencillo y, el montaje más aún, pues es colocar un único LED.

raspduino_bb

Si ya habéis usado Arduino antes, entenderéis este código a la primera. Si, por lo contrario, es vuestra primera vez, no os preocupéis, es muy intuitivo.

int led = 13;

void setup () {
  pinMode(led, OUTPUT); //LED 13 como salida
  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
      digitalWrite(led, HIGH);
    } else if (c == 'L') { //Si es una 'L', apago el LED
      digitalWrite(led, LOW);
    }
  }
}

¿Qué hace este código?

Lo primero de todo es declarar la variable ‘led’ como entero, a la que le asignaremos el valor 13, que es el pin donde está conectado. Tras esto, inicializaremos la comunicación y, en el ‘loop()’, que es la función principal, leeremos constantemente los valores que nos estén llegando desde Python.

RaspDuino | Arduino 1.0.1_021

 - Parte 2: Raspberry Pi

Vamos, ahora, con la parte de Raspberry Pi. Esta parte consiste en la programación en Python del código que nos permitirá mandarle comandos a la placa Arduino. Llamaremos a este código RaspDuino.py.

Antes de escribir el código, tendremos que instalar la librería ‘python-serial’ para que no nos de error en la ejecución:


¡Vamos con el código!

import serial

arduino = serial.Serial('/dev/ttyACM0', 9600)

print("Starting!")

while True:
    comando = raw_input('Introduce un comando: ') #Input
    arduino.write(comando) #Mandar un comando hacia Arduino
    if comando == 'H':
        print('LED ENCENDIDO')
    elif comando == 'L':
        print('LED APAGADO')

arduino.close() #Finalizamos la comunicacion

¿Qué hace este código?

Necesitamos la importar las funciones necesarias para utilizar el puerto serie. Esa es la razón de la primera línea. Tras esto, declaramos una variable llamada ‘arduino’, con los datos necesarios para establecer la comunicación (puerto y baudios). Tras esto, en un while-true, pedimos al usuario que introduzca un comando. Cuando lo introduzca, se enviará a Arduino, donde ya le hemos hecho diferenciar entre ‘H’ y ‘L’. Si es una ‘H’, se encenderá el LED y, si es una ‘L’, se apagará. Así de simple.

Para ejecutar este código, simplemente tendremos que introducir lo siguiente en la consola de la Raspberry Pi:

Os dejo un vídeo con la explicación que acabo de dar paso a paso y con la demostración de que el código funciona, aunque lo veréis vosotros mismos.

¿Os ha servido este tutorial? ¿Tenéis dudas? ¿Queréis proponer algo? ¡Entrad al foro y publicad! -> FORO
¡Un saludo!
Enlaces recomendados:

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

Compartir:Facebook37Google+3Twitter3EmailLinkedIn0Reddit0tumblr

Estudiante de Ingeniería de Telecomunicación. Apasionado de la electrónica y de la programación. Demasiadas ideas pasan por mi cabeza. Intentaré plasmarlas todas en Geeky Theory.



44 Comments

  1. Responder

    Pablo

    31 julio, 2013

    Hola.

    Antes de nada felicitaros por la página web.

    He probado este tutorial, pero a la hora de ejecutar, después de escribir "python RaspDuino.py" me sale un error diciendo:
    "Traceback (most recent call last):
    File "RaspDuino.py", line 1, in
    import serial
    ImportError: No module named serial"

    No sé como solucionarlo.

    Muchas gracias.

    • Responder

      Mario

      31 julio, 2013

      ¡Hola Pablo!

      Sí, el error te lo da porque se me olvidó poner un paso que hay que hacer en la Raspberry Pi. Tienes que ejecutar el siguiente comando: "sudo apt-get install python-serial". Con ello, podrás ejecutar el código.

      ¡Un saludo y gracias por leernos!

      • Responder

        Pablo

        3 agosto, 2013

        Muchas gracias. Va perfecto.

        • Responder

          Mario

          4 agosto, 2013

          ¡Y yo que me alegro! Gracias a tí por leernos. Saludos.

  2. Responder

    adri

    1 agosto, 2013

    OLA gacias por el bideo tutorial e aprendido mucho
    porcierto me podrias contestar la pregunta que te envie en el vidio tutorial del arduino pro mando de una television

    • Responder

      Mario

      2 agosto, 2013

      Hola adri. Gracias por el comentario. Ahora reviso tu otra pregunta. ¡Saludos!

  3. Responder

    Carlos Velez

    8 agosto, 2013

    Que bien!

    He programado todo tal cual muestras y a salido excelente, ya estoy pensando en que aplicarlo en mi impresora 3D tal vez en alguna función adicional.
    gracias por el aporte y felicitaciones por tan buena pagina.

  4. Responder

    Carlos Velez

    8 agosto, 2013

    Y como trabajaría esto mismo desde una WAN?

    • Responder

      Mario

      19 agosto, 2013

      Hola Carlos Velez. Con un servicio no-ip podrías perfectamente. Saludos.

  5. Responder

    Lautaro

    8 agosto, 2013

    Hola, una consulta, no se podria usar el monitor serial de arduino directamente?

    • Responder

      Mario

      19 agosto, 2013

      Hola Lautaro. Sí, se puede usar el monitor serial, pero ya tendrías que hacerlo con el IDE de Arduino ejecutándose en un ordenador local. Saludos.

  6. Responder

    Víctor

    16 agosto, 2013

    Buenas!! Tengo unas preguntas que me han surgido viendo el tutorial, a ver si me las podíais resolver.

    1. ¿Por qué se enciende el LED al iniciar la comunicación si no ha mandado ninguna letra?
    2. ¿Se podrían mandar comandos de más de una letra o carácteres especiales como acentos, eñes...?
    3. ¿El puerto al que se conecta Arduino depende del puerto USB al que se conecta o del propio dispositivo Arduino? ¿Cómo se puede saber? Si hay varios dispositivos iguales, ¿tienen el mismo puerto?
    4. Veo un error en el código de la Raspberry: la última línea que cierra la conexión nunca se llega a ejecutar, puesto que para salir del while-True usas ^C, que lo que hace es parar el programa esté lo que esté haciendo, con lo cual detienes el programa sin que se haya ejecutado el cierre de la conexión. ¿Qué pasa si no se cierra la conexión Serial?
    5. Supongo que la conexión Serial es la del USB. ¿Arduino no tiene una especie de conexión serial con unos pines? ¿Cómo funcionan?

    Gracias por el tutorial =)

    • Responder

      Mario

      19 agosto, 2013

      Hola Víctor. Antes de nada, gracias por el comentario. Te respondo:

      1. Aunque no se haya mandado ninguna letra, para establecer la comunicación, Arduino y Raspberry Pi tienen que "hablar". Debido a esto, el LED parpadea.

      2. Puedes mandar como comando todo caracter que esté en la tabla ASCII. En cuanto a mandar más de una letra, Arduino te reconocerá la palabra como un conjunto de letras, y por tanto, no te lo reconocerá como palabra. Para conseguir esto, tienes que unir estas letras para formar una palabra en el código de Arduino.

      3. El puerto es único para cada dispositivo conectado en un determinado momento. Para saber el puerto, puedes usar el comando 'dmesg' o listar los puertos que tengas en /dev/.

      4. Efectivamente, finalizo la ejecución del programa con CTRL+C. Pongo el arduino.close() al final por la costumbre y porque nunca sobra. No pasa nada si no cierras la comunicación serial (al menos no sale fuego de la Raspberry Pi ni de Arduino). :)

      5. Sí, la conexión serial es la del USB. Arduino tiene también unos pines de comunicación serial, que no pueden utilizarse cuando está enviando o recibiendo datos, como es este caso.

      Si tienes más dudas, ya sabes dónde escribir.

      ¡Un saludo!

  7. Responder

    Belisario Ochoa

    20 agosto, 2013

    saludos Mario seguí este interesante tutorial, pero tuve un pequeño inconveniente al momento de introducir python RaspDuino.py me da un error que dice:
    File "RaspDuino.py", line 6
    comand = raw_input('INTRODUCE UN COMANDO')
    IndentationError: expected an indent block
    no se cómo solucionarlo Gracias ¡¡

    • Responder

      Mario

      20 agosto, 2013

      Hola Belisario Ochoa. Eso es debido a que tienes que darle al tabulador tras el bucle while True. Saludos.

  8. Responder

    Nacho

    22 agosto, 2013

    Buenas noches Mario desde España.

    Primero, enhorabuena por tu blog. Es de una gran utilidad para los novatos como yo. Te escribo para ver si me puedes echar una mano porque ando algo perdido.

    Estoy desarrollando un sistema de control de acceso a una instalación y había pensado en la siguiente combinación de sistemas:

    - dispositivo con BT + app Blueterm
    - arduino con BT
    - raspberry

    La idea sería que el usuario se conecta al arduino con la aplicación Blueterm vía Bluetooth. Ingresa la contraseña y el arduino la compara con la contraseña establecida previamente.

    El problema que se me presenta es que quiero que esa contraseña se cambie cada hora del día. Es aquí donde creo que entraría en juego la raspberry Pi.

    La rapsberry Pi almacenaría todas las contraseñas en una base de datos y mandaría la contraseña correcta al arduino dependiendo de la hora. Es aquí como no sé como interactuar entre la rapsberry y arduino.

    He visto manuales que utilizan Python para escribir comandos, pero yo querría que el sistema estuviera totalmente automatizado.

    ¿Alguna idea que puedas darme? ¿Sería la solución más correcta para diseñar este control de acceso por horas o se te ocurre alguna otra manera mejor?

    Muchas gracias por tu ayuda de antemano, saludos, Nacho.

    • Responder

      Mario

      2 septiembre, 2013

      Hola Nacho, gracias por tu comentario. En realidad, lo que pienso es que es más sencillo si introduces la contraseña y que la propia Raspberry Pi la compare para ver si es correcta o no. Tras esto, devolverá al Arduino por ejemplo un '1' si es correcta o un '0' si no lo es. ¡Saludos!

  9. Responder

    adri

    1 septiembre, 2013

    ola
    ami no me pone lo que te sale a ti cuando pone ls
    tiene algo que ver
    un saludo gracias

  10. Responder

    adri

    1 septiembre, 2013

    ola
    me puede decir como se mira a que puerto se conecta el arduino
    gracias

    • Responder

      Mario

      2 septiembre, 2013

      Hola adri. Ejecuta el comando 'dmesg' y te saldrá una lista donde verás el puerto del Arduino.

  11. Responder

    pepepaco

    13 septiembre, 2013

    hola mario ,buen tutorial,estuve buscando por la red un programita igual al tuyo pero
    que pudiera encender y apagar un led pero de forma grafica,por (botones), no encontre ninguno , de casualidad me encontre con Qt,un framework multisistema,para windows,linux,y mac ,despues de casi un mes viendo el codigo me hice un programita para linux,te dejo una direccion en youtube :
    qt5.1.0 con arduino pc linux,mac,android
    la raspberry se programa en linux ,lo unico malo es que solo esta el qt4 para el mismo, y el programa esta hecho en qt5 ,esperando que qt5 este para la raspberry.
    pepepaco

    • Responder

      pepepaco

      14 septiembre, 2013

      hola otra vez os dejo otro tutorial de qt4 con raspberry con qtserialport que es portado por qt4 el tuto esta en youtube : raspberry pi qt4 arduino
      espero que os guste ,estoy intentendo hacer otro con botones ,cuando lo tenga
      lo colgare ya que quiero hacer algunas cosillas y necesitare buestra ayuda.
      pepepaco

      • Responder

        pepepaco

        15 noviembre, 2013

        Os dejo el tuto prometido en resumen qt4 con qtserialport en la raspberry con un arduino uno controlado por botenes hecho con qt

        http://youtu.be/agZlhY1KeP8

    • Responder

      Mario

      24 septiembre, 2013

      Hola pepepaco. Gracias por el aporte. ¡Saludos!

  12. Responder

    Jaume Fernandez

    29 septiembre, 2013

    Hola Mario.
    Mi primera búsqueda sobre Arduino y Rapsberry después de consultar en la wikipedia en que consiste el invento, ha sido esta pagina.
    Me he interesado en el tema pensando sobre todo en las ventajas de jugar con mis hijos con algo que les ayudará muchisimo en su educación y su imaginación.
    Te agradeceria si me pudieras informar donde puedo encontrar ejemplos explicados en un lenguaje muy básico de ejercicios vistosos para empezar a dar los primeros pasos.
    Gracias

    • Responder

      Mario Pérez Esteso

      30 septiembre, 2013

      Hola Jaume. Me alegro de que quieras introducir a tus hijos en algo tan interesante como es Arduino y Raspberry Pi. Para hacer cosas fáciles y dar sus primeros pasos en la programación, te recomiendo Scratch. Es un lenguaje de programación creado por el MIT para gente con tus inquietudes. Es gráfico, por bloques, y muy sencillo de utilizar. Para la Raspberry Pi es idóneo. Ya que estoy, te aviso de que hemos cambiado la web por completo, y ahora mismo todo el mundo puede publicar lo que quiera. Estaría genial que nos contaras tu experiencia enseñándole este tipo de cosas a niños. Espero haberte ayudado. ¡Un saludo!

  13. Responder

    NikNitro

    6 octubre, 2013

    Buenas. Me ofrece un amigo un kit Arduino Mega 2560 formado por lo siguiente:

    -Placa Arduino Mega 2560
    -Placa protoboard
    -Pantalla lcd 128x64
    -13 resistencias de 10 kOhm
    -13 resistencias de 200 Ohm
    -11 pulsadores
    -33 led de 3 colores
    -2 potenciómetros
    -1 receptor IR
    -1 led IR
    -1 mando a distancia IR
    -1 zumbador
    -1 servo
    -1 cable alimentación USB
    -1 cable programación USB
    -Un puñado de jumpers

    Por 40€... Te parece razonable?? Y lo que es más importante... Que tal ira con la raspberry?? Que he visto que siempre usas el Arduino UNO

    Gracias ;)

    • Responder

      Mario Pérez Esteso

      6 octubre, 2013

      No está mal. El Arduino Mega original está sobre ese precio y algunos de esos componentes son interesantes.

  14. Responder

    mayra

    4 noviembre, 2013

    hola, necesito conectar un potenciometro digital a mi raspberry tienes alguna informacion de donde me pueda guiar? no tengo mucha idea de como hacerlo

  15. Responder

    carlos

    21 noviembre, 2013

    hola, muy buen aporte, lo implementare, oye una pregunta, lo que quiero hacer es mandar un dato numerico de una raspberry a otra por el puerto usb para probar conectividad y despues mandarlo por radiofrecuencia, pero bueno antes de eso nesesito saber como enviar un dato por usb, me servira que en la raspi tx solo escriba rx.write(valor) y en la rx escriba tx.read(dato), o nesesito algo mas, espero que me puedas ayudar, gracias, si me pudieras contestar a mi correo mejor

  16. Responder

    Carlos

    21 noviembre, 2013

    Hola, antes que nada que buen articulo, oye necesito hacer algo parecido, mira necesito enviar datos por el puerto USB pero de raspberry a raspberry y me preguntaba si solo necesito hacer algo asi, desde la raspi transmisora escribo Rx.write(Dato) y en la receptora escribo Tx.read(Dato) o necesito algo mas o que debo considerar, gracias te agradecería mucho si contestaras a mi correo, espero me puedas ayudar

  17. Responder

    MegaTron

    2 diciembre, 2013

    Hola a todos,

    Estoy intentando hacer lo que proponía Mario, pero controlando más leds (6 en total).

    Lo que he deducido es de ampliar el número de puertos de salida y cambiar el programa añadiéndole mas sentencias IF. De este modo

    if(caracterrecibido =='a'){encender led 1;}
    if(caracterrecibido =='b'){ apagar led 1;}
    if(caracterrecibido =='c'){ encender led 2;}
    if(caracterrecibido =='d'){apagar led 2;}

    ........Así hasta 6 leds
    ..........................................................................................

    Pero el problema es que cada vez que recibe un caracter por serial, no me conserva los estados de los leds anteriores y los apaga y me enciende el nuevo led correctamente pero me apaga los anteriores.

    Se os ocurre algo para solucionar esto, y poder encender y apagar de forma independiente los distintos leds?

  18. Responder

    Lamasa

    17 enero, 2014

    hola!
    muy bueno el tutorial, lo estuve probando hace un rato y me sale el mismo error de pablo en la linea 1 ejecute el comando sudo apt-get install python-serial se descargo el archivo pero igual
    muchas gracias

    • Responder

      LAMASA

      18 enero, 2014

      pude solucionarlo el problema es que la libreria que se descarga es para la version 3.2 pero en el tutorial lo que pide ejecutar es la version 2.7 descargue la version anterior y me funciono perfecto. si alguien tiene algun problema con gusto puedo dar mas detalles. muchas gracias

  19. Responder

    cesar

    5 marzo, 2014

    hola no tendras un tutorial para conectar una raspberry a una base de datos en mysql

  20. Responder

    roberto

    6 marzo, 2014

    Una pregunta colega. ¿Que le añade la arduino a una rasp? ¿Mas pins controlables? ¿Porque conectar un arduino a una rasp, no llega la rasp sola?

  21. Responder

    ballack guillen

    7 marzo, 2014

    SALUDOS DESDE VERACRUZ MEXICO. HE DESCUBIERTO TU PAGINA Y PUDE CONECTAR EL ARDUINO Y LA PI, MUCHAS GRACIAS POR HACER ESTO Y AYUDARNOS A ACLARAS UNAS DUDAS. NO TE MUERAS NUNCA PORFAVOR..!!

    • Responder

      Mario Pérez Esteso

      8 marzo, 2014

      ¡Gracias a ti Ballack por el comentario!

  22. Responder

    Mario Pérez Esteso

    8 marzo, 2014

    Es según el proyecto. Yo lo uso para leer varios sensores desde los pines del Arduino y almacenarlos en una base de datos en la Raspberry Pi. Arduino es muy cómodo para estas cosas.

    ¡Saludos!

  23. Responder

    Oscar

    20 marzo, 2014

    Excelente pagina , acabo de conseguirme una raspberry espero poder hacer el ejemplo que indicas sin problemas, saludos desde Tijuana Mexico.

  24. Responder

    Jeremy

    31 marzo, 2014

    Excelente post, me esta sirviendo para iniciarme, en este post se ve como raspberry le pasa comandos al arduino, habría alguna forma de que arduino le devolviera algún valor a raspberry para que esta interpretara y tomara una decision u otra, digamos una comunicacion bidirreccional.
    Gracias Saludos!

    • Responder

      Jeremy

      31 marzo, 2014

      Me contesto a mi mismo!! jaja

      "readline().strip()" He encontrado este comando para ejecutar desde phyton
      Creo que sería la solución si estoy equivocado me comentais

      Gracias
      Un saludo


Deja un comentario