RaspberryPi / junio 27, 2015

Comunicación entre Arduino y Raspberry Pi

Me compré un Arduino para hacer «cosas frikis» en mi casa y así explorar mi «yo programador». Y casi lo está consiguiendo. Hoy os traigo un tutorial muy interesante y que para los iniciados como yo os abrirá muchas puertas.

ArduPi

Lo interesante siempre está mezclar y juntar cosas distintas, así que ¿Porque no utilizar Arduino como actuador y la Raspberry Pi como servidor? Desde que tengo Raspberry Pi, siempre he mirado de tener un control del dispositivo, saber el estado de los servicios, comunicación con ella, etc Con Arduino se puede conseguir ese control ya que lo podemos utilizar como actuador y hacer que se enciendan leds cuando pase algo, hacer sonar un speaker u otra cosa.

Para llegar hacer eso, primero hay que poder comunicar los dos dispositivos. Vamos a establecer una comunicación a través del puerto serie entre Arduino y Raspberry Pi. Utilizaremos Python para hacer esta comunicación y el código que usaremos es relativamente sencillo, así que si no sabes Python no te asustes que te lo voy a explicar todo bien detallado.

Introducción

Lo que haremos será reproducir una melodía con un speaker (si, de esos que encuentras en una placa base!) y a su vez reiniciaremos un servicio (Apache, por ejemplo). Conectaremos primero Arduino en nuestro PC, cargaremos el software en él y luego lo conectaremos a la Rasberry Pi. Desde la Rasberry Pi, «controlaremos» el Arduino.

Material necesario

  • Arduino UNO
  • Speaker
  • Raspberry Pi

Preparando Arduino

El código de Arduino es realmente sencillo, y el montaje no requiere mucho tiempo, ya que solo es conectar el speaker en el pin 8 (cable rojo) y en el pin GND (cable negro).

tonePiezo

Ahora cargamos este programa en nuestro Arduino, si aún no sabes como hacerlo, quizás deberías de pasarte primero por aquí: Instalar IDE de Arduino en GNU/Linux.

#include "pitches.h"
// Notas en la melodía
int melody[] = {
    NOTE_C4, NOTE_G3, NOTE_G3, NOTE_A3, NOTE_G3,0, NOTE_B3, NOTE_C4};

// Duración de las notas: 4 (negra), 8 (semicorchea), etc
int noteDurations[] = {
    4, 8, 8, 4, 4, 4, 4, 4};


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 == 'w') { // Si escribo web, suena una melodía y reinicia apache (en la RPi)

      	 for (int thisNote = 0; thisNote < 8; thisNote++) {
        
          int noteDuration = 1000/noteDurations[thisNote];
          tone(8, melody[thisNote],noteDuration);
      
          int pauseBetweenNotes = noteDuration * 1.30;
          delay(pauseBetweenNotes);
          // stop the tone playing:
          noTone(8);
        }
      } 
    }
}

Junto a esto, abriremos un fichero nuevo y lo llamaremos pitches.h que contendrá las notas, os dejo el fichero en el Code de PortalLinux para no hacer una entrada tan larga, pero esta información también la podéis encontrar aquí. Este código lo que hace es que si la variable que Raspberry Pi le envía es igual a ‘w’ entonces ejecutará la melodía. Así de simple.

Una vez hemos cargado este código en Arduino, el siguiente paso es preparar la Raspberry Pi.

Preparando Raspberry Pi

Aquí tendremos que hacer un pequeño programa en Python que nos permitirá mandarle comandos a la placa Arduino. Para eso, tendremos que instalar una librería de Python en Raspberry Pi:

apt-get install python-serial

Una vez instalado, conectamos Arduino a nuestra Rasberry Pi y creamos un fichero llamado RaspDuino.py. En él añadiremos lo siguiente:

import serial
import os

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

print("Starting!")

continuar = True
while continuar:
        comando = raw_input('Introduce un comando: ') #Input
        arduino.write(comando) #Mandar un comando hacia Arduino

        if comando == 'w':
                print('Reiniciando apache...')
                resultado = os.system("service apache2 restart")
        elif comando == 'exit':
                continuar = False
arduino.close() #Finalizamos la comunicacion

Este código también es sencillo. Primero de todo creamos un bucle para que nos vaya pidiendo siempre el «Introduce un comando«, todo lo que vayamos escribiendo, se enviará al Arduino y dependiendo del código hará una cosa u otra. Por ejemplo, si escribimos «patata» no hará nada, mientras que si enviamos ‘w‘ ejecutará la melodía en el Arduino y además, ejecutaremos en la Raspberry Pi, «service apache2 restart«. Si escribimos «exit» saldrá del bucle while y se acabará el programa.

Para ejecutar este fichero:

python RaspDuino.py

Demostración

Aquí os dejo un vídeo de como funciona, nada que no se haya explicado, ejecuto el programa en Python con el Arduino conectado a la Raspberry Pi, y cuando pulso Enter se escucha la melodía y en pantalla se muestra la salida del comando para reiniciar el Apache2.

La imaginación al poder!

Como podéis ver, se pueden hacer muchas cosas, encender leds, ejecutar melodía por el speaker… Con un código sencillo se pueden hacer mil cosas. Mi objetivo de este verano, es poder conectar Raspberry Pi con Arduino y Telegram, así desde Telegram enviar códigos para diferentes tareas y una respuesta óptica o sonora desde Arduino (y ahora con el tema de los bots de Telegram parece que será muy fácil).

Happy Hacking 😛

Fuentes: Arduino, GeekyTheory, Demasiado Personal.

2 comentarios “Comunicación entre Arduino y Raspberry Pi”

avatar
500
0 Comment threads
0 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
0 Comment authors
Recent comment authors
  Suscribirte  
más nuevos más viejos más votados
Notificarme

Utilizamos cookies propias y de terceros para mejorar nuestros servicios. Si continúa navegando, consideramos que acepta su uso. Doble clic sobre aquí para cerrar.