fbpx

Expresate

Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:

Avisos
Vaciar todo

Panchito: Robot bípedo con PIC16F84A

21 Respuestas
8 Usuarios
0 Reactions
9,673 Visitas
fulguitron
Respuestas: 50
Topic starter
(@fulguitron)
Trusted Member
Registrado: hace 16 años

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.

Responder
20 respuestas
guanajo
Respuestas: 74
(@guanajo)
Ardero
Registrado: hace 18 años

creo que el tembleque es por la calidad de los servos......aunque se supone que los futaba son buenos,

Responder
boops
Respuestas: 1813
(@boops)
Ardero
Registrado: hace 19 años

Puedes revisar los 50hz con un osciloscopio?

Responder
technik
Respuestas: 287
(@technik)
Reputable Member
Registrado: hace 18 años

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.

Responder
sphinx
Respuestas: 651
(@sphinx)
Ardero
Registrado: hace 17 años

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):

|<--------------------------------------------20 ms --------------------------------------- |
|<---p. servo 1--->|<---p. servo 2--->|<---p. servo 3--->|<---- X ms tiempo en reposo ----->|
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...

Espero que te sirva de ayuda.
Slds, Sphinx.

Responder
Página 1 / 5
Compartir: