Comunicación por radiofrecuencia con Arduino

En este artículo vamos a aprender a realizar una comunicación por radiofrecuencia con un circuito básico. Este es un buen modo de comunicación para controlar robots, pequeños vehículos o para transmisión de datos.

rf, radiofrecuencia

Para realizar la comunicación por radiofrecuencia es necesario un transmisor que es el que se encarga de enviar una señal electromagnética a una cierta frecuencia y un receptor que la recibe. En mi caso utilizare un transmisor CDR03A y un receptor CDT-88 de 433MHz.

Para programar necesitaremos la librería de virtualwire que se puede encontrar gratuitamente en internet, esta la tendremos que descomprimir en la carpeta libraries de Arduino y ya podremos usarla.

Material necesario:

  • Dos placas Arduino 
  • Un juego de transmisor/receptor
  • Un pulsador 
  • Un led
  • Una resistencia de 10k Ohm
  • Una resistencia de 220 Ohm

Esquema de montaje

 

En 2 partes

Transmisor:

Esquema transmisor rf arduino

Receptor:

Esquema receptor rf arduino

Programa Arduino transmisor:

#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

}
}

Programa Arduino 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
}
}
}

Demostración:


46 comentarios

  1.   ARTURO dijo

    Disculpa, que libreria usaste?? Intente con muchas librerias el codigo receptor, pero me marca error. Me puedes pasar la libreria que usaste ??

    1.    Benjamin Garcia del Gaiso dijo

      La libreria se llama VirtualWire, la puedes descargar desde aca: http://www.pjrc.com/teensy/arduino_libraries/VirtualWire.zip

      Saludos

  2.   ARTURO dijo

    cuando cargo el programa del receptor en el arduino, me sale esto.

    sketch_de15b:16: error: incompatible types in assignment of ‘const char

    1.    Benjamin Garcia del Gaiso dijo

      Cambia las comillas del codigo por comillas simples ( ‘ ) o bien comillas dobles ( ” ).

      Saludos

  3.   daniel dijo

    oye una pregunta porque conectas el puerto numero 11 del receptor a el puerto data del arduino si en el programa que tu no asignas ningun tipo de lectura o lo avilita tengo esa duda seria de gran ayuda que me explicaras ;)

  4.   daniel dijo

    hola tengo un problema con mi protocolo de comuncasion pues lo quise aser con mas variables y lo ise con cuatro y me funciona con tres osea emito la señal y pues me llega la uno, dos y la tres pero no llega la cuatro y pues e investigado y no e encontrado una solucion no se si son los modulos rf o los arduino porque lo pruevo con leds y pues el que le pertenese la variable numero cuatro queda medio encendido como si fuera ruido estoy usando un arduino nano como emisor y uno mega como recepttor no se si eso afecte en algo la comunicacion ya e mirado las coneciones que son demasiado selcillas en cuanto a el programa se me ase extraño porque me funcionan tres señles y el codigo es practicamente identico a cada pulsador

  5.   Tomás dijo

    Hola! me gusta mucho el sitio, hace años que lo visito.
    Una recomendación: Cuando vas a usar valores que no van a cambiar, en este caso el numero de pin del boton, es recomendable usar una constante (agregare const adelande de “int boton”), ya que el compilador reemplaza al compilar la palabra por el valor, en vez de usar una variable integer que si no me equivoco reserva 4 bytes de memoria para los posibles valores. Obviamente en un programa pequeño no hace diferencia, pero siempre es bueno tenerlo en cuenta.
    Con respecto al post, me encantó, hace unas semanas recibí un arduino mega y estoy buscando que utilidades darle.

    1.    Nacho Morato dijo

      Hola Tomás,

      muchas gracias por el consejo, de verdad que se agradecen :)

  6.   victor dijo

    Hola muy buen tutorial,

    Pero tengo una pregunta cuanto alcance tiene la radiofrecuencia? que autonomia tiene con una pila de 9v?

    1.    Dabizu Garushia dijo

      Eso es depende del modulo que uses si usas uno de 433 Mhz eso te dará un alcance de 400 metros (aproximadamente) no todos son compatibles por eso te los venden en pares y para que esten a su mayor alcance es de 9 v máximo

  7.   daniel dijo

    Fenomenal el tutorial, justo lo que andaba buscando!

    Sólo un problema: No soy capaz de que me funcione. Me temo que mi problema está en las comillas. Al copiar el código me da errores de compilación y aunque he tratado de cambiarlas por ” “, ‘ ‘, sigue sin funcionarme. Sería posible descargar el programa en un archivo .ino? Así supongo que no habría error posible !

    gracias!

  8.   daniel dijo

    bueno, conseguí que funcione! Sin embargo el alcance es solamente de medio metro, a pesar que le he puesto antena tanto a receptor como a emisor.

    El emisor lo alimento con transformador a 12V 1000mA y el receptor desde el usb del pc

    alguna solución?

    gracias!

    1.    Cat007 dijo

      Mueve el ajuste del receptor, a mí me pasó lo mismo, ahora logré unos 10 metros :)

      1.    daniel dijo

        hola
        ¿podrías explicarme con detalle a qué te refieres con “mover el ajuste del receptor”?
        Te refieres a mover la antena o orientarla de alguna manera especial?

        gracias!

        1.    Cat007 dijo

          Hola, en el módulo receptor, si es que estamos hablando del mismo, se encuentra un capacitor variable, el mío estaba cubierto como por silicón, en la imagen de este post, puedes ver que tiene un tornillito plano, con un destornillador prueba a ir moviendo poco a poco este tornillo, yo lo hice, pasé un buen rato allí sentado moviendo y probando, pero valió la pena

          1.    daniel dijo

            muchas gracias, lo probaré!


          2.    Cat007 dijo

            Sobres cualquier cosa me dices que onda :D


    2.    JOSE DUITAMA dijo

      BUEN DIA MUCHACHOS , NO HE PODIDO COMPILAR EL INO DEL RECEPTOR , ME PUEDEN COLABORAR SON TAN AMABLES

      1.    daniel dijo

        hola josé,

        he colgado los dos programas compilando correctamente en el siguiente enlace:

        https://drive.google.com/folderview?id=0Bykabk8umbtSWDdZRzVidUZzY3M&usp=sharing

        suerte

        1.    Saya maurys dijo

          gracias por el aporte, ya me funciona …. ahora me queda un solo problema , como hago para combinar este codigo con otro codigo que tengo?
          de antemano, gracias por responder…

    3.    Saya maurys dijo

      tengop el mismo problema, me da eroro en la compilacion… como puedo solucionarlo_?

    4.    Edel dijo

      Como lograste que te funcionara a mi no me complila el receptor

  9.   Israel dijo

    Hola
    Me podrías ayudar ayudar, me marca un error en el receptor
    if ( msg[0] == “E”) {

    le cambie las comillas por (” “), me marca: ISO C++ forbids comparison betwen pointer and integer.

    como le hago para que me compare lo que guarde en la E, supongo que me marcara el mismo error cuando compare la A.
    saludos,

    1.    JOSE DUITAMA dijo

      TENGO EL MISMO ERROR COMPA , YA LO PUDISTE SOLUCIONAR

      1.    Enrique Gudiño dijo

        Hola que tal, lo que pasa es que son comillas simples, por eso marca ese error. :D

        if ( msg[0] == ‘E’)

  10.   Alejo Puche Navarrete dijo

    Muy buenas, me interesa mucho el tema que estáis tratando. Sabrías decirme ¿cual es la distancia máxima de la comunicación?.

    Muchas gracias, un saludo.

  11.   David Vigón dijo

    Hola, Necesito ayuda para el emisor, quiero que los datos se envíen desde el puerto serie, con la función Serial.read( );

    Es decir, quiero enviar desde la consola de Arduino los datos escritos por el teclado del ordenador, pero el compilador me da error.

    Me dice que Serial.read() tiene como retorno un int, y la función sólo me permite enviar datos de tipo char.

    Se te ocurre alguna solución ?

    Gracias.

  12.   julian colorado dijo

    hey muchas gracias funciono a la perfeccion pero tengo una pregunta para la antena q tanto cable se recomienda para hacerla

    1.    JOSE DUITAMA dijo

      HOLA JULIAN , QUE PE NA LA MOLESTIA LA VERDAD ME GUSTARIA SABER QUE LIBRERIA EMPLEASTE POR QUE NO ME COMPILA EL EMISOR

  13.   martin sedano dijo

    Hola sabes como puedo hacer que suba y baje la intensidad del led por medio del push botton??

  14.   Eduardo dijo

    Hola, buen tutorial. ¿Podrías indicarme si a un único receptor se le pueden enviar datos desde varios transmisores? ¿Habría que cambiar algo en el código? Y lo más importante ¿afectarían señales de una radio a estos circuitos? Saludos y gracias anticipadas.

  15.   Andrei dijo

    Pregunta tecnica deseo saber el por que utiliza ese tamaño de resistencias específicamente. soy nuevo en el tema. espero tu respuesta.

  16.   UnoMas dijo

    ¿Que resistencia usas con el emisor y cual con el receptor?

  17.   mmm dijo

    Hola que tal, como puedo aumentar la distancia?? se le puede soldar algun tipo de antena o cable?=

  18.   alan dijo

    que tal tengo un problema con el programa ya que no puedo hace que funcione correctamente ya descarge los archivos correctos y si lo compila bien pero no puedo hacer que funcione no estoy seguro si sean los sensores que esten mal alguien me podria pasar el programa correcto y explicarme donde conecto los pinnes ya que con los tengo pero no puedo lograr que prenda el led, grs.

  19.   dan dijo

    y si quiero conectar mas botones y mas leds como le hago ? saludos :)

  20.   fran dijo

    Hola quisiera saber como se pueden modificar los pines con lo que se envia y reciben los datos para poder usar otros en lugar de estos, ya que los estoy usando para la libreria de ethernet

  21.   Rigo dijo

    Hola,disculpa quiero saber si puedo modificar la velocidad de la transmisión de datos?
    Saludos.

  22.   Reyna dijo

    a mi me aparece esto.. ayuda!!

    Arduino:1.6.7 (Mac OS X), Placa:”Arduino Mega ADK”

    transmisor_2_:5: error: empty character constant
    char *msg = ”; //Asignamos el mensaje en blanco
    ^
    /Users/reynagarcia/Documents/Arduino/transmisor_2_/transmisor_2_.ino: In function ‘void loop()’:
    transmisor_2_:16: error: invalid conversion from ‘char’ to ‘char*’ [-fpermissive]
    msg = ‘E’; //Si lo esta, asignamos la letra E al mensaje
    ^
    transmisor_2_:20: error: invalid conversion from ‘char’ to ‘char*’ [-fpermissive]
    msg = ‘A’; //Asignamos A al mensaje
    ^
    exit status 1
    empty character constant

  23.   Jerry dijo

    Funciona con Arduino Leonardo?

    Saludos.

    Buen tutorial por cierto.

  24.   Jerry dijo

    Funciona con Arduino Leonardo?

    Saludos.

    Buen tutorial por cierto.

    Felicitaciones

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *