Comunicación por radiofrecuencia con Arduino

59 Flares Filament.io Made with Flare More Info'> 59 Flares ×

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:

33 pensamientos en “Comunicación por radiofrecuencia con Arduino

  1. ARTURO

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

    Responder
  2. ARTURO

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

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

    Responder
  3. daniel

    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 ;)

    Responder
  4. daniel

    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

    Responder
  5. Tomás

    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.

    Responder
  6. victor

    Hola muy buen tutorial,

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

    Responder
  7. daniel

    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!

    Responder
  8. daniel

    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!

    Responder
      1. daniel

        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!

        Responder
        1. Cat007

          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

          Responder
  9. Israel

    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,

    Responder
  10. Alejo Puche Navarrete

    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.

    Responder
  11. David Vigón

    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.

    Responder
  12. Eduardo

    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.

    Responder
  13. Andrei

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

    Responder
  14. tito

    disculpa me podrias ayudar a corregir estos errores??

    In file included from sketch_apr27a.ino:1:

    C:\arduino-1.0.3-windows\arduino-1.0.3\libraries\VirtualWire/VirtualWire.h:54: error: variable or field ‘vw_set_tx_pin’ declared void

    C:\arduino-1.0.3-windows\arduino-1.0.3\libraries\VirtualWire/VirtualWire.h:54: error: ‘uint8_t’ was not declared in this scope

    C:\arduino-1.0.3-windows\arduino-1.0.3\libraries\VirtualWire/VirtualWire.h:58: error: variable or field ‘vw_set_rx_pin’ declared void

    C:\arduino-1.0.3-windows\arduino-1.0.3\libraries\VirtualWire/VirtualWire.h:58: error: ‘uint8_t’ was not declared in this scope

    C:\arduino-1.0.3-windows\arduino-1.0.3\libraries\VirtualWire/VirtualWire.h:62: error: variable or field ‘vw_set_ptt_pin’ declared void

    C:\arduino-1.0.3-windows\arduino-1.0.3\libraries\VirtualWire/VirtualWire.h:62: error: ‘uint8_t’ was not declared in this scope

    C:\arduino-1.0.3-windows\arduino-1.0.3\libraries\VirtualWire/VirtualWire.h:66: error: variable or field ‘vw_set_ptt_inverted’ declared void

    C:\arduino-1.0.3-windows\arduino-1.0.3\libraries\VirtualWire/VirtualWire.h:66: error: ‘uint8_t’ was not declared in this scope

    C:\arduino-1.0.3-windows\arduino-1.0.3\libraries\VirtualWire/VirtualWire.h:71: error: variable or field ‘vw_setup’ declared void

    C:\arduino-1.0.3-windows\arduino-1.0.3\libraries\VirtualWire/VirtualWire.h:71: error: ‘uint16_t’ was not declared in this scope

    C:\arduino-1.0.3-windows\arduino-1.0.3\libraries\VirtualWire/VirtualWire.h:90: error: ‘uint8_t’ does not name a type

    C:\arduino-1.0.3-windows\arduino-1.0.3\libraries\VirtualWire/VirtualWire.h:96: error: ‘uint8_t’ does not name a type

    C:\arduino-1.0.3-windows\arduino-1.0.3\libraries\VirtualWire/VirtualWire.h:99: error: ‘uint8_t’ does not name a type

    C:\arduino-1.0.3-windows\arduino-1.0.3\libraries\VirtualWire/VirtualWire.h:104: error: ‘uint8_t’ does not name a type

    sketch_apr27a.ino: In function ‘void setup()':

    sketch_apr27a:7: error: ‘vw_setup’ was not declared in this scope

    sketch_apr27a.ino: In function ‘void loop()':

    sketch_apr27a:15: error: ‘vw_send’ was not declared in this scope

    sketch_apr27a:19: error: ‘vw_send’ was not declared in this scope

     

    Responder
  15. Wk3

    Hola tito,

    Tienes descargada la libreria de virtualwire y dentro del directorio de libraries de arduino? Si es asi usaste el codigo de arriba?

    Un saludo

    Responder
  16. tito

    muchas gracias si tenia la libreria pero no me servia, descargue otra y ya esta funcionando.

    otra cosa si no es mucha molestia me podrias decir como hechar andar un servo?? ya que creo que necesita de mas voltaje (soy nuevo en esto) 

    saludos

    Responder

Deja un comentario

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

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>