TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: the_haven en 31 de Agosto de 2007, 11:18:49
-
Como estan comunidad, soy nuevo en esto de los pic, y me estoy iniciando con pic basic ide, para programarlos, pero cuando vi la pagina y el alcance que pueden tener los pic, me entusiasme a construir un bot, estoy desde hace 1 semana tratantando de comunicar 2 pics con la sentencia serout y serin, sin tener exito, por el momento quiciera ver si me pueden ayudar a manejar estas sentencias, mi primer objetivo, es mover 2 motores de cc, que son lo que tengo disponibles, luego los cambio por servo, ya tengo los modulos TLP/RPL a 315Mhz, o me `podrian explicar como puedorealizar un enlace de este tipo... por cierto utilizo 2 pic 16f84a tanto para la Tx y la Rx
-
Usa el buscador del Foro ese tema ya ha sido resuelto con esas instrucciones. Por Veguepic, LordLafebre Dogflu y tu servidor.
PD: antes de hacerlo RF verifica con un cable entre ellos que realmente funcione el programa que has hecho.
-
Como bien te recomienda navaismo, hay muchos proyectos de bot controlados por rf en el foro, en el índice de robótica puedes ojearlos.
Y también como te indica, primero es aconsejable comenzar haciendo la comunicación por cable y una vez que esta funciona se pasa a transmitir los datos por rf.
Después tienes que tener en cuenta que las funciones serout y serin están muy limitadas para este tipo de control ya que son una simulación de la uart por soft con las que se desperdicias mucha potencia de proceso y memoria de programa del micro.
Pero de todas formas postea tu código y veremos de ver en que falla.
PD. En el índice de robótica hay una lectura recomendada para trabajar con RF antes de comenzar a mayores.
-
Que tal Navismo y the_haven:
Sin animos de ofender simplemente aportar lo que en mi caso a mi me ha sucedido. Hace un par de semanas estuve trabajando con los modulos de LAIPAC TLP434A y RLP434A. Lo primero que intente fue lo que proponen en algunos amigos foreros al usar simplemente una sentencia SEROUT TX_PIN,N2400,[$6,$6,"OK",DATO_TX] para la transmision
y
SERIN RX_PIN,N2400,["OK],DATO_RX
Esto en mi caso la verdad no me sirvio ya que el dato se recibia correctamente en forma aleatoria, es dceir 10 veces no 2 veces si, 10 vece si 10 veces no. Es decir fue muy inestable y esto fue debido a que el receptor no se sincroniza adecuadamente. Depues lo que hice fue utilizar codigo manchester, usando para la transmision lo siguiente:
DATO_RX = $25
GOSUB CODIFICA_MANCHESTER
SEROUT TX_PIN,N2400,[$55,$55,$5A,ENCODE_H,ENCODE_L]
y en la recepcion:
SERIN RX_PIN,N2400,[$5A],DECODE_H,DECODE_L 'Recibe el dato codificado en manchester
GOSUB DECODIFICA_MANCHESTER 'Decodifica el dato recibido y colocalo en DATO_TX
SEROUT TX_SERIAL,T9600,[DATO_TX]
Lo anterior me dio mejor respuesta, pero de igual manera el dato llegaba correctamente muy pocas veces. Entonces lo que hice fue que en la parte transmisora envia el dato 4 veces, y en el receptor recibir al menos 2 recepciones validas, si asi era, entonces comparaba los datos y si estos eran iguales entonces muestrro el dato en una terminal.
Esto mejoro muchisimo la comunicacion, pero aun sigo teniendo un porcentaje de error de 50% o mas, esto es 1 trecepcion correcta, otra no.
Ahora lo que estoy haciendo es usar codificacion PWM y bingo el porcentaje de error se redujo a solo el 1% (esto es solo 3 veces no recibi el dato correcto en 256 transmisiones hechas). Este es el mejor resultado que he obtenido hasta ahora. Pero de igual manera el dato el mismo dato se transmite 6 veces y en el receptor al menos se debe deben recibir 2 transmisiones validas, hago la comparacion y muestro.
Me gustaria mucho compartir el codigo, pero es para una aplicacion comercial y no me esta permitido.
Lo anterior es solo para describir mi experiencia y que el uso de modulos RF no es tan simple como a veces lo parece. Aunque para algunos companieros y amigos del foro les ha resultado y han tenido resultados muy buenos, en mi caso no es asi.
Sigo trabajando y en cuanto tenga la solucion con menos errores la comentare y vere si es posible colgar un fragmento del codigo, por lo menos la parte de transmision y recepcion.
Saludos.
Elreypic.
-
Reconozco que no he tenido problemas con los módulos de Laipac,
ni con los de Aurel y menos con unos para uso profesional,
los DM70 de Maxon. Pero como indica usando unos pic 16f84
no creo que tenga mucho juego como para hacer las rutinas de
Tx o Rx muy extensas teniendo en cuenta que quiere controlar otros dispositivos.
Así que sigo haciendo hincapié en que nos postee el código y pase por
el índice de robótica donde están resueltos todos los problemas que se
generan al usar estos módulos... :wink:
-
En mi caso ElreyPIC tambien hice una aplicacion comercial y basto sentencias de SERIN y SEROUT con un F84 el codigo esta plasmado Aqui (http://www.todopic.com.ar/foros/index.php?topic=13956.msg83023#msg83023) y la verdad es que fue sencillo y efectivo sobre todo por la distancia de casi 80 mts. Tambien debo señalar que lo que indica dogflu es muy cierto las rutinas por soft siempre te complican y consumen mas recursos. Pero en mi poca experiencia ese codigo basto y todavia mejoro cuando meti el dato que verifica lo que tu haces con $5A
-
Gracias amigos de todo pic, sus respuestas fueron muy instructivas, lamento la demora en la respuesta, pero comence a modificar el codigo, comence con lago mas sencillo y lo simule en proteus, lo que hice fue mandar a prender una secuencia de diodos para empezar pero q su vez es la secuencia para controlar un puente H, el codigo es el siguiente
'****************************************************************
'* Name : UNTITLED.BAS *
'* Author : Jhon Lopez *
'* Notice : Copyright (c) 2007 Todos los Rerechos Reservados *
'* : All Rights Reserved *
'* Date : 01/09/2007 *
'* Version : 1.0 *
'* Notes : *
'* : *
'****************************************************************
'TX CODE:
device 16f84a
trisb = %10000101
trisa = %10000111
symbol var1 =porta.0
symbol var2 =porta.1
symbol var3 =porta.2
var1 = 0
var2 = 0
var3 = 0
start:
while var1 = 0 : wend
serout portb.7,9600, ["A"] 'izquierda
while var2 = 0 : wend
serout portb.7,9600, ["B"] ' No mueve
while var3 = 0 : wend
serout portb.7,9600, ["C"] ' Derecha
goto start
end
cuando mando el pin correspodiente a tierra manda una letra ;
por los momentos en proteus me funciona, pero quiciera saber si para un bot es mejor motores paso a paso; o servomotores?
-
Es posible que como indica la simulación, trabajando con dos pic interconectados directamente por cable y siempre
que no sean hilos muy largos es posible que el programa se entienda bien con su opuesto (Rx).
Pero al usar radios de este tipo con un sistema de acople de los datos tan simple
se requiere hacer las tramas algo mas complejas para compensar las deficiencias de este tipo de radios.
El tema de los motores esta en la utilidad y la complejidad que quieras dar a tu bot, normalmente
se suelen usar servomotores trucados a DC ya que son muy compactos y faciles de obtener.
-
Primero que nada, reciban un saludo.
Comentando con esto del RF, estuve realizando mas pruebas y recabando informacion de todos lados , pero principalmente de este maravilloso foro logre lo siguiente y tiene resultados excelentes.
Lo que hice fue enviar un pulso de 5 milisegundos y un espacio de 5 milisegundos, seguido por dos bytes de header (0x5A y 0xA5) y el dato codificado en manchester. Este pulso me ayudo a sincronizar el receptor de una manera simple y sencilla, pero los datos aun asi tuve que enviarlos codificando en manchester. ya que si lo enviaba tal cual (en forma transparente) ocasionalmente el dato no era recibido correctamente y simplemente no se recibia. El baud rate que uso es de 2400 bps y todo va de maravilla. Hice pruebas tanto para los modulos TLP434 y RLP434 asi como con los TLP434A y el RLP434A.
Estos son sol codigos:
El de transmision:
'****************************************************************
'* Name : MAN_TEST_TX.BAS *
'* Author : [select VIEW...EDITOR OPTIONS] *
'* Notice : Copyright (c) 2007 [select VIEW...EDITOR OPTIONS] *
'* : All Rights Reserved *
'* Date : 9/03/2007 *
'* Version : 1.0 *
'* Notes : *
'* : *
'****************************************************************
Include "Modedefs.Bas"
DEFINE OSC 4
@ __config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_ON & _BODEN_ON & _DATA_CP_ON & _LVP_OFF
'********************************************************************
' DEFINICION DE PINES
'********************************************************************
TXRF_PIN VAR PORTB.4
SWITCH VAR PORTB.3
'********************************************************************
' DEFINICION DE VARIABLES
'********************************************************************
Counter Var Byte
S_Byte Var Byte
RC_ID Var Byte
D VAR BYTE
I var byte
RCV_WORD Var word
ENCODED VAR WORD
ENCODED_LOW VAR ENCODED.LOWBYTE
ENCODED_H VAR ENCODED.HIGHBYTE
DECODED VAR BYTE
RC_ID=21 ' Transmitter number is 21
CMCON = 7
OPTION_REG = 0
TRISB = %11001111
LOW TXRF_PIN
PAUSE 100
COUNTER = 0
Main:
IF SWITCH = 0 THEN
S_byte = CUNTER
GOSUB MAN_ENCODING
HIGH TXRF_pin
PAUSE 5
LOW TXRF_PIN
PAUSE 5
Serout TXRF_PIN,N2400,[$5A,$A5,ENCODED_LOW,ENCODED_H]
COUNTER = COUNTER + 1
ENDIF
WHILE SWITCH = 0
PAUSE 50
WEND
PAUSE 100
Goto Main
'******************************************************************************
' Subrutina para codificar en manchester el dato a transmitir
' ENTRADAS: S_BYTE
' SALIDAS: ENCODED
'******************************************************************************
MAN_ENCODING:
FOR D = 0 TO 7
IF S_BYTE.0[D] = 0 THEN
ENCODED.0[D*2] = 0
ENCODED.0[D*2+1] = 1
ELSE
ENCODED.0[D*2] = 1
ENCODED.0[D*2+1] = 0
ENDIF
next D
return
Y este es el codigo de recepcion;
'****************************************************************
'* Name : RXRF_PWM.BAS *
'* Author : [select VIEW...EDITOR OPTIONS] *
'* Notice : Copyright (c) 2007 [select VIEW...EDITOR OPTIONS] *
'* : All Rights Reserved *
'* Date : 9/04/2007 *
'* Version : 1.0 *
'* Notes : *
'* : *
'****************************************************************
Include "Modedefs.Bas"
DEFINE OSC 4
@ __config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_ON & _BODEN_ON & _DATA_CP_ON & _LVP_OFF
'********************************************************************
' DEFINICION DE PINES
'********************************************************************
RXRF_PIN VAR PORTB.4
LED VAR PORTB.5
TX_PIN VAR PORTB.3
'********************************************************************
' DEFINICION DE VARIABLES
'********************************************************************
DECODED VAR BYTE
D VAR BYTE
RCV_WORD VAR WORD
RCV_WORD_L VAR RCV_WORD.LOWBYTE
RCV_WORD_H VAR RCV_WORD.HIGHBYTE
'******************************************************************************
' PROGRAMA PRINCIPAL
'******************************************************************************
CMCON = 7 'Configura puerto A como digital
LOW LED 'Apaga el led
TRISB = 255
MAIN: DECODED = 0
SERIN RXRF_PIN,N2400,[$5A,$A5],RCV_WORD_L,RCV_WORD_H
OK_REC: TOGGLE LED
GOSUB MAN_DECODING
SEROUT TX_PIN,N9600,[DECODED]
GOTO MAIN
'******************************************************************************
' Subrutina para decodificar el manchester word recibido
' ENTRADAS: RCV_WORD
' SALIDAS: DECODED
'******************************************************************************
MAN_DECODING:
FOR D = 0 TO 7
IF (RCV_WORD.0 = 0) AND (RCV_WORD.1 = 1) THEN
DECODED.7 = 0
ELSE
DECODED.7 = 1
ENDIF
if d < 7 then
RCV_WORD = RCV_WORD >> 2
DECODED = DECODED >> 1
endif
NEXT D
RETURN
Espero con esta informacion contribuir mas a este mundo de radiofrecuencia y hacer la vida mas facil a otros.
Saludos.
Elreypic.
-
Hola amigos!
Les voy a recomendar que utilicen los XBee_Pro para el proyecto del robot que comenta el amigo estos modulos trabajan mejor que los de laipac, segun yo, respecto a que uno no tiene que estar ingeniandosela para codificar y decodificar los datos, les comento que en mis inicios utilice los modulos de laipac y despues de innumerables pruebas con ellos les puedo decir que los mejores resultados los obtuve utilizando el decoder y el encoder del mismo fabricante, lo malo es que estos envia señales en forma paralela y no serial :mrgreen:
Luego encontre los modulos RF, XBee_Pro http://www.maxstream.net/products/xbee/xbee-pro-oem-rf-module-zigbee.php
Estos modulos son super sencillos de utilizar y operan como si estuvieran los pic conectados via cable.
Por cierto los venden en digikey si les interesa!!!!
Saludos a todos!
-
Hola pana Ralf2, deduzco que cada modulo son Tx y RX, a un que
seguramente no al mismo tiempo, ¿esoty en lo cierto?.
-
Que tal mi estimado amigo Dogflu!!
Mira los modulos en concreto son transceiver (lo maximo) esos bichitos trabajan de lo mejor!
No hay que estar, como coloque en el post anterior, enviando byte para sincronizar los modulos solo envias los datos y ya. Como si tubieras los pic conectados por un cable serial!!!
Desgraciadamente no tengo de momento como tomar unas fotos o mejor un video para que lo vean en accion pero eso espero resolverlo pronto :mrgreen:
Bajate el data sheet y si tienes alguna duda puedo postear un ejemplo :mrgreen:
Saludos
-
Hola a todos, soy nuevo en el tema de estos modulos y quisiera hacer una comunicacion confiable sin perder muchas veces los datos. estuve viendo el codigo manchester pero no entiendo esta subreutina ma la podrian explicar, por favor. Y en que Proton estan compilando estos ejemplos, porque en el mio me da error, el que tengo yo es Proton Ide 1.0.4.6 Compiler 3.2.5.5.
Desde ya muchas gracias.
S_BYTE.0[D] esa posicion de vector d no la entiendo alguien que me explique
MAN_ENCODING:
FOR D = 0 TO 7
IF S_BYTE.0[D] = 0 THEN
ENCODED.0[D*2] = 0
ENCODED.0[D*2+1] = 1
ELSE
ENCODED.0[D*2] = 1
ENCODED.0[D*2+1] = 0
ENDIF
next D
return