Autor Tema: Control de velocidad de un servo en PICBASIC PRO  (Leído 7067 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado Burrillo

  • PIC10
  • *
  • Mensajes: 5
Control de velocidad de un servo en PICBASIC PRO
« en: 25 de Agosto de 2009, 13:33:30 »
He estado busacndo en el foro y solo encuentro ejemplos de como mover el servo, pero no del control de velocidad.

Tengo un proyecto de minirobotica, exactamente es un hexápodo, estoy usando el pic 16F876A.
Hasta el momento ya hice que caminara, dejo un ejemplo del programa que tengo:

Código: [Seleccionar]
'SE MODIFICA LA PALABRA DE CONFIGURACIÓN DEL PIC 16F876A'
@ device  pic16F876A, xt_osc, wdt_off, pwrt_on, lvp_off, protect_off, bod_off

'****************************************************************'

adcon1 = 7        'se desactivan entradas analógicas'
cmcon  = 7        'se desactivan los comparadores (I/O digitales)'
trisa = 0         'se programa el puerto A como salida'
trisb = 0         'se programa el puerto B como salida'
trisc = 0         'se programa el puerto C como salida'

;=================================================================

'SE ASIGNAN ALIAS A LOS PINES DE CADA PUERTO'
'Servomotores: HITEC HS-475 HB, HITEC HS-422, FUTABA 3004'

;PATA 1
servo11 var portb.4: servo12 var portb.2: servo13 var portb.3
;PATA 2
servo21 var portb.1: servo22 var portb.0: servo23 var portc.7
;PATA 3
servo31 var portc.6: servo32 var portc.5: servo33 var portc.4
;PATA 4
servo41 var portc.1: servo42 var portc.2: servo43 var portc.3
;PATA 5
servo51 var portc.0: servo52 var porta.1: servo53 var porta.0
;PATA 6
servo61 var portb.6: servo62 var portb.5: servo63 var portb.7

'======================================================================='
'DEFINICION DE VARIABLES'

POSICION11  VAR BYTE: POSICION12  VAR BYTE: POSICION13  VAR BYTE ;PATA 1
POSICION21  VAR BYTE: POSICION22  VAR BYTE: POSICION23  VAR BYTE ;PATA 2
POSICION31  VAR BYTE: POSICION32  VAR BYTE: POSICION33  VAR BYTE ;PATA 3
POSICION41  VAR BYTE: POSICION42  VAR BYTE: POSICION43  VAR BYTE ;PATA 4
POSICION51  VAR BYTE: POSICION52  VAR BYTE: POSICION53  VAR BYTE ;PATA 5
POSICION61  VAR BYTE: POSICION62  VAR BYTE: POSICION63  VAR BYTE ;PATA 6

x var byte: y var byte : z var byte

vel         var byte
veces       VAR BYTE

'======================================================================='
;PROGRAMA PRINCIPAL

INICIO:
'Inicia con centrado del hexápodo'  
    vel = 20  
    veces = 5
    GOSUB centrado

'INICIA SUB-RUTINA DE CAMINAR HACIA ENFRENTE'    
    vel = 18  
    GOSUB posicion_caminar  
    vel = 16
    veces = 5
    gosub caminar

'================ SUB-RUTINAS DE MOVIMIENTO ====================    

centrado:
for y = 0 to veces  
    posicion11 = 150 : posicion12 = 150 : POSICION13 = 150 ;pata 1
    posicion21 = 150 : posicion22 = 150 : POSICION23 = 150 ;pata 2
    posicion31 = 150 : posicion32 = 150 : POSICION33 = 150 ;pata 3
    posicion41 = 150 : posicion42 = 150 : POSICION43 = 150 ;pata 4
    posicion51 = 150 : posicion52 = 150 : POSICION53 = 150 ;pata 5
    posicion61 = 150 : posicion62 = 150 : POSICION63 = 150 ;pata 6  
    gosub servos
    next y
    return
posicion_caminar:
for y = 0 to 8
lookup y,[150,150,150,123],POSICION11
lookup y,[150,150,150,185,144],POSICION12
lookup y,[150,150,150,155],POSICION13

lookup y,[150,150,150,150,150,173],POSICION21
lookup y,[150,150,150,150,150,185,146],POSICION22
lookup y,[150,150,150,150,150,158],POSICION23

lookup y,[150,119],POSICION31
lookup y,[150,185,150],POSICION32
lookup y,[150],POSICION33

lookup y,[150,150,150,150,150,150,150,175],POSICION41'FUTABA'
lookup y,[150,150,150,150,150,150,150,185,150],POSICION42
lookup y,[150,150,150,150,150,150,150,179],POSICION43'FUTABA'

lookup y,[150,150,150,150,150,150,150,173],POSICION51
lookup y,[150,150,150,150,150,150,150,185,150],pOSICION52
lookup y,[150,150,150,150,150,150,150,120],POSICION53

lookup y,[150,181],POSICION61
lookup y,[150,185,150],POSICION62
lookup y,[150],POSICION63'Servo reparado'
GOSUB SERVOS
NEXT y
RETURN  

caminar:
For x = 0 to veces
for y = 0 to 8
lookup y,[123],POSICION11
lookup y,[145,145,145,185,144],POSICION12
lookup y,[134,134,134,155],POSICION13

lookup y,[173],POSICION21
lookup y,[150,150,150,150,150,185,146],POSICION22
lookup y,[133,133,133,133,133,158],POSICION23

lookup y,[150,119],POSICION31
lookup y,[150,185,150],POSICION32
lookup y,[150],POSICION33

lookup y,[175],POSICION41'FUTABA'
lookup y,[150,150,150,150,150,150,150,185,150],POSICION42
lookup y,[150,150,150,150,150,150,150,179],POSICION43'FUTABA'

lookup y,[173],POSICION51
lookup y,[150,150,150,150,150,150,150,185,150],pOSICION52
lookup y,[150,150,150,150,150,150,150,120],POSICION53

lookup y,[150,181],POSICION61
lookup y,[150,185,150],POSICION62
lookup y,[150],POSICION63 'servo reparado'
GOSUB SERVOS
NEXT y
next x
RETURN

'==================================================================
' SE ENVIAN LAS SEÑALES DE POSICIONAMIENTO A LOS SERVOS'

 SERVOS:
    porta = 0 'LOS PUERTOS INICIAN CON UN PULSO EN 0'
    portb = 0
    portc = 0
    FOR z = 0 TO vel ' VELOCIDAD ENTRE MOVIMIENTOS'
    
    PULSOUT servo11,POSICION11
    PULSOUT servo12,POSICION12
    PULSOUT servo13,POSICION13
    
    PULSOUT servo21,POSICION21
    PULSOUT servo22,POSICION22
    PULSOUT servo23,POSICION23
    
    pulsout servo31,POSICION31
    pulsout servo32,POSICION32
    pulsout servo33,POSICION33
    
    pulsout servo41,POSICION41
    pulsout servo42,POSICION42
    pulsout servo43,POSICION43
    
    pulsout servo51,POSICION51
    pulsout servo52,POSICION52
    pulsout servo53,POSICION53
    
    pulsout servo61,POSICION61
    pulsout servo62,POSICION62
    pulsout servo63,POSICION63
    NEXT    z
  
    RETURN 'regresa a la subrutina desde la cual se envía los pulsos'



Estoy usando unos servos Hitec 475 y unos futaba 3003. y haber si me consigo unos mg995 que estan de lujo.

Ahora lo que estoy intentando hacer es que tenga movimiendos mas naturales (lentos), pero no encuentro la forma.
hasta ahora como ven puedo controlar el tiempo que hay entre cada movimiento del servo, pero eso no me sirve.

Lo que se me ocurre es mover el servo grado por grado, por ejemplo de 90° a 150°
He usado el comando Lookup2 que es casi lo mismo que el lookup, pero podemos meter una variable dentro y extraer todos los datos, por ejemplo:

for a = 90 to 150
for y = 0 to 8 ------> no sabemos por que no ocurre nada cuando cambiamos este valor, se supone que seria de 0 to 59 (cantidad de grados de 90 a 150)
lookup y,[a],POSICION11

next y
next a

El problema que tengo es que genera tres veces más codigo que el lookup normal, aparte de que solo puedo mover simultaneamente varios servos con esa instruccion, pero no puedo moverlos individualmente.

Espero que me ayuden, de antemano muchas gracias

« Última modificación: 25 de Agosto de 2009, 22:40:07 por Burrillo »
"The walls between art and engineering exist only in our minds"