Comunicación entre Arduinos por radiofrecuencia

Hola, el otro día compre en ebay este modulo de radiofrecuencia para Arduino:

img1

img2

Este módulo se compone de un receptor y un emisor que funcionan en la frecuencia 315Mhz, las conexiones con Arduino son muy sencillas:

En el caso del emisor (XY-FST):

  • ATAD (Data) —> Pin digital 3 (Se puede cambiar por otro en el código del programa).
  • VCC —> +5V
  • GND —> GND

Para el receptor (XY-RF-5V):

  • GND —> GND
  • DATA —> Pin digital 3 (Se puede cambiar por otro en el código del programa).
  • DATA —> Este pin lo dejaremos sin conectar, solo usaremos un pin de datos (Podemos usar cualquiera de los dos).
  • VCC —> +5V

Antes de cargar el código es necesario descargar e instalar la librería VirtualWire, el enlace de descarga directa es el siguiente:

http://www.airspayce.com/mikem/arduino/VirtualWire/VirtualWire-1.14.zip

El siguiente código permite enviar y recibir un mensaje entre dos placas Arduino:

Código para el emisor:

//Prueba y transmision de texto con el modulo RF para Arduino http://zygzax.com
//TRANSMISOR
#include <VirtualWire.h>
void setup()
{
vw_set_ptt_inverted(true); // Requerido por el modulo RF
vw_setup(2000); // Velocidad de conexion bps
vw_set_tx_pin(3); // Pin en el que conectamos la patilla data del transmisor
}

void loop()
{
//Mensaje a enviar:
const char *msg = "HOLA MUNDO";
vw_send((uint8_t *)msg, strlen(msg));
vw_wait_tx(); // Esperamos a que termine de enviar el mensaje
delay(200); // Esperamos para enviar el siguiente mensaje
}

Código para el receptor:

//Prueba y transmision de texto con el modulo RF para Arduino http://zygzax.com
//RECEPTOR
#include <VirtualWire.h>

void setup()
{
Serial.begin(9600); // Configuramos la conexion serie con el ordenador
vw_set_ptt_inverted(true); // Requerido por el modulo RF
vw_setup(2000); // Velocidad de conexion bps
vw_set_rx_pin(3); // Pin en el que conectamos la patilla data del receptor
vw_rx_start(); // Arrancamos el receptor
}

void loop()
{
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen)) // Comprobamos si hemos recibido datos
{
int i;
// Mensaje con un chequeo correcto.
for (i = 0; i < buflen; i++)
{
Serial.write(buf[i]); // Los datos recibidos son guardados en el buffer
// y enviados por el puerto serie al ordenador
}
Serial.println();
}
}

Una vez cargados los programas y en ejecución, conectando el monitor serie de la aplicación Arduino con la placa receptora a 9600, deberíamos ver el mensaje que estamos emitiendo desde la placa emisora.

Fuentes: VirtualWire

38 pensamientos en “Comunicación entre Arduinos por radiofrecuencia

  1. felix

    i did everything exactly as you said but mine still doesn’t show anything on the serial monitor.here are the steps i took

    1.downloaded arduino 1.0.2 for windows,unzipped and copied it to c:program files
    2.downloaded virtual wire 1.14,unzipped it and copied it to c:program file/Arduino/libraries
    3.copy pasted the above code for transmitter and receiver and uploaded them to their respective arduino uno boards.

    still nothing shows on serial monitor window of receiver.could i have done something wrong in steps 1and 2?

  2. roukao

    hello,
    I try to send “hello” from a self ATmega328. I put a LED on the PIN3 to see when a signal is emitted. But nothing! I tested the LED, I 5V, the atmega loaded, but nothing.
    I don’t understand, when you load the atmega, the library “VirtualWire” is still in the PC … The atmega does not need to issue the library? . Have you an idea of ​​the error I am! Thank you !!

    1. DigiGram

      Hey Roukao,

      The library will stay on the PC yes. Arduino compiles the library with your code and writes that to the ATmega, but will not remove the library from your PC. Also, a LED on pin 3 might indicate transfer, but keep in mind it will be very short bursts, so your LED might not even light up (mine never did, even though my project is working).

      Maybe put the exact code you used in a pastepin or hastepaste.com and paste here. A schematic of your setup (with the LED) might also help in figuring this out.

  3. Eduardo

    Hi. I got this erro

    Arduino: 1.5.6-r2 (Windows 7), Placa:”Arduino Uno”

    Build options changed, rebuilding all

    In file included from Simple_Transmitter_Code.ino:3:
    C:Program Files (x86)ArduinolibrariesVirtualWire/VirtualWire.h:54: error: variable or field ‘vw_set_tx_pin’ declared void
    C:Program Files (x86)ArduinolibrariesVirtualWire/VirtualWire.h:54: error: ‘uint8_t’ was not declared in this scope
    C:Program Files (x86)ArduinolibrariesVirtualWire/VirtualWire.h:58: error: variable or field ‘vw_set_rx_pin’ declared void
    C:Program Files (x86)ArduinolibrariesVirtualWire/VirtualWire.h:58: error: ‘uint8_t’ was not declared in this scope
    C:Program Files (x86)ArduinolibrariesVirtualWire/VirtualWire.h:62: error: variable or field ‘vw_set_ptt_pin’ declared void
    C:Program Files (x86)ArduinolibrariesVirtualWire/VirtualWire.h:62: error: ‘uint8_t’ was not declared in this scope
    C:Program Files (x86)ArduinolibrariesVirtualWire/VirtualWire.h:66: error: variable or field ‘vw_set_ptt_inverted’ declared void
    C:Program Files (x86)ArduinolibrariesVirtualWire/VirtualWire.h:66: error: ‘uint8_t’ was not declared in this scope
    C:Program Files (x86)ArduinolibrariesVirtualWire/VirtualWire.h:71: error: variable or field ‘vw_setup’ declared void
    C:Program Files (x86)ArduinolibrariesVirtualWire/VirtualWire.h:71: error: ‘uint16_t’ was not declared in this scope
    C:Program Files (x86)ArduinolibrariesVirtualWire/VirtualWire.h:90: error: ‘uint8_t’ does not name a type
    C:Program Files (x86)ArduinolibrariesVirtualWire/VirtualWire.h:96: error: ‘uint8_t’ does not name a type
    C:Program Files (x86)ArduinolibrariesVirtualWire/VirtualWire.h:99: error: ‘uint8_t’ does not name a type
    C:Program Files (x86)ArduinolibrariesVirtualWire/VirtualWire.h:104: error: ‘uint8_t’ does not name a type
    Simple_Transmitter_Code.ino: In function ‘void setup()':
    Simple_Transmitter_Code:6: error: ‘vw_set_ptt_inverted’ was not declared in this scope
    Simple_Transmitter_Code:7: error: ‘vw_setup’ was not declared in this scope
    Simple_Transmitter_Code:8: error: ‘vw_set_tx_pin’ was not declared in this scope
    Simple_Transmitter_Code.ino: In function ‘void loop()':
    Simple_Transmitter_Code:15: error: ‘vw_send’ was not declared in this scope

    Este relatório deveria ter mais informações
    “Mostrar saída verbosa durante a compilação”
    habilitado em Arquivo > Preferências.

    1. javiersb Autor

      Hola, según parece la versión 1.5.6-r2 es una beta y debe de tener algún problema con la librería VirtualWire o no está incluida.
      Prueba a descargarte una versión estable de la aplicación de Arduino como la 1.0.5, con ella el programa debería compilar correctamente.

      Gracias por tu visita,
      Javier.

  4. alejandro

    disculpa quería saber si puedes ayudarme con el diagrama de el armado de las 2 placas de arduino y de el receptor y emisor.

  5. Wojtek

    Hello,

    Thanks for the great write-up. Would you know how to set the working frequency of the receiver (you mention 315 MHz, there are other available but I cannot find any information on how to set them up)

    Thank you!

    1. DigiGram

      Wojtek, the receiver is set to 315MHz when you buy it. Most versions does feature a variable inductor, but you don’t want to change that!! So decide if you want 315MHz or 433Mhz, and buy the set you need. Don’t try to set these.

      I absolutely love these RF kits, so I try to use them for as many projects as possible

  6. Gabriel R

    Gracias por este tutorial, fue de much ayuda! Alguien sabe cual es la maxima distancia que se puede obtener con estos modulos? Necesito obtener mas distancia para que mi projecto funcione, talvez tenga que usar X-bees pero son muy caras comparadas con estos modulos.

    Gracias

  7. José Luis

    Interesante amigo, yo no uso arduino pero estoy a punto de comprar este kit para utilizarlo con un MSP430, de Texas Instruments, solo tengo algunas preguntas: ya no requiere codificador y decodificador el tx y rx respectivamente verdad? porque he visto unos modulos que si lo requieren y otra cuestion mas: en mi caso yo tengo en mi microcontrolador terminales de tx y rx de la uart, ahi serian las conexiones de data? muy amable y ya te contare como estuvo.

    1. DigiGram

      I would rather not use your tx/rx as that is programmed to work in one set way, while the virtualwire library is set up to use input/output pins. The encoder/decoder is not necessary for the virtualwire library, but you might get interference from other devices. The MSP430 is very nice, and virtualwire is written to work with MSP430 as well. Good luck and enjoy.

      PS. I’m now having 40m of reception outside while the receiver is inside the house, inside a cupboard on the other side of the house. Can turn my back lights on from my gate, about 40m away. Running the transmitter from 3*1.5V AAA batteries and the receiver from a 5V regulated supply.

      PPS. Hope the English replies are fine

  8. Pingback: A nice longer weekend being able to play with the Arduino board… »

    1. DigiGram

      @Carlos, yes several transmitters can talk to one receiver BUT NOT at the same time! As long as the transmitters don’t transmit simultaneously the receiver will receive all of them.

      And as to distance, I got roughly 10m tonight through doors and walls, with a regulated 5V supply and NO external ANT.

      @Luke: Yes you can use UNO for both. I used Uno for the receiver and a standalone Atmega 328p for the transmitter, so you can use just what you have

Los comentarios están cerrados.