martes, 25 de septiembre de 2012

Conectividad serie entre RaspberryPi y Arduino (parte 1)



... de una forma poco eficiente

Buenos días, llevo tiempo sin postear nada, pero por un buen motivo. He estado haciendo cientos de pruebas, buscando información y reuniendo materiales para los siguientes posts. Y algo muy relacionado con esto, es este post que estoy escribiendo, vamos a conectar nuestro RaspberryPi a un Ardunio Nano, para controlar unos leds. Al lio.

La idea es conectar Arduino y RaspberryPi por serie. Lo lógico seria usar los puertos GPIO destinados a este fin, pero por ahora lo que he encontrado es poco efectivo, así que usaremos un cable USB. Este ejemplo es un poco tontorrón, puesto que encender leds con el RaspberryPi es de lo más sencillo que puede haber, pero bueno, solo es un ejemplo, luego os comento para que seria útil.
Empezamos con el esquema (disculpad el desorden pero mis conocimiento de Fritzing se limitan a 7 minutos de experiencia):
Simplemente un led rojo al pin 7, verde al 8 y blanco al 9, el Arduino lo alimentamos con la pila de 9V porque seguramente la alimentación que da el RaspberryPi por USB es bastante cortita. Perfecto, ahora cargamos el siguiente código en el Arduino:
int redPin   = 7;
int greenPin   = 8;
int whitePin   = 9;

int redVal   = LOW; 
int greenVal   = LOW; 
int whiteVal   = LOW; 
int readSerial;

char c;

void setup(){
    pinMode(7,OUTPUT);
    pinMode(8,OUTPUT);
    pinMode(9,OUTPUT);

    Serial.begin(9600);
    Serial.println("      Arduino Serial Leds Control rsppi.blogspot.com");  
    Serial.println("Press 1, 2 or 3 to turn on the leds");  
    Serial.println();  
}

void loop()
{
    if (Serial.available()>0)
    {
    readSerial = Serial.read();
    if (readSerial == 49) { redVal   = HIGH; }  
    if (readSerial == 50) { greenVal   = HIGH; }  
    if (readSerial == 51) { whiteVal   = HIGH; }  
    Serial.flush();
    digitalWrite(redPin, redVal);
    digitalWrite(greenPin, greenVal);
    digitalWrite(whitePin, whiteVal);
    delay(1000);
    redVal   = 0; 
    greenVal   = 0; 
    whiteVal   = 0; 
    digitalWrite(redPin, redVal);
    digitalWrite(greenPin, greenVal);
    digitalWrite(whitePin, whiteVal);
    }
}
Nuevamente mis conocimientos en programación quedan demostrados ... Para hacer la comunicación serie, conectamos el miniusb al Arduino y el otro extremo al RaspberryPi. Si ejecutamos un dmesg, tiene que mostrar lo siguiente:
[ 3794.237629] usb 1-1.2: FTDI USB Serial Device converter now attached to ttyUSB0
[ 3794.240030] usbcore: registered new interface driver ftdi_sio
[ 3794.240077] ftdi_sio: v1.6.0:USB FTDI Serial Converters Driver
Bien!, ahora instalamos "algo" que nos permita comunicarnos fácilmente por serie, por ejemplo:
apt-get install putty-tools
y vamos a jugar:
plink -serial /dev/ttyUSB0
y pulsamos 1, 2 ó 3 (con su intro al final) y vemos como los leds se encienden y apagan. También podemos:
echo 1 | plink -serial /dev/ttyUSB0
Insisto que es una chorrada usar un Arduino para encender leds, teniendo un RaspberryPi que lo hace de maravillas, pero lo interesante es:
RaspberryPi tiene un sólo pin GPIO para con control de PWM por hardware, Arduino tiene 6 y además 8 inputs de tipo analógico ...

Lo que significa que podemos controlar por ejemplo 6 motores dc en un sentido y en intensidad, o bien 3 motores en intensidad y sentido, al tiempo que leemos de 8 sensores analógicos. Pero lo más interesante de todo, es que puedes comprar un Arduino Nano en ebay por 5€.

Edición 28 Enero 2013:
Estaba haciendo pruebas y también podemos:
echo -ne "1" > /dev/ttyUSB0
y por cierto, comentaba que sólo se podía tener un GPIO modulado en PWM, pero ya podemos hacer esto.

3 comentarios:

  1. La verdad es que se echaba de menos... quiero ponerme ya manos a la obra pero aún no me ha llegado el RP (Desde julio)...


    un saludo!

    ResponderEliminar
  2. Me alegra ver que crece la comunidad de habla hispana alrededor de la
    rasppi! Yo ya tengo dos joyas de estas! Una la uso como media center y
    la otra la quiero para hacerme un robot. Quiero controlar dos motores
    y dos servos a través de una arduino. Al igual que tu lo quiero hacer
    mediante el usb, por lo q seguire muy de cerca estos post! Y tu blog!

    Una pregunta, donde compras tu las arduinos, nano o la que sea?? Por
    ebay no las veo por debajo de 13 euros.

    Un abrazo y mucho animo con este blog!

    ResponderEliminar
  3. Muchas gracias por tus posts. Algún día si tienes un rato, y ganas, ¿nos podrías poner dónde comprar los arduinos y demás a esos precios? Tipo wiki lista de la compra jeje.

    ResponderEliminar