Artículos recientes

Novedades

Comunicación Inalámbrica con módulos de RF de 433Mhz

Comunicación Inalámbrica con módulos de RF de 433Mhz

En este tutorial vamos a realizar una comunicación inalámbrica entre dos Arduino usando módulos de radiofrecuencia de bajo costo.

Los módulos RF de 433Mhz son muy populares por su bajo costo y fácil uso. Vienen en pareja, emisor (FS1000A) y receptor (XY-MK-5V), el tipo de comunicación es simplex, es decir en un solo canal y unidireccional, son de baja velocidad de transmisión pero para  aplicaciones básicas son muy útiles.

 Módulo RF 433MHz TX y RX

 

La frecuencia de trabajo es de 433MHz, debido a que es una banda de libre uso. Para utilizar estos módulos basta con alimentarlos y conectar el pin de datos por un lado del Transmisor (TX) y en otro el Receptor (RX). Para la programación no es necesario agregar ningún tipo de librería, ya que es un proceso "transparente", por lo que el programa sería igual a usar una comunicación serial (UART) entre 2 MCUs , sin embargo existen algunas librerías que nos ofrecen ciertas ventajas como: verificación de errores, mejor transmisión, Direccionamiento, Enrutamiento, mallas, etc.

Antena para módulos de 433Mhz

La antena tiene una gran influencia sobre todo en el módulo receptor, por lo que se recomienda conectar un cable de cobre de unos 17cm de largo para alcanzar la frecuencia de 433MHz.Tambien son muy comunes y eficientes antenas helicoidales de 5mm de diámetro y 3.4cm de longitud. La posición de la antena también afecta la recepción de datos.

medidas de antena modulo RF 433Mz

Para este tutorial se está usando antenas helicoidales.

Antena elicoidal

 

Comunicación Serial con módulos RF

Para este tipo de comunicación solo basta con conectar el módulo RF al  Pin RX o TX del Arduino dependiendo si es transmisor y receptor.

Para este ejemplo usaremos un Arduino el cual transmitirá seriamente información a través del RF transmisor, el módulo receptor está conectado a un conversor USB serial (Puedes usar otro Arduino en lugar del conversor) y visualizaremos los datos des de la pc.

La conexión es la siguiente:

Conexiones del emisor:

Conexion RF emisor Serial

Conexiones del receptor

 Conexion receptor rf conversor usb serialCon respecto al programa se trabaja como si se tratase de una comunicación serial (UART) normal, con el inconveniente que no existe validación o seguridad para saber si los datos son transmitidos correctamente. Pero se puede usar para visualizar mensajes o datos que sean redundantes o que no sean necesarios validar.

Para lograr  una mejor transferencia se recomienda usar velocidades de 1200 o 2400 baudios o inferiores.

A continuación se muestra un código de ejemplo para testear nuestros módulos.

 

void setup() {
   // Inicializamos la comunicación serial a 2400 baudios
  Serial.begin(2400);

}

void loop() {
  Serial.print("Hola mundo ... ");
  Serial.print(millis()); // enviamos  los ms transcurridos
  Serial.println("ms");
  delay(10);    
}

Para visualizar los datos recibidos, en herramientas cambiamos al puerto COM al del conversor,  abrimos el Monitor serial y cambiamos la velocidad a 2400 baudios, debemos recibir los datos como se muestra en la siguiente imagen

 comunicacion serial RF

  

Existen varios métodos para validar información, una de las más fácil de implementar es en enviar el mismo dato varias veces, por ejemplo 3 veces y en el receptor se debe validar verificando que se reciba 3 veces el mismo dato. Otros métodos son la paridad, agregar tramas de validación, sumar los bytes trasmitidos, etc.

 

Comunicación inalámbrica RF entre Arduinos usando librerías

Una de las librería más comunes y eficientes es la VirtualWire desarrollado por Mike McCauley, con esta librería vamos a trabajar los proximos ejemplos del tutorial

Necesitamos descargar la librera VirtualWire e importarla a nuestro IDE Arduino.

A continuación explicamos  las funciones principales  de la librería:

void vw_setup(uint16_t speed)

Inicializar el software VirtualWire, como parámetro hay que indicarle la velocidad de operación, que representa los bits por segundo para la transmisión RF

void vw_set_tx_pin(uint8_t pin)

Estable el pin IO digital por donde se va a transmitir los datos

void vw_set_rx_pin(uint8_t pin)

Estable el pin digital IO por donde se va a recibir datos.               

void vw_rx_start()

Empieza a escuchar los datos provenientes por el pin_rx, es necesario llamar a esta función para poder recibir los datos

uint8_t vw_send(uint8_t * buf,uint8_t len )

Enviar un mensaje con la longitud dada. La función termina rápido pero mensaje será enviado en el momento adecuado establecido por las interrupciones.  Dónde: buf , es el puntero al vector para trasmitir. Y len es el número de bytes a transmitir

void vw_wait_tx()

Hace una pausa hasta que se trasmitan todos los datos.

uint8_t vw_get_message(uint8_t * buf, uint8_t * len )             

Si un mensaje está disponible (con buena suma de comprobación o no), almacena el mensaje en buf , devuelve true si la comprobación es correcta. buf es puntero a la ubicación para guardar los datos de lectura y leng es un puntero a la cantidad de bytes disponibles de buf.

Conexiones entre el modulo RF y Arduino.

Antes de empezar a programar necesitamos hacer las siguientes conexiones:

Conexiones del Emisor:

Conexion RF emisor y arduino

 

Conexiones del receptor:

 

Conexion RF receptor y Arduino

 

Ej.1 Encender y apagar una Led de forma inalámbrica:

En este ejemplo se encenderá un led conectado al pin 13 del Arduino, para apagar y prender se lo hará de forma remota desde otro Arduino, para enviar la orden lo haremos desde la PC pero se lo puede hacer a través de un pulsador.

El código del Emisor es el siguiente: 

#include <VirtualWire.h>

void setup()
{
    Serial.begin(9600);	  
    Serial.println("Emisor RF");

    // Se inicializa el RF
    vw_setup(2000); // velocidad: Bits per segundo
    vw_set_tx_pin(2); //Pin 2 como salida para el RF 
}

void loop()
{

    
    while (Serial.available() > 0) 
    {
      char dato[1];
      dato[0] = Serial.read();
      //Enviamos el carácter recibido al RF
      vw_send((uint8_t*)dato,sizeof(dato));
      vw_wait_tx();         
    }
    delay(200);
}

Como se observa el programa envía inalámbricamente el dato que recibe por el puerto serie.

EL código del receptor se muestra a continuación:

#include <VirtualWire.h>

void setup()
{
    Serial.begin(9600);	// Debugging only
    Serial.println("setup");

    // Se inicializa el RF
    vw_setup(2000);	 // velocidad: Bits per segundo
    vw_set_rx_pin(2);  //Pin 2 como entrada del RF
    vw_rx_start();       // Se inicia como receptor
    
    pinMode(13, OUTPUT);    //Configuramos el pin del Led como entrada
    digitalWrite(13, false);
}

void loop()
{
    uint8_t dato;
    uint8_t datoleng=1;
    //verificamos si hay un dato valido en el RF
    if (vw_get_message(&dato,&datoleng))
    {
        if((char)dato=='a')
        {
            digitalWrite(13, true); //Encendemos el Led
        }
        else if((char)dato=='b')
        {
            digitalWrite(13, false); //Apagamos el Led
        }            
    }
}

Para encender el led es necesario abrir el monitor serial del trasmisor y enviar una “a” o “b” para encender o apagar el Led respectivamente

  

Ej.2 Enviando Mensajes Entre módulos RF

En este ejemplo un Arduino envía una mensaje  “Hola mundo” hacia otro Arduino receptor, para visualizar el mensaje recibido usaremos el monitor serial.

Código del Emisor:

 

#include <VirtualWire.h>

void setup()
{
    Serial.begin(9600);	
    Serial.println("Emisor: Setup");

    // Se inicializa el RF
    vw_setup(2000);	// velocidad: Bits per segundo
    vw_set_tx_pin(2); //Pin 2 como salida para el RF 
}

void loop()
{
    const char *msg = "Hola mundo";

    digitalWrite(13, true); // Parpadeamos  el led al enviar 
    vw_send((uint8_t *)msg, strlen(msg));
    vw_wait_tx(); //Esperamos hasta que el mensaje se envie
    digitalWrite(13, false);
    delay(200);
}

  

Código del receptor:

#include <VirtualWire.h>

void setup()
{
    Serial.begin(9600);	// Debugging only
    Serial.println("Emisor: Setup");

    // Se inicializa el RF
    vw_setup(2000);	 // velocidad: Bits per segundo
    vw_set_rx_pin(2);    //Pin 2 como entrada del RF
    vw_rx_start();       // Se inicia como receptor
}

void loop()
{
    uint8_t buf[VW_MAX_MESSAGE_LEN];
    uint8_t buflen = VW_MAX_MESSAGE_LEN;
    //verificamos si hay un dato valido en el RF
    if (vw_get_message(buf, &buflen)) 
    {
	int i;

        digitalWrite(13, true); // Parpadeamos  el led al recibir
	//verificamos si hay un dato valido en el RF
	Serial.print("Mensaje: ");
	
	for (i = 0; i < buflen; i++)
	{
	    Serial.print((char)buf[i]);
	}
	Serial.println("");
        digitalWrite(13, false);
    }
}

Para visualizar los datos es necesario abrir el monitor serial del receptor.

Mensaje Hola mundo RF

  

Ej.3 Enviando datos y variables con los módulos RF

La librería principalmente trasmite cadenas de bytes, que pueden ser una cadena de texto o un dato convertido en cadena, pero cuando se necesitan enviar varios datos hay dos formas de hacerlo, un método es empaquetar todo en una sola trama y enviarlo, el receptor debe de desempaquetar y obtener los datos.

Otra forma más sencilla es enviar un inicio de trama diferente para cada dato, el cual indicara al receptor que dato es el que se está enviando, el siguiente ejemplo lo hacemos de esta forma, enviaremos dos  datos, cada uno con un inicio de trama diferente.

Código del emisor:

#include <VirtualWire.h>

void setup()
{
    Serial.begin(9600);	  // Debugging only
    Serial.println("setup");

    // Se inicializa el RF
    vw_setup(2000); // velocidad: Bits per segundo
    vw_set_tx_pin(2); //Pin 2 como salida para el RF 
}

void loop()
{
    char buf[VW_MAX_MESSAGE_LEN]; // Cadena para enviar
    int dato1=millis()/1000; //variable con el tiempo en segundos
    float dato2=3.14;   //segundo dato para enviar
    String str="";  
    
    str="i"+String(dato1); //convertimos el entero a String y agramos un inicio de trama
    str.toCharArray(buf,sizeof(buf)); //convertimos el String en un array
    vw_send((uint8_t *)buf, strlen(buf)); //Enviamos el array
    vw_wait_tx(); //Esperamos hasta que el mensaje se envie
    
    str="f"+String(dato2); //convertimos el float a String y agramos un inicio de trama
    str.toCharArray(buf,sizeof(buf)); //convertimos el String en un array
    vw_send((uint8_t *)buf, strlen(buf)); ////Enviamos el array
    vw_wait_tx(); //Esperamos hasta que el mensaje se envie
    
    delay(200);
}

   

Código del Receptor

#include <VirtualWire.h>

void setup()
{
    Serial.begin(9600);	// Debugging only
    Serial.println("Receptor: setup");

    // Se inicializa el RF
    vw_setup(2000);	 // velocidad: Bits per segundo
    vw_set_rx_pin(2);    //Pin 2 como entrada del RF
    vw_rx_start();       // Se inicia como receptor
}

void loop()
{
    uint8_t buf[VW_MAX_MESSAGE_LEN];
    uint8_t buflen = VW_MAX_MESSAGE_LEN;
    int dato1=0;
    float dato2=0.0;
    //verificamos si hay un dato valido en el RF
    if (vw_get_message((uint8_t *)buf,&buflen))
    {
	int i;
	String  DatoCadena="";
        if((char)buf[0]=='i') //verificamos el inicio de trama
        {
            for (i = 1; i < buflen; i++)
            {
        	DatoCadena.concat((char)buf[i]);
            }
            dato1=DatoCadena.toInt();
            Serial.print("Dato1 recivido: ");
            Serial.println(dato1);
        }
        else if((char)buf[0]=='f') //verificamos el inicio de trama
        {
            for (i = 1; i < buflen; i++)
            {
        	DatoCadena.concat((char)buf[i]);
            }
            dato2=DatoCadena.toFloat();
            Serial.print("Dato2 recivido: ");
            Serial.println(dato2);
        }
    }
}

Los datos lo visualizaremos  en el monitor serial del receptor

 

 Transmision de datos por RF

   

Pueden adquirir los materiales usados en este tutorial en nuestra tienda

Arduino Uno R3

Módulo RF 433MHz TX y RX

Cable Dupont, hembra a macho 20cm x 20Und

86 Comments

    • Avatar
      cristian
      jul 17, 2016

      como puedo hacer la antena helicoidal. que calibre de cobre y cuanto necesito?

      • Avatar
        Naylamp
        jul 20, 2016

        Cristian, prueba con un cable calibre AWG 20 y has un espiral con diámetro 5mm y 3.5 cm de longitud, las espiras no deben de tocarse entre sí, como se muestra en la imagen del tutorial. Saludos

    • Avatar
      Federico Mahieu
      jul 27, 2016

      Buenas tardes, consulta, si quisiera tener comunicacion entre tres arduinos es posible codificar las señales de los transmisores y receptores?.-Gracias.-

      • Avatar
        Naylamp
        jul 28, 2016

        Con estos módulos RF no se pueden trasmitir más de uno a la vez, estos módulos básicamente trabajan con modulación ASK, con ausencia y presencia de señal que definen los 1 y 0 lógicos, por eso cualquier otra señal de la misma frecuencia interfiere en la transmisión. Si quieres conectar más de un Arduino tu algoritmo debe asegurar que solo uno transmita a la vez.

      • Avatar
        Doen
        abr 24, 2017

        en los datos que transmitas le puedes agregar una identificación para que el dispositivo descarte la información que no esta dirigida a él

    • Avatar
      Jonathan Ascencio
      sep 27, 2016

      Existe algún módulo o que componentes requiero que me permita comunicar varios dispositivos a la vez. Por ejemplo tengo 5 focos (llamemos cliente) que están con un rele y arduino y quiero controlar su encendido y apagado desde un arduino principal (llamemos servidor). Es posible y que módulos o componentes de comunicación requiero, Gracias.

      • Avatar
        Naylamp
        sep 30, 2016

        Hola Jonathan, Si solo existe un Emisor y varios receptores si es posible trabajar con estos módulos. Desde el emisor aparte del dato que deseas enviar también tienes que enviar un variable con el ID del receptor con el que quieres comunicarte, en el receptor tienes que validar si el ID es el que le corresponde para aceptar los datos que recibe. En cambio sí más de un arduino va a trasmitir tienes que usar módulos RF de varios canales, para que no haya interferencia entre ellos. Para este caso puedes usar el NRF24L01.

    • Avatar
      Alberto
      oct 2, 2016

      Muchas Gracias, es el primer tutorial, de este módulo, que encuentro claro, fácil y que funciona. Es frustrante empezar en este mundo y nada más que encontrar basura por la red. Voy a ver si soy capaz de modificar tu código para encender el led con un botón. Una vez más gracias, estaba completamente desanimado.

    • Avatar
      Enzo Brandoni
      oct 12, 2016

      Hola, me gustaría saber como debería modificar la programación si quiero hacerlo con un interruptor nada mas, sin PC. Voy a alimentar las placas con fuentes de computadora a 5v y quiero que empiecen a transmitir en el momento en que enciendo la fuente del Emisor. Muchas gracias.

      • Avatar
        Naylamp
        oct 14, 2016

        Hola Enzo, va a depender de lo que quieres transmitir, nuestro tutorial se los ha separado en tres ejemplos. El primero para enviar un solo dato, el segundo para enviar texto, y el tercero para enviar varios tipos de datos. En los ejemplos 2 y 3 el emisor trabaja sin PC, solo basta con alimentar y empezaran a transmitir, en los receptores solo usamos la PC para mostrar los datos recibidos.

    • Avatar
      osvaldo
      nov 2, 2016

      Hola y si lo que quiero es transmitir datos en tiempo real es decir enviarlos desde el monitor serial y como puedo hacerle asi mismo como puedo agregarle una activación mediante una señal de otro sensor

      • Avatar
        Naylamp
        nov 5, 2016

        Estimado Osvaldo, los ejemplos que mostramos son la base para que implementes sobre ellos cualquier aplicativo, por ejemplo si quieres enviar desde el monitor serial, los datos recibidos desde la PC puedes almacenarlos en un string y posteriormente enviarlo como un solo mensaje al receptor. O también leer carácter por carácter e enviarlo de como variable tipo char.

    • Avatar
      Ivan
      nov 15, 2016

      Buenas tardes, quería hacerte una pregunta. Podrías ayudarme a realizar un programa para manejar un motor, variando su velocidad con un potenciómetro o a través del monitor serial? Soy estudiante de secundaria y estoy en proyecto para construir un Drone. Te agradecería mucho si me ayudaras. Saludos.

      • Avatar
        Naylamp
        nov 16, 2016

        Estimado Iván, Para la parte de radiofrecuencia puedes usar el ejemplo 3, aquí envías la velocidad como una variable int dato1=analogRead(A0); y en A0 estaría tu potenciómetro. En el receptor después de leer la velocidad envíalo al PWM de tu motor, esto en caso sea un motor DC.

    • Avatar
      Felipe Vallejo
      nov 24, 2016

      Oye en que cambiaría el programa para ponerle un pulsador

    • Avatar
      Felipe Vallejo
      nov 24, 2016

      Oye en que cambiaría el programa para ponerle un pulsador

      • Avatar
        Naylamp
        nov 26, 2016

        Hola Felipe, En el ejemplo 1, el emisor seria así:
        void loop() {
        char dato[1];
        if (digitalRead(buttonPin) == HIGH) {dato[0] ='a';}
        else {dato[0] ='b';}
        vw_send((uint8_t*)dato,sizeof(dato));
        vw_wait_tx();
        }

    • Avatar
      Giovanni Sosa
      nov 24, 2016

      Tengo una duda, es necesaria la antena para que funcione? Realice todo tal y como esta, con los modulos a 2 cm de distancia sin antena pero no funciona, no se si sea necesaria la antena porque estan casi pegados y aun asi nada :/

      • Avatar
        Naylamp
        nov 26, 2016

        Hola Giovanni, en una comunicación serial podría fallar, pero usando librerías a esa distancia si debería transmitir. Pero ponle una antena, si es distancias cortas puedes trabajar con cualquier trozo alambre como antena.

    • Avatar
      Argelia Zalazar
      dic 3, 2016

      Disculpe, cree usted que podria ser posible utilizar el mismo arduino como emisor y receptor? y que este reciba y mande señales a otro arduino emisor-receptor?

      • Avatar
        Naylamp
        dic 14, 2016

        Hola, Justamente esa es la limitación de estos módulos, que trabajan en un solo sentido, y solo puede haber un emisor activo, si hubieran más de un emisor habría interferencia entre ellos. Lo que podrías hacer es usar módulos de diferente frecuencia. Por ejemplo para transmitir en un sentido 433MHZ y para el sentido contrario 315Mhz. Otra Opción es apagar el modulo transmisor después de enviar. Para que el otro transmisor pueda responder. De igual manera tendrías que pagar el receptor sino estaría recibiendo lo que el mismo arduino envía.

    • Avatar
      arturo
      feb 13, 2017

      Hola Naylamp. Una duda. los modulos RF vienen programados para funcionar unicamente con su pareja?, algo asi como que manejen una codificacion interna que no permita que el modulo receptor reciba una señal de un modulo emisor diferente a la pareja con el cual viene. no se si me explico bien. Quiero colocarlo para manejar una cantonera eléctrica de una puerta y usar el emisor como una especie de control remoto que le genere la señal al receptor que activara la cantonera y abriría la puerta y no me gustaría que alguien con un modulo de los mismos, al emitir una señal, sea recibida por mi modulo receptor y active la cantonera eléctrica. Hay seguridad respecto a la señal que recibe?

      • Avatar
        Naylamp
        feb 13, 2017

        Hola Arturo, estos modulo RF no vienen emparejado, con respecto a seguridad no son una buena opción, cualquiera que tenga programado otro módulo con la misma librería y velocidad puedes trasmitir o recibir datos. Existen chips codificadores como el SC2272 que tienen una dirección de 8 bits para el emparejamiento, pero para muchas aplicaciones esto aún es inseguro.

      • Avatar
        Tony
        jun 6, 2018

        También podrías utilizar una codificación basada en cadenas de texto y que el receptor valide que la cadena enviada por el emisor cumpla con algún patrón, por ejemplo "1a2b3c:ENCENDER" (ver ejemplo 3 inicio de trama), saludos.

    • Avatar
      Carlos
      mar 6, 2017

      Buena tarde Naylamp, te pregunto, fui a descargar la libreria y me sale que fue actualizada y ahora no es VirtualWire sino RadioHead, ahora pregunto, cual es la nueva sintaxis que se utiliza con esta nueva libreria? realmente he buscado pero no he podido encontrar como cambia. Por favor colaborame. Gracias.

      • Avatar
        Naylamp
        mar 7, 2017

        Hola Carlos, aun no revisamos la actualización a RadioHead, pero se debe usar la clase RH_ASK y sus funciones que son similares a las de VirtualWire, Pero aun esta disponible la versión de VirtualWire te recomendamos trabajar con esa hasta que haya documentación suficiente.

    • Avatar
      ruben
      mar 15, 2017

      Hola , me gustaría saber si mediante estos módulos y arduino puedo transmitir audio (obviamente en una sola direccion)

      • Avatar
        Naylamp
        mar 31, 2017

        Hola Rubén, No es posible transmitir audio, estos módulos solo aceptan estados digitales, y trasmiten a baja velocidad.

    • Avatar
      Carlos Coaquira
      abr 11, 2017

      Hola Naylamp, te felicito por tu aporte, es meritorio lo que haces, te pido me apoyes en este proyecto, tengo 20 emisores (pulsador), en un radio de 50 metros y 01 receptor conectado al PC que sea capaz de identificar quien pulsó el boton para enviarlo a una app y este asu vez enviará un mensaje a otro dispositivo. Que me podrias aconsejar. Gracias de antemano.

      • Avatar
        Naylamp
        abr 30, 2017

        Hola Carlos, en cada emisor envía un identificador, como un inicio de trama para poder diferenciar quien envió la cadena, el receptor con el identificador podrá saber en que Arduino se presionó el pulsador. Tienes que enviar la cadena varias veces, pues si se presionan dos pulsadores a la vez, ambos emisores funcionaran a la vez provocando interferencia entre ellos

    • Avatar
      Yair Rojas
      abr 15, 2017

      Necesito alambre para hacer bobinas o simple cable

      • Avatar
        Naylamp
        abr 30, 2017

        Hola Yair, puedes usar cualquier cable, si es esmaltado o con aislante es mejor, evitará que se oxide.

    • Avatar
      dcelin
      may 29, 2017

      Hola, Naylamp excelente trabajo. Soy estudiante de ingeniería electrónica y estoy algo atascado con lo que pretendo hacer tengo un código de emisión, este emite los datos que escribo por el monitor serie, el receptor toma esos datos y los manda a un display lcd 16*2..EL problema consiste en que solo se pueden trasmitir hasta 27 caracteres y necesito mandar más, lo que me planteo hacer mandar una cadena de 27 caracteres, el numero 27 va a ser un 1 o un 0. cuando reciba estos caracteres los debe recorrer y mirar el ultimo, si es un 1 debe guardar esto en una variable y esperar ah que le llegue el siguiente mensaje, cuando reciba el siguiente mensaje lo recorre y verifica si es un "1 o un 0" si es un 1 hace el mismo procedimiento de guardar y esperar, si es un 0 debe guardar la información y mandar al lcd cada mensaje recibido en un intervalo de tiempo por ejemplo 15 seg.
      El 1 significa que entran mas mensajes.
      El 0 significa que ya no va a mandar mas mensajes y que debe mostrar todo
      EMISOR
      // Librerias:
      #include
      //FUNCIONA
      // Variables globales
      char cad[100];
      int i=0;

      void setup()
      {
      Serial.begin(9600); // Abre el puerto serie a 9600 bps
      vw_setup(2000); // Abre el puerto RF a 200 bps
      Serial.print("Finalice con "." cada envio de datos.");
      vw_set_tx_pin(9);
      }

      void loop()
      {
      // Indica cuantos caracteres hay en el buffer:
      if( Serial.available() > 0)
      {
      cad[i] = Serial.read(); // Cada vez que se lee un carácter se guarda en nuestro array y se descuenta del buffer.
      i++;
      }
      // Cuando escribamos un punto, se enviara todo el texto por el emisor RF:
      if( cad[i-1] == '.')
      {
      cad[i] = ''; // Se añade fin de linea al array (string)
      i=0;
      vw_send((byte *)cad, strlen(cad)); // Se envía el texto.
      delay(400);
      }
      }

      RECEPTOR CON LCD
      //LiquidCrystal lcd(10, 9, 5, 4, 3, 6);
      #include
      #include
      // Instanciacion del LCD:
      LiquidCrystal lcd(10, 9, 5, 4, 3, 6);
      // Variables globales:
      char cad[100];
      int pos = 30;
      void setup()
      {
      lcd.begin(16, 2); // Configuración del LCD, 2 líneas de 16 caracteres cada una.
      lcd.setCursor(0, 0); // Se pone el cursor en la primera posición de la pantalla.
      vw_setup(2000); // Se indica los bits por segundo (baudios) para la comunicacion.
      vw_rx_start(); // Se inicia la recepción.
      vw_set_rx_pin(2); // Pin de trasmicion
      }
      void loop()
      {
      byte buf[VW_MAX_MESSAGE_LEN]; // Se crea una array de tipo byte de 30 componentes (Es el valor que tiene la constante VW_MAX_MESSAGE_LEN en la libreria)
      byte buflen = VW_MAX_MESSAGE_LEN; // Se indica que por defecto el tamaño sera de hasta 30 caracteres.
      int i;
      // Si se recibe un mensaje desde el Arduino emisor, la función vw_get_message devolverá por valor un true y por referencia el mensaje y si tamaño.
      if( vw_get_message(buf, &buflen) )
      {
      if(pos < 3)
      lcd.setCursor(3, pos);
      else
      {
      pos=3;
      lcd.clear();
      }
      // Se imprime por pantalla componente a componente del array hasta que se llegue al final.
      for (i = 0; i < buflen; i++)
      {
      //lcd.print(buf[i]);
      // Otras formas de imprimir:
      //lcd.write(buf[i]);
      // lcd.print(buf[i], byte);
      lcd.print((char)buf[i]);
      pos++;
      }
      }
      //MOVIMIENTO DE IZQUIERDA A DERECHA
      for (int positionCounter = 3; positionCounter < 16; positionCounter++) {
      // scroll one position left:
      lcd.scrollDisplayLeft();
      // wait a bit:
      delay(300);
      }
      }

    • Avatar
      Manuel Rivera
      jun 14, 2017

      hola, quiero que me ayudes, he probado la comunicación y la máxima distancia que tengo es de máximo 5 metros, pero este equipo lo quiero comunicar hasta 200 metros, que debo hacer que se comunique. o tengo que comprar otro tipo de tarjeta de radio frecuencia

      • Avatar
        Naylamp
        jun 18, 2017

        Hola Manuel, estos módulos son económicos sensibles a ruido y de poco alcance, para llegar a los 200 metros tienes que tener diseñado una buena antena y trabajar a velocidades de trasmisión bajas.

    • Avatar
      erick
      jun 27, 2017

      porque los codigos funcionan en algunos arduino uno y otros no pense que era mi arduino pero no era .si era el codigo.

      • Avatar
        Naylamp
        jul 17, 2017

        Hola Erick, los programas deben funcionar en cualquier arduino.

    • Avatar
      Iban
      jul 1, 2017

      Buenas noches , el módulo emisor sigue ocupando la frecuencia de 433MHZ aunque no le estemos ordenando enviar nada por el pin DATA? o debería asegurarme de quitarle alimentación al módulo emisor mientras no estoy en el proceso de envío para así asegurar que no interfiere con ningún otro dispositivo en esa frecuencia? Muchas gracias

      • Avatar
        Naylamp
        jul 17, 2017

        Hola, Lo recomendable es deshabilitar el modulo, tendrías que conmutar con un transistor el VCC del módulo, otra opción es invertir la lógica pero la libraría no soporta eso, solo permite invertir el RX.

    • Avatar
      rodrigo
      jul 19, 2017

      Hola, una pregunta con los modulos RF se podria medir distancia entre un emisor y un receptor ? muchas gracias

      • Avatar
        Naylamp
        jul 30, 2017

        Hola Rodrigo, con estos módulos no es posible.

    • Avatar
      EDINSON GARCIA RUEDA
      jul 30, 2017

      HOLA NAYLAM....COMO ES POSIBLE HACER ESTO CON INTEGRADOS.......HT12E Y HT12D NO LO HE PODIDO HACER....NO HE PODIDO ENCONTAR EL ERROR...GRACIAS

      • Avatar
        Naylamp
        ago 22, 2017

        Hola Edinson, la librería solo trabaja para una conexión directa de los RF, si usas codificadores ya no necesitarías usar la librería, pero solo podrás trasmitir 4 bits.

    • Avatar
      Ariel Rosenberg
      ago 14, 2017

      Hola Naylam,Pude hacer funcionar y replicar la señal de un control remoto RF. El problema que tengo es que la función de la alarma que quiero controlar se activa si uno pulsa el control remoto por 3 segundos. Como se puede simular ese comportamiento ? El receptor de señal me imprime en el puerto serie varias lecturas durante los 3 segundos cuando presiono el boton, tendría que hacer un for (loop) para simular dicho comportamiento ? Se que la emisión dura 298 ms (el receptor me dio esa info), tendría que transmitir 11 ciclos para simular los 3 segundos ? Gracias.

      • Avatar
        Naylamp
        ago 22, 2017

        Hola Ariel, implementando el bucle para simular los 298ms te debería funcionar, solo ten en cuenta que tienes que transmitir los mismos datos que el transmisor original envía.

    • Avatar
      Juan
      sep 5, 2017

      Hola, tengo un pequeño problema. Tengo modulo receptor y emisor. El receptor tiene un led solamente y el emisor (a fines de prueba) tiene un led y 3 switch button. Uso el código para transmisión y recepción según los tutos, ni más ni menos. El funcionamiento es, cuando pulso uno de los switch, el receptor recibe el dato y enciendo 1 seg el led, nada más. El problema esta que con el primer switch que transmite los caracteres "sw1" llega bien, enciende el led. Cuando pulso el segundo switch llamado "sw2" no pasa nada y cuando lo hago con el 3 llamado "sw3" tampoco. Luego si intento varias veces por ahí si o por ahi no pero si pulso "sw1" si funciona. Es medio raro este error, primero pensé que fuera la antenas porque no las uso, tengo los modulos casí pegados pero llegué a la conclusión que no es el problema porque revisando el led de recepción veo que no recibe nada , no es que sea baja la señal o algo. Bueno, espero que alguien me cuente de su experiencia. Todo sirve.
      Por el momento voy a instalar las antenas correspondientes pero mis expectativas de solución con esto son bajas porque estoy haciendo prueba de código, no de alcance por el momento.
      Saludos y el artículo muy bueno como siempre.

      • Avatar
        Naylamp
        sep 23, 2017

        Hola Juan, prueba los ejemplos del tutorial, si te funcionan si problemas, significa que en tu aplicación solo es problema de programación o de tu algoritmo.

    • Avatar
      tazma
      sep 5, 2017

      hola me gustaria saber si con este mando que tengo de 15 canales mas arduino y los módulos de rf 433 podria cerrar y abrir un toldo con su correspondiente motorhttp://greutor.com/producto/ohe15-mando-a-distancia-de-15-canales/

      • Avatar
        Naylamp
        sep 23, 2017

        Hola Tazma, primero tendrías que averiguar si la comunicación del mando es unidireccional o bidireccional, en caso solo sea en una sola dirección te quedaría en descifrar e implementar el protocolo de comunicación, lo último sería lo más complicado

    • Avatar
      Eugenio
      sep 30, 2017

      hola que tal, gracias por tu blog, he usado tus códigos y modificado, solo utilizo el receptor y 2 mandos a distancias de 4 botones funciona muy bien, sin antena, una distancia de 30-50 centimetros, despues de soldar la antena (un hilo de 16.5cm de un cable de pruebas ) consigo una distancia maxima de 70cm pudiera ser que a mayor distancia , mayor ruido? como puedo eliminar el ruido si es el problema?gracias

    • Avatar
      sebastian
      oct 5, 2017

      Hola, super buen aporte, pero tengo problema con el codigo de receptor, he intentado muchas veces realizar un esquema desde core (ya que soy un novato en esto de la programacion) y siempre me da el mismo error: Arduino: 1.8.5 (Windows 10), Board: "Arduino Nano, ATmega328P"C:UserschinaAppDataLocalTempccnp2rKK.ltrans0.ltrans.o: In function `loop':C:UserschinaDesktopProgramaciones arduinoreceptor_conexion_inalambricareceptor/receptor.ino:22: undefined reference to `vw_get_message'collect2.exe: error: ld returned 1 exit statusexit status 1 Error compiling for board Arduino Nano.Si alguien puede iluminar que pasa lo agradeceria.

    • Avatar
      Alex Burbano
      oct 18, 2017

      Es posible enviar sonido o audio con estos elementos?..Si es afirmativo, como lo hago? Gracias...

    • Avatar
      Yorman
      oct 25, 2017

      hola, es posible con los modulos RF enviar una imagen bmp, de no ser asi que elementos deberia obtener para la transmision y recepcion de la imagen inalambricamente + el codigo en arduino? gracias

    • Avatar
      Gaby
      nov 21, 2017

      Donde descargo las librerías (´・_・`)

    • Avatar
      edwin
      dic 12, 2017

      necesito 10 emisores y un solo receptor es posible?? en cada emisor envio una letra y de acuerdo a eso detecto cual emisor envio el dato....es posible??

      • Avatar
        Daniel
        oct 18, 2018

        Si lo imaginas, es posible. Suerte!!!!

    • Avatar
      Carlos Daniel
      ene 8, 2018

      BUENAS NOCHES QUISIERA SABER EXACTAMENTE A QUE DISTANCIA TRABAJAN LAS TARJETAS RF ??

      • Avatar
        Daniel
        oct 18, 2018

        Todo es relativo, nada es exacto mi amigo. Recuerde que se trata de radio frecuencia, tantas variables externas que puede perturbar que es imposible calcular la exactitud que Ud requiere. Cada fabricante da un estimado de distancia máxima obviamente con un + ó - muy grande por las variables tales como ruido, obstáculos, etc. Le recomiendo que haga ensayo y error en el lugar que quiere que trabaje dicho dispositivo.

    • Avatar
      Francisco
      ene 16, 2018

      Hola, me gustaría saber si se puede usar este código en un Arduino Due en vez de un Arduino Uno. El Due lo usaría como receptor. Al compilar el código del receptor para el Due me da el siguiente error:"Error compilando para la tarjeta Arduino Due (Native USB Port)."No sé si es problema de que el Arduino Due no es compatible con la librería o que he hecho algo mal... El emisor me compila y carga bien en un Arduino Nano. Saludos!

    • Avatar
      falcon tumorrow
      ene 28, 2018

      una duda puedo usar solo el transmisor para hacer funcionar un dron de los comerciales? o tengo q colocar el receptor en el dron?

    • Avatar
      Javier avila
      mar 27, 2018

      Hola muy bueno el post lo estoy probando pero en cuanto a la seguridad en los datos trasmitidos tienen algún mecanismo de encriptacion? O va en texto plano

    • Avatar
      luis diaz
      abr 23, 2018

      Buenas Tardes.Excelente tutorial. Tengo una pregunta: ¿como envio un vector, en el cual solo he guardado datos de tipo entero , a un receptor, para que los numeros o datos que estan en el vector (array) se viusalicen en el monitor serial de arduino? Obviamente, el vector me va a manejar solo numeros. ¿como se hace?Espero su pronta respuesta.

    • Avatar
      luis lugo
      may 14, 2018

      hoja, de bogota, colombia necesito una tarjeta que me conecte via lan a mi pc y esta al enviar un dato especifio haga la apertura de una puerta o simplemente me de un impulso seco para abir una puertagraciasespero sus comentarios

      • Avatar
        Joan
        may 18, 2018

        Amigo Luis, Esta entrada no es sobre peticiones, pero si usted busca a través de "San Google", encontrará varios modelos que posiblemente se adapte a lo que usted necesita.Además deberá indicar si la lan es interna o a través de Internet.Saludos desde Medellín.

    • Avatar
      martin fernandez
      may 16, 2018

      Todo esta bien solo que "Recivido" no es asi, es asi "Recibido"

    • Avatar
      Joan
      may 18, 2018

      Un buen tutorial sobre todo teórico, pues en la práctica es tanta la basura que llega al módulo receptor que imposibilia mucho el funcionamiento. Por ejemplo, si usted vive en una ciudad con mucho ruido en esta frecuencia, casi seguro que no podrá usar este tipo de módulo. Yo particularmente he optado por abandonar mis proyectos con estos módulos por el ruido que llega al recpetor. Saludos y espero que antes de comprarlos se planteen si les va a funcionar, porque de una cosa es la teoría y simulación con Proteus y otra muy diferenta ; la realidad.

      • Avatar
        David
        sep 8, 2018

        Saludos Joan Al inicio también pensaba lo mismo, hasta que encontré esta página, que me ayudo a despejar muchos errores; los datos basura que recepciones, es el tiempo que pierdes de comunicación entre el modulo transmisor y el modulo receptor, en consecuencias, agotas la energía del receptor, obligando a este a tratar de captar algo más (por diseño), la solución a este inconveniente, solo es darle información constante, para que los espacios en blanco (sin señal enviada) también deban ser transmitidos y recibidos (señal de no hacer nada) y mantener una comunicación llamémosles sincrónica, para tener la atención del receptor respecto al transmisor. Espero te pueda servir. Atte David.

    • Avatar
      Ana
      may 21, 2018

      Hola! muchas gracias por la información. Soy principiante en el tema. estoy tratando de hacer el ejemplo 1 con un momentary pushbutton como de arcade. El código del emisor va así: #include const int buttonPin = 13; //red button pin void setup() { pinMode(buttonPin, INPUT); Serial.begin(9600); Serial.println("Emisor RF");// Se inicializa el RF vw_setup(2000); // velocidad: Bits per segundo vw_set_tx_pin(2); //Pin 2 como salida para el RF }void loop(){ while (Serial.available() > 0) { char dato[1]; if (digitalRead(buttonPin) == HIGH) {dato[0] ='a';} else {dato[0] ='b';} vw_send((uint8_t*)dato,sizeof(dato)); vw_wait_tx(); } delay(200); }... el problema es que no he logrado hacer que encienda y apague el led que esta en el otro arduino (receptor), con el código así me esta apagando el led L en el arduino emisor mientras esta pulsado el botón, pero lo que quiero es que apague y prenda el otro led. He mirado varias paginas y tutoriales pero no logro encontrar algo queme guíe.Intente usar un código simple de apagar y prender un led pero no lo pude hacer funcionar. Agradecería mucho su ayuda. Buena noche

    • Avatar
      JC
      may 30, 2018

      Buen tutorial! Te consulto sobre el alcance de estos modulos. Cuantos metros es el alcance? Gracias!

    • Avatar
      michael ortiz
      jul 14, 2018

      buenas, necesito saber como usar el modulo controlandolo con el pic16f877A

    • Avatar
      Daniel Terrazas
      ago 28, 2018

      Buenas, me podrian proporcionar algunos datos de esta publicacion? Estoy participando en una Feria de ciencias e ingenierias, necesito llenar unos datos en las fuentes bibliograficas. Nombre del autor, año de publicación, y lugar de publicación. Les agradesco por tener todos estos tutoriales tambien explicados.

    • Avatar
      David Peñalva
      sep 8, 2018

      reciba un saludo afectuoso por el aporte desinteresado y muy valioso; necesito ayuda, he armado el circuito de comunicacion, funciona muy bien la comunicacion entre los pic via RF en proteus, la interconecion con el PC con USB-TTL tambien hasta 4800 mbps; aparentemente tambien funciona en protoboar, con la coneccion directa de señal entre los pic, pero cuando trato de realizar con la señal de recepcion RX433 al pic 16f628a por el pin B1 (RX) no funciona, he probado el voltaje promedio de emision que va desde 2.4v a 2.7v pero a la salida del receptor promedia la señal de solo 1.3v a 1.6v como hago para compensar esta diferencia para que el receptor del pic me decodifique la señal. desde ya muchisimas gracias y bendiciones por tu trabajo, gracias.

    • Avatar
      Claudio Ludueña
      oct 29, 2018

      Estimado, hay alguna posibilidad de conectar sin usar Arduino, la señal la daría un rele conectado a un sensor de movimiento

    • Avatar
      Jaidiver
      nov 15, 2018

      Hola, me podrías ayudar con algo por favor. Voy a controlar un carro a RF con un control de PS3, entonces la idea es utilizar este modulo RF y conectarlo al control, pero no se como hacerlo, si podrías colaborarme con eso te agradecería mucho.

    • Avatar
      Gio
      mar 13, 2019

      Donde encuentro las librerias?

    • Avatar
      jesus manuel vergara
      mar 15, 2019

      Hola que tal, como puedo enviar un dato o (datos) mediante RF y que el código de programación me devuelva el tiempo que tardaron en transferirse del emisor al receptor. gracias

    • Avatar
      agrl
      mar 19, 2019

      quien me ayuda #include con la libreria de arduino no me compila

    • Avatar
      Jairo Alonso Castrillon Marulanda
      abr 2, 2019

      Buen dia.HE tratado de hacer funcionar este para apagar y encender un led, no he podido... veo que el transmisor transmite pero no pasa nada en el receptor que podrá ser....Muchas gracias.Transmisor#include//const int dataPin=9; char estado=0;void setup() { Serial.begin(9600); vw_setup(2000); vw_set_tx_pin(9);}void loop() { while(Serial.available()>0) { estado = Serial.read(); Serial.println(estado); char data[1]; data[0]=Serial.read(); Serial.println(data[0]); vw_send((uint8_t *)data,sizeof(data)); vw_wait_tx(); } delay(200);}Receptor#includeconst int dataPin=9; const int ledPin=12;void setup() { Serial.begin(9600); vw_set_rx_pin(dataPin); vw_setup(2000); vw_rx_start();pinMode(ledPin,OUTPUT); digitalWrite(ledPin,true); delay(1000); digitalWrite(ledPin,false);}void loop() { uint8_t data; uint8_t datalength=1;if(vw_get_message(&data,&datalength)) { if((char)data=='a') { digitalWrite(ledPin,true); } else if((char)data=='b') { digitalWrite(ledPin,false); } }}

    • Avatar
      DDD
      abr 28, 2019

      Buenas TardesQuisiera saber si me puede orientar con un proyecto, tengo que enviar un archivo de imagen de un arduino transmisor a un arduino receptor, pero no se como hacer para ponerlo en el codigo, tengo que utlizar un arduino mega y un arduino UNO R3, modulos de RF 433MHz-Por favor de verdad necesito su ayuda Es urgenteFeliz Tardes espero su pronto respuesta

    • Avatar
      Camila
      may 8, 2019

      Hola, como se hace para hacer que a medida que se acerque el emisor vaya sonando más fuerte, así como un buscador de metales pero buscador del receptor.

    • Avatar
      michael
      may 31, 2019

      como puedo mandar un archivo excel por rf es posible o no

    • Avatar
      Fernando C
      jun 3, 2019

      Estimado, soy principiante en este mundo, estoy intentando la comunicación entre Arduino Uno y otro Arduino R3 , tengo los módulos, y mi primera intención es encender un led con un pulsador, mi segunda intención es que el led pueda parpadear 5 veces y parar, y por último, mi intención final es reemplazar el botón pulsador emisor, por un módulo de ultrasonido, realmente estoy frustrado porque no he podido realizar la comunicación, los módulos tienen las antenas correspondientes, pero no puedo lograr la comunicación, Solamente me conformo con encender un led, receptor, desde el botón pulsador y que pueda parpadear 5 veces y parar hasta repetir la operación, ojalá pudieras graficarme bien los pines con exactitud, Un cordial saludo y espero tu favorable respuesta.

Leave a Reply

* Name:
* E-mail: (Not Published)
   Website: (Site url withhttp://)
* Comment: