Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:
Hola a todos, soy nuevo y e montando mi primer microbot. Ya lo tengo montando y ahora le estoy haciendo los primeros programas en asm para pic16f84.
Estoy empezando por los servos y el primer programa es el de calibrado, ya que son trucados para giro completo y se supone que donde antes respondia dando 90º ahora tendria que dar la velocidad 0, por lo ke e leido a pulsos de 1'2 milisegundos en alto y su complemento en bajo hasta 20 milisegundos, que es lo que creo que hace mi programa entrando en un bucle sin fin del que solo saldria con interrupciones.
Lo e probado, los servos giran y se supone que ahora con un destornillador tendria ke girar el potencimentro del servo hasta que se paren para conseguir la velocidad 0 a esa frecuencia.
El problema que tengo es que no e podio pararlos, no se si porque no lo pillo con el destornillador si porque el programa este mal. Los servos los desmontare, intentare calibrarlos abiertos y los dejare fijos si lo consigo.
Observandolos lo que veo es que girar giran y no a su velocidad maxima pero algo rapidos, me parece, como para pararlos con el potenciometro. Por lo que pense que el fallo puede estar en mi programa que le de otra frecuencia. Probare tambien a darle 1'3 1'4 y 1'5 a ver si esque mi programa las calculase mal (grabare varios pic a ver).
Mi programa lo que tiene es una tabla de la que se puede elegir un pulso desde 0'3 milisegundos hasta 2'4 milisegundos (en este caso escojo la de 1,2 milisegundos, porque es lo que e leido).
¿puede ser que al trucar el servo ya no sea a 1,2 milisegundos la velocidad 0 ? ¿O que no sea siempre 1'2 milisegundos para los 90º? ¿Puede ser que sea a 1'4 o 1'5 milisegundos el pulso? Gracias.
Un saludo
La datasheet del Futaba S3003 anda algo perdida. Ya me costó a mi encontrarla también.
El fabricante solo dice esto en su página:
http://www.gpdealera.com/cgi-bin/wgainf ... I=FUTM0031
Pero encontré una datasheet en un rincón de Internet:
http://www.es.co.th/Schemetic/PDF/ET-SERVO-S3003.PDF
Como ves el punto neutro lo pone a 1520 microsegundos.
Saludos,
Sphinx.
Dragonet80, lo estoy haciendo en emsamblador.
Gracias Sphinx, el 1º enlace si lo vi, y el 2º sera el unico donde ponga algo, pero si, parece ser que es 1'5. Grabare otro pic a 1'4 por si acaso.
Es el rocko de todoelectronica, el que estoy intentando programar. Si lo anterior me funciona ya tendria un poco solucionado la calibracion y los giros, ahora lo ke tendre que pensar es como ingeniarmelas para que valla adelante y atras, jeje aun no se si lo hare dandole un pulso a un servo y luego a otro o un timer0 de pulsos a uno y otro a otro. Y a ver en que cambia el programa al hacerlo y si me sigue sirviendo el de calibracion y las temporizaciones.
Como esta ahora mismo, para escoger una frecuencia y encender los servos elegidos creo que vale. Pero para mi proyecto ya veremos cuando le valla añadiendo lo demas.
Un saludo, y gracias.
Uff... Al final era mi programa (Lo empeze y lo termine dejando meses de por medio). Era un milagro que encendiera los motores tal y como estaba.
Me faltaba meterle 2 variables auxiliares y pegaba un salto a donde no debia. Ya lo e arreglado y los e calibrado a 1'4 ms que aprobechaba mas los indices de velocidades de mi tabla, y ningun problema para pararlos, ya funciona.
Gracias por la colaboracion.
El programa, por si alguien le interesara para usarlo o que le sacara pegas que yo no halla visto 😕 ¿Donde podria subirlo? Aqui creo que se descolocaria demasiado, si acaso ponerlo en otro lado y poner el enlace (tendria que buscarme un sitio).
¿Deveria de abrir un hilo en robot comerciales por si alguien mas estuviera con el mismo proyecto?
Coji este, porque aunque sea comercial, la electronica que añade al pic es muy sencilla y simple y poco me costaria hacer uno parecido, ya con mas cosas y solucionando las pegas que me encuentre con este.
Tambien lo hago por saber si soy capaz de programar un circuito ya dado basado en pic.
Como pega que me e encontrado con el, es que veo algo engorroso el movimiento alante y atras. Tendre que ingeniarme algo como la multimedia de los pc (1º a un motor luego a otro y que parecca que lo haga a la vez), para repartir pulsos distintos a los 2 servos. Ya ire viendo resultados sobre la marcha a ver que es mejor e ir aprendiendo mientras.
Un Saludo
Ivan, casi me saco los ojos al leer lo que has puesto (por la cantidad de faltas de ortografía), utiliza un corrector antes de subir los posts o instala en el Firefox el diccionario de Español. Ojo! no digo que tengas que escribir perfecto (no conozco a nadie que lo haga), pero sí con un poco de correción.
Respondiendo a tu pregunta... Para subir código al foro se usa la etiqueta code que es el # cuando usas el editor.
S2
Ranganok Schahzaman
El programa es este y aun lo estoy revisando para continuar con el proyecto.
No sera perfecto y podra optimizarse mucho, pero creo que funciona bien.
;;CALIBRACION por Ivan.
;Las lineas de control de servomotores son RB0 servo derecho y RB1 servo izquierdo
LIST P=16F84A
;DEFINICION DE REGISTROS ESPECIFICOS
PCL EQU 02 ;Registro de menos peso del contador de programa (Program Counter low)
ESTADO EQU 03 ;Registro de estado (Status)
PUERTA_B EQU 06
;DEFINICION DE VARIABLES;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
VAR_LINEAS EQU 0C ;Aqui se guarda el dato de las 2 lineas a encender o apagar
; indice(0-2)son los valores que tendra
;A esta variable llega la velocidad alante o atras
FACTOR_VEL EQU 0D ;Esta variable guardara el indice del factor de velocidad
; Es el mismo indice para Alto ke para Bajo
FACTOR_ALT EQU 0E ;Guarda el numero de veces que se llama a 100mc para alto
FACTOR_BAJ EQU 0F ;Guarda el numero de veces que se llama a 100mc para bajo
PULSO EQU 10 ;Guardara mascara de las lineas de los servomotores
CONT_A EQU 11 ;Es el contador de la rutina de 96mc
FACTOR_ALT_A EQU 12 ;Variables auxiliares para no decrementar FACTOR_ALT ni FACTOR_BAJ
FACTOR_BAJ_A EQU 13
ORG 0 ;posicionamiento de la primera instruccion del programa
;Saltar vector de interrupciones (no es necesario porque este programa no usa interrupciones)
;PROGRAMA
;Configuracion de las lineas rb0 y rb1 de salida
bsf ESTADO,5 ;cambio al banco 1
movlw b'11111100' ;carga w con la mascara
andwf PUERTA_B,1 ;AND de w y la puertab y el resultado se keda en puertab
bcf ESTADO,5 ;vuelta al banco 0
;PONER EN FACTOR_VEL EL INDICE DE LA VELOCIDAD 0
movlw d'11' ;escojo indice de velocidad
movwf FACTOR_VEL
;PONER EN VAR_LINEAS EL INDICE DE LA MASCARA DE DOS_UN_OTRO en este caso seria 0 para los 2
movlw d'0'
movwf VAR_LINEAS
;con los datos anteriores ya empieza o se llama a la funcion 1
;RUTINAS Y FUNCIONES
;;;;; 1 ;;;;;;;ESCOJE PULSO ALTO BAJO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Usa variables FACTOR_VEL de entrada y FACTOR_ALT Y FACTOR_BAJ de Salida
;Necesita valor en FACTOR_VEL para funcionar
;Devuelve en FACTOR_ALT el indice del pulso alto
;Devuelve en FACTOR_BAJ el indice del pulso bajo
;Coje la velocidad elegida y calcula el tiempo en ALTO
movf FACTOR_VEL,0 ;Mueve el factor velocidad a W
call T_VELOCIDAD ;devuelve en w el factor en alto
movwf FACTOR_ALT ;mueve lo obtenido en w a su variable
;Vuelve a cojer la velocidad y calcula el tiempo bajo
movf FACTOR_VEL,0 ;Vuelve a meter el factor velocidad a w
call T_VEL_BAJ ;devuelve en w el factor en bajo
movwf FACTOR_BAJ ; y lo mueve a su variable
;;;; 2 ;;;;;;;;;;;;ESCOJE MOTORES A ENCENDER;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;Necesita valor en VAR_LINEAS que es el indice de DOS_UN_OTR (0-2)
;Necesita valor en FACTOR_ALT Obtenidos de la rutina anterior
;Necesita valor en FACTOR_BAJ
;Usa la tabla DOS_UN_OTRO
;Carga indice y llama a tabla para obtener mascara y guardarla
; en su variable (PULSO)
movf VAR_LINEAS,0 ;carga variable en w (Indice)(0-2)
call DOS_UN_OTRO ;LLama a tabla donde se escoje 2 motores uno u otro con mascaras
;
movwf PULSO ;Guarda mascara en variable PULSO, necesario para el sinfin
;aqui vendria llamar a ENC_MO, no es necesario porque biene seguido
;; 3 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;,,
;Comienzo Rutina del pulso correspondiente AltoBajo sin fin
;Necesita haber declarado FACTOR_ALT_A y FACTOR_BAJ_A que son las variables que decrementa
ENC_MO movf FACTOR_ALT,0 ;Carga lo de FACTOR_ALT y FACTOR_BAJ en unas variables auxiliares
movwf FACTOR_ALT_A ; lo dejare asi a ver, aunque añada 4 mc a los 20 milisegundos
movf FACTOR_BAJ,0
movwf FACTOR_BAJ_A
movf PULSO,0 ; pulso de la mascara elegida
iorwf PUERTA_B,1 ;lo lleva a la puerta B (enciende lo elegido) EN ESTE PUNTO ES DONDE SE ENCIENDEN LOS MOTORES
bcf ESTADO,2 ;Bajar bandera
INI decf FACTOR_ALT_A,1 ;activa Z si es 0
call RETARDO_96MC
btfss ESTADO,2
goto INI
movlw b'11111100' ;mascara para apagar
andwf PUERTA_B,1 ;se apagan
;Tiempo apagadas
bcf ESTADO,2
INI2 decf FACTOR_BAJ_A,1
call RETARDO_96MC
btfss ESTADO,2
goto INI2
goto ENC_MO
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; TA 1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Tabla para el tiempo en alto
T_VELOCIDAD
addwf PCL,1
retlw d'3' ;(0)Factores de velocidad
retlw d'4' ;(1)
retlw d'5' ;(2)
retlw d'6' ;(3)
retlw d'7' ;(4)
retlw d'8' ;(5)
retlw d'9' ;(6)
retlw d'10' ;(7)
retlw d'11' ;(8)
retlw d'12' ;(9)
retlw d'13' ;(10)
retlw d'14' ;(11)CALIBRACION VOy a probar con esta de calibracion 0
retlw d'15' ;(12)Punto neutro del fabricante
retlw d'16' ;(13)
retlw d'17' ;(14)
retlw d'18' ;(15)
retlw d'19' ;(16)
retlw d'20' ;(17)
retlw d'21' ;(18)
retlw d'22' ;(19)
retlw d'23' ;(20)
retlw d'24' ;(21)
;;;; TA 2 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Tabla para el tiempo bajo
T_VEL_BAJ
addwf PCL,1
retlw d'197' ;(0)
retlw d'196' ;(1)
retlw d'195' ;(2)
retlw d'194' ;(3)
retlw d'193' ;(4)
retlw d'192' ;(5)
retlw d'191' ;(6)
retlw d'190' ;(7)
retlw d'189' ;(8)
retlw d'188' ;(9)
retlw d'187' ;(10)
retlw d'186' ;(11)CALIBRACION
retlw d'185' ;(12)Punto neutro del fabricante
retlw d'184' ;(13)
retlw d'183' ;(14)
retlw d'182' ;(15)
retlw d'181' ;(16)
retlw d'180' ;(17)
retlw d'179' ;(18)
retlw d'178' ;(19)
retlw d'177' ;(20)
retlw d'176' ;(21)
;;; TA 3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Tabla 2motores uno u otro indices (0-2)
DOS_UN_OTRO
addwf PCL,1
retlw b'00000011' ;(0)Los 2 motores
retlw b'00000001' ;(1)1 motor
retlw b'00000010' ;(2)un motor
;MASCARAS OR pone a 1 los que se pongan a 1 y no toca los que en la mascara esten a 0
; al salir de esta biene (iorwf PUERTA_A,1)
;;; TEMPORIZACION 1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;TEMPORIZACION 96mc
RETARDO_96MC
nop
nop
movlw d'29'
goto RETARDO
RETARDO
movwf CONT_A
RE_BUCLE
decfsz CONT_A,1
goto RE_BUCLE
return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
END ;Fin del programa
Si no esta muy bien es porque es el primer programa que hago de estas caracteristicas. Para mi ya es un logro haber podido dar el 1º paso. Cualquier ayuda sera bienvenida.
Un saludo.