Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:
Buenas noches, después de un buen tiempo desconectado vuelvo a la carga con otro robocillo. El primero tuve que dejarlo porque al hacer las piezas en plastico y Loctite era un dolor pegarlo otra vez antes de que se moviera. Ahora he hecho uno de metal y más a conciencia. Se parece mucho al BRAT pero prefiero empezar con algo que funciona que aventurarme en cosas nuevas.
Buenos os dejo unas fotillos para que las critiqueis y de paso unas dudas para seguir adelante con mi proyecto.
También os paso el código que como vereis es bastante cutre salchichero pero ahí entrais vosotros. En breve (cuando consiga caminar sin que se caiga) colgaré un video que ya tengo ganas de enseñar mi pqueña obra maestra.
LIST P=16F84A
INCLUDE <P16F84A.INC>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
cblock 0x0c
contA
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'30'
movwf contA
Saludo
bsf PORTB,0 ; Activa el PORTB1
call Retardo_50micros ; la suma de los call genera el tiempo
call Retardo_400micros ; en alto para un ángulo de 60º
bcf PORTB,0 ; Desactiva el PORTB1
call Retardo_10ms ; la suma de los call genera el tiempo
call Retardo_5ms ; la suma de los call genera el tiempo
call Retardo_2ms ; la suma de los call genera el tiempo
call Retardo_2ms ; la suma de los call genera el tiempo
decfsz contA ; Cuenta a contA y sigue en la línea de abajo
goto Saludo ; Cuando contA sea = 0 omite la línea siguiente.
clrf contA
movlw d'80' ; Tiempo de duración del saludo
movwf contA
Saludo_2
bsf PORTB,0 ; Activa el PORTB1
call Retardo_1ms ; la suma de los call genera el tiempo
call Retardo_500micros ; la suma de los call genera el tiempo
call Retardo_400micros ; en alto para un ángulo de 60º
bcf PORTB,0 ; Desactiva el PORTB1
call Retardo_10ms ; la suma de los call genera el tiempo
call Retardo_5ms ; la suma de los call genera el tiempo
call Retardo_2ms ; la suma de los call genera el tiempo
decfsz contA ; Cuenta a contA y sigue en la línea de abajo
goto Saludo_2 ; Cuando contA sea = 0 omite la línea siguiente.
clrf contA
movlw d'80' ; Tiempo de duración del saludo_2
movwf contA
Paso_1
bsf PORTB,1
call Retardo_500micros ; la suma de los call genera el tiempo de 30º
call Retardo_100micros
bcf PORTB,1
bsf PORTB,2
call Retardo_500micros ; la suma de los call genera el tiempo de 30º
call Retardo_100micros
bcf PORTB,2
bsf PORTB,3
call Retardo_1ms ; la suma de los call genera el tiempo de 105º
call Retardo_500micros ;
call Retardo_100micros ;
call Retardo_50micros ;
bcf PORTB,3
bsf PORTB,4
call Retardo_1ms ; la suma de los call genera el tiempo de 105º
call Retardo_200micros ;
call Retardo_100micros ;
call Retardo_50micros ;
bcf PORTB,4
bsf PORTB,5
call Retardo_1ms ; la suma de los call genera el tiempo de 75º
call Retardo_50micros ;
bcf PORTB,5
bsf PORTB,6
call Retardo_1ms ; la suma de los call genera el tiempo de 75º
call Retardo_50micros ;
bcf PORTB,6
bsf PORTB,7
call Retardo_1ms ; la suma de los call genera el tiempo de 90º
call Retardo_200micros ;
bcf PORTB,7
call Retardo_10ms ; la suma de los call genera el tiempo
decfsz contA ; Cuenta a contA y sigue en la línea de abajo
goto Paso_1 ; Cuando contA sea = 0 omite la línea siguiente.
clrf contA
movlw d'80' ; Tiempo de duración del Paso_1
movwf contA
Paso_2
bsf PORTB,1
call Retardo_500micros ; la suma de los call genera el tiempo de 30º
call Retardo_100micros
bcf PORTB,1
bsf PORTB,2
call Retardo_500micros ; la suma de los call genera el tiempo de 45º
call Retardo_200micros
call Retardo_50micros
bcf PORTB,2
bsf PORTB,3
call Retardo_1ms ; la suma de los call genera el tiempo de 90º
call Retardo_200micros ;
bcf PORTB,3
bsf PORTB,4
call Retardo_1ms ; la suma de los call genera el tiempo de 90º
call Retardo_200micros ;
bcf PORTB,4
bsf PORTB,5
call Retardo_500micros ; la suma de los call genera el tiempo de 45º
call Retardo_200micros ;
call Retardo_50micros ;
bcf PORTB,5
bsf PORTB,6
call Retardo_500micros ; la suma de los call genera el tiempo de 30º
call Retardo_100micros ;
bcf PORTB,6
bsf PORTB,7
call Retardo_1ms ; la suma de los call genera el tiempo de 90º
call Retardo_200micros ;
bcf PORTB,7
call Retardo_10ms ; la suma de los call genera el tiempo
decfsz contA ; Cuenta a contA y sigue en la línea de abajo
goto Paso_2 ; Cuando contA sea = 0 omite la línea siguiente.
clrf contA
movlw d'80' ; Tiempo de duración del Paso_1
movwf contA
Paso_3
bsf PORTB,1
call Retardo_500micros ; la suma de los call genera el tiempo de 30º
call Retardo_100micros
bcf PORTB,1
bsf PORTB,2
call Retardo_500micros ; la suma de los call genera el tiempo de 45º
call Retardo_200micros
call Retardo_50micros
bcf PORTB,2
bsf PORTB,3
call Retardo_1ms ; la suma de los call genera el tiempo de 105º
call Retardo_50micros ;
bcf PORTB,3
bsf PORTB,4
call Retardo_1ms ; la suma de los call genera el tiempo de 105º
call Retardo_50micros ;
bcf PORTB,4
bsf PORTB,5
call Retardo_500micros ; la suma de los call genera el tiempo de 45º
call Retardo_200micros ;
call Retardo_50micros ;
bcf PORTB,5
bsf PORTB,6
call Retardo_500micros ; la suma de los call genera el tiempo de 30º
call Retardo_100micros ;
bcf PORTB,6
bsf PORTB,7
call Retardo_1ms ; la suma de los call genera el tiempo de 90º
call Retardo_200micros ;
bcf PORTB,7
call Retardo_10ms ; la suma de los call genera el tiempo
decfsz contA ; Cuenta a contA y sigue en la línea de abajo
goto Paso_3 ; Cuando contA sea = 0 omite la línea siguiente.
clrf contA
movlw d'80' ; Tiempo de duración del Paso_1
movwf contA
Paso_4
bsf PORTB,1
call Retardo_1ms ; la suma de los call genera el tiempo de 150º
call Retardo_200micros
bcf PORTB,1
bsf PORTB,2
call Retardo_1ms ; la suma de los call genera el tiempo de 135º
call Retardo_200micros
bcf PORTB,2
bsf PORTB,3
call Retardo_1ms ; la suma de los call genera el tiempo de 90º
call Retardo_50micros ;
bcf PORTB,3
bsf PORTB,4
call Retardo_1ms ; la suma de los call genera el tiempo de 90º
call Retardo_50micros ;
bcf PORTB,4
bsf PORTB,5
call Retardo_1ms ; la suma de los call genera el tiempo de 135º
call Retardo_500micros
call Retardo_100micros
call Retardo_50micros
bcf PORTB,5
bsf PORTB,6
call Retardo_1ms ; la suma de los call genera el tiempo de 150º
call Retardo_500micros
call Retardo_200micros
call Retardo_100micros
bcf PORTB,6
bsf PORTB,7
call Retardo_1ms ; la suma de los call genera el tiempo de 90º
call Retardo_200micros ;
bcf PORTB,7
call Retardo_10ms ; la suma de los call genera el tiempo
decfsz contA ; Cuenta a contA y sigue en la línea de abajo
goto Paso_4 ; Cuando contA sea = 0 omite la línea siguiente.
clrf contA
movlw d'80' ; Tiempo de duración del Paso_1
movwf contA
Paso_5
bsf PORTB,1
call Retardo_1ms ; la suma de los call genera el tiempo de 135º
call Retardo_500micros
call Retardo_100micros
call Retardo_200micros
bcf PORTB,1
bsf PORTB,2
call Retardo_1ms ; la suma de los call genera el tiempo de 150º
call Retardo_500micros
call Retardo_50micros
call Retardo_100micros
bcf PORTB,2
bsf PORTB,3
call Retardo_1ms ; la suma de los call genera el tiempo de 90º
call Retardo_200micros ;
bcf PORTB,3
bsf PORTB,4
call Retardo_1ms ; la suma de los call genera el tiempo de 90º
call Retardo_200micros ;
bcf PORTB,4
bsf PORTB,5
call Retardo_1ms ; la suma de los call genera el tiempo de 135º
call Retardo_500micros
call Retardo_100micros
call Retardo_50micros
bcf PORTB,5
bsf PORTB,6
call Retardo_1ms ; la suma de los call genera el tiempo de 150º
call Retardo_500micros
call Retardo_200micros
call Retardo_100micros
bcf PORTB,6
bsf PORTB,7
call Retardo_1ms ; la suma de los call genera el tiempo de 90º
call Retardo_200micros ;
bcf PORTB,7
call Retardo_10ms ; la suma de los call genera el tiempo
decfsz contA ; Cuenta a contA y sigue en la línea de abajo
goto Paso_5 ; Cuando contA sea = 0 omite la línea siguiente.
clrf contA
movlw d'80' ; Tiempo de duración del Paso_1
movwf contA
Paso_6
bsf PORTB,1
call Retardo_1ms ; la suma de los call genera el tiempo de 135º
call Retardo_500micros
call Retardo_200micros
call Retardo_100micros
bcf PORTB,1
bsf PORTB,2
call Retardo_1ms ; la suma de los call genera el tiempo de 150º
call Retardo_500micros
call Retardo_100micros
call Retardo_50micros
bcf PORTB,2
bsf PORTB,3
call Retardo_1ms ; la suma de los call genera el tiempo de 90º
call Retardo_200micros ;
call Retardo_100micros
call Retardo_50micros
bcf PORTB,3
bsf PORTB,4
call Retardo_1ms ; la suma de los call genera el tiempo de 90º
call Retardo_200micros ;
call Retardo_100micros
call Retardo_50micros
bcf PORTB,4
bsf PORTB,5
call Retardo_1ms ; la suma de los call genera el tiempo de 150º
call Retardo_500micros
call Retardo_100micros
call Retardo_50micros
bcf PORTB,5
bsf PORTB,6
call Retardo_1ms ; la suma de los call genera el tiempo de 135º
call Retardo_500micros
call Retardo_200micros
call Retardo_100micros
bcf PORTB,6
bsf PORTB,7
call Retardo_1ms ; la suma de los call genera el tiempo de 90º
call Retardo_200micros ;
bcf PORTB,7
call Retardo_10ms ; la suma de los call genera el tiempo
decfsz contA ; Cuenta a contA y sigue en la línea de abajo
goto Paso_6 ; Cuando contA sea = 0 omite la línea siguiente.
clrf contA
movlw d'80' ; Tiempo de duración del Paso_1
movwf contA
Paso_7
bsf PORTB,1
call Retardo_500micros ; la suma de los call genera el tiempo de 30º
call Retardo_100micros
bcf PORTB,1
bsf PORTB,2
call Retardo_500micros ; la suma de los call genera el tiempo de 45º
call Retardo_200micros
call Retardo_50micros
bcf PORTB,2
bsf PORTB,3
call Retardo_1ms ; la suma de los call genera el tiempo de 90º
call Retardo_200micros ;
call Retardo_100micros ;
call Retardo_50micros ;
bcf PORTB,3
bsf PORTB,4
call Retardo_1ms ; la suma de los call genera el tiempo de 105º
call Retardo_200micros ;
call Retardo_100micros ;
call Retardo_50micros ;
bcf PORTB,4
bsf PORTB,5
call Retardo_1ms ; la suma de los call genera el tiempo de 90º
call Retardo_200micros ;
bcf PORTB,5
bsf PORTB,6
call Retardo_1ms ; la suma de los call genera el tiempo de 90º
call Retardo_200micros ;
bcf PORTB,6
bsf PORTB,7
call Retardo_1ms ; la suma de los call genera el tiempo de 90º
call Retardo_200micros ;
bcf PORTB,7
call Retardo_10ms ; la suma de los call genera el tiempo
decfsz contA ; Cuenta a contA y sigue en la línea de abajo
goto Paso_7 ; Cuando contA sea = 0 omite la línea siguiente.
clrf contA
movlw d'80' ; Tiempo de duración del Paso_1
movwf contA
goto Paso_2
INCLUDE<LIBSERVOS.INC>
End
No os fijeis en los comentarios de los ángulos porque quizás no estén todos arreglados, porque lo voy cambiando sobre la marcha.
Y ahora es cuando necesito toda vuestra ayuda para seguir adelante. Tengo tres frentes a atacar y no se como empezar.
Frente 1 - Actualmente puedo controlar los ángulos, pero no la velocidad de los motores, como lo consigo??? alguien tiene algún ejemplo sencillo en ASM??
Frente 2 - Quiero montarle un sensor de infrarrojos el GP2DXX, que os parece?? es sencillo de usar?? me conformo que pueda detectar obstaculos a cierta distancia y si pudiera medir la distancia para un futuro mejor que mejor.
Frente 3 - También sé que con los conectores del programador de PICS lo puedo conectar al PIC16F84A para no tener que estar montando y desmontando el micro. Es cierto?? es solamente conectar los cables y listo?? sabeis el orden?? Os dejo fotillo de lo que os digo por sino me explico bien
Pues nada, espero vuestras respuestas y a ver si llego más lejos con RoYbot que con el anterior Panchito jejejeje.
Un saludo a todos y muchas gracias
Ya hemos conseguido algo, he modificado un programa que he encontrado por la red y lo he modificado para simplificarlo y a partir de aquí empezar a modificar.
list p=16F84A ; definir procesador
include <p16F84A.inc> ; definiciones de variables específicas del procesador
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
#define SERVO1 PORTB,0 ; puerto de salida de servo 1
#define Pulsador1 PORTA,0 ; puerto de salida de servo 1
CBLOCK 0x20
Posic ; posición servo
acum_A
ENDC
;********************************************************************************
org 0x000
goto configuracion
;*****************************************************************************
; Principal
;********************************************************************************
configuracion
clrf PORTA ; inicia ports
clrf PORTB ; inicia ports
bsf STATUS,RP0 ; Apunta a banco 1
movlw b'11111111' ; PORTA
movwf TRISA ; entradas
MOVLW b'00000000' ; PORTB
movwf TRISB ; salidas
movlw b'00000010' ; Configuración para TMR0
movwf OPTION_REG ; preescaler 2, 1:8 con CLK interno (que es
; de 1 MHz si el oscilador es de 4 MHz).
; El contador cuenta cada 8 useg
bcf STATUS,RP0 ; Apunta a banco 0
clrf TMR0 ; inicia registro de timer en 0
movlw d'133' ; inicia valor de posición de servo (centro)
movwf Posic
principal
; Los servos actúan con un pulso de control que va entre 0,5 ms y 2,5 ms.
; En el bloque que sigue se inicia en 1 el pulso de control y se espera un
; retardo fijo de aproximadamente 0,5 ms, que es el valor mínimo del pulso.
; Con este valor de longitud de pulso y una longitud cero en la parte variable,
; el servo está parado al máximo hacia la izquierda (sentido antihorario).
bsf SERVO1 ; pone la señal de servo en 1
bcf INTCON,T0IF ; borra el flag de timer
movlw d'192' ; (256-192 = 64) 64 * 8 us = 0,512 ms
movwf TMR0 ; valor al registro de timer
btfss INTCON,T0IF ; espera por timer = ff -> 00
goto $-1
bcf INTCON,T0IF ; borra el flag de timer
; A continuación, comienza el tiempo variable del pulso. Esto permite
; que el recorrido completo, de 180 grados (valores de pulso entre 0,5 ms
; y 2,5 ms), se divida en 256 segmentos (256 * 8 us = 2,048 ms).
; La parte variable del pulso de control varía entre 0 y 2 ms
movf Posic,w ; 256-nn x 8 uS = 1 ms, 1,5 ms, 2,5 ms
movwf TMR0 ; valor al registro de timer
btfss INTCON,T0IF ; espera por timer = ff -> 00
goto $-1
bcf SERVO1 ; pone la señal de servo en 0
bcf INTCON,T0IF ; borra el flag de timer
; Retardo de 20 ms, que es el tiempo estándar que debe separar los pulsos
; de control para los servos comunes de RC
movlw d'9' ; cantidad de veces: 9 x 2 ms = 18 ms + 2 ms
movwf acum_A
retardo
bcf INTCON,T0IF ; borra el flag de timer
movlw d'6' ; (256-6 = 250) 250 * 8 us = 2 ms
movwf TMR0 ; valor al registro de timer
btfss INTCON,T0IF ; espera por timer = ff -> 00
goto $-1
decfsz acum_A ; decrementa cantidad de veces
goto retardo
iniciaPos
movlw d'167' ; 256-170 = , 86 * 8 us = 688 us + 512 us
movwf Posic ; posición de 90º para un servo Futaba S3003
goto principal ;
END
Ahora mi próximo reto será pasar de un ángulo a otro pero controlando la velocidad del servo. Ahora vienen mis dudas, que significa esto ?
goto $-1
A ver si algún experto de ASM me puede echar una mano. RoY no puede andar hasta que no consiga controlar la velocidad del movimeinto de los servos.
Un saludo a todos.
Hola,
respecto al Frente 2 - Quiero montarle un sensor de infrarrojos el GP2DXX, que os parece?? es sencillo de usar?? me conformo que pueda detectar obstaculos a cierta distancia y si pudiera medir la distancia para un futuro mejor que mejor.
Yo el único que he conseguido encontrar ha sido el GP2D12, que es analógico (te da entre 0 y 3V según la distancia a la que esté el obstáculo). Cuesta 10 euros, y para usarlo con el PIC que has elegido vas a tener que montarte un comparador externo, que le suministre al PIC una entrada digital según vea obstáculo o no. Es fácil. Lo puedes hacer con un amplificador operacional LM311, por ejemplo.
Un saludo.
OK Felix lo tendré en cuenta, aunque con los días también he estado barajando la posibilidad de empezar con un acelerómetro. Aunque la verdad es que no sé que es más fácil, el sensor o el acelerómetro??
Que opinais?? que es más fácil de programar?? no quiero liarme todavía demasiado y quiero ir poco a poco, que bastante me está costando mover un servo de un ángulo a otro controlando la velocidad. El día que mueva los siete a la vez .......
Me apunto el sensor GP2D12, mercy.
Calurosas tardes, os voy a poner mis primeros avances con la programación, he logrado que un servo vaya de un ángulo a otro muy despacio, lo cual ya es para mi un buen logro.
Pero ahora tengo un problema, quiero pasar de un ángulo a otro, pero no sé como hacerlo, cuando va a SegundoMov, vuelve a princpial y lo que yo quiero es que luego vaya a SegundoMov sin pasar por PrimerMov. Estoy un poco atascado y no sé como salir.
Me podeis echar una mano??? os cuelgo el código.
list p=16F84A ; definir procesador
include <p16F84A.inc> ; definiciones de variables específicas del procesador
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
#define SERVO1 PORTB,0 ; puerto de salida de servo 1
#define Pulsador1 PORTA,0 ; puerto de salida de servo 1
CBLOCK 0x20
Posic ; posición servo
Posic_A
Posic_B
acum_A
ENDC
;********************************************************************************
org 0x000
goto configuracion
;*****************************************************************************
; Principal
;********************************************************************************
configuracion
clrf PORTA ; inicia ports
clrf PORTB ; inicia ports
bsf STATUS,RP0 ; Apunta a banco 1
movlw b'11111111' ; PORTA
movwf TRISA ; entradas
MOVLW b'00000000' ; PORTB
movwf TRISB ; salidas
movlw b'00000010' ; Configuración para TMR0
movwf OPTION_REG ; preescaler 2, 1:8 con CLK interno (que es
; de 1 MHz si el oscilador es de 4 MHz).
; El contador cuenta cada 8 useg
bcf STATUS,RP0 ; Apunta a banco 0
clrf TMR0 ; inicia registro de timer en 0
movlw d'167' ; inicia valor de posición de servo (centro)
movwf Posic
movlw d'226' ; posición del servo a los 45º
movwf Posic_A
movlw d'167' ; posición del servo a los 90º
movwf Posic_B
principal
; Los servos actúan con un pulso de control que va entre 0,5 ms y 2,5 ms.
; En el bloque que sigue se inicia en 1 el pulso de control y se espera un
; retardo fijo de aproximadamente 0,5 ms, que es el valor mínimo del pulso.
; Con este valor de longitud de pulso y una longitud cero en la parte variable,
; el servo está parado al máximo hacia la izquierda (sentido antihorario).
bsf SERVO1 ; pone la señal de servo en 1
bcf INTCON,T0IF ; borra el flag de timer
movlw d'192' ; (256-192 = 64) 64 * 8 us = 0,512 ms
movwf TMR0 ; valor al registro de timer
btfss INTCON,T0IF ; espera por timer = ff -> 00
goto $-1
bcf INTCON,T0IF ; borra el flag de timer
; A continuación, comienza el tiempo variable del pulso. Esto permite
; que el recorrido completo, de 180 grados (valores de pulso entre 0,5 ms
; y 2,5 ms), se divida en 256 segmentos (256 * 8 us = 2,048 ms).
; La parte variable del pulso de control varía entre 0 y 2 ms
movf Posic,w ; 256-nn x 8 uS = 1 ms, 1,5 ms, 2,5 ms
movwf TMR0 ; valor al registro de timer
btfss INTCON,T0IF ; espera por timer = ff -> 00
goto $-1
bcf SERVO1 ; pone la señal de servo en 0
bcf INTCON,T0IF ; borra el flag de timer
; Retardo de 20 ms, que es el tiempo estándar que debe separar los pulsos
; de control para los servos comunes de RC
movlw d'9' ; cantidad de veces: 9 x 2 ms = 18 ms + 2 ms
movwf acum_A
retardo
bcf INTCON,T0IF ; borra el flag de timer
movlw d'6' ; (256-6 = 250) 250 * 8 us = 2 ms
movwf TMR0 ; valor al registro de timer
btfss INTCON,T0IF ; espera por timer = ff -> 00
goto $-1
decfsz acum_A ; decrementa cantidad de veces
goto retardo
PrimerMov
incf Posic
movf Posic
movf Posic,W
subwf Posic_A,W ;revisa el valor entre ContB y W (SOLO MIRA EN W NO EN F)
btfsc STATUS,Z
goto SegundoMov
goto principal
SegundoMov
decf Posic
movf Posic
movf Posic,W
subwf Posic_B,W ;revisa el valor entre ContB y W (SOLO MIRA EN W NO EN F)
btfsc STATUS,Z
goto Fin
goto principal
Fin
END