You are on page 1of 28

MCRF-VW

Manual Comunicacin RF con Virtual Wire Versin 1.5


Para Arduino Duemilanove y compatibles

Salvador Garca Bernal M.C. en Electrnica y Sistemas Digitales Lic. en Ing. Electrnica y Computadoras

Primera Revisin: Marzo 2010 Segunda Revisin: Abril 2010

Todas las marcas son propiedad de sus respectivos dueos.

Attribution Non-Commercial Share Alike This license lets others remix, tweak, and build upon your work non-commercially, as long as they credit you and license their new creations under the identical terms. Others can download and redistribute your work just like the by-nc-nd license, but they can also translate, make remixes, and produce new stories based on your work. All new work based on yours will carry the same license, so any derivatives will also be non-commercial in nature.

Contenido
1 Comunicacin RF con Virtual Wire 1.1 Acerca de Virtual Wire ........................................................ 1.2 Instalando Virtual Wire 1.5 .................................................. 1.3 - Hardware soportado por Virtual Wire ................................. 1.4 Conguracin bsica Transmisor-Receptor ........................ 2 - Ejemplos Prcticos 2.1 Control remoto de un Rel .................................................. 15 2.2 - Sensado de temperatura remoto ....................................... 19 2.3 - Diseo de un algoritmo de cifrado - descifrado bsico ....... 22 Anexo ........................................................................................... 25 10 10 11 12

1 Comunicacin RF con Virutal Wire 1.1 - Acerca de VirtualWire VirtualWire es una librera desarrollada por Mike McCauley. Esta es usada con la mayora de las tarjetas compatibles con Arduino. Es posible enviar mensajes cortos, sin direccionamiento, retransmisin o reconocimiento; se dene como un UDP inalmbrico usando ASK (Amplitud Shifting Keying). La librera soporta un gran nmero de transmisores receptores inalmbricos de bajo costo. No se usa el UART del microcontrolador, esto debido a que los mensajes son enviados con prembulo, la longitud del mensaje contiene checksum. Estos mensajes son enviados con codicacin de 4 a 6 bits para un buen balance de DC, y checksum CRC para su integridad.

1.2 Instalando Virtual Wire 1.5 La librera puede descargarse del sitio ocial, actualmente en su versin 1.5 del siguiente enlace: http://www.open.com.au/mikem/arduino/VirtualWire-1.5.zip Existe un manual ocial en Ingles tambin descargable de la siguiente direccin: http://www.open.com.au/mikem/arduino/VirtualWire.pdf Una vez descargado el archivo: VirtualWire-1.5.zip, se descomprime y copia en el subdirectorio de Arduino bajo: libraries. Si se encuentra en MacOSX, acceda a la carpeta donde se ubica la aplicacin Arduino, de ctrl + clic sobre el icono. Seleccione: Mostrar Contenido del paquete. Entre a las siguientes carpetas hasta encontrar: libraries bajo la ruta: /Arduino.app/Contents/Resources/Java/hardware/ Copie la carpeta: VirtualWire. Para GNU/Linux, puede acceder directamente a la carpeta que contiene la aplicacin: /arduino-0017/Java/hardware/ , hasta encontrar: libraries . Dentro de esa carpeta copiamos: VirtualWire.
1 Comunicacin RF con Virtual Wire 10

Para Windows se requiere entrar al directorio principal de Arduino: ARDUINO\lib\targets\libraries. Otra manera de instalar la libreria es: bajo MacOSX: ~/Documents/Arduino/libraries/. En Windows, se encontrar en: My Documents\Arduino\libraries\ . Este procedimiento es vlido para la versin de Arduino 0018. Para versiones anteriores (inclusive la 0018) el procedimiento descrito anteriormente ser funcional. Una vez instalado, inicie el IDE de Arduino, para incluirla en el scketch de clic en el menu: Sketch - Import Library, seleccionar VirtualWire. Automticamente incluir el cdigo requerido para poder usarse la librera tal como: #include <VirtualWire.h>

1.3 - Hardware soportado por VirtualWire Existe una gran cantidad de hardware soportado por Virtual Wire. Todos en diferentes gamas, frecuencias, tamaos, etc. Los mdulos ms recomendables se enlistan a continuacin.

Mdulo TxRx-315Mhz Frecuencia: 315Mhz Modulacin: ASK Transmitter input voltage: 3-12V Alcance mximo: 100 mts

Mdulo TxRx 433/315 Mhz Frecuencia: 433/315Mhz Modulacin: ASK Transmitter input voltage: 3-12V Alcance mximo: 150 mts

1 Comunicacin RF con Virtual Wire

11

Mdulo TxRx HS On-Shine 433Mhz Frecuencia: 433Mhz Modulacin: Compatible con ASK Transmitter input voltage: 3-12V Alcance mximo: 150 mts

Mdulo TxRx 315 Mhz Con Encoder/Decoder Frecuencia: 315Mhz Modulacin: Compatible con ASK Transmitter input voltage: 3-12V Alcance mximo: 100 mts

1.3 - Conguracin bsica Transmisor - Receptor La conguracin bsica para usar el mdulo, es considerar un voltaje constante de: 3.3 V 5 V (segn se requiera) en las terminales de voltaje de cada mdulo de recepcin y transmisin. En la gura 1.3.1 puede observarse el mdulo con frecuencia selectible de 433 Mhz 315 Mhz. Tiene que considerar los pines de TxRx del microcontrolador (MCUx) usados para congurar correctamente la librera. Es recomendable usar una antena, puede usarse un cable un tubo pequeo de aluminio, que no excedan las longitudes indicadas en ambos lados de los mdulos.

12

1 Comunicacin RF con Virtual Wire

Figura 1.3.1 - Conguracin bsica para los mdulos TxRx 315/433 Mhz.

Figura 1.3.2 - Conguracin bsica para los mdulos TxRx 315 Mhz.

1 Comunicacin RF con Virtual Wire

13

2 - Ejemplos con Virtual Wire A continuacin para el lector, se proponen en est seccin algunos ejemplos prcticos aplicados a diferentes experimentos, que pueden realizarse con la librera VirtualWire. 2.1 - Control remoto de un rel En este ejemplo, se requiere controlar un rel remotamente. Para ello se disea un sistema Transmisor - Receptor. El cual de manera general puede verse en la gura 2.1

Figura 2.1 - Diagrama general del ejemplo propuesto.

El primer bloque contiene una conexin USB a la estacin de trabajo (Computadora, Laptop, etc) en dnde se indicar la accin bsica de abrir o cerrar el rel. Esta palabra se enva inalambricamente usando el Mdulo Tx. Cuando el receptor (Mdulo Rx) obtiene la palabra de control, sta ser descodicada para realizar la accin programada usando el rel conectado al microcontrolador. Para el segundo bloque, usa un rel, que es un switch que puede controlar cargas mayores. Estos se pueden usar para activar algn dispositivo grande, como pudiera ser un motor, el encendido de una fuente, entre otras aplicaciones. Existen diversos tipos de rel, aqu se expone uno de ellos, el cual se activa con 5 volts, como el Reed D1A0500.
2 - Ejemplos con Virtual Wire 15

Es recomendable usar una resistencia de entre 10 15 k, un transistor NPN como el 2N3904, nalmente entre las terminales un diodo 1N4007. En la gura 2.2 se propone un circuito que funciona para controlar el abierto cerrado del rel.

Figura 2.2 - Diagrama para un rel de 5 V. Cada mdulo Tx - Rx, por regla general, se recomienda usar un capacitor de 100 nF (entre 5 - Gnd, cerca de los mdulos), conocido como capacitor decoplador; esto es debido a que existen seales parsitas no deseadas que pueden afectar la transmisin - recepcin en un circuito, en este caso inalmbrico. Para el transmisor, analizaremos una transmisin sin codicacin (en un ejemplo posterior se diseara un algoritmo de cifrado - descifrado). Lo primero que se requiere es obtener una palabra corta para cerrar el rel, en este caso: P. Para abrir, usaremos: A. Consideremos que la funcin VW_MAX_PAYLOAD (), enva un mensaje de la siguiente manera: 36 bit, preparacin de prembulo de pares bit (0-1) 12 bit, smbolo de inicio (0xb38) 1 byte de mensaje, longitud de byte (4 a 30), esto incluye: byte de cuenta y bytes de FCS n mensajes en bytes 2 bytes de FCS, enviado como: low byte, hi byte Todo lo dems se codica de 4 a 6 bits. En la transmisin se enva primero los bits menos signicativos. Para el Arduino Duemilanove con una frecuencia de reloj de 16MHz equivalente a 62.5ns/ciclo. Podemos considerar una tasa de transferencia de 2000 bps, si consideramos una palabra mxima de 30 bits (VW_MAX_MESSAGE_LEN) tenemos: !6"1"VW_MAX_MESSAGE_LEN #$6=222 bits ...(1)

16

2 - Ejemplos con Virtual Wire

Dnde el bitrate se calcula como: 2n t= Rbps ...(2)

As el tiempo dado de 2 n bits, calculado anteriormente ser a 2000 bps: t = 0.11 segs As para el transmisor, podemos tener el siguiente cdigo 2.1.(Para este ejemplo se usan los pines de coneccin default de la librera VirtualWire) #include <VirtualWire.h> void setup() { Serial.begin (4800); // bps para USB vw_setup(2000); // bps para transmisor } int Data; char DataTx[10]; void loop() { if (Serial.available() > 0) { Data = Serial.read(); itoa (Data,DataTx,10); vw_send( (uint8_t *)DataTx, strlen(DataTx)); vw_wait_tx(); // Espera hasta que termine de enviar la palabra delay (5); } } Cdigo 2.1 - Cdigo usado para el transmisor.

Observe que se usa la funcin itoa(), la cual convierte un valor tipo int a su representacin ASCII, este recibe el valor entero (Data), la representacin (DataTx) la cul ser enviada, as como un radio. Considere, s el radio es mayor a 10, el siguiente dgito despus de '9' ser la letra 'a'. De igual manera para la recepcin (se usan los pines por default de la librera), consideremos que el rel se conecta en el Pin 7, para ello observe el cdigo 2.2:

2 - Ejemplos con Virtual Wire

17

#include <VirtualWire.h> int rele = 7; //puerto para el rele void setup() { vw_setup(2000); // Bps para receptor vw_rx_start(); //iniciamos el receptor pinMode (rele,OUTPUT); } void loop() { int i, DataRx; uint8_t buf[VW_MAX_MESSAGE_LEN]; uint8_t buen = VW_MAX_MESSAGE_LEN; if (vw_get_message(buf, &buen)){ char tmp[buen]; memset(tmp,'\0', sizeof(tmp)); strncpy(tmp, (char*)buf,buen); DataRx = atoi(tmp); //Reviso Accin if (DataRx == 80) { digitalWrite(rele,1); }else if (DataRx == 65) { } } } Cdigo 2.2 - Cdigo usado para el receptor. delay (1000); digitalWrite(rele,0);

Observe que se usa la funcin strncpy(), dnde se copia la cadena del vector buf a tmp de longitud buen. Tambin se puede notar el uso de la funcin atoi(), que contiene la conversin de ASCII a un valor tipo int. Con esto podremos usarlo para manejar alguna accin determinada.

18

2 - Ejemplos con Virtual Wire

2.2 - Sensado de temperatura remoto Para este ejemplo se usar un sensor de temperatura tal como el LM35 TMP36. Existen diversas formas de conectar el sensor, la ms simple se muestra en la gura 2.2.1, como puede ver solo requiere una resistencia R1 de 330. Considerando, que la curva de respuesta lineal para este sensor se observa en la gura 2.2.2, podemos deducir las siguientes dos ecuaciones para el LM35 TMP36.

Figura 2.2.1 - Diagrama bsico para usar un LM35 TMP36.

Figura 2.2.2 - Grca de Voltaje - Temperatura para los sensores LM35 TMP36.

2 - Ejemplos con Virtual Wire

19

Para TMP36:

5V ADC 1024 !V %0.5# T= 100 V= 5V ADC 1024 V T= 100

... (2.2.1)

Para LM35:

V=

... (2.2.2)

De manera general el sistema de transmisin - recepcin se observa en la gura 2.2.3, como puede verse el transmisor se encuentra junto al sensor (S1). Considerando los cdigos anteriores (2.1, 2.2), es posible disear los siguientes cdigos 2.3 y 2.4.

Figura 2.2.3 - Diagrama general para el monitoreo remoto de temperatura. void loop() { Vadc = analogRead(Tin); //Variable de tipo Int V = map(Vadc,0,5,0,1024); itoa (V,DataTx,10); vw_send( (uint8_t *)DataTx, strlen(DataTx)); vw_wait_tx(); // Espera hasta que termine de enviar la palabra delay(1500); } Cdigo 2.3 - Cdigo principal para el Transmisor.

20

2 - Ejemplos con Virtual Wire

Considere, que el dato a enviar (V) debe ser entero, el cual previamente se convierte a una cadena de caracteres (DataTx) para enviarlos de manera inalmbrica. Es posible realizar todo el procesamiento en el transmisor, pero se recomienda enviar los datos simples. void loop() { uint8_t buf[VW_MAX_MESSAGE_LEN]; uint8_t buen = VW_MAX_MESSAGE_LEN; if (vw_get_message(buf, &buen)){ Ndata = obtenData (buf, buen); //Variable de tipo int tempC = (Ndata - 0.5) * 100 ; //Variable de tipo otante tempF = (tempC * 9 / 5) + 32; //Variable de tipo otante Serial.print(tempC); Serial.println(" C "); Serial.print(tempF); Serial.println(" F "); delay(1500); } Cdigo 2.4 - Cdigo principal para el Receptor.

Una vez que la palabra llega al receptor, sta se convierte a otante para poderla procesar y as convertirla a grados centgrados y Fahrenheit. Observe que se usa una funcin llamada obtenData(), que contiene parte del cdigo 2.2 para recuperar los datos. En la terminal del receptor podr observar los datos recibidos como lo que se muestra en la gura 2.2.4.

Figura 2.2.3 Datos visualizados en la terminal de recepcin de Arduino.

2 - Ejemplos con Virtual Wire

21

2.3 - Diseo de un algoritmo de cifrado - descifrado bsico Existen una diversidad de algoritmos denominados de dominio pblico que se estudian en diversas universidades del mundo. Este tema es tratado con delicadeza por tener cierta seguridad. Los algoritmos de cifrado pueden ser de sustitucin, en dnde se toman ciertos datos para ser sustituidos por otros. Tambin, se usa la transpocisin, que consiste en ordenar de forma diferente los datos. A este proceso se le conoce como cifrado. El proceso contrario es el descifrado, que consiste en aplicar una tcnica similar (inversa) a la que se uso para cifrar el mensaje original. Esto se muestra en el ejemplo 2.3.1, dnde se aprecia este proceso.

GATO NO VIVE Vocales se sustituye: A=E O=I GETI NI VOVA

GATO NO VIVE Vocales se transponen: A 1 posicin Izquierda O 2 posiciones izquierda E 3 posiciones izquierda AOGOT N E VIV

Ejemplo 2.3.1 Cifrado bsico. (Izquierda) Manejo de cifrado por sustitucin (Derecha) Manejo de cifrado por transposicin

Existen dos vertientes importantes, una es la simtrica y otra la asimtrica. En la primera de ellas, se usa una misma clave para cifrar y descifrar mensajes. Las dos partes que se comunican han de ponerse de acuerdo sobre la clave a usar. Una vez que ambos tienen acceso a esta clave, el remitente cifra un mensaje usndola, lo enva al destinatario, y ste lo descifra con la misma clave. En la segunda se usan dos claves que pertenecen a la misma persona a la que se ha enviado el mensaje. Una clave es pblica y se puede entregar a cualquier persona, la otra clave es privada y el propietario debe guardarla de modo que nadie tenga acceso a ella. Este mtodo criptogrco garantiza que esa pareja de claves slo se puede generar una vez, el remitente cifra un mensaje usando la clave publica , lo enva al destinatario, y ste lo descifra con la clave privada. Estos temas son muy extensos, aqu se presenta un ejemplo prctico que puede funcionar, el cual tiene algunos inconvenientes. La clave est en el algoritmo lo cual lo pone como un inconveniente. Una ventaja es que se pueden crear dos versiones diferentes; una para el cifrador y otra para el descifrador. En este ejemplo, el remitente enva palabras cifradas, el destinatario descifra estas palabras.

22

2 - Ejemplos con Virtual Wire

Para esto usamos un algoritmo de transposicin no inversa, el cifrado se dene como:

k =n , c=

!k "1# 2

c%1 i =0

| ! ! P 2i !c%i# , P 2i"1 !k %i ##

... (2.3.1)

Para el descifrado, podemos tener:

{
J ASCII 74 0 1 ec. 2.3.1 1 1 0 1 0 0 - ASCII 230

k =n , c= | !! |
n=!c%1#%i

! k "1# 2

c%1 i =0

P i !2n # , P i"c !2n"i ##

... (2.3.2)

Este proceso lo realizamos bajo bits. Si suponemos el carcter J, valor ASCII 74. Al aplicar la ecuacin 2.3.1 tendremos:

1 0

0 1

1 1

0 0

Al aplicar el descifrador de la ecuacin 2.3.2 podremos recuperar J Para ello podemos crear una funcin para el cifrador como se muestra en el cdigo 2.5 void enc (int Din[], int k){ int i; int C = (k + 1) / 2; for (i = 0; i <= C; i ++){ tmp[2*i] = fnot (Din[C - i]); tmp[2*i+1] = fnot (Din[k - i]); } return tmp; } Cdigo 2.5 Funcin para el cifrador basados en la ecuacin 2.1.
2 - Ejemplos con Virtual Wire 23

Para el descifrador, se recomienda que el usuario desarrolle su propia funcin basadose en la ecuacin 2.3.2. Para la funcin: fnot(), podemos usar el cdigo 2.6. int fnot(int nD) { int fn; if ( nD == 1) { fn = 0; }else{ fn = 1; } return fn; } Cdigo 2.6 Funcin para el fnot(). Considere que se requiere usar una funcin que convierta este vector binario a una palabra de tipo char. o int Para ello tambin el usuario deber crear una funcin que convierta el vector a una palabra binaria usando: 27 26 25
32

24
16

23 22
8 4

21
2

20
0

128 64

Tabla 2.1 Conversin binaria.

Con esto, es posible enviar palabras cifradas al receptor usando las funciones que se han visto de Virtual Wire. Para mayor referencia puede consultar el anexo.

24

2 - Ejemplos con Virtual Wire

Anexo. A.1 Funciones de Virtual Wire A continuacin se explica brevemente cada funcin soportada por la librera Virtual Wire. vw_set_tx_pin extern void vw_set_tx_pin(uint8_t pin); Funcin para manejo de puerto Entrada/Salida (IO), que se usa para transmitir datos. Por default es 12. vw_set_rx_pin extern void vw_set_rx_pin(uint8_t pin); Funcin para manejo de puerto Entrada/Salida (IO), que se usa para recibir datos. Por default es 11. vw_set_ptt_pin extern void vw_set_ptt_pin(uint8_t pin); Pone el puerto digital Entrada/Salida para habilitar la transmisin. Por default es 10. No todos los transmisores requieren PTT. Esto es requerido por el DR3100, pero no el TX-B1. vw_set_ptt_inverted extern void vw_set_ptt_inverted(uint8_t inverted); Por default el ping PTT se pone en alto cuando el transmisor se habilita. Esta bandera permite forzar cuando el transmisor es habilitado. Esto se requiere para el DR3100. vw_setup extern void vw_setup(uint16_t speed); Funcin para inicializar VirtualWire, esta funcin requiere velocidad de bits por segundo. Se debe congurar en el setup() despus de cualquier llamada vw_set_* . Debe llamarse despus a la funcin: vw_rx_start(), antes de recibir cualquier mensaje. No se recomienda trabajar a ms de 10000 bps. vw_rx_start extern void vw_rx_start(); Funcin para iniciar el receptor. Debe hacerce esto antes de recibir un mensaje. Cuando un mensaje esta disponible (tenga o no un buen checksum), la funcin: vw_have_message() regresa un valor verdadero (true).

Anexo

25

vw_rx_stop extern void vw_rx_stop(); Esta funcin detiene el receptor. No se reciben mensajes hasta que la funcin: vw_rx_start() se llame de nuevo. Se almacena la interrupcin en ciclos de procesamiento cuando se sabe que no habr mensajes. vx_tx_active extern uint8_t vx_tx_active(); La funcin regresa un valor verdadero (true), cuando el transmisor esta activo. vw_wait_tx extern void vw_wait_tx(); La funcin se usa para bloquear y esperar, hasta que el transmisor este en espera. vw_wait_rx xtern void vw_wait_rx(); La funcin se usa para bloquear y esperar, hasta que el mensaje este disponible del receptor. vw_wait_rx_max extern uint8_t vw_wait_rx_max(unsigned long milliseconds); Esta funcin espera en mili-segundos (ms) por un mensaje a ser recibido. Regresa estado de verdadero (true) si el mensaje est disponible. vw_send extern uint8_t vw_send(uint8_t* buf, uint8_t len); Con esta funcin se enva un mensaje de determinada longitud. Regresa casi inmediatamente, y el mensaje ser enviado con tiempo correcto por la interrupcin. Regresa estado verdadero (true) si el mensaje fue aceptado para transmitir. Regresa estado falso (false), si el mensaje es demasiado largo. ( > VW_MAX_PAYLOAD). vw_have_message extern uint8_t vw_have_message(); Se regresa estado de verdadero (true), si un mensaje no se a ledo desde el receptor. vw_get_message extern uint8_t vw_get_message(uint8_t* buf, uint8_t* len); Si un mensaje est disponible (tenga o no buen checksum), se copia a: *len los octetos al buf. Regresa estado de verdadero (true), si hubo mensaje y el checksum es correcto.

26

Anexo

Bibliografa
Banzi, Massimo, Getting Started with Arduino. 2008, O !Reilly, USA. Garca, Bernal. S. Arduino Diseo y Aplicaciones. 2009, Mxico. Internet: Arduino Reference, http://arduino.cc/en/Reference/Extended Internet: Processing Reference, http://processing.org/reference/

Salvador Garca Bernal 2009

You might also like