martes, 28 de agosto de 2012

Envío de mensajes a través de modulo RF y dos Arduinos


En esta practica vamos a realizar el envío de mensajes a través de un modulo de RadioFrecuencia y dos Arduinos.

El módulo empleado es un emisor y receptor RF Link que trabaja a 434Mhz, modelo SF-WRL-08946, de la marca Sparkfun.
Es un módulo muy económico y tiene una cobertura bastante aceptable, según el fabricante unos 500 pies en espacio abierto (150 metros).
El voltaje en el que trabaja es entre 2 y 12 voltios, por tanto ideal para utilizar con nuestro Arduino.

EMISOR:

El emisor lo he alimentado a 5 voltios y el pin de datos lo he conectado en el pin 10(digital). 
La antena es opcional.

Vcc= 5 v(Arduino)
Gnd= Gnd
Data= pin 10








RECEPTOR:

En el receptor tenemos varios pines de conexión yo he utilizado los 3 primeros de la izquierda,  la antena igual que en el emisor es opcional, para una distancia corta no es necesaria, pero si queremos mas distancia tendremos que ponerla.
Vcc= 5 v(Arduino)
Gnd= Gnd
Data= pin 9






Dentro de la programación he empleado la libreria VirtualWire, la cual proporciona la característica de envío de mensajes cortos de forma inalambrica.


EL RESULTADO:

Arriba tenemos el Arduino Emisor y abajo el Arduino Receptor.





Para comprobar que funciona he programado un Bucle con el envío de la palabra "PRUEBA".

En la foto podemos observar como recibimos los datos en nuestro Arduino y lo mostramos a través del puerto serie.







Sketch del emisor:


// Codigo del transmisor

// Modulo RF para transmitir mensajes usando VirtualWire

#include <VirtualWire.h>  // incluimos la libreria VirtualWire, deberemos haberla copiado en la carpeta libraries

void setup()
{

    vw_set_ptt_inverted(true);       // Inicializa el software de VirtualWire
    vw_setup(2000);                 // Bits por sec
    vw_set_tx_pin(10);                // definimos el pin 10 para el envio del mensaje, por defecto será el pin 12.
}

void loop()
{
    const char *msg = "PRUEBA";       // mensaje a enviar

   vw_send((uint8_t *)msg, strlen(msg));
   vw_wait_tx();                                          // espera a que finalice el envio del mensaje
   delay(200);
}




Sketch del receptor:


#include <VirtualWire.h>  // incluimos la libreria 

void setup()
{
    Serial.begin(9600);         

    vw_setup(2000);                   // Bits por sec
    vw_set_rx_pin(9);           // definiremos el pin 9 para la recepcion, por defecto es el pin 11.
    vw_rx_start();                      // Activa la recepcion
}

void loop()
{
    uint8_t buf[VW_MAX_MESSAGE_LEN];
    uint8_t buffer = VW_MAX_MESSAGE_LEN;

    if (vw_get_message(buf, &buffer)) // comprueba si algo ha sido recibido
    {
    int i;
        
    for (i = 0; i < buffer; i++)
      {
         Serial.print(buf[i]);  // imprime en el puerto serie el dato recibido en el buffer
      }
    Serial.println("");
    }
}



8 comentarios:

  1. disculpa porq en la salida de arduino al trasmisor tengo 2.4 y eso no alcanza a dectetar el trasmisor ya hize todo pero no lo decteta q esta mal profas

    ResponderEliminar
  2. Hola masmas. Que pin has definido como salida para envió de datos,el 10? 2.4 voltios obtienes? Un saludo

    ResponderEliminar
  3. es el pin 10 y en esa salida me da 2.4v porq ya puse todo bien del codigo pero no manda el mensaje y medi el voltaje del pin y es de 2.4v

    ResponderEliminar
  4. Hola masmas ¿Usas dos Arduinos no?Si has hecho la práctica igual que yo, tiene pinta a que es un problema en las velocidades de puerto serie. Comprueba que esta a 9600 baudios,ya que es un problema muy común y si no coincide, o no recibimos datos o aparecen símbolos sin sentido. La otra opción es que uno de los dos componentes este dañado, pero no creo que sea el caso. La medición del voltaje no te sirve de mucho, ten en cuenta que a través de ese Pin estas enviando paquetes de datos, y el multímetro te mide el voltaje medio.
    Ya me vas informando si das con el problema, cualquier otra cuestion no dudes en preguntar.
    Un saludo

    ResponderEliminar
  5. grasias pero ya utilize los dos y en el Rx noresivo nada te muestro el codigo de cada arduino y la antena q ocupe porefavor ayudame link=http://articulo.mercadolibre.com.mx/MLM-449941184-rf-trasnmisor-receptor-433-mhz-para-pic-avr-arduino-_JM#D[S:VIP,L:SELLER_ITEMS,V:2]


    Tx:
    #include


    const int boton= 2;
    //const int salida=3;



    void setup()
    {
    Serial.begin(9600);
    vw_set_ptt_inverted(true); // Inicializa el software de VirtualWire
    vw_setup(2000); // Bits por sec
    vw_set_tx_pin(7);
    pinMode(boton, INPUT); // definimos el pin 11 para el envio del mensaje, por defecto será el pin 12.
    //pinMode(salida,OUTPUT);
    }

    void loop()
    {
    //Serial.println(salida);
    int acti=digitalRead(boton);
    Serial.println(acti);



    if (acti==HIGH)
    {
    const char *msg = "ABC"; // mensaje a enviar

    Serial.println(msg);
    vw_send((uint8_t *)msg, strlen(msg));
    vw_wait_tx(); // espera a que finalice el envio del mensaje
    //delay(200);

    }
    }

    Rx:

    include // incluimos la libreria

    void setup()
    {
    Serial.begin(9600);

    vw_setup(2000); // Bits por sec
    vw_set_rx_pin(9); // definiremos el pin 9 para la recepcion, por defecto es el pin 11.
    vw_rx_start();
    Serial.println("Iniciando"); // Activa la recepcion
    }

    void loop()
    {
    uint8_t buf[VW_MAX_MESSAGE_LEN];
    uint8_t buffer = VW_MAX_MESSAGE_LEN;

    if (vw_get_message(buf, &buffer)) // comprueba si algo ha sido recibido
    {
    int i;

    for (i = 0; i < buffer; i++)
    {
    Serial.print(buf[i]);
    Serial.println("ddd");// imprime en el puerto serie el dato recibido en el buffer
    }
    Serial.println("");
    }


    }

    ResponderEliminar
  6. QUE HACER SI EN EL RECEPTOR USO UN DISPLAY DE 16 POR 2 EN LUGAR DEL MONITOR SERIAL?...CAIASMBIA EL SKETCH?,GRAC

    ResponderEliminar
  7. Hola Toño!
    Te debería de funcionar sin problemas, lo único piensa que el LCD es de 16x2 e igual tienes que ajustar los caracteres dependiendo de como lo quieras visualizar.
    Un saludo

    ResponderEliminar
  8. yo necesito controlar varias salidas del arduino recptor con botones en el emisor si se podria con este modelo

    ResponderEliminar