You are on page 1of 13

01 de abril 2009

VirtualWire
Copyright (C) 2008-2009 Mike McCauley

Documentacin para la VirtualWire 1.3 biblioteca de comunicaciones para Arduino.

1.0 Introduccin
Arduino es un microcontrolador de bajo coste con el hardware de cdigo abierto, ver http://www.arduino.cc. VirtualWire es una biblioteca de comunicaciones para Arduino que permite mltiples Arduino para comunicarse mediante transmisores y receptores de RF de bajo costo. El documento describe la biblioteca VirtualWire y cmo instalarlo y usarlo.

2.0 Informacin general


VirtualWire es una biblioteca de Arduino que proporciona funciones para enviar mensajes cortos, sin abordar, retransmitir o reconocimiento, un poco como UDP sobre wireless, usando ASK (Modulacin por desplazamiento de amplitud). Es compatible con varios transmisores de radio de bajo costo y receptores. Todo lo que se requiere es transmitir datos, recibir datos y (para los transmisores, la opcinaliado) un transmisor PTT enable. Se pretende que sea compatible con los Monolithics RF (www.rfm.com) Alambre virtual protocolo, pero esto no ha sido probado. No utiliza el Arduino UART. Los mensajes se envan con un mensaje formacin prembulo longitud y suma de comprobacin. Los mensajes se envan con codificacin de bits 4-a-6 para un buen equilibrio de CC, y una suma de comprobacin CRC para la integridad del mensaje. Por qu no slo tiene que utilizar el Arduino UART directamente conectado al transmisor / receptor? Como discutido en la documentacin RFM, ASK receptores requieren una rfaga de impulsos de formacin para sincronizar el transmisor y el receptor, y tambin requiere un buen equilibrio entre 0s y 1s en la secuencia de mensaje con el fin de mantener el equilibrio de CC del mensaje. 1 de 13

Visin de conjunto

UART no proporcionan estos. Trabajan un poco con ASK inalmbrica, pero no tan bien como este cdigo.

2.1 Hardware soportado. Se admite una amplia gama de hardware de comunicaciones. Las que se enumeran golpe estn disponibles en puntos de venta comunes en los pases de Australia y otros por menos de $ 10 por unidad. Muchos otros mdulos tambin pueden trabajar con este software. Se ejecuta en ATmega8/168 (Arduino Diecimila etc) y ATmega328 y posiblemente otros. 2.2 Receptores

RX-B1 (433,92 MHz) (tambin conocido como ST-RX04-ASK)

FIGURA 1.

RX-B1

Detalles en http://www.summitek.com.tw/ST_SPEC/ST-RX04-ASK.pdf 2.3 Transmisores:

TX-C1 (433.92)

2 de 13

VirtualWire

Visin de conjunto

FIGURA 2.

TX-C1

Detalles en http://www.tato.ind.br/files/TX-C1.pdf 2.4 Transceptores:

DR3100 (433.92)

VirtualWire

3 de 13

Descarga e instalacin

FIGURA 3.

DR3100

Detalles en http://www.rfmonolithics.com/products/data/dr3100.pdf

3.0 Descarga e instalacin


La ltima versin de este documento est disponible en
http://www.open.com.au/mikem/arduino/VirtualWire.pdf

Descargar la distribucin de VirtualWire


http://www.open.com.au/mikem/arduino/VirtualWire-1.3.zip

Para instalar, descomprime la biblioteca a un subdirectorio del hardware / libraries subdirectorio de su directorio de la aplicacin Arduino. A continuacin, inicie el entorno Arduino; debera ver la biblioteca en el men Sketch-> Import Library, y el ejemplo de cdigo en Archivo-> Sketchbook-> Ejemplos-> men Biblioteca-VirtualWire.

Llamadas de funcin 4.0


Para utilizar la biblioteca VirtualWire, debe tener
# Include <VirtualWire.h>

En la parte superior de su dibujo.

4 de 13

VirtualWire

Las llamadas a funciones

4.1 vw_set_tx_pin
extern vw_set_tx_pin void (pin uint8_t);

Ajuste el pin IO digital para utilizar los datos de transmisin. El valor predeterminado es 12. 4.2 vw_set_rx_pin
extern vw_set_rx_pin void (pin uint8_t);

Ajuste el pin IO digital para utilizar para recibir datos. El valor predeterminado es 11. 4.3 vw_set_ptt_pin
extern vw_set_ptt_pin void (pin uint8_t);

Ajuste el pin IO digital para utilizar para activar el transmisor (pulsar para hablar). El valor predeterminado es 10. No todos los transmisores requieren PTT. El DR3100 hace, pero el TX-B1 no. 4.4 vw_set_ptt_inverted
vaco extern vw_set_ptt_inverted (uint8_t invertido);

Por defecto, el pin PTT est en alto cuando el transmisor est activado. Esta bandera fuerzas que bajo cuando el transmisor est activado. Se requiere para el DR3100.

4.5 vw_setup
extern vw_setup vaco (velocidad uint16_t);

Inicia el software VirtualWire, para funcionar a velocidad bits por segundo. Llame a este una vez en su setup () despus de cualquier vw_set_ * Llamadas. Debe llamar vw_rx_start () despus de esto antes de recibir los mensajes.

4.6 vw_rx_start
extern void vw_rx_start ();

Inicie el receptor. Debe hacerlo antes de poder recibir mensajes. Cuando un mensabio est disponible (buena suma de comprobacin o no), vw_have_message () devolver true.

4.7 vw_rx_stop
extern void vw_rx_stop ();

Detenga el receptor. No se recibirn mensajes hasta vw_rx_start () se llama de nuevo. Guarda los ciclos de procesamiento de interrupcin cuando se sabe que no habr mensajes.

4.8 vw_wait_tx
extern void vw_wait_tx ();

VirtualWire

5 de 13

Cdigo de ejemplo

Bloquear y esperar hasta que el transmisor est inactivo 4.9 vw_wait_rx


xtern vaco vw_wait_rx ();

Bloquee y espere hasta que un mensaje est disponible desde el receptor. 4.10 vw_wait_rx_max
vw_wait_rx_max uint8_t extern (milisegundos unsigned long);

Espere por lo ms milisegundos ms para que un mensaje sea recibido. Devuelve true si un mensaje es disponible.

4.11 vw_send
vw_send uint8_t extern (uint8_t * buf, uint8_t len);

Enviar un mensaje con la longitud dada. Devuelve casi de inmediato, y el mensaje Se enviar en el momento adecuado por las interrupciones. Devuelve true si el mensaje fue aceptado para la transmisin. Devuelve false si el mensaje es demasiado largo (> VW_MAX_PAYLOAD).

4.12 vw_have_message
vw_have_message uint8_t extern ();

Devuelve true si un mensaje no ledo est disponible desde el receptor. 4.13 vw_get_message
vw_get_message uint8_t extern (uint8_t * buf, uint8_t * len);

Si hay un mensaje disponible (buena suma de comprobacin o no), copia hasta * octetos Len para buf. Devuelve true si haba un mensaje y la suma de comprobacin era bueno.

5.0 Cdigo de ejemplo


Los siguientes ejemplos estn disponibles como ejemplos en la distribucin VirtualWire. 5.1 transmisor Un simple (un solo sentido) del transmisor. Enva un mensaje corto cada 400 ms. Prueba de esto con el el receptor a continuacin.
# Include <VirtualWire.h> void setup () { vw_setup (2000); / / Bits por segundo }

6 de 13

VirtualWire

Cdigo de ejemplo

void loop () { const char * msg = "hello"; vw_send ((uint8_t *) msg, strlen (msg)); delay (400); }

5.2 receptor Un simple (solo ida) receptor. Espera a un mensaje y lo vuelca contenidos. Prueba de esto con transmisor anteriormente.
# Include <VirtualWire.h> void setup () { Serial.begin (9600); Serial.println ("setup"); vw_setup (2000); / / Bits por segundo vw_rx_start () ;/ / Inicia el PLL receptor funcionamiento } void loop () { uint8_t buf [VW_MAX_MESSAGE_LEN]; uint8_t buflen = VW_MAX_MESSAGE_LEN; if (vw_get_message (buf, y buflen)) / / no-bloqueo { int i; / / Mensaje con una buena suma de control recibi, HEX dump Serial.print ("Got:") for (i = 0; i <buflen; i + +) { Serial.print (buf [i], HEX); Serial.print (""); } Serial.println (""); } }

5.3 cliente Implementa un cliente inalmbrico sencillo para DR3100. Enva un mensaje a otro Arduino ejecutando el cdigo del servidor abajo y espera una respuesta.
# Include <VirtualWire.h> void setup () { Serial.begin (9600) ;/ / Depuracin slo Serial.println ("setup"); vw_set_ptt_inverted (true) / / Necesario para DR3100 vw_setup (2000); / / Bits por segundo vw_rx_start () ;/ / Inicia el PLL receptor funcionamiento } void loop () {

VirtualWire

7 de 13

Cdigo de ejemplo

const char * msg = "hello"; uint8_t buf [VW_MAX_MESSAGE_LEN]; uint8_t buflen = VW_MAX_MESSAGE_LEN; vw_send ((uint8_t *) msg, strlen (msg)); vw_wait_tx (); / / Espera a que el mensaje se ha ido Serial.println ("Enviado"); / / Espera en la mayora de 400ms para una respuesta si (vw_wait_rx_max (400)) { if (vw_get_message (buf, y buflen)) / / no-bloqueo { int i; / / Mensaje con una buena suma de comprobacin recibida, lo descarga. Serial.print ("Got respondi:"); for (i = 0; i <buflen; i + +) { Serial.print (buf [i], HEX); Serial.print (""); } Serial.println (""); } } ms Serial.println ("Timout");

5.4 servidor Implementa un servidor inalmbrico sencillo para DR3100. Espera a que un mensaje de otro Arduino se ejecuta el cdigo del cliente por encima y enva una respuesta.
# Include <VirtualWire.h> void setup () { Serial.begin (9600) ;/ / Depuracin slo Serial.println ("setup"); vw_set_ptt_inverted (true) / / Necesario para DR3100 vw_setup (2000); / / Bits por segundo vw_rx_start () ;/ / Inicia el PLL receptor funcionamiento } void loop () { const char * msg = "hello"; uint8_t buf [VW_MAX_MESSAGE_LEN]; uint8_t buflen = VW_MAX_MESSAGE_LEN;

/ / Espera a un mensaje vw_wait_rx (); if (vw_get_message (buf, y buflen)) / / no-bloqueo { int i; const char * msg = "adis"; / / Mensaje con una buena suma de comprobacin recibida, lo descarga. Serial.print ("Got:");

8 de 13

VirtualWire

Detalles de la implementacin

for (i = 0; i <buflen; i + +) { Serial.print (buf [i], HEX); Serial.print (""); } Serial.println (""); / / Enviar respuesta vw_send ((uint8_t *) msg, strlen (msg)); } }

6.0 Detalles de la implementacin


Los mensajes de hasta VW_MAX_PAYLOAD (27) bytes se pueden enviar Cada mensaje se transmite como:

Prembulo de entrenamiento de 36 bits que consiste en 0-1 pares de bits 12 bit smbolo de inicio 0xb38 1 byte del mensaje de recuento de bytes de longitud (4 a 30), el recuento incluye contador de bytes y
FCS bytes

bytes del mensaje N 2 bytes de FCS, enviados byte byte hi baja


Todo despus de que el smbolo de inicio se codifica 4-6 pedazos, tanto un byte en el mensaje se codifica como smbolos de bits de 2x6, enviado hi Nybble, bajo Nybble. Cada smbolo se enva LSBit primero. La velocidad del reloj Arduino Diecimila es 16MHz => 62.5ns/cycle. Para una velocidad de bits de RF de 2.000 bps, necesitar periodo de bit 500microsec. La rampa requiere 8 muestras por periodo de un bit, por lo que necesita 62.5microsec por muestra => intertick RUPT es 62.5microsec. La longitud mxima del mensaje consiste en (6 + 1 + VW_MAX_MESSAGE_LEN) * 6 = 222 bits = 0,11 segundos (a 2000 bps). El cdigo consta de un controlador de interrupcin ISR. La mayor parte del trabajo se hace en la interrupcin controlador para transmitir y recibir, pero algunos se hace desde el nivel de usuario. Caro funciones como clculos CRC se hacen siempre en el nivel de usuario.

7.0 Performance
Las pruebas unitarias muestran que el PLL receptor puede enfrentar a 1 de la muestra en 11 que se invierte por ruido sin efectos dainos.
VirtualWire

9 de 13

Conexiones

Pruebas con TX-C1, RX-B1, mensaje 5 bytes, antena 17cm, sin plano de tierra, 1m por encima del suelo, el espacio libre A 10.000 bps el transmisor no funciona correctamente (ISR correr demasiado con frecuencia en 80000/sec?) En 9000 bps, las asimetras en el receptor impiden una comunicacin fiable en cualquier discia En 7000bps, intervalo de aproximadamente 90m En 5000bps, rango de unos 100 metros En 2000bps, Range sobre 150m En 1000bps, Range sobre 150m Como sugiere la documentacin RFM, cerca de los lmites de la gama, la recepcin est fuertemente influenciado por la presencia de un cuerpo humano en la lnea de seal, y por el mdulo de orientacin cin. En toda la gama que hay valores nulos y los puntos fuertes debido a la trayectoria mltiple reflexin. As que ... su experiencia puede variar. No se encontraron cifras de rendimiento similares para DR3100. 9000bps trabajaban. Arduino y TX-C1 transmisor atrae 27 mA a 9V. Arduino y el receptor RX-B1 empates 31 mA a 9V. Arduino y el receptor DR3100 empates en 28 mA 9V.

8.0 Conexiones
Tenga en cuenta que los pines IO se pueden cambiar desde sus valores por defecto (como se muestra) a cualquier adecuado Pines IO utilizando el vw_set_ * _pin () llamadas.

10 de 13

VirtualWire

Conexiones

8,1 receptor RX-B1

FIGURA 4.

Cableado para el receptor RX-B1

Arduino 11 5V Gnd Datos Vcc Gnd RX-B1 Hormiga

8.2 transmisor TX-C1

FIGURA 5.

Cableado para el transmisor TX-C1

Arduino 12 3V3 Gnd Datos Vcc Gnd TX-C1 Hormiga

VirtualWire

11 de 13

Conexiones

8.3 DR3100 transceptor

FIGURA 6.

Cableado para DR3100

Arduino 11 12 12k 10 3V3 11 9 12 1 Gnd 10 4 5

DR3100 Rx de datos Tx En Ctr1 Vcc Ctr0 AGC Gnd RFIO RF Gnd 13 14

FIGURA 7.

Conexiones DR3100 en breadboard

12 de 13

VirtualWire

Copyright y licencia

Las conexiones que se muestran para no AGC, 1mW sin electricidad, 2400bps. Tenga en cuenta la resistencia de 12k en En serie con Tx para controlar la potencia de salida Si desea utilizar mayores velocidades de datos, necesita un resistencia entre el pin 8 del DR3100 a tierra (consulte la documentacin RFM para ms detalles). Si desea utilizar AGC, necesitar un condensador de la patilla 1 del DR3100 a tierra (ver RFM documentacin para ms detalles). El mdulo DR3100 se suministra sin ningn tipo de clavijas de conexin, slo montaje en superficie estilo almohadillas. Usted tendr que soldar los pins en el mdulo si desea utilizarlo en un tablero.

9.0 Copyright y licencia


Este software es Copyright (C) 2008 Mike McCauley. El uso est sujeto a licencia condiciones. Las principales opciones de licencias disponibles son GPL V2 o profesional:

9.1 Open Source Licensing GPL V2 Esta es la opcin adecuada si desea compartir el cdigo fuente de su aplicacin con todos los que la distribuya a, y usted tambin quiere darles el derecho a compartir lo que lo utiliza. Si desea utilizar este software bajo licencia de cdigo abierto, debe contriUte todo el cdigo fuente a la comunidad de cdigo abierto de acuerdo con la GPL Versin 2 cuando se distribuya la aplicacin. Ver http://www.gnu.org/copyleft/gpl.html

9.2 Licencias Comerciales Esta es la opcin adecuada si va a crear aplicaciones propias y que son no preparado para distribuir y compartir el cdigo fuente de su aplicacin. Contacto info@open.com.au para ms detalles.

VirtualWire

13 de 13

You might also like