Trastejant

Crea, comparte, aprende y disfruta

Virtual Wire: comunicación por radio frecuencia

Emisor y recoeptor de radiofrecuencia

Si quieres comunicar dos Arduinos de manera inalámbrica usando módulos de radio frecuencia la librería Virtual Wire te ayudará enormemente a la hora establecer la comunicación.
Lo primero que necesitas es descargar la librería, puedes hacerlo desde nuestra sección de descargas e instalarla. Si no tienes claro como hacer esto ultimo puedes consultar nuestro tutorial Instalar librerías para Arduino.
Esta librería nos provee de una serie de funciones que nos serán muy útiles a la hora de crear nuestros proyectos:

Funciones de configuración

  •  vw_set_tx_pin(transmit_pin) : Configuración del pin de transmisión (Por defecto el 12)
  •  vw_set_rx_pin(receive_pin) : Define el pin de recepción (Por defecto el 11)
  •  vw_set_ptt_pin(transmit_en_pin) : Activa y configura el módulo “push to talk”. Esto significa que el pin seleccionado deberá estar en un determinado estado para que se realice la recepción de un mensaje. El pin por defecto para esto es el 10.
  •  vw_set_ptt_inverted(true) : Configura la polaridad del pin “push to talk”
  •  vw_setup(2000) : Inicia la comunicación a la velocidad indicada.

Funciones de transmisión

  •  vw_send(message, length) : Envía el mensaje indicado en message de la longitud indicada en length
  •  vw_tx_active() : Devuelve TRUE si el mensaje ha sido enviado. Puede usarse para verificar si se ha terminado de enviar el mensaje.
  •  vw_wait_tx() : Genera un tiempo de espera hasta que el mensaje se ha terminado de enviar.

Funciones de recepción

  •  vw_rx_start() :Comenzar la recepción.
  •  vw_have_message() : Devuelve TRUE si se ha recibido un mensaje.
  •  vw_wait_rx() : Espera a recibir un mensaje entrante.
  •  vw_wait_rx_max(timeout_ms) : Se mantiene a la espera de recibir un mensaje el tiempo indicado.
  •  vw_get_message(buf, &buflen)): lee y almacena en un buffer el mensaje recibido.
  • vw_rx_stop() : Detiene la recepción de mensajes.

Veamos un ejemplo de como usar esta librería:

Receptor deRadio frecuencia

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include
#include  
 
 const int led_pin = 13; 
 const int transmit_pin = 12; 
 const int receive_pin = 11; 
 const int transmit_en_pin = 3; 
 
 void setup(){ 
 delay(1000); 
 Serial.begin(9600); 
 Serial.println("setup"); 
 
 // Initialise the IO and ISR 
 vw_set_tx_pin(transmit_pin); 
 vw_set_rx_pin(receive_pin); 
 vw_set_ptt_pin(transmit_en_pin); 
 vw_set_ptt_inverted(true); 
 vw_setup(2000); // Bits per sec 
 
 vw_rx_start(); // iniciamos la recepcion 
 
 pinMode(led_pin, OUTPUT); 
 } 
 
 void loop(){ 
 uint8_t buf[VW_MAX_MESSAGE_LEN]; 
 uint8_t buflen = VW_MAX_MESSAGE_LEN; 
 
 if (vw_get_message(buf, &buflen)){ 
 int i; 
 digitalWrite(led_pin, HIGH); // encendemos el led cuando recibimos 
 Serial.print("mensaje: "); 
 
 //bucle que muestra el contenido del array recibido 
 for (i = 0; i < buflen; i++){ 
 Serial.print(buf[i],DEC); 
 Serial.print(' '); 
 } 
 
 Serial.println(); 
 digitalWrite(led_pin, LOW); 
 } 
 }

 

Ahora es el turno del emisor:

Emisor Radio Frecuencia

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include  
const int sensor = 6; 
const int led_pin = 11; 
const int transmit_pin = 12; 
const int receive_pin = 2; 
const int transmit_en_pin = 3; 
 
void setup(){ 
 // Initialise the IO and ISR 
 vw_set_tx_pin(transmit_pin); 
 vw_set_rx_pin(receive_pin); 
 vw_set_ptt_pin(transmit_en_pin); 
 vw_set_ptt_inverted(true); // Required for DR3100 
 vw_setup(2000); // Bits per sec 
 pinMode(led_pin, OUTPUT); 
} 
 
byte count = 1; //inicializamos el contador de envios 
 
void loop(){ 
 
 int msg[1] = {1,2,3,4,5,6}; //Creamos un array de numeros que enviaremos 
 
 msg[6] = count;//Colocamos el contador de envios en la posicion 6 del array 
 
 digitalWrite(led_pin, HIGH); // Encendemos el Led mientras transmitimos 
 vw_send((uint8_t *)msg, 7); //Enviamos el array 
 vw_wait_tx(); // Esperamosa a que el mensaje se envie 
 digitalWrite(led_pin, LOW); //Apagamos el led una vez el envio esta completo 
 delay(1000); //Esperamos antes de volver a emitir 
 count = count + 1; //sumamos uno al contador de envios 
}

También te puede interesar...

No hay temas relacionados

Deja un comentario

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

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.