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,746 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
furri
Respuestas: 2708
(@furri)
Ardero
Registrado: hace 20 años

... He puesto una resistencia variable porque me he dado cuenta que la propia luz también interfiere en el receptor así que supongo que según la superficie habrá que regular esta resistencia. Ahora vienen las preguntas, que se puede poner aparte de 74LS14?? lo veo excesivo tener 14 pines si solo voya a usar dos pines. También quiero colocar un LED bicolor que esté en verde cuando detecte suelo y rojo cuando no detecte y no se como hacerlo, alguna sugerencia???

Al tener una resistencia variable yo quitaria el 74LS14 ya que imagino que puedes ajustar hasta que el propio PIC detecte la señal, el led bicolor yo no lo engancharia directamente a sensor sino que lo pondria ocupando dos pines del PIC y asi los controlas por soft y los usas para el sensor y lo que necesites.
...una pila de 9v y ponerle un integrado para pasarlo a 5v o cuatro pilas de 1,5v y pasarlas a 5v??

Las mejores soluciones son la que propone Bastian 4 pilas recargables x 1,2V = 4.8V para ahorrarte el regulador, tambien puedes usar 3 pilas normales x 1,5V = 4,5V y tampoco usas regulador.... yo tengo varios zocalos de 4 pilas "trampeados" para poder usar 4 recargables o 3 pilas normales.... 😉

furri.

Responder
acollantes
Respuestas: 1
(@acollantes)
New Member
Registrado: hace 15 años

Hola te cuento que yo me demoré varios días tratando pero al final lo conseguí: ya tengo mis sensores con leds IR con un regulador, se trata del LM358, este trabaja con dos resistencias una variable de 10k y otra fija de 10K, no necesitas más, con eso le puedes enseñar a reconocer objetos a determinada distancia o reconocer una intensidad de luz (discriminar colores), ahora, para estar bien seguro lo paso por el CD40106, que es similar al 74ls14, pero te consume muchísima menos corriente, importante si lo quieres hacer autónomo. y como es un inversor lo paso dos veces (doble negado) lo que me da muy buenos resultados.

s2,

Responder
fulguitron
Respuestas: 50
Topic starter
(@fulguitron)
Trusted Member
Registrado: hace 16 años

Pues ya estamos otra vez liados con el robot que hacía un tiempo que lo tenía olvidado. Actualmente le he puesto dos sensores infrarrojos en cada pata que corresponden al Porta,0 y al Porta,1. Ahora mismo tengo un problema con las interrupciones y no sé como solucionarlo. El robot se queda colgado y creo que hay un problema con la orden del contador (Conta) a la hora de ejecutar la interrupción, creo y solo creo que no cuenta nada y se queda colgado.
Os pego el código a ver si alguien ve algún error garrafal que ya tengo ganas de que Panchito no se caiga por el filo de la mesa.

;*****************PROGRAMA PANCHITO V2_3***********
; FECHA: 20/08/10
; PIC: 16F84A 4Mhz
; SERVOS: Futaba S3003
; MEJORAS: "Sensor de infrarrojos en ambas
; piernas."
;
******************************************************

LIST P=16F84A
INCLUDE <P16F84A.INC>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

cblock 0x0c
ENDC
contA

ORG 0
goto Inicio ; El programa comienza en la dirección 0.
ORG 4
goto Interrupcion

Inicio

bsf STATUS,RP0 ; Pone a 1 el bit 5 del STATUS. Acceso al Banco 1.
bsf PORTA,0
bsf PORTA,1
bcf PORTB,0
bcf PORTB,1
bcf PORTB,2
bcf PORTB,3
bcf OPTION_REG,NOT_RBPU
bcf OPTION_REG,INTEDG
bcf STATUS,RP0
clrf contA
movlw b'10010000'
movwf INTCON
Adelante
movlw d'30' ; Tiempo de duración del Movimiento_1
movwf contA
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
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
bsf PORTB,2
call Retardo_1ms ; 120º
call Retardo_200micros
call Retardo_200micros
call Retardo_100micros
bcf PORTB,2
call Retardo_10ms
call Retardo_5ms
call Retardo_1ms
call Retardo_100micros
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
movlw d'30' ; Tiempo de duración del Movimiento_1
movwf contA
Movimiento_2

bsf PORTB,1
call Retardo_1ms ; 90º
call Retardo_200micros
bcf PORTB,1
bsf PORTB,3
call Retardo_1ms ; 120º
call Retardo_100micros
call Retardo_200micros
call Retardo_200micros
bcf PORTB,3
bsf PORTB,2
call Retardo_500micros ; 60º
call Retardo_200micros
call Retardo_200micros
bcf PORTB,2
bsf PORTB,0
call Retardo_500micros ; 60º
call Retardo_200micros
call Retardo_200micros
bcf PORTB,0
call Retardo_10ms
call Retardo_5ms
call Retardo_500micros
decfsz contA
goto Movimiento_2
clrf contA
movlw d'30' ; Tiempo de duración del Movimiento_2
movwf contA
Movimiento_3

bsf PORTB,3
call Retardo_1ms ; 90º
call Retardo_200micros
bcf PORTB,3
call Retardo_10ms
call Retardo_5ms
call Retardo_2ms
call Retardo_1ms
call Retardo_500micros
call Retardo_200micros
call Retardo_100micros
decfsz contA
goto Movimiento_3
clrf contA
movlw d'30' ; Tiempo de duración del Movimiento_3
movwf contA
return

marcha_atras
bsf PORTB,0
call Retardo_1ms ; 90º
call Retardo_200micros
bcf PORTB,0
call Retardo_10ms
call Retardo_5ms
call Retardo_2ms
call Retardo_1ms
call Retardo_500micros
call Retardo_200micros
call Retardo_100micros
decfsz contA ; Cuenta a contA y sigue en la línea de abajo
goto marcha_atras
clrf contA ; Cuando contA sea = 0 omite la línea siguiente.
movlw d'30' ; Tiempo de duración del movimiento marcha atras
movwf contA
return

Interrupcion
btfsc PORTA,0
call marcha_atras
btfsc PORTA,1
call marcha_atras

bcf INTCON,INTF
retfie

INCLUDE<LIBSERVOS.INC>
END

Como siempre muy agradecido y a ver si arreglo este fallo y cuelgo otro video para que veais los avances, que ahora mismo anda que da gusto.Saludos

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

Hola,

Sin mirar el código muy a fondo: ¿ dónde de claras esos pines como entradas ?

Slds, Sphinx.

Responder
fulguitron
Respuestas: 50
Topic starter
(@fulguitron)
Trusted Member
Registrado: hace 16 años

Al principio de todo con la instrucción BSF

bsf STATUS,RP0 ; Pone a 1 el bit 5 del STATUS. Acceso al Banco 1.
bsf PORTA,0
bsf PORTA,1

Se puede poner de otra manera???

Responder
Página 4 / 5
Compartir: