10
Por: Omar Gurrola 3/24/13 http://www.proprojects.wordpress.com PIC18F14K50: Modulos RF 433MHz En esta sección trabajaremos con comunicación inalámbrica por RF a una frecuencia de 433 MHz (frecuencia libre) utilizando dos módulos, uno transmisor y otro receptor únicamente. La ventaja de estos módulos es el costo, los puedes comprar en www.ebay.com por alrededor de $2.00 dólares ambos. Las características de ambos módulos son los siguientes: Caracteristic: Transmisor (TX): Receptor (RX): Voltaje: 3V-12V 5V Current: ≤ 40mA (12V), ≤ 9mA (3V) ≤ 5.5mA Modulation: ASK / OOK ASK / OOK Speed: ≤ 10Kbps ≤ 9.6Kbps Freq. Range: 315MHz – 433.92MHz 315MHz – 433.92MHz Los módulos están acoplados con AC lo que evita que se pueda transmitir un pulso alto por un lapso largo, si se intenta la señal baja después de un corto tiempo, lo que evita que se puedan utilizar protocolos comunes como RS-232 y se tenga que utilizar otros tipos de protocolos que no mantengan la señal en un nivel por mucho tiempo. Para realizar la codificación y decodificación tenemos dos opciones: 1. Realizar la codificación/decodificación por HW utilizando algún integrado para esta tarea. 2. Realizar la codificación/decodificación por SW utilizando algún protocolo. En mi caso no utilizare ningún integrado para codificar/decodificar la señal por que cuestan más que los módulos en sí, por lo que utilizare la codificación “Manchester - G.E. Thomas” para realizar este trabajo en SW, la cual consiste en: Para enviar cero “0” se transmite un “01” Para enviar uno “1” se transmite “10” También tenemos que empaquetar la información para evitar recibir información de otros dispositivos que trabajen bajo la misma frecuencia.

PIC18F14K50: Modulos RF 433MHz

Embed Size (px)

DESCRIPTION

Como utilizar los modulos RF 433 mas economicos

Citation preview

Page 1: PIC18F14K50: Modulos RF 433MHz

Por: Omar Gurrola 3/24/13 http://www.proprojects.wordpress.com

PIC18F14K50: Modulos RF 433MHz

En esta sección trabajaremos con comunicación inalámbrica por RF a una frecuencia de 433 MHz (frecuencia libre) utilizando dos módulos, uno transmisor y otro receptor únicamente. La ventaja de estos módulos es el costo, los puedes comprar en www.ebay.com por alrededor de $2.00 dólares ambos. Las características de ambos módulos son los siguientes:

Caracteristic: Transmisor (TX): Receptor (RX):

Voltaje: 3V-12V 5V

Current: ≤ 40mA (12V), ≤ 9mA (3V) ≤ 5.5mA

Modulation: ASK / OOK ASK / OOK

Speed: ≤ 10Kbps ≤ 9.6Kbps

Freq. Range: 315MHz – 433.92MHz 315MHz – 433.92MHz

Los módulos están acoplados con AC lo que evita que se pueda transmitir un pulso alto por un lapso largo, si se intenta la señal baja después de un corto tiempo, lo que evita que se puedan utilizar protocolos comunes como RS-232 y se tenga que utilizar otros tipos de protocolos que no mantengan la señal en un nivel por mucho tiempo. Para realizar la codificación y decodificación tenemos dos opciones:

1. Realizar la codificación/decodificación por HW utilizando algún integrado para esta tarea.

2. Realizar la codificación/decodificación por SW utilizando algún protocolo. En mi caso no utilizare ningún integrado para codificar/decodificar la señal por que cuestan más que los módulos en sí, por lo que utilizare la codificación “Manchester - G.E. Thomas” para realizar este trabajo en SW, la cual consiste en:

Para enviar cero “0” se transmite un “01”

Para enviar uno “1” se transmite “10”

También tenemos que empaquetar la información para evitar recibir información de otros dispositivos que trabajen bajo la misma frecuencia.

Page 2: PIC18F14K50: Modulos RF 433MHz

Por: Omar Gurrola 3/24/13 http://www.proprojects.wordpress.com La trama consistirá de:

1. Header: Cabecera, sirve para inicializar la transmisión y estabilizar la señal. 2. Device ID: ID del dispositivo, es la dirección del dispositivo y se utiliza para distinguir quien manda el paquete. 3. Data: Datos, será el byte a transmitir. 4. Checksum: Es la suma de todos los bytes transmitidos, se utiliza para verificar que la información recibida esta correcta. 5. End: Final de la transmisión, no se transmite nada por un tiempo definido.

El paquete se verá así:

Para decodificar la señal se utilizara el siguiente algoritmo:

1. Esperar el bit de inicio “0” (transición de 0 a 1). 2. Para leer cada bit del paquete:

a. Esperar 3/4Tbit. b. Leer bit. c. Esperar transición para sincronizar la señal. d. Regresar al paso a).

3. Se deben leer 16 x “1” + “0”, si no es así hay un error en Header. 4. Leer los siguientes 8b + “0” + “1”, si no termina en 0 y 1 hay un error en el Device ID. 5. Si el Device ID no coincide con la del dispositivo TX, hay un error en Device ID. 6. Leer los siguientes 8b + “0” + “1” si no termina en 0 y 1 hay un error en Data. 7. Leer los siguientes 8b + “0” + “1”, si no termina en 0 y 1 hay un error en el Checsum. 8. Si Data no coincide con Checksum, hay un error en Checksum. 9. La recepción se realizó correctamente.

Para probar los módulos debemos realizar dos programas uno para el transmisor y otro para el receptor cada uno con su microcontrolador y su pantalla LCD para mostrar la información. El TX utilizara la pantalla para mostrar cuantos paquetes se han transmitido, se actualizara cada 50 paquetes y el RX la utilizara para mostrar cuantos paquetes ha recibido correctamente y cuantos con errores, actualizara la pantalla cuando presionemos un interruptor para evitar perder paquetes por actualizar cierto tiempo.

Page 3: PIC18F14K50: Modulos RF 433MHz

Por: Omar Gurrola 3/24/13 http://www.proprojects.wordpress.com TX main.c

/* * Copyright (c) 2011-2013, http://www.proprojects.wordpress.com * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1.- Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2.- Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /********************************************************************************** * Author: Omar Gurrola * Site: http://www.proprojects.wordpress.com * Processor: PIC18 * Compiler: C18 v3.45 * File Name: main.c * Description: Main program * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Rev. Date Comment * 1.0 04/01/12 Initial version * 1.1 01/29/13 Remove ISR prototipes, they are declared in hid_bl.h *********************************************************************************/ /** INCLUDES *******************************************************/ #include <p18f14k50.h> #include "pic18f14k50_cbits.h" #include "pic18f14k50_io.h" #include "stdvars.h" #include "wait.h" #include "rfman.h" #include "HD44780.h" #include <stdio.h> /** DECLARATIONS ***************************************************/ #pragma code // Forces the code below this line to be put into the code section (Memory Adress >= 0x'REMDIR'02A) /** Interrupt Service Routines (ISR)********************************/ #pragma interrupt HighPriorityISR void HighPriorityISR (void){ //Check which interrupt flag caused the interrupt. //Service the interrupt //Clear the interrupt flag //Etc. } //This return will be a "retfie fast", since this is in a #pragma interrupt section #pragma interruptlow LowPriorityISR void LowPriorityISR (void){ //Check which interrupt flag caused the interrupt. //Service the interrupt //Clear the interrupt flag //Etc. } //This return will be a "retfie", since this is in a #pragma interruptlow section void main(void){ u16 c; u16 t = 0; s8 String[17]; u16 Update = 1; OSCCONbits.IRCF = 0b110; // Poscaler selected to 8 MHz OSCTUNEbits.SPLLEN = 1; // PLLx4 Enable System FQ = 32 MHz OpenInRA5(); lcd_initialize(); RFInit(); #define DID 0xAA #define DATA 0xAA

Page 4: PIC18F14K50: Modulos RF 433MHz

Por: Omar Gurrola 3/24/13 http://www.proprojects.wordpress.com #define PKGS 1000 while(true){ lcd_goto(1,1); lcd_write_pgm("Waiting Start..."); if(ReadRA5() == 1){ Waitmsx(50); if(ReadRA5() == 1){ lcd_goto(1,1); lcd_write_pgm("Sending Data...."); for(c = 0; c < PKGS; c++){ RFStartTX(DID); RFSend(DATA); RFEndTX(); // Update screen Total/Sended t++; if(Update == 50){ Update = 0; sprintf(String,"%6hu -- %6hu",PKGS,t); lcd_goto(2,1); lcd_write(String); } Update++; } } } } // end while } // end main()

RX main.c

/* * Copyright (c) 2011-2013, http://www.proprojects.wordpress.com * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1.- Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2.- Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /********************************************************************************** * Author: Omar Gurrola * Site: http://www.proprojects.wordpress.com * Processor: PIC18 * Compiler: C18 v3.45 * File Name: main.c * Description: Main program * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Rev. Date Comment * 1.0 04/01/12 Initial version * 1.1 01/29/13 Remove ISR prototipes, they are declared in hid_bl.h *********************************************************************************/ /** INCLUDES *******************************************************/ #include <p18f14k50.h> #include "pic18f14k50_cbits.h" #include "pic18f14k50_io.h" #include "stdvars.h" #include "wait.h" #include "rfman.h" #include "HD44780.h" #include <stdio.h> /** PROTOTYPES *****************************************************/ void ResetStadistics(void); void UpdateStadistics(void); /** VARIABLES ******************************************************/ /** DECLARATIONS ***************************************************/

Page 5: PIC18F14K50: Modulos RF 433MHz

Por: Omar Gurrola 3/24/13 http://www.proprojects.wordpress.com #pragma code // Forces the code below this line to be put into the code section (Memory Adress >= 0x'REMDIR'02A) /** Interrupt Service Routines (ISR)********************************/ #pragma interrupt HighPriorityISR void HighPriorityISR (void){ //Check which interrupt flag caused the interrupt. //Service the interrupt //Clear the interrupt flag //Etc. } //This return will be a "retfie fast", since this is in a #pragma interrupt section #pragma interruptlow LowPriorityISR void LowPriorityISR (void){ //Check which interrupt flag caused the interrupt. //Service the interrupt //Clear the interrupt flag //Etc. } //This return will be a "retfie", since this is in a #pragma interruptlow section u16 noe,hdre,dide,datae,cse,toe; s8 String[21]; void main(void){ u8 devid, data, result; OSCCONbits.IRCF = 0b110; // Poscaler selected to 8 MHz OSCTUNEbits.SPLLEN = 1; // PLLx4 Enable System FQ = 32 MHz OpenInRA4(); OpenInRB4(); lcd_initialize(); RFInit(); #define SW1() PORTAbits.RA4 #define SW2() PORTBbits.RB4 #define DID 0xAA #define DATA 0xAA ResetStadistics(); while(true){ result = RFReceive(&devid,&data); if(result == RF_OK){ if(devid != DID) result = RF_DID_ERROR; if(data != DATA) result = RF_DATA_ERROR; } switch(result){ case RF_OK: noe++; break; case RF_HDR_ERROR: hdre++; break; case RF_DID_ERROR: dide++; break; case RF_DATA_ERROR: datae++; break; case RF_CS_ERROR: cse++; break; } if(SW1() == 1){ Waitmsx(30); if(SW1() == 1){ ResetStadistics(); } } if(SW2() == 1){ UpdateStadistics(); } } // end while } // end main() void ResetStadistics(void){ noe = hdre = dide = datae = cse = toe = 0; UpdateStadistics(); } void UpdateStadistics(void){

Page 6: PIC18F14K50: Modulos RF 433MHz

Por: Omar Gurrola 3/24/13 http://www.proprojects.wordpress.com lcd_goto(1,1); lcd_write_pgm(" Estadisticas de RX "); lcd_goto(2,1); sprintf(String,"OK: %.5hu HD: %.5hu",noe,hdre); lcd_write(String); lcd_goto(3,1); sprintf(String,"ID: %.5hu DT: %.5hu",dide,datae); lcd_write(String); lcd_goto(4,1); sprintf(String,"CS: %.5hu TO: %.5hu",cse,toe); lcd_write(String); }

Diagrama esquemático del TX:

Diagrama esquemático del RX:

Page 7: PIC18F14K50: Modulos RF 433MHz

Por: Omar Gurrola 3/24/13 http://www.proprojects.wordpress.com

Circuito armado:

Page 8: PIC18F14K50: Modulos RF 433MHz

Por: Omar Gurrola 3/24/13 http://www.proprojects.wordpress.com

Pruebas:

Las pruebas consisten en enviar 1000 paquetes a las siguientes distancias: 1m, 5m, 10m, 50m y 100m, utilizando 12v en el transmisor y ambos módulos con antenas de espiral para máxima potencia. El objetivo consiste en determinar el % de perdida en cada distancia y graficarla en Excel.

1. En la primera prueba se utilizaron antenas de 37cm de largo en forma de espiral tanto para el TX como el RX. Como se puede observar en la gráfica la distancia máxima sin tanta perdida fue de 5m.

2. En la segunda prueba se utilizaron antenas de 32cm para el TX y 25cm en el RX en forma de espiral ambas. Como se puede observar en la gráfica la distancia máxima sin tanta perdida aumento a 10m.

Page 9: PIC18F14K50: Modulos RF 433MHz

Por: Omar Gurrola 3/24/13 http://www.proprojects.wordpress.com 3. En la última prueba se utilizaron antenas de 32cm para el TX y 25cm en el RX en forma de espiral ambas, con la diferencia

de que el TX fue estirado 15cm y el RX 11cm. Como se puede observar en la gráfica la distancia máxima sin tanta perdida aumento a 50m.

Estoy seguro que se puede mejorar la señal con otros tipos de antenas, pero por cuestión de tiempo fue lo único que pude probar.

Page 10: PIC18F14K50: Modulos RF 433MHz

Por: Omar Gurrola 3/24/13 http://www.proprojects.wordpress.com

Referencias

Microchip, “PIC18F/LF1XK50 Data Sheet”, 2010,

http://ww1.microchip.com/downloads/en/DeviceDoc/41350E.pdf

Peter JAKAB, “Infra/radio remote control transmitter/receiver with PIC”, 1999

http://jap.hu/electronic/codec-v4.0.html

Winpicprog, “PIC Tutorial Twelve - RF remote control”, 2013

http://www.winpicprog.co.uk/pic_tutorial12.htm

great-digital, “New 433Mhz RF Transmitter Module And Receiver Link Kit For Arduino/ARM/MCU WL”, 2013

http://www.ebay.com/itm/New-433Mhz-RF-Transmitter-Module-And-Receiver-Link-Kit-For-Arduino-ARM-MCU-

WL-/380584441506?pt=LH_DefaultDomain_0&hash=item589c99b6a2

Philippe Larcher, “AN2358 – Manchester Decoder Using PSoC”, 2007

http://www.eetasia.com/STATIC/PDF/200805/EEOL_2008MAY23_EMS_AN_03.pdf?SOURCES=DOWNLOAD

Wikipedia, “Manchester code”, 2013

http://en.wikipedia.org/wiki/Manchester_code