lunes, 21 de abril de 2014

Conectar dos Arduinos mediante RadioFrecuencia

Ups. Bueno, ayer nos despistamos un poco y no subimos nada (no nos crucifiqueis porfaplis :p). Hoy os traigo algo bastante curioso. Cómo encender un led en un arduino desde otro usando RadioFrecuencia.
Aquí podeis descargaros los archivos .ino directos para abrir en arduino: Emisor y Receptor. Además os dejo la librería VirtualWire la cual solo teneis que descomprimirla donde estén todas las demás (en mi caso en libraries).

Aquí un video de proyecto final:
Aquí os doy la lista de materiales necesarios:

   Para el emisor:
      - Led de 10.000 Ohmios      - Pulsador
      - Jumpers (cablecitos de conexión)
      - Protoboard
      - Arduino (está claro. Yo uso el Uno R3)
      - Un emisor de RadioFrecuencia.(He usado uno de 433MHz)
Aquí teneis el esquemático del circuito emisor:

Y aquí las conexiones (por si no han quedado claras):



Ahora el Receptor.
      - Arduino cables y protoboard (como en el anterior)
      - Receptor de RadioFrecuencia
      - Led
      - Resistencia de 220 Ohmios 
Este es el esquemático:
Y estas algunas fotos de las conexiones:


Aquí os dejo el código del emisor:
#include <VirtualWire.h>  //incluimos la libreria de virtualwire
int boton = 2;            //Asignamos el numero dos al boton
char *msg = "";           //Asignamos el mensaje en blanco
int eb = 0;               //Asignamos el estado del boton en 0

void setup(){
  vw_setup(7000);            //Configuramos la velocidad de transimsion de datos
  pinMode(boton, INPUT);    //Configuramos el pin boton como entrada
}

void loop () {
  eb = digitalRead(boton);    //Leemos el estado del boton y lo guardamos en la variable
  if ( eb == HIGH) {          //Condicion para ver si esta activado el boton
    msg = "E";                //Si lo esta, asignamos la letra E al mensaje
    vw_send((uint8_t *)msg, strlen(msg));  //y enviamos este mensaje
  }
  else {                      //Si no lo esta
    msg = "A";                //Asignamos A al mensaje
    vw_send((uint8_t *)msg, strlen(msg));    // y lo enviamos

  }
}

Y aquí el del receptor:
#include <VirtualWire.h>  //incluimos la libreria de virtualwire

int led = 12; //Asignamos el 12 a la variable led

void setup() {
  vw_setup(7000);        //Seleccionamos la velocidad de transmision de datos
  vw_rx_start();         //Iniciamos la comunicación
  pinMode(led, OUTPUT);  //Asignamos la variable led como salida
}

void loop(){
  uint8_t msg[VW_MAX_MESSAGE_LEN];
  uint8_t len = VW_MAX_MESSAGE_LEN;

  if (vw_get_message(msg, &len)){  //Condicion para ver si hay mensaje
    if ( msg[0] == ‘E’) {            //Si el mensaje es una E
      digitalWrite(led, HIGH);         //Encendemos el LED
    }
    else if (msg[0] == ‘A’){         // Si es una A
      digitalWrite(led, LOW);        //Apagamos el led
    }
  }
}

Bueno gente, espero que hayais estado un rato entretenidos trasteando. Este proyecto también se puede hacer con un solo Arduino pero ni la impresión es la misma (que tener dos Arduinos conectados) ni es necesario, pues se haría directamente, ¿no creeis?

Saludos a todos, perdón por no subir nada ayer y, hasta la próxima! ;)

7 comentarios:

  1. Como seria el codigo si fuera un solo arduino Gracias

    ResponderEliminar
    Respuestas
    1. Aisss que odio. Te he escrito un tochaco y al enviar ha habido un error y se ha borrado todo... T_T

      Bueno, te lo resumo. Pienso que no es posible con un sólo Arduino (además de que no es lógico hacerlo porque un Arduino ya está conectado consigo mismo).

      No se puede porque un Arduino solo es capaz de realizar una acción a la vez (tiene un solo núcleo) por lo que podría estar mandando una señal o recibiendo una señal, pero nunca las dos cosas a la vez. ¿Me entiendes?

      Espero que te gusten mis post. Tengo un par de proyectos con Arduíno en la cabeza que, en cuanto tenga tiempo, pondré en marcha y subiré por aquí.

      Saludos;)

      Eliminar
  2. hola, esto haciendo mis primeras prueba con RF, el codigo del receptor me muestra error de comparación pero no logro ubicar que es saludos y espero me puedas ayudar

    ResponderEliminar
    Respuestas
    1. Si nos mostraras tu código y el error que te devuelve seguro que podríamos ayudarte mejor...

      Saludos;)

      Eliminar
  3. Hola Adrían, ante todo gracias por tu trabajo.
    He copiado el código del emisor y al compilar me devuelve el siguiente error:
    C:\...\sketch_nov16b.ino: In function 'void loop()':
    sketch_nov16b:16: error: ISO C++ forbids comparison between pointer and integer [-fpermissive]
    if ( msg[0] == "E") { //Si el mensaje es una E
    ^
    sketch_nov16b:19: error: ISO C++ forbids comparison between pointer and integer [-fpermissive]
    else if (msg[0] == "A"){ // Si es una A
    ^
    exit status 1
    ISO C++ forbids comparison between pointer and integer [-fpermissive]
    Podrías decirme donde está el error.
    Gracias.

    ResponderEliminar
    Respuestas
    1. Un típico error al copiar códigos suele estar en las comilas ("). A veces se modifican "solas".

      Prueba a borrarlas y reescribirlas a mano en tu código (Mayus+2).

      Saludos;)

      Eliminar
  4. Hola!funciona igual sin la resistencia del pulsador?

    ResponderEliminar