Arduino

Premios Bitácoras

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]

Share on Facebook80Share on Google+20Tweet about this on Twitter24Buffer 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.

  • Pablo

    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.

    • Mario

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

      • Pablo

        Muchas gracias. Va perfecto.

        • Mario

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

  • adri

    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

    • Mario

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

  • Pingback: Arduino + Raspberry Pi = RaspDuino | WnGeek

  • http://@3DMedellin Carlos Velez

    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.

  • http://twitter.com/3DMedellin Carlos Velez

    Y como trabajaría esto mismo desde una WAN?

    • http://www.geekytheory.com Mario

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

  • Lautaro

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

    • http://www.geekytheory.com Mario

      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.

  • Víctor

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

    • http://www.geekytheory.com Mario

      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!

  • Pingback: Arduino + Raspberry Pi - Lectura de datos | GEEKY THEORY

  • Belisario Ochoa

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

    • http://www.geekytheory.com Mario

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

  • Nacho

    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.

    • http://www.geekytheory.com Mario

      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!

  • adri

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

  • adri

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

    • http://www.geekytheory.com Mario

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

  • pepepaco

    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

    • pepepaco

      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

      • http://Website pepepaco

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

    • http://www.geekytheory.com Mario

      Hola pepepaco. Gracias por el aporte. ¡Saludos!

  • Jaume Fernandez

    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

    • Mario Pérez Esteso

      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!

  • http://Website NikNitro

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

    -Placa Arduino Mega 2560
    -Placa protoboard
    -Pantalla lcd 128×64
    -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 ;)

    • Mario Pérez Esteso

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

  • http://Website mayra

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

  • http://Website carlos

    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

  • http://Website Carlos

    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

  • http://Website MegaTron

    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?

  • http://Website Lamasa

    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

    • http://Website LAMASA

      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

  • cesar

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

  • roberto

    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?

    • Alex Mora

      puedes por ejemplo usar la raspberry como base de datos, como servidor web para controlar tu arduino desde una interface web (php, node.js, por ejemplo) es decir, expande las posibilidades de las dos plataformas ;)

  • ballack guillen

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

    • Mario Pérez Esteso

      ¡Gracias a ti Ballack por el comentario!

  • Mario Pérez Esteso

    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!

  • Oscar

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

  • Jeremy

    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!

    • Jeremy

      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

  • Davos

    Una pregunta querido Mario

    Quiero importar una libreria diferente a las que estan precargadas en el Arduino, pero en el Arduino IDE, teniendo conectado el Arduino a la Raspeberry no puedo importar la libreria ya que no aparece la opcion, cosas que es diferente cuando tengo estoy en el Arduino IDE de mi Laptop. Me podras dar una solucion porfavor al respecto?.

    • Alex Mora

      ponlo manualmente en la carpeta de librerias de arduino (suponiendo que usas raspbian)

      /usr/share/arduino/libraries

  • Davos

    Una pregunta mas querido Mario

    Puede cargar el programa en mi Arduino desde mi Laptop y despues de cargado conectar el Arduino a la Raspberry y manipular las variables del Arduino en Python, sin necesidad de abrir el Arduino IDE en la Raspberry?

    Saludos cordiales

  • https://plus.google.com/115351661261358375174 Jes Rod

    Hola Buen Día, tengo un problema con el código python en la linea:
    arduino = serial.Serial(‘/dev/ttyACM0′, 9600)
    AttributeError: ‘module’ object has no attribute ‘serial’
    si me puedes ayudar, gracias de ante mano, Saludos.

  • Pingback: Arduino+Python+RBPi+Twitter : TweetMotica | Geeky Theory

  • Edwar Amaya

    Hola Mario si yo quiero conectar mas de un arduino a la Raspberry pi ¿lo puedo hacer? y de ser afirmativa la respuesta ¿como lo hago?

    • http://geekytheory.com/ Mario Pérez Esteso

      Hola Edward. Si se puede. Si te fijas, en el código Python creo un objeto con el puerto en el que está el Arduino. Si quieres veces y otro sólo tendrías que crear otro con otro puerto.

      • http://edwar.github.io/ Edwar Amaya

        Muchas gracias Mario es un muy buen aporte para la comunidad que siempre quiere aprender cada día mas.

  • http://www.ikravets.com/ Ivan Kravets

    Thanks a lot for great article. I want to propose another way how to build Arduino-based source code for Raspduino without Arduino IDE and any dependencies. This happens due to cross platform code builder named PlatformIO.

    I’ve just answered on RaspberryPI Forum with a few explanations.

  • Mariano

    Buenisimo tutorial, tengo una duda, estas usando el terminal de la raspberry pi, en una pc con linux? me gustaria saber como conectarlo a la pc por eso, ya q no tengo un monitor con hdmi por ahora. Muchas gracias