Autor Tema: Controlar Servos con PicBasic  (Leído 10037 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado Matadoor

  • PIC10
  • *
  • Mensajes: 41
Re: Controlar Servos con PicBasic
« Respuesta #15 en: 29 de Mayo de 2007, 22:15:58 »
Hola navaismo espero me puedas ayudar con un par de incognitas que tengo, mira ya hice los cambios que me sugeriste en el codigo pero revisando la documentacion del pic16f628a  que estoy usando encontre que si se puede definir el oscilador interno la linea de definicion exacta no la recuerdo este momento pero solo es posible definirlo desde 4 Mhz para arriba y el comentario de la definicion del oscilador del codigo original me hacia entender que lo definia a 1Khz dime existira problemas si uso los 4 mhz en el oscilador??? La siguiente consulta es: Estuve revisando el codigo y me parece que el codigo recibido por el receptor es enviada de manera serial al pin 0 (salida) me podrias ayudar diciendome como podria capturar este codigo en una variable para poder hacer luego una rutina case select (case select ya lo tengo claro) y por ultimo el receptor infrarojo del que te hable en el anterior post (3 patitas) estaba en una envoltura de hoja lata y lo destape para sacar solo el diodo que pense iba a estar solo en una placa pero mi sorpresa fue que encontre el fotoreceptor en su plaquita con una serie de elementos sdm y unos 3 o 4 capacitores electroliticos pequeños, asi que mi pregunta es ¿sera que funciona el receptor propuesto con este fotoreceptor?, por cierto lo saque de una tv en desuso de marca sony. espero no abusar de tu paciencia y bondad, espero me puedas ayudar,
Un abrazo y muchas gracias....... 

Desconectado Matadoor

  • PIC10
  • *
  • Mensajes: 41
Re: Controlar Servos con PicBasic
« Respuesta #16 en: 29 de Mayo de 2007, 22:18:49 »
pd: con esos cambios ya se compilo el programa......

Desconectado navaismo

  • Jubilado Todopic
  • PIC24H
  • ****
  • Mensajes: 1973
Re: Controlar Servos con PicBasic
« Respuesta #17 en: 29 de Mayo de 2007, 23:24:53 »
Para lo del oscilador interno a 4MHZ solo pon al inicio, del programa esta linea :@ DEVICE INTRC_OSC si usas el winpic o cualquier otro cuando cargues el archivo .hex veras como el Fuse de INTRC IO esta activa esto quiere decir que usara el oscilador interno y donde va el crystal pueden ser usadas como salidas o entradas digitales segun sea el caso.

Con respecto a lo de capturarlo en una variable eso ya esta hecho, es decir si te fijas bien en el codigo el valor se guarda en la variable command la cual efectivamente se manda de manera serial a la PC. lo que puedes hacer es en lugar de usar un serout poner un lcd un display o lo que quieras para ver su valor. El codigo del receptor es muy transparente, si te fijas busca el valor de cada bit de la variable byte commadn para despues unirlo y mandar el valor decimal de la conjuncion de sus bits.

Y con lo del receptor tengo mis dudas creo que no funcionara lo unico que necesitas es un receptor de 38 o 40 KHZ en este caso el uso el pna4612 yo use el pna4602, puedes intentar con cualquier otro com un tsop40 o algo asi. No son muy costosos a lo mucho $2USD el PNA4602.

Saludos
"Mi tercer deseo, que otra cosa podría ser, poner un final a todo el sufrimiento, que sólo con mi propia extinción el planeta podrá ser aliviado. Pobre de mí, Si tuviera tres deseos hoy, la elección no sería dificil para mí, Sólo tres deseos serían suficientes, No tendría uso para más."

"He sido un hombre que busca y aun lo sigo siendo, pero ya no busco en las estrellas y en los libros, sino en las enseñanzas de mi sangre."

Desconectado Matadoor

  • PIC10
  • *
  • Mensajes: 41
Re: Controlar Servos con PicBasic
« Respuesta #18 en: 30 de Mayo de 2007, 17:02:22 »
Saludos Navaismo, efectivamente estudiando el codigo sugerido se almacena en la variable command, estuve revisando el funcionamiento del protocolo utilizado por sony y veo que el cofçdigo detecta los 7 bits que llegan luego del bit de star, pero cuando llegan los bits a partir del 8 en adelante el codigo hace esto:
Código: [Seleccionar]
if IRpulse_length(8) < 100 then
Command.bit7 = 0
Else   
Command.bit7 = 1
endif
If Command.bit7 = 0 then         'Bit 7 is one of the device bits
Command = Command + 1
Endif
If Command = 10 then
Command = 0
Endif


es decir la trama a partir del bit 8 determina que dispositivo es (TV, VCR, ect) pero porque se le suma 1 si el bit 8 es 0??? Para hacerle saber que estamos trabajando con un control de television??? porque lei que la trama de address 1 corresponde a los televisores Sony, y cuando se hace la conparacion If Command = 10 then; se esta comparando en formato binario o en decimal?? de serlo por que se hace que command = 0 ???
Es decir si quiero hacer las comparasiones en mi estructura case select yo me imagino que debo comparar la variable con el valor de bits leido pero en formato binario ejm si he enviado el codigo 10(d) comparararia con su correspondiente 1010(b) o en el select deberia compararlo con el propio 10(d)????
Gracias nuevamente por la ayuda.....
Hasta la proxima........

Desconectado navaismo

  • Jubilado Todopic
  • PIC24H
  • ****
  • Mensajes: 1973
Re: Controlar Servos con PicBasic
« Respuesta #19 en: 30 de Mayo de 2007, 20:44:51 »
Acerca del porque se usa ese codigo viene perfectamente explicado en la pagina del codigo -valga la redundancia- y con respecto a lo del SELECT CASE no es necesario que lo hagas de manera binaria si lo que entro en la variable command es un %00000111 si lo pones en el select case como 7 lo detectara. 7 es 7 en binario o decimal.

Saludos. no te compliques tanto, hazlo, pruebalo y diviertete jeje parecio comercial.
« Última modificación: 31 de Mayo de 2007, 00:25:42 por navaismo »
"Mi tercer deseo, que otra cosa podría ser, poner un final a todo el sufrimiento, que sólo con mi propia extinción el planeta podrá ser aliviado. Pobre de mí, Si tuviera tres deseos hoy, la elección no sería dificil para mí, Sólo tres deseos serían suficientes, No tendría uso para más."

"He sido un hombre que busca y aun lo sigo siendo, pero ya no busco en las estrellas y en los libros, sino en las enseñanzas de mi sangre."

Desconectado Matadoor

  • PIC10
  • *
  • Mensajes: 41
Re: Controlar Servos con PicBasic
« Respuesta #20 en: 30 de Mayo de 2007, 21:28:39 »
ok.... :wink:

Desconectado Matadoor

  • PIC10
  • *
  • Mensajes: 41
Re: Controlar Servos con PicBasic
« Respuesta #21 en: 31 de Mayo de 2007, 12:26:55 »
Hola Navaismo, te comento que conecte con sentido comun  mi sensor ir que habia conseguido el que te habia contado anteriormente +, - , y la ultima patita que supuse era la salida le conecte a un led y luego de este a positivo al presionar los botones de mi control remoto sony el led parpadea rapidamente, luego cargue una parte del codigo en el PIC16F628A para hacer una pequeña prueba esto fue lo que le cargue :
Código: [Seleccionar]
@ DEVICE MCLR_off, PROTECT_OFF, WDT_OFF
CMCON = 7             ' Comparators OFF
;ANSEL = 0             ' A/D OFF -- Port pins all digital
;TRISB = %010000    ' All I/O but GPIO3 = outputs
PORTB = %00000000      ' All 0 on boot
;Define OSCCAL_1K 1 ' Set OSCCAL for 1K device
DEFINE OSC 4

IRpulse_length var word(13)
xx var Byte
Command Var Byte
clear



Getstartbits:
PuLSIN PORTA.1,0,IRpulse_length(0)
if IRpulse_length(0) < 200 then
goto getstartbits

high PORTB.0
PAUSE 100
LOW PORTB.0

Endif

high PORTB.1
PAUSE 100
LOW PORTB.1

goto getstartbits
end


luego al conectar el pic el diodo en la salida b0 esta prendido y al presionar cualquier boton b0 se apaga y b1 se enciende, lo que a mi parecer me hace suponer que el pic esta ya sensando el codigo enviado por el control remoto verdad????

Ahora viene mi inquietud, al acoplar el respo del codigo y cargar el pic con el mismo:
Código: [Seleccionar]
for xx=1 to 12
pulsin PORTA.1,0,IRpulse_length(xx)
next  xx


displaybits:
if IRpulse_length(1) < 100 then         ;Primer Bit Recibido
Command.bit0 = 0
Else
Command.bit0 = 1
endif
if IRpulse_length(2) < 100 then         ;Segundo Bit Recibido
Command.bit1 = 0
Else
Command.bit1 = 1
endif
if IRpulse_length(3) < 100 then         ;Tercer Bit Recibido
Command.bit2 = 0
Else
Command.bit2 = 1
endif
if IRpulse_length(4) < 100 then         ;Cuarto Bit Recibido
Command.bit3 = 0
Else
Command.bit3 = 1
endif
if IRpulse_length(5) < 100 then         ;Quinto Bit Recibido
Command.bit4 = 0
Else
Command.bit4 = 1
endif
if IRpulse_length(6) < 100 then         ;Sexto Bit Recibido
Command.bit5 = 0
Else
Command.bit5 = 1
endif
if IRpulse_length(7) < 100 then         ;Septimo Bit Recibido
Command.bit6 = 0
Else
Command.bit6 = 1
endif
if IRpulse_length(8) < 100 then
Command.bit7 = 0
Else
Command.bit7 = 1
endif
If Command.bit7 = 0 then         'Bit 7 is one of the device bits
Command = Command + 1
Endif
If Command = 10 then
Command = 0
Endif



SELECT CASE Command
        CASE 0
        High portb.0         
        pause 500         
        low portb.0
        pause 500
end select

SELECT CASE Command
        CASE 1
        High portb.1         
        pause 500         
        low portb.1
        pause 500
end select

SELECT CASE Command
        CASE 2
        High portb.2         
        pause 500         
        low portb.2
        pause 500
end select


goto Getstartbits
end


y comparlo en mi estructura case ningun led se enciende, estoy ocupando la comparacion con los numeros 0,1,2 corespondientes 1 2 3 respectivamente en mi control remoto segun esta informacion:


http://imajr.com/View3.aspx?Id=cuadro_86829

http://imajr.com/sony_trama_86828

ahora he tratado de sensar los bits 1 haciendo pasar la señal que entrega el recetor ir por una  copuerta inversora pero no he tenido exito, crees que este haciendo algo mal o podrias darme alguna sugerencia respecto al por que no esta funcionandome el receptor de manera apropiada en mi caso??
Muchas gracias por tu ayuda y aporte ......
Saludos ......
« Última modificación: 31 de Mayo de 2007, 12:32:36 por Matadoor »

Desconectado navaismo

  • Jubilado Todopic
  • PIC24H
  • ****
  • Mensajes: 1973
Re: Controlar Servos con PicBasic
« Respuesta #22 en: 31 de Mayo de 2007, 15:09:05 »
Bueno la primera prueba del codigo no es que sense ya que el decoder de IR solo funciona correctamente si esta todo lo que tu pusiste solo detecta el pulso mas no le decodifica. Por eso parece que funciona.

En la segunda parte del codigo no estas usando bien el select case eso mas bien parece unos IFS con case. Mira la ayuda del compilador y veras como es su uso:

SELECT CASE  variable a comparar
      CASE x
          sentencia
       case x1
           sentencia
       case xn
           sentencia
 end select


Solo necesitas un Select case y de ahi metes los casos posibles. Debajo de cada caso puedes poner la rtina o mandar a una subrutina eso ya depende de ti. El case es el qeuivalente del Switch del C.

Para ver si realmente estas decodificando bien el dato o si recibes un valor correcto te sugiero que pruebes el codigo original mandando via serie el valor al PC o bien conectandole un LCD para ver si es el dato que realmente mandas. Y si cualquiera de esas te complioca o no tienes LCD usa el PORTA para recibir y muestra el valor de command en todo el portb y ponle LEDS asi si mandas un 1 deberas ver un LED prendido en el PORTB osea o veras de manera binaria.

Saludos.
"Mi tercer deseo, que otra cosa podría ser, poner un final a todo el sufrimiento, que sólo con mi propia extinción el planeta podrá ser aliviado. Pobre de mí, Si tuviera tres deseos hoy, la elección no sería dificil para mí, Sólo tres deseos serían suficientes, No tendría uso para más."

"He sido un hombre que busca y aun lo sigo siendo, pero ya no busco en las estrellas y en los libros, sino en las enseñanzas de mi sangre."

Desconectado Matadoor

  • PIC10
  • *
  • Mensajes: 41
Re: Controlar Servos con PicBasic
« Respuesta #23 en: 31 de Mayo de 2007, 22:08:10 »
Hola Navaismo, al fin y luego de echar a perder 2 pics(solo esta semana), acaba de funcionar el receptor de infrarojo mediante protocolo Irs de Sony, para los amigos que esten interesados aqui les dejo el codigo que me dio resultado, esta escrito para ser usado con el PIC16F628A (Gracias Navaismo) y se encuentra funcioonando de maravilla.....
El codigo sensa y envia elvisualiza el codigo binario de la tecla pulsada.
Código: [Seleccionar]
@ DEVICE MCLR_off, PROTECT_OFF, WDT_OFF
CMCON = 7             
trisb = 0

DEFINE OSC 4

IRpulse_length var word(13)
xx var Byte
Command Var Byte
clear

Getstartbits:
portb=0
PuLSIN PORTA.0,0,IRpulse_length(0)
if IRpulse_length(0) < 200 then

goto getstartbits
Endif

for xx=1 to 12
pulsin PORTA.0,0,IRpulse_length(xx)
next  xx


displaybits:
if IRpulse_length(1) < 100 then         ;Primer Bit Recibido
Command.bit0 = 0
Else
Command.bit0 = 1
endif
if IRpulse_length(2) < 100 then         ;Segundo Bit Recibido
Command.bit1 = 0
Else
Command.bit1 = 1
endif
if IRpulse_length(3) < 100 then         ;Tercer Bit Recibido
Command.bit2 = 0
Else
Command.bit2 = 1
endif
if IRpulse_length(4) < 100 then         ;Cuarto Bit Recibido
Command.bit3 = 0
Else
Command.bit3 = 1
endif
if IRpulse_length(5) < 100 then         ;Quinto Bit Recibido
Command.bit4 = 0
Else
Command.bit4 = 1
endif
if IRpulse_length(6) < 100 then         ;Sexto Bit Recibido
Command.bit5 = 0
Else
Command.bit5 = 1
endif
if IRpulse_length(7) < 100 then         ;Septimo Bit Recibido
Command.bit6 = 0
Else
Command.bit6 = 1
endif
if IRpulse_length(8) < 100 then
Command.bit7 = 0
Else
Command.bit7 = 1
endif
If Command.bit7 = 0 then         'Bit 7 is one of the device bits
Command = Command + 1
Endif
If Command = 10 then
Command = 0
Endif

portb=command
pause 500

goto Getstartbits
end

Bueno cuando este acoplado el infrarojo con el control de servos les mostrare unas fotitos.....
Muchas gracias a todos quienes colaboraron con estas inquietudes.....
Saludos.......

Desconectado navaismo

  • Jubilado Todopic
  • PIC24H
  • ****
  • Mensajes: 1973
Re: Controlar Servos con PicBasic
« Respuesta #24 en: 01 de Junio de 2007, 11:36:12 »
Que bueno que ya haya funcionado. El codigo de Craig Gardner esta 100% probado Gracias a el por compartirlo y explicarlo. Y felicidades el que persevera alcanza. Ya nos contaras como va el hexapodo y tus demas metas.
"Mi tercer deseo, que otra cosa podría ser, poner un final a todo el sufrimiento, que sólo con mi propia extinción el planeta podrá ser aliviado. Pobre de mí, Si tuviera tres deseos hoy, la elección no sería dificil para mí, Sólo tres deseos serían suficientes, No tendría uso para más."

"He sido un hombre que busca y aun lo sigo siendo, pero ya no busco en las estrellas y en los libros, sino en las enseñanzas de mi sangre."

Desconectado Matadoor

  • PIC10
  • *
  • Mensajes: 41
Re: Controlar Servos con PicBasic
« Respuesta #25 en: 04 de Junio de 2007, 16:30:30 »
A si es la mecanica ya casi esta terminada, solo falta unos toques por aqui y por alla y listo, pero aun falta enseñarle a caminar(depurar el programa de control), pero haciendo eso les contare como me ha ido (ando en ello precisamente)......
Saludos......