10

Control de Arduino mediante la Raspberry Pi

Publicado por el .

Raspberry Pi USB Arduino

Arduino y Raspberry Pi no son dos productos sin relación, juntos pueden hacer una simbiosis bastante interesante y permitirte ampliar el rango de posibilidades de una placa Arduino sola. Además podrás aprender como funciona la comunicación entre software y hardware para captar la esencia de lo que se cuece en tu equipo cada vez que realizas alguna operación.

Eso es lo bueno de Arduino y Raspberry Pi, que no solo creas, sino que también aprendes. Y por eso son dos amigos muy potentes para tus proyectos. En éste artículo te enseñamos a realizar los lazos entre Arduino y Raspberry Pi para poder controlar tu proyecto de Arduino mediante el software que creamos en la Raspi.

Lo cierto es que la comunicación entre ambos dispositivos se puede hacer de muchas maneras. En cuanto a las formas físicas de hacerlo se encuentran: utilizar un módulo Ethernet, mediante el propio cable USB, por Bluetooth, etc. Pero lo más sencillo y barato es hacerlo mediante el puerto serie (el USB que ya trae). Una vez elegido el método físico, también nos topamos con diversos métodos de comunicación: apps para realizar el control, mediante la consola de Arduino IDE o creando nuestro propio programa escrito en cualquier lenguaje de programación que admita la comunicación serie (Python, C, Java, Processing,…).

Material necesario

  • Una placa Raspberry Pi ya preparada.
  • Una placa Arduino UNO.
  • LED verde (o cualquier otro color, incluso podría servir una pequeña bombilla, motor, etc…)

Procedimiento

Nosotros vamos a usar un método bastante sencillo, mediante el cable USB con el que conectamos Arduino al PC y empleando Python. Para nuestro ejemplo emplearemos un circuito simple que consta únicamente de un LED, así podrás ver los resultados de una forma sencilla (pero puedes crear cualquier otra cosa). Los pasos a seguir son:

  • Desde nuestra Raspberry Pi ya configurada accedemos al terminal (debe estar conectada a Internet, si no dispones de conexión para la Raspi, puedes descargarte el paquete desde otro PC y pasarlo a la Raspberry Pi) y tecleamos lo siguiente:

sudo apt-get install python-serial

  • Ahora ya tenemos instalado el paquete Python que se necesita para la comunicación serial con Arduino. Vamos a montar ahora el “circuito” para lo que simplemente tenemos que insertar el terminal largo (ánodo) del LED en el pin digital 13 de la placa Arduino y el corto (cátodo) en GND o tierra. Por cierto, colocar el LED así directamente sobre la placa de Arduino no es aconsejable en caso de dejar mucho tiempo el LED encendido, en ese caso podemos implementar una resistencia (de unos 220 ohmios es suficiente) en serie con el terminal largo.

 Circuito LED Arduino

  • Luego escribiremos el código fuente o sketch para programar Arduino desde Arduino IDE (si lo deseas puedes tenerlo instalado en tu Raspberry Pi o incluso en tu móvil Android gracias a la app ArduinoDroid). Para nuestro sketch empleamos el siguiente código:
/*Programa para hacer que Arduino espere ordenes de la Raspberry Pi*/

const int led=13; //Declaramos el pin digital del LED

void setup(){
 pinMode(led, OUTPUT); //Configuramos el pin como salida
 Serial.begin(9600); //Iniciamos la transmision serial a 9600 baudios
}
void loop(){ //Este es nuestro bloque de ejecucion
 if (Serial.available()) {
 luz(Serial.read) - '0'); //Esto toma el valor 0 inicial
 }
 delay(500);
}

void luz(int n){
 for(int i=0; i<n; i++){
 digitalWrite(led, HIGH); //Se enciende el LED por 130ms
 delay(130);
 digitalWrite(led, LOW); //Se apaga el LED por 130ms
 delay(130);
 }
}
  • Una vez revisado para ver si hemos cometido errores sintácticos o de cualquier otro tipo, lo cargamos en nuestra placa Arduino utilizando el cable USB y mediante el botón de acceso rápido Cargar.
  • Ya solo nos falta una parte, escribir la línea en el terminal para que Python haga el resto. Fíjate en la siguiente línea. Si la escribes en el terminal de la Raspi respetando el punto y las comillas simples y sustituyendo n por cualquier número, en Arduino verás titilar el LED tantas veces como hayas especificado:

 ser.write(‘n’)

Finalizo explicando un poco lo que ocurre. Al escribir el código o sketch de Arduino, hemos conseguido que la placa esté a la “escucha” de cualquier cantidad entera que le llegue por el puerto serie. Gracias al bucle for que hemos creado, el código que contiene se repetirá tantas veces como indique el número n. Si te fijas en el código for (int i = 0; i < n; i++) lo que hace es evaluar el número i que comienza tomando el valor 0 y se va incrementando (i++). El bucle se rompe cuando i supere a n (i < n). ¡Ahora es tu turno, espero que te haya gustado!

Más información – Cómo montar y configurar la Raspberry Pi paso a paso


10 comentarios

  1.   Anonimo dijo

    Muy interesante

  2.   tonixiclanaTony dijo

    El código python para la arduino no funciona :/.

    sketch_may20a.ino: In function ‘void loop()’:
    sketch_may20a:9: error: argument of type ‘int (HardwareSerial::)()’ does not match ‘int’
    sketch_may20a:9: error: expected `;’ before ‘)’ token
    sketch_may20a.ino: In function ‘void luz(int)’:
    sketch_may20a:15: error: ‘i’ was not declared in this scope

    1.    Isaac P.E. dijo

      Hola Toni.

      Vayamos por partes. Lo primero, el código al que te refieres no es Python, es el lenguaje Arduino que como bien has hecho has insertado en Arduino IDE. El Python se usa en pasos previos desde el terminal…

      Lo segundo, el error que reportas es muy común. Te está indicando que Arduino IDE al intentar compilar el código fuente del sketch ha detectado errores sintácticos. Siempre que te ocurra eso, comprueba que no hayas olvidado ninguna ; al final de las instrucciones, que las variables están bien declaradas y que no haya nada mal escrito…

      En este caso ha sido un problema nuestro, que al pasar el código e insertarlo con el plugin que empleamos para insertar código en los artículos, ha variado algunas cosas. Pero ya está solucionado. Copia y pega el código y no debes tener más problemas.

      Si te fijas en esta imagen, podrás ver como en mi Arduino IDE se ha compilado el código correctamente: http://m1.paperblog.com/i/218/2185652/control-arduino-raspberry-pi-L-J1SAPc.jpeg

      Saludos. Cualquier otra duda, no dudes en consultarnos.

  3.   tonixiclanaTony dijo

    Hola Isaac.

    Perdona mi ignorancia!, no es python, es procesing no? Basado en C y C++. Una duda me aborda sobre estas conexiones serial.Tengo una arduino UNO y al mandar el mensaje por serial de la Raspberry a la arduino, esta se me reinicia, por lo que he leído esto sucede para que cuando desde el IDE subamos el sketch, no tengamos que pulsar previamente el reset, también he leído que es posible desactivarlo haciendo un puente del reset al 5v pin, pero no me ha quedado nada claro, ¿has realizado alguna vez algo de esto?.

    No más que decir que muchas gracias por la atención y la respuesta tan elaborada que has dado.

    Saludos.
    Tony.

    1.    Isaac P.E. dijo

      Hola Toni, para nada tengo que perdonar nada. Todos tenemos errores, solo te indiqué que no es Python para evitar confusiones.

      En cuanto a lo que comentas del reset, nunca he realizado nada igual. Si eres tan amable indícame donde has visto lo del puente al pin 5v y le echo un vistazo para poder ayudarte.

      Saludos y gracias a ti.

    2.    Isaac P.E. dijo

      Perdón, acabo de ver lo que me comentas sobre el puenteado del reset y la salida de 5v para desactivar el autoreinicio. Para Arduino UNO es bien sencillo, tan solo tienes que puentear con ayuda de un condensador de un condensador de 10 μF entre el pin RESET y el de tierra (GND).

      Para otras placas de Arduino (en Arduino UNO parece no funcionar demasiado bien) se necesita de una resistencia de 120 ohmios entre el pin RESET y el de 5v. Que un pin de la resistencia vaya conectado al pin RESET de Arduino y el otro a 5V. Tal cual aparece en esta imagen:
      http://playground.arduino.cc/uploads/Main/no_reset.png

      Un apunte, como las de 120 ohmios son difíciles de encontrar, puedes utilizar una similar, pero nunca una inferior a 110 ohmios o superior a los 124 ohmios porque se puede dañar la placa.

      No tienes que modificar nada más, ni en el sketch ni en el circuito, solo hacer ese puente. El resto igual…

      Saludos y espero haberte ayudado.

      1.    tonixiclanaTony dijo

        Mil gracias Isaac, me has servido de mucha ayuda, intenté hacerlo con una resistencia de 640 ohm pero no resultó. He pedido ayuda en varios foros incluido el oficial de arduino y nadie me ha ayudado, menos mal que de vez en cuando encuentras personas que te ayudan en esos momentos en los que nada sale! jaja. Por si te interesa, estoy realizando un proyecto de fin de curso en el que levanto una red wifi con la raspberry, y mediante una plataforma web en apache para controlar los dispositivos, simular una instalación de domótica, en la que se encienden unas luces , un ventilador y apertura y cierre de una puerta de garaje construidos en una maqueta, eventos programables mediante crontab, también quiero incluir un sensor de movimiento que reproducira un sonido mediante omxplayer… Lo que me de tiempo xD . Para el control del motor del garaje he utilizado un Chip integrado L293D. Mi ciclo superior es de administración de redes con que de electrónica poca idea tengo xD, pero ahí estoy exprimiendo el coco !. De nuevo gracias!, Si te puedo servir de ayuda en algo (que lo dudo xD), mi correo ya lo tienes.

  4.   Gerard dijo

    Para ver el efecto sobre la salida indicáis que se puede utilizar: ” LED verde (o cualquier otro color, incluso podría servir una pequeña bombilla, motor, etc…) ”
    Dejando el LED de lado ¿una bombilla o un motor no será una carga muy elevada sin la ayuda de driver ?

    1.    Isaac PE dijo

      Hola. Pues para un motor sería conveniente emplear un driver como indicas. Pero cuando digo bombilla pequeña me refiero a unas bombillas pequeñas que suelen traer algunos juguetes o kits… No son bombillas de 220v.
      Saludos y disculpa si no ha quedado claro.

  5.   Meta dijo

    Interfaz Java y Arduino.

    Tutorial diseño de interfaz con Java bajo NetBeans para controlar Arduino desde el puerto serie / USB, odrás encender y apagar un Led, recibir mensajes de textos o comandos desde Arduino.

    Ver tutorial.
    http://www.slideshare.net/Metaconta2/interfaz-java-y-arduino

    Saludos.

A inventar!