You are on page 1of 22

Modulos RF TX(FST-3) RX(CZS-3) - 315Mhz / 433.

92Mhz
: Septiembre 24, 2009, 07:48:31

Hola amigos
A vista que empiezan los concursos de robotica y que muchos quieren construir sus RobotSoccer o Warbots se les hace difcil el control inalambrico es as que muchos usan los controles remotos de los carritos ( sin infancia.... ) pero estos no traen buenos resultado al final pues se cruzan con otros mandos de igual frecuencia ( 47Mhz ,75Mhz , etc). A todo esto es mejor conseguirse mdulos RF de bajo costo y mejor calidad como estos: TRANSMISOR

Descripcion: o o o o o o o o Voltage de operacion: DC3-12 V Corriente de operacion: 5-45 mA Corriente de reposo: ?20uA Velocidad de transmision max.: 9.6K Modulacion: AM Frecuencia de operacion: 315 MHz 433 MHz Alcance de transmision: 1000m Dimensiones: 19mm x 19mm x 8mm

RECEPTOR

Descripcion: o o o o o o o o Voltaje de operacion: DC 5 V Consumo de corriente: 5 mA Sensitividad de recepcion: -103 dbm Velocidad de transmision: 4.8K Modulacion: AM Tipo de salida: TTL Frecuencia de operacion: 315 MHz 433 MHz Dimensiones: 30mm x 14mm x 7mm

Donde lo venden ? Bueno para los que son de Peru y son electrnicos o aficionados deben conocer en gran PARURO en lima asiq ahi hay un punto de compra el otro es a la tienda de ICABOTS www.icabots.com/productos o sino al contacto info@icabots.com Como los uso bueno? Bueno debo decir que hay 2 formas : 1.Usando encoder y decoder (PT2262 y PT2272) 2.Programando un micro controlador para la transmisin serial -USART ( se las recomiendo porque pueden hacer muchas combinaciones sin limitarte ) Bueno debo decir a lo personal que son muy buenos ya que los he usado para control warbots,robotsoccer y ahora parte de mi TESIS

Bien si se animan pasan la voz para postear el programa para controlar N salidas....asi como el circuito electronico para control del TX y RX Nos vemos bytes........
En lnea Investigacion y desarrollo

ccencho
Administrator Construye Nanobots

Re: Modulos RF TX(FST-3) RX(CZS-3) 315Mhz / 433.92Mhz


Respuesta #1 : Octubre 26, 2009, 10:55:46

Desconectado Mensajes: 432

Bueno como muchos me han estado preguntado sobre como programar esto mdulos ac les subo un demo de como controlar el Tx y Rx, con la cual modificando el cdigo pueden controlar perfectamente 2^n salidas dependiendo de las combinaciones que hagan....

CODIGO TRASMISOR
DEFINE HSER_RCSTA 90h DEFINE HSER_TXSTA 24h ' ya no mover esta bien Laberinto DEFINE HSER_BAUD 2400 TRISB=$FF como entrada el portb TRISC=$00 modulo USART como TX E V VAR byte var byte ; solo ; port.0 al portb.4 INICIO: inicia el codigo v=PORTB & RES IF V=31 THEN GOSUB PARADA en seco IF V=30 THEN GOSUB ARRIBA ; va ; para ; ; variables ; declaro ; declara

RES VAR BYTE RES=%00011111 deja usar los pines del

hacia arriba IF V=29 THEN GOSUB ABAJO hacia abajo IF V=27 THEN GOSUB DERECHA la derecha IF V=23 THEN GOSUB IZQUIERDA la izquierda IF V=22 THEN GOSUB TROM_IZQ a la izquierda con una llanta IF V=26 THEN GOSUB TROM_DER a la derecha con una llanta GOTO INICIO ; gira ; gira ; va a ; va a ; va

PARADA: HSEROUT [ 0] RETURN ARRIBA: HSEROUT [1] return ABAJO: HSEROUT [2] RETURN DERECHA: HSEROUT [3] RETURN IZQUIERDA: HSEROUT [4] RETURN TROM_IZQ: HSEROUT [5] RETURN TROM_DER: HSEROUT [6] RETURN

END

CODIGO RECEPTOR
DEFINE HSER_RCSTA 90h DEFINE HSER_TXSTA 24h ' ya no mover esta bien DEFINE HSER_BAUD 2400 TRISD=$00 TRISB=$00 PORTD=$00 PORTB=$00 TRISC = %10000000 ; declaro modulo USART como receptor E VAR WORD M INICIO: HSERIN [E] if E=0 THEN GOSUB PARADA if E=1 THEN GOSUB ARRIBA if E=2 THEN GOSUB ABAJO if E=3 THEN GOSUB izquierda if E=4 THEN GOSUB derecha if E=5 THEN GOSUB TROM_IZQ if E=6 THEN GOSUB TROM_DER GOTO INICIO PARADA: PORTB=$00 RETURN ARRIBA: PORTB=%00101101 return ABAJO: PORTB=%00110110 RETURN VAR BYTE ; variables

DERECHA: PORTB=%00101110 RETURN IZQUIERDA: PORTB=%00110101 RETURN TROM_IZQ: PORTB=%00101000 RETURN TROM_DER: PORTB=%00000101 RETURN END

Bueno espero que con esto muchos puedan hacer funcionar sus proyectos usando estos modulos...jee asiq espero comentarios y agradecer no cuesta nada...jaa mas me cuesta digitar jee
En lnea Investigacion y desarrollo

Robo3001
Conoce de robots por la TV Desconecta do Mensajes: 4

Re: Modulos RF TX(FST-3) RX(CZS-3) 315Mhz / 433.92Mhz


Respuesta #2 : Diciembre 18, 2009, 03:25:56

Interesante... Bueno aqui dejo mi ejemplo de un sistema esclavo-maestro con 2 uC 16f628A, sin crystal externo, sin R de MasterClear y haciendo uso de la tcnica de sobrecarga.

nota: Otra ventaja que tengo, es que en el receptor no solo se limita a esperar el dato SERIAL y tomar desiciones, sino que atiendo esto mediante "interrupcin" por datos en la entrada del mdulo USART, y puedo utilizar mi programa principal para hacer multitarea.... Otro punto mas interesante an es que puedo usar varios maestro-esclavo al mismo tiempo. puesto que para reconocer la trama tienen un indicador de cabezera, que es un cdigo nico para cada sistema...

Pic master
'**************************************************************** '* '* '* '* '* Name Author Notice Date : Soccer2009.BAS : Guillermo David Evangelista Adrianzn : Copyright (c) 2009 : 24/09/2009 All Rights Reserved * * * * *

Version : 2.0

'**************************************************************** @ DEVICE PIC16F628A, WDT_OFF @ DEVICE PIC16F628A, PWRT_OFF @ DEVICE PIC16F628A, BOD_OFF @ DEVICE PIC16F628A, PROTECT_OFF @ DEVICE PIC16F628A, CPD_OFF @ DEVICE PIC16F628A, MCLR_OFF @ DEVICE PIC16F628A, INTRC_OSC_NOCLKOUT '============================= CONFIGURACION DE Rx ============================= RX VAR PORTB.1 : TRISB.1=1 90h 24h 2400 103 '4M/(2400*16)-1=103 'Rx define HSER_RCSTA DEFINE HSER_TXSTA DEFINE HSER_BAUD DEFINE HSER_SPBRG ========== CABECERA VAR BYTE : CABECERA=32 TRAMA var byte

'=====================================================================

KICK UP DOWN LEFT RIGHT K U D L R

VAR PORTA.0 VAR PORTA.1 VAR PORTA.2 VAR PORTA.3 VAR PORTA.5 VAR BIT VAR BIT VAR BIT VAR BIT VAR BIT

: : : : :

TRISA.0=1 TRISA.1=1 TRISA.2=1 TRISA.3=1 TRISA.5=1

CMCON = %00000111 comparator) MAIN: if UP=1 THEN U=1 ELSE U=0 ENDIF if DOWN=1 THEN D=1 ELSE D=0 ENDIF if LEFT=1 THEN L=1 ELSE L=0 ENDIF if RIGHT=1 THEN R=1 ELSE R=0 ENDIF gosub envia GOTO MAIN ENVIA: TRAMA=U*8+D*4+L*2+R hserout [CABECERA] HSEROUT [TRAMA]

' Pines PortA a Digital (No

HSEROUT [TRAMA] HSEROUT [TRAMA] HSEROUT [TRAMA] HSEROUT [TRAMA] RETURN

Pic slave
'**************************************************************** '* Name : Soccer2009.BAS * '* Author : Guillermo David Evangelista Adrianzn * '* Notice : Copyright (c) 2009 All Rights Reserved * '* Date : 24/09/2009 * '* Version : 2.0 * '**************************************************************** @ DEVICE PIC16F628A, WDT_OFF @ DEVICE PIC16F628A, PWRT_OFF @ DEVICE PIC16F628A, BOD_OFF @ DEVICE PIC16F628A, PROTECT_OFF @ DEVICE PIC16F628A, CPD_OFF @ DEVICE PIC16F628A, MCLR_OFF @ DEVICE PIC16F628A, INTRC_OSC_NOCLKOUT '========================== CONFIGURACION DE ORDENES =========================== MD VAR PORTA.6 : TRISA.6=0 NMD VAR PORTA.7 : TRISA.7=0 MI VAR PORTA.0 : TRISA.0=0 NMI VAR PORTB.6 : TRISB.6=0 ENAI VAR PORTA.1 : TRISA.1=0 ENAD VAR PORTB.5 : TRISB.5=0 ENPI PIST NPIST VAR PORTA.2 : TRISA.2=0 VAR PORTA.3 : TRISA.3=0 VAR PORTB.3 : TRISB.3=0

'============================= CONFIGURACION DE Rx ============================= RX VAR PORTB.1 : TRISB.1=1 'Rx define HSER_RCSTA 90h DEFINE HSER_TXSTA 24h DEFINE HSER_BAUD 2400 DEFINE HSER_SPBRG 103 '4M/(2400*16)-1=103 '===================================================================== ========== I VAR BYTE CABECERA VAR BYTE TRAMAIN VAR BYTE[4] ACCION VAR BYTE '=====================================================================

==========

ON INTERRUPT GOTO recibe INTCON=%11000000 habilitado habilitado PIE1.5=1 habilitado CMCON = %00000111 comparator) 'GIE=1 :global interrupt-

'PEIE=1 :Peripheral interrupt'RCIE=1 :USART Receive Interrupt ' Pines PortA a Digital (No

ENAI=0 ENAD=0 ENPI=0 MAIN: IF ACCION=8 THEN GOSUB ADELANTE ELSE IF ACCION=4 THEN GOSUB ATRAS ELSE IF ACCION=2 THEN GOSUB IZQUIERDA ELSE IF ACCION=1 THEN GOSUB DERECHA ELSE if accion=0 then GOSUB ALTO endif ENDIF ENDIF ENDIF ENDIF GOTO MAIN '===================================================================== ========== ATRAS: MI =0:NMI =1:ENAI=1 MD =0:NMD =1:ENAD=1 RETURN ADELANTE: MI =1:NMI =0:ENAI=1 MD =1:NMD =0:ENAD=1 RETURN

DERECHA: MI =0:NMI =1:ENAI=1 MD =1:NMD =0:ENAD=1 RETURN IZQUIERDA: MI =1:NMI =0:ENAI=1 MD =0:NMD =1:ENAD=1 RETURN ALTO: ENAI=0 ENAD=0 RETURN '===================================================================== ========== disable recibe: HSERIN [CABECERA] if CABECERA=32 THEN FOR I=0 TO 3 hserin[tramain[i]] next i if tramain[1]=tramain[2] then if tramain[2]=tramain[3] then IF (TRAMAIN[1]<9 AND TRAMAIN[1]>=0) THEN ACCION=tramain[1] ELSE ACCION=0 ENDIF ELSE ACCION=0 ENDIF ENDIF endif INTCON =%11000000 PIE1.5=1 PIR1 = 0 resume ' ' ' ' GIE=1 PEIE=1 RCIE=1 RCIF=0 :global interrupt-habilitado :Peripheral interrupt-habilitado :USART Receive Interrupt habilitado :The USART receive buffer is empty

ENABLE

Modulo de Radiofrecuencia 433Mhz

Caracteristicas Transmisor: Voltaje de operacin: 3-12VDC Tipo de Modulacin: AM Frecuencia de Operacin: 433Mhz Distancia de transmisin: 1000m segun fabricante

Caracteristica Receptor: Voltaje de operacin: 5VDC Tipo de modulacin: AM Frecuencia de Operacin: 433Mhz Sensibilidad de recepcin: -110dBm Rango de transferencia: 4.8kbps

Hola aprendiz, despues de tiempo me doy un tiempo( que tal redundancia jee), bueno amigo...aca mi solucion a tu problema. 1.No me percate que mas antes usaba el picbasic y no el ccscompiler, lo digo porque en picbasic usaba el envio y recepcion por hadware y tambien lo hacia una sola vez, y no tenia problemas. 2. al hacer lo mismo en C esto no funciona y es aqui que se usa un metodo de sobrecarga o llenado total del buffer, pero este llenado de datos no debe exeder demasiado sino saturarias y no funcionaria nada. 3.Los probe con mi modulos y bueno despues de unos minutos, di con este problema y con una solucion, por ello aca te subo un modelo de codigo con este metodo, es mas aun faltara algunas cosas como comparar cada dato que ingresa y asi asegurar mas el codigo como tambin ingresar un ID o clave para que no haiga interferencias con otros modulos, bueno esos detalles sern para un proximo codigo Bueno espero que aun no sea tarde...bueno... TRANSMISOR
#include <16F628A.h> #fuses intrc_io,noput,nowdt,nolvp,nomclr #use delay(clock=4M) #use standard_io(b) #define p1 PIN_B4 #define p2 PIN_B5 int i; void main() { set_tris_b(0b00110000); //output_b(0); port_b_pullups(TRUE); //FRECUENCIA DE RELOJ #use rs232(baud=2400,xmit=PIN_B2,rcv=PIN_B1 )

while(TRUE){ if(input(p1)==0) for(i=0;i<8;i++) { putc(1); {} } // enviamos un 1 por tx usart while(input(p1)==0);// hasta que deje de presionar pulsador // si se presiono pulsador 1...

if(input(p2)==0) for(i=0;i<8;i++) { {} putc(2);} while(input(p2)==0);

// si se presiono pulsador 2... // enviamos un 2 por tx usart // hasta que deje de presionar pulsador

if( (input(p1)==1) & (input(p2)==1)) { putc(3);} // enviamos un 2 por tx usart

} }

RECEPTOR
Cdigo: #include <16F628A.h> #fuses intrc_io,nowdt,nolvp,nomclr,noput #use delay(clock=4M) #use standard_io(b) #define led1 pin_b4 #define led2 pin_b5 #define led3 pin_b6 char data; void main(){ set_tris_b(0b00000011); //output_b(0); while(TRUE){ // configuro pines como entrada/salida // limpio el puerto // loop infinito //FRECUENCIA DE RELOJ // configuracion del usart #use rs232(baud=2400,rcv=PIN_B1)

data=fgetc(); if(data==1) { output_high(led1); output_low(led2); output_low(led3); } if(data==2) { output_high(led2); output_low(led1); output_low(led3); } if(data==3){ // de lo contrario si es '2'... //todo a cero // cambio estado del led // de lo contrario si es '2'.. // cambio estado del led // si el dato es '1'...

output_low(led1); output_low(led2); output_high(led3); } } }

Bueno el programa lo que hace es encender 2 led( pinb4 y pinb5 del pic receptor) mediante los pulsadores que van en el pinb4 y pinb5 del pic transmisor, mientras estos no estn presionados se encender el led ubicado en el pinb6 del receptor.

Holas amigos , aca subo el esquematico de como conectar los modulos con el pic 16f877a, este esquematico corresponde al primer codigo en basic que subi en este tema.

aqui una forma mas segura para poder utilizar nuestro modulos rf ya sea dos mod en la misma frecuencia sin interferencia entre ambos, esta aplicacion esta dada para un robot soccer radiocontrolado. Un soccer radio controlado consta de un mando (transmisor) y un movil, (receptor). Si tenemos dos equipos de soccer y trabajamos con modulos de radiofecuencia de la misma frecuencia vamos a darnos con el problema q se interfieren entre si. por ello lo mas lgico es asignarle para cada equipo un identificador unico. bueno aqui les dejo la programacion y una imagen RECEPTOR
#include <16f886.h> #fuses hs,nowdt,nolvp,noput,nomclr #use delay(clock=20M) // declaro pic a usar // declaro fuses // declaro cristal usar //

#use rs232(uart1,baud=2400,rcv=PIN_C7,bits=8,parity=N) configuro el modulo USART asincrono como RX, solo recive

//**************DECLARO CONSTANTES****************************** #DEFINE ENI PIN_C1 #DEFINE END PIN_C2 #DEFINE INI_1 PIN_C0 #DEFINE INI_2 PIN_C3 #DEFINE IND_1 PIN_C4 #DEFINE IND_2 PIN_C5 #DEFINE PTD PIN_B0

#DEFINE ALTO OUTPUT_HIGH #DEFINE BAJO OUTPUT_LOW char valor[4]; recibidos int i=0; int dato; VOID DLT(); VOID atras(); VOID izq(); VOID der(); VOID glp(); VOID paro(); //dato a ejecutar //vector en lo cual almacenaremos los datos

#INT_RDA void RDA_isr() { valor[0]=getc(); identificacion if (valor[0]=='@') { autentificada p //procede a capturar los 3 datos faltantes para llenar el vector for(i=1;i<4;i++) { valor[i]=getc(); } if(valor[1]==valor[2] && valor[2]==valor[3]) // comparamos si el dato es el mismo {dato=valor[3];} } } void main() { enable_interrupts(int_rda); recepcion de datos usart enable_interrupts(global); globales //activamos interrupciones //activamos interrupcion por // inicio //almacena 3 datos del mod usart //valor unico para cada soccer //si la identificacion es //primer dato adquirido:

set_tris_b(0); set_tris_c(0b10000000);

while(true) { switch(dato) el dato y ejecutamos { case '1': DLT(); break; case '2': ATRAS(); break; case '3': IZQ(); break; case '4': DER(); break; case '5': GLP(); break; default: PARO(); ALTO(PTD); DELAY_US(500); BAJO(PTD); DELAY_MS(20); break; } // bucle while // instruccion case comparamos

} } // fin

//*************funciones de movimiento************************** void DLT() { ALTO(ENI); ALTO(END); ALTO(INI_1); ALTO(IND_1); BAJO(INI_2); BAJO(IND_2); } void ATRAS() { ALTO(ENI); ALTO(END); ALTO(INI_2); ALTO(IND_2); BAJO(INI_1); BAJO(IND_1); } void DER() { ALTO(ENI); ALTO(END); ALTO(INI_2); ALTO(IND_1); BAJO(INI_1); BAJO(IND_2); } void IZQ() { ALTO(ENI); ALTO(END); ALTO(INI_1); ALTO(IND_2); BAJO(INI_2); BAJO(IND_1); } void PARO() {

BAJO(ENI); BAJO(END); BAJO(INI_2); BAJO(IND_2); BAJO(INI_1); BAJO(IND_1); BAJO(PTD); } void GLP() { ALTO(PTD); DELAY_US(1500); BAJO(PTD); DELAY_MS(20);

TRANSMISOR
Cdigo #include <16f628a.h> // declaro pic a usar #fuses hs,nowdt,nolvp,put // declaro fuses, el intrc_io permite usar las patitas del cristal como puertos #use delay(clock=20M) // declaro cristal usar #use rs232(baud=2400, xmit=PIN_B2, bits=8, parity=N) // configuro el modulo USART asincrono como TX//solo envia #use fast_io(b) #byte porta = 0x05 char cabecera='@'; para cada mando de soccer int i; //valor de identificacion unico

void main() { set_tris_b(0); set_tris_a(255); while(true) { if (porta==31) pulsador { putc(cabecera); identificacion

// inicio // asigno puertob como salida // asigno puertoa como entrada // bucle while

//si no c ha presionado algun

//enviamos por el usart nuestra

for(i=0;i<3;i++) 3 veces { putc('0'); delay_ms(5); } while(porta==31); } if (porta==30) { putc(cabecera); for(i=0;i<3;i++) { putc('1'); delay_ms(5); } while(porta==30); } if (porta==29) { putc(cabecera); for(i=0;i<3;i++) { putc('2'); delay_ms(5); } while(porta==29); } if (porta==27) { putc(cabecera); for(i=0;i<3;i++) { putc('3'); delay_ms(5); } while(porta==27); } if (porta==23) { putc(cabecera); for(i=0;i<3;i++) { putc('4'); delay_ms(5); } while(porta==23); }

//enviamos la orden a ejecutar

//bucle anti rebote

if (porta==15) { putc(cabecera); for(i=0;i<3;i++) { putc('5'); delay_ms(5); } while(porta==15); }

} } // fin

You might also like