Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:
Después de muchos problemas y frustaciones he conseguido que Panchito de sus primeros pasos, aquí os dejo un video para ver mi creación, que todavía esta en sus inicios pero que poco a poco iremos mejorando.
http://www.youtube.com/watch?v=nmLD8M1SleE " onclick="window.open(this.href);return false;
Pero como vereis tiene un problema de Parkinson, tiembla un montón y no se porque.Os dejo el programa que he hecho a ver si alguien me ayuda a mejorarlo para quitarle esos temblores.
;*****************PROGRAMA PANCHITO V2***********
; FECHA: 01/05/10
; PIC: 16F84A 4Mhz
; SERVOS: Futaba S3003
;***************************************************
LIST P=16F84A
INCLUDE <P16F84A.INC>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
cblock 0x0c
contA
contB
contC
ENDC
ORG 0 ; El programa comienza en la dirección 0.
Inicio
bsf STATUS,RP0 ; Pone a 1 el bit 5 del STATUS. Acceso al Banco 1.
clrf TRISB ; Las líneas del Puerto B configuradas como salidas.
movlw b'00011111' ; Las 5 líneas del Puerto A configuradas como entradas.
movwf TRISA
bcf STATUS,RP0
movlw d'15'
movwf contA
movwf contB
movwf contC
Movimiento_1
bsf PORTB,1 ; Activa el PORTB1
call Retardo_500micros ; la suma de los call genera el tiempo
call Retardo_200micros ; en alto para un ángulo de 60º
call Retardo_200micros
bcf PORTB,1 ; Desactiva el PORTB1
call Retardo_20ms ; el PORTB1 está en bajo durante 20ms.
bsf PORTB,0 ; Activa el PORTB0
call Retardo_1ms ; la suma de los call genera el tiempo
call Retardo_200micros ; en alto para un ángulo de 120º
call Retardo_200micros
call Retardo_100micros
bcf PORTB,0
call Retardo_20ms
bsf PORTB,2
call Retardo_1ms ; 120º
call Retardo_200micros
call Retardo_200micros
call Retardo_100micros
bcf PORTB,2
call Retardo_20ms
decfsz contA ; Cuenta a contA y sigue en la línea de abajo
goto Movimiento_1 ; Cuando contA sea = 0 omite la línea siguiente.
clrf contA
Movimiento_2
bsf PORTB,1
call Retardo_1ms ; 90º
call Retardo_200micros
bcf PORTB,1
call Retardo_20ms
bsf PORTB,3
call Retardo_1ms ; 120º
call Retardo_100micros
call Retardo_200micros
call Retardo_200micros
bcf PORTB,3
call Retardo_20ms
bsf PORTB,2
call Retardo_500micros ; 60º
call Retardo_200micros
call Retardo_200micros
bcf PORTB,2
call Retardo_20ms
bsf PORTB,0
call Retardo_500micros ; 60º
call Retardo_200micros
call Retardo_200micros
bcf PORTB,0
call Retardo_20ms
decfsz contB
goto Movimiento_2
clrf contB
Movimiento_3
bsf PORTB,3
call Retardo_1ms ; 90º
call Retardo_200micros
bcf PORTB,3
call Retardo_20ms
decfsz contC
goto Movimiento_3
clrf contC
goto Inicio
INCLUDE<LIBSERVOS.INC>
END
Y esta es la librería, LIBSERVOS.INC
;*************LIBRERIA DE TIEMPOS*************
;* PARA CALCULAR EL TIEMPO EN ALTO
;* DE UN ÁNGULO CON LOS SERVOS
;* FUTABA S3003 HAY QUE USAR ESTA FÓRMULA
;*
;* T=0,3+(angulo deseado)/100
;*
;******************************************************
CBLOCK
R_ContA
R_ContB
R_ContC
ENDC
Retardo_1ms
movlw d'1'
goto Retardo_ms
Retardo_20ms
movlw d'20'
goto Retardo_ms
Retardo_2ms
movlw d'2'
goto Retardo_ms
Retardo_900micros
nop
movlw d'296'
goto RetardoMicros
Retardo_800micros
nop
nop
movlw d'262'
goto RetardoMicros
Retardo_700micros
nop
nop
movlw d'229'
goto RetardoMicros
Retardo_600micros
nop
movlw d'196'
goto RetardoMicros
Retardo_500micros
nop
movlw d'164'
goto RetardoMicros
Retardo_400micros
nop
nop
movlw d'129'
goto RetardoMicros
Retardo_300micros
nop
nop
movlw d'96'
goto RetardoMicros
Retardo_200micros
nop
movlw d'64'
goto RetardoMicros
Retardo_100micros
movlw d'31'
goto RetardoMicros
Retardo_50micros
nop
movlw d'14'
goto RetardoMicros
Retardo_20micros
movlw d'5'
goto RetardoMicros
RetardoMicros
movwf R_ContA
Rmicros_Bucle
decfsz R_ContA,F
goto Rmicros_Bucle
return
Retardo_ms
movwf R_ContB
R1ms_BucleExterno
movlw d'249'
movwf R_ContA
R1ms_BucleInterno
nop
decfsz R_ContA,F
goto R1ms_BucleInterno
decfsz R_ContB,F
goto R1ms_BucleExterno
return
Por último me gustaría ponerle unos sensores en los pies que detecten la ausencia de suelo para que no caiga de una mesa por ejemplo, alguna sugerencia??? por supesto alguno sencillito, como veis estoy empezando. A ver si entre todos me hechais una mano a ver hasta donde llego en el esto de hacer Robots.
Muchas gracias, un saludo.
creo que el tembleque es por la calidad de los servos......aunque se supone que los futaba son buenos,
Puedes revisar los 50hz con un osciloscopio?
Leí en otro post tuyo que la señal de los servos la mandabas de forma alternativa, si un ciclo reciben la señal y tres ciclos no, esto explica el tembleque. Respecto a los sensores, te recomiendo los típicos sensores CNY70, se suelen usar en siguelineas, pero te valen para esto creo (buscalos un poco por el foro y por google). Y una cosa, aunque supongo que ya te lo habrán dicho, no has pensado en pasarte al C y dejar atrás el assembler? que ya para este calibre empieza a ser un poco tedioso y seguro que el C te facilitaría las cosas muchisimo.
Fulguitron, efectivamente como apuntan BoOps y technick tienes un problema con los tiempos con los que refrescas el pulso en cada servo. He echado un vistazo a tu código y lo que haces es (teniendo en cuenta la secuencia en el tiempo):
|<---pulso para servo 1--->|<---20ms--->|<---pulso para servo 2--->|<---20ms--->|<---pulso para servo 3--->|.....etc....
De modo que tu código está enviando un pulso a cada servo cada aprox. 63 ms en el caso del Movimiento 1, aprox. 84 ms en el caso del Movimiento 2.
Cuando lo que sería más conveniente hacer es ( lo pongo en este formato para ve si se ve más claro):
Es decir, que durante un tiempo de 20ms enviases pulsos a todos los servos, y además esperases X ms hasta completar esos 20ms totales, para volver a repetir la secuencia, es decir, volver a enviar el pulso al servo 1, servo 2, etc...
|<--------------------------------------------20 ms --------------------------------------- |
|<---p. servo 1--->|<---p. servo 2--->|<---p. servo 3--->|<---- X ms tiempo en reposo ----->|
Espero que te sirva de ayuda.
Slds, Sphinx.