Microcontroladores PIC > Lenguaje Basic para microcontroladores PIC

Control servos con pic simulador

(1/6) > >>

fco1306:
Tengo este programa que mueve servos y recuerda su posición cuando se enciende la alimentación.
Un botón sirve para posicionarlo en el centro y otro para moverlo a derecha e izquierda.Además controla un par de leds y un relé.

La cuestión es que cuando enciendo y apago la alimentación el servo se mueve, aunque no se hayan pulsado los botones.
Cuando pulso el boton para moverlo al centro, tengo que pulsarlo varias veces para que se posicione en el centro,cuando en teoría con una pulsación debería ir.
Cuando lo simulo con proteus no tengo problemas.No sé donde puede estar el problema.¿Cómo debo configurar los bits en el iceprog para programar el pic?
Muchas gracias

dogflu66:
Declaraste los fuses en el código de tu programa, así que, tu programador no debe, no puede modificarlos. Debería de configurarse de forma automática con la misma configuración de los fuses de tu código.
No sé porque el servo hace cosas raras en el arranque, lo que puedes hacer es configurar la salida del servo a controlar lo antes posible al estado bajo, o arranca la rutina de control del servo lo antes posible.
Con respecto a por que los servos no van a su posición, pues lo más probable sea porque no le das tiempo a que llegue. El servo tarda un tiempo en realizar el desplazamiento mínimo, la suma de estos tiempos mínimos ayudado por la velocidad, será el tiempo que tarde en llegar el servo a su lugar. Por lo tanto deberías mantener la señal de control hasta que llegue al destino.

    While hasta llegar a posicion
       ServoOut servo, 160
    Wend

Repetir ServoOut servo, 160 hasta llegar a la posicion.

Puedes ver los ejemplos del indice de este hilo:

http://www.todopic.com.ar/foros/index.php?topic=14917.0

Y como puedes ver en este ejemplo no se puede dejar de refrescar la posicion del servo

http://www.todopic.com.ar/foros/index.php?topic=14917.msg113728#msg113728

fco1306:
He modificado un poco el código ,le he puesto una pausa de 200ms después de mover el servo y ha mejorado.
Lo que no consigo es hacerme con el control del servo al inicio.Cuando conecto la alimentación se mueve hacia cualquier sitio.
Le tengo puesto que vaya a la posición 160 pero no hace caso.
Sólo cuando pulso el botón el servo va a su sitio.Después conserva la posición y se mueve a dch o izq según voy pulsando el botón.
No sé que puede pasar

AllDigital  'todos los pines digitales
Symbol rele = GPIO.0  'define los pines entradas/salidas
Symbol rojo = GPIO.1
Symbol verde = GPIO.2
Symbol progr = GPIO.3
Symbol boton = GPIO.4
Symbol servo = GPIO.5

TRISIO = %011000

'define variables
Dim velocidad As Byte
Dim n As Byte
Dim posicion As Byte
Dim angulo As Byte
Dim angulo1 As Byte
'posiciona el servo en su sitio cuando se conecta la alimentación
'conecta los leds según la posición y el relè



rojo = 0
verde = 0
rele = 0
servo = 0
For n = 1 To 200 Step 1
ServoOut servo, 160
Next n
WaitMs 500


Read 01, posicion
If posicion = 0xff Then
Write 01, 01
For n = 1 To 200 Step 1
ServoOut servo, 160
Next n
WaitMs 200
rojo = 1
verde = 1
rele = 0
Endif

If posicion = 01 Then
Write 01, 01
For n = 1 To 200 Step 1
ServoOut servo, 160
WaitMs 200
Next n
rojo = 1
verde = 1
rele = 0
Endif


If posicion = 02 Then

For n = 1 To 200 Step 1
ServoOut servo, 190
Next n
WaitMs 200
rojo = 1
verde = 0
rele = 0
Endif

If posicion = 03 Then
For n = 1 To 200 Step 1
ServoOut servo, 130
Next n
WaitMs 200
rojo = 0
verde = 1
rele = 1
Endif

'inicio programa
inicio:
Read 01, posicion

If progr = 1 Then
WaitMs 200
Gosub pulso
Endif

If boton = 1 Then
WaitMs 200
Gosub mover_servo
Endif

Goto inicio

End                                               




pulso:
For n = 1 To 200 Step 1
ServoOut servo, 160
Next n
WaitMs 200
rojo = 1
verde = 1
Write 01, 01
Return                                           

'mueve el servo
mover_servo:
Read 01, posicion

If posicion = 01 Then
'el servo està en centro y tiene que pasar a dch

For n = 160 To 190 Step 1
ServoOut servo, n
WaitMs 100
Next n
WaitMs 200
rojo = 0
verde = 0
WaitMs 200
rojo = 1
verde = 0
rele = 1
Write 01, 02
Endif



If posicion = 02 Then
'el servo està en dch y tiene que pasar a izq
For n = 190 To 130 Step -1
ServoOut servo, n
WaitMs 100
Next n
WaitMs 200
rojo = 0
verde = 0
WaitMs 200
rojo = 0
verde = 1
rele = 0
Write 01, 03
Endif

If posicion = 03 Then
'el servo está en izq y tiene que pasar a dch
For n = 130 To 190 Step 1
ServoOut servo, n
WaitMs 100
Next n
WaitMs 200
rojo = 0
verde = 0
WaitMs 200

rojo = 1
verde = 0
rele = 1
Write 01, 02
Endif

Return                             

dogflu66:
Una vez que funciona puedes bajar el valor de "periodo" hasta el minimo que siga funcionando el servo.


--- Código: vb.net ---'Trabajando con servos, PIC12F675Define CONF_WORD = 0x3184Define CLOCK_FREQUENCY = 4AllDigital  'todos los pines digitalesSymbol rele = GPIO.0  'define los pines entradas/salidasSymbol rojo = GPIO.1Symbol verde = GPIO.2Symbol progr = GPIO.3Symbol boton = GPIO.4Symbol servo = GPIO.5TRISIO = %011000'define variablesDim velocidad As ByteDim n As ByteDim posicion As ByteDim angulo As ByteDim angulo1 As ByteDim outon As Byte  'Tiempo de la señal de control del servo a On (duty cycle)Dim outoff As Word  'Tiempo de la señal de control del servo a OffDim periodo As Word  'Periodo de la frecuencia de trabajo de la señal de control del servo 'posiciona el servo en su sitio cuando se conecta la alimentación'conecta los leds según la posición y el relèrojo = 0verde = 0rele = 0servo = 0periodo = 2000  '20mSeg., para servos de 50Hz, señal a On mas señal a Off = 20mSeg. outon = 160  '1.6mSeg.outoff = (periodo - outon) * 10  'Calculo tiempo de la señal a Off en uSeg.For n = 0 To 74  'Se repite durante 1500mSeg. para dar tiempo al servo a posicionarse    ServoOut servo, outon  '1.6mSeg. (señal a On)    WaitUs outoff  'Tiempo de la señal a OffNext nWaitMs 500 Read 01, posicionIf posicion = 0xff Then    Write 01, 01    For n = 1 To 200 Step 1        ServoOut servo, 160    Next n    WaitMs 200    rojo = 1    verde = 1    rele = 0Endif If posicion = 01 Then    Write 01, 01    For n = 1 To 200 Step 1        ServoOut servo, 160        WaitMs 200    Next n    rojo = 1    verde = 1    rele = 0Endif If posicion = 02 Then    For n = 1 To 200 Step 1        ServoOut servo, 190    Next n    WaitMs 200    rojo = 1    verde = 0    rele = 0Endif If posicion = 03 Then    For n = 1 To 200 Step 1        ServoOut servo, 130    Next n    WaitMs 200    rojo = 0    verde = 1    rele = 1Endif 'inicio programamain:    Read 01, posicion    If progr = 1 Then        WaitMs 200        Gosub pulso    Endif     If boton = 1 Then        WaitMs 200        Gosub mover_servo    Endif Goto mainEnd                                                pulso:    For n = 1 To 200 Step 1        ServoOut servo, 160    Next n    WaitMs 200    rojo = 1    verde = 1    Write 01, 01Return                                             'mueve el servomover_servo:    Read 01, posicion    If posicion = 01 Then    'el servo està en centro y tiene que pasar a dch        For n = 160 To 190 Step 1            ServoOut servo, n            WaitMs 100        Next n        WaitMs 200        rojo = 0        verde = 0        WaitMs 200        rojo = 1        verde = 0        rele = 1        Write 01, 02    Endif     If posicion = 02 Then    'el servo està en dch y tiene que pasar a izq        For n = 190 To 130 Step -1            ServoOut servo, n            WaitMs 100        Next n        WaitMs 200        rojo = 0        verde = 0        WaitMs 200        rojo = 0        verde = 1        rele = 0        Write 01, 03    Endif     If posicion = 03 Then    'el servo está en izq y tiene que pasar a dch        For n = 130 To 190 Step 1            ServoOut servo, n            WaitMs 100        Next n        WaitMs 200        rojo = 0        verde = 0        WaitMs 200        rojo = 1        verde = 0        rele = 1        Write 01, 02    EndifReturn

fco1306:
 :) :)Muchas,muchas gracias, funciona perfectamente.El servo se va al centro y se mantiene hasta que se pulsa el botón.Además el movimiento es muy suave.
He modificado un poco el código para que se posicione en la dch o izq según quedó anteriormente.
Una última cosa.Para que se mueva por ejemplo de 160 a 190  y a poca velocidad ¿se puede mejorar el código que tengo?


For n = 160 To 190 Step 1
ServoOut servo, n
WaitMs 100
Next n






--- Código: ---'
Trabajando con servos, PIC12F629
Define CONF_WORD = 0x3184
Define CLOCK_FREQUENCY = 4
AllDigital  'todos los pines digitales
Symbol rele = GPIO.0  'define los pines entradas/salidas
Symbol rojo = GPIO.1
Symbol verde = GPIO.2
Symbol progr = GPIO.3
Symbol boton = GPIO.4
Symbol servo = GPIO.5
TRISIO = %011000
'define variables
Dim velocidad As Byte
Dim n As Byte
Dim posicion As Byte
Dim angulo As Byte
Dim angulo1 As Byte
Dim outon As Byte  'Tiempo de la señal de control del servo a On (duty cycle)
Dim outoff As Word  'Tiempo de la señal de control del servo a Off
Dim periodo As Word  'Periodo de la frecuencia de trabajo de la señal de control del servo
'posiciona el servo en su sitio cuando se conecta la alimentación
'conecta los leds según la posición y el relè
rojo = 0
verde = 0
rele = 0
servo = 0
periodo = 2000  '20mSeg., para servos de 50Hz, señal a On mas señal a Off = 20mSeg.
'outon = 160  '1.6mSeg.
'outoff = (periodo - outon) * 10  'Calculo tiempo de la señal a Off en uSeg.
'For n = 0 To 75  'Se repite durante 1500mSeg. para dar tiempo al servo a posicionarse
'ServoOut servo, outon  '1.6mSeg. (señal a On)
'WaitUs outoff  'Tiempo de la señal a Off
'Next n

Read 01, posicion
If posicion = 0xff Or posicion = 01 Then
Write 01, 01
outon = 160  '1.6mSeg.
outoff = (periodo - outon) * 10  'Calculo tiempo de la señal a Off en uSeg.
For n = 0 To 75  'Se repite durante 1500mSeg. para dar tiempo al servo a posicionarse
ServoOut servo, outon  '1.6mSeg. (señal a On)
WaitUs outoff  'Tiempo de la señal a Off
Next n
WaitMs 200
rojo = 1
verde = 1
rele = 0
Endif


If posicion = 02 Then
outon = 190  '1.9mSeg.
outoff = (periodo - outon) * 10  'Calculo tiempo de la señal a Off en uSeg.
For n = 0 To 75  'Se repite durante 1500mSeg. para dar tiempo al servo a posicionarse
ServoOut servo, outon  '1.9mSeg. (señal a On)
WaitUs outoff  'Tiempo de la señal a Off
Next n
WaitMs 200
rojo = 1
verde = 0
rele = 0
Endif

If posicion = 03 Then
outon = 130  '1.3mSeg.
outoff = (periodo - outon) * 10  'Calculo tiempo de la señal a Off en uSeg.
For n = 0 To 75  'Se repite durante 1500mSeg. para dar tiempo al servo a posicionarse
ServoOut servo, outon  '1.3mSeg. (señal a On)
WaitUs outoff  'Tiempo de la señal a Off
Next n
WaitMs 200
rojo = 0
verde = 1
rele = 1
Endif

'inicio programa
main:
Read 01, posicion
If progr = 1 Then
WaitMs 200
Gosub pulso
Endif

If boton = 1 Then
WaitMs 200
Gosub mover_servo
Endif

Goto main
End                                               

pulso:
outon = 160  '1.6mSeg.
outoff = (periodo - outon) * 10  'Calculo tiempo de la señal a Off en uSeg.
For n = 0 To 75  'Se repite durante 1500mSeg. para dar tiempo al servo a posicionarse
ServoOut servo, outon  '1.6mSeg. (señal a On)
WaitUs outoff  'Tiempo de la señal a Off
Next n
WaitMs 200
rojo = 1
verde = 1
Write 01, 01
Return                                           

'mueve el servo
mover_servo:
Read 01, posicion
If posicion = 01 Then
'el servo està en centro y tiene que pasar a dch
For n = 160 To 190 Step 1
ServoOut servo, n
WaitMs 100
Next n
WaitMs 200
rojo = 0
verde = 0
WaitMs 200

rojo = 1
verde = 0
rele = 1
Write 01, 02
Endif

If posicion = 02 Then
'el servo està en dch y tiene que pasar a izq
For n = 190 To 130 Step -1
ServoOut servo, n
WaitMs 100
Next n
WaitMs 200
rojo = 0
verde = 0
WaitMs 200
rojo = 0
verde = 1
rele = 0
Write 01, 03
Endif

If posicion = 03 Then
'el servo está en izq y tiene que pasar a dch
For n = 130 To 190 Step 1
ServoOut servo, n
WaitMs 100
Next n
WaitMs 200
rojo = 0
verde = 0
WaitMs 200
rojo = 1
verde = 0
rele = 1
Write 01, 02
Endif
Return                                           


--- Fin del código ---

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa