Virtual Wire

Librería de Arduino
pic

Si quieres comunicar dos Arduinos de manera inalambrica usando modulos 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ódo "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 transmision

  • vw_send(message, length) : Envia 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:

ReceptorEmisor

Código del Arduino receptor.

						#include <VirtualWire.h>

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

Código del Arduino emisor.

						#include <VirtualWire.h>
						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
						}								
					
Plantilla Basada en la obra de © 2011 Ansimuz.