Professional Documents
Culture Documents
VirtualWire
Copyright (C) 2008-2009 Mike McCauley
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.
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
FIGURA 1.
RX-B1
TX-C1 (433.92)
2 de 13
VirtualWire
Visin de conjunto
FIGURA 2.
TX-C1
DR3100 (433.92)
VirtualWire
3 de 13
Descarga e instalacin
FIGURA 3.
DR3100
Detalles en http://www.rfmonolithics.com/products/data/dr3100.pdf
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.
4 de 13
VirtualWire
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
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.
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)); } }
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
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
FIGURA 4.
FIGURA 5.
VirtualWire
11 de 13
Conexiones
FIGURA 6.
FIGURA 7.
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.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