Autor Tema: Control servos con pic simulador  (Leído 15904 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado fco1306

  • PIC16
  • ***
  • Mensajes: 128
Control servos con pic simulador
« en: 12 de Octubre de 2010, 16:53:09 »
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

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3554
Re: Control servos con pic simulador
« Respuesta #1 en: 12 de Octubre de 2010, 19:42:46 »
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
« Última modificación: 12 de Octubre de 2010, 19:53:27 por dogflu66 »
Saludos desde Granada, España.

Desconectado fco1306

  • PIC16
  • ***
  • Mensajes: 128
Re: Control servos con pic simulador
« Respuesta #2 en: 14 de Octubre de 2010, 16:20:34 »
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                             

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3554
Re: Control servos con pic simulador
« Respuesta #3 en: 14 de Octubre de 2010, 20:47:55 »
Una vez que funciona puedes bajar el valor de "periodo" hasta el minimo que siga funcionando el servo.

Código: vb.net
  1. 'Trabajando con servos, PIC12F675
  2. Define CONF_WORD = 0x3184
  3. Define CLOCK_FREQUENCY = 4
  4. AllDigital  'todos los pines digitales
  5. Symbol rele = GPIO.0  'define los pines entradas/salidas
  6. Symbol rojo = GPIO.1
  7. Symbol verde = GPIO.2
  8. Symbol progr = GPIO.3
  9. Symbol boton = GPIO.4
  10. Symbol servo = GPIO.5
  11. TRISIO = %011000
  12. 'define variables
  13. Dim velocidad As Byte
  14. Dim n As Byte
  15. Dim posicion As Byte
  16. Dim angulo As Byte
  17. Dim angulo1 As Byte
  18. Dim outon As Byte  'Tiempo de la señal de control del servo a On (duty cycle)
  19. Dim outoff As Word  'Tiempo de la señal de control del servo a Off
  20. Dim periodo As Word  'Periodo de la frecuencia de trabajo de la señal de control del servo
  21.  
  22. 'posiciona el servo en su sitio cuando se conecta la alimentación
  23. 'conecta los leds según la posición y el relè
  24. rojo = 0
  25. verde = 0
  26. rele = 0
  27. servo = 0
  28. periodo = 2000  '20mSeg., para servos de 50Hz, señal a On mas señal a Off = 20mSeg.
  29.  
  30. outon = 160  '1.6mSeg.
  31. outoff = (periodo - outon) * 10  'Calculo tiempo de la señal a Off en uSeg.
  32. For n = 0 To 74  'Se repite durante 1500mSeg. para dar tiempo al servo a posicionarse
  33.     ServoOut servo, outon  '1.6mSeg. (señal a On)
  34.     WaitUs outoff  'Tiempo de la señal a Off
  35. Next n
  36. WaitMs 500
  37.  
  38. Read 01, posicion
  39. If posicion = 0xff Then
  40.     Write 01, 01
  41.     For n = 1 To 200 Step 1
  42.         ServoOut servo, 160
  43.     Next n
  44.     WaitMs 200
  45.     rojo = 1
  46.     verde = 1
  47.     rele = 0
  48. Endif
  49.  
  50. If posicion = 01 Then
  51.     Write 01, 01
  52.     For n = 1 To 200 Step 1
  53.         ServoOut servo, 160
  54.         WaitMs 200
  55.     Next n
  56.     rojo = 1
  57.     verde = 1
  58.     rele = 0
  59. Endif
  60.  
  61. If posicion = 02 Then
  62.     For n = 1 To 200 Step 1
  63.         ServoOut servo, 190
  64.     Next n
  65.     WaitMs 200
  66.     rojo = 1
  67.     verde = 0
  68.     rele = 0
  69. Endif
  70.  
  71. If posicion = 03 Then
  72.     For n = 1 To 200 Step 1
  73.         ServoOut servo, 130
  74.     Next n
  75.     WaitMs 200
  76.     rojo = 0
  77.     verde = 1
  78.     rele = 1
  79. Endif
  80.  
  81. 'inicio programa
  82. main:
  83.     Read 01, posicion
  84.     If progr = 1 Then
  85.         WaitMs 200
  86.         Gosub pulso
  87.     Endif
  88.  
  89.     If boton = 1 Then
  90.         WaitMs 200
  91.         Gosub mover_servo
  92.     Endif
  93.  
  94. Goto main
  95. End                                              
  96.  
  97. pulso:
  98.     For n = 1 To 200 Step 1
  99.         ServoOut servo, 160
  100.     Next n
  101.     WaitMs 200
  102.     rojo = 1
  103.     verde = 1
  104.     Write 01, 01
  105. Return                                            
  106.  
  107. 'mueve el servo
  108. mover_servo:
  109.     Read 01, posicion
  110.     If posicion = 01 Then
  111.     'el servo està en centro y tiene que pasar a dch
  112.         For n = 160 To 190 Step 1
  113.             ServoOut servo, n
  114.             WaitMs 100
  115.         Next n
  116.         WaitMs 200
  117.         rojo = 0
  118.         verde = 0
  119.         WaitMs 200
  120.         rojo = 1
  121.         verde = 0
  122.         rele = 1
  123.         Write 01, 02
  124.     Endif
  125.  
  126.     If posicion = 02 Then
  127.     'el servo està en dch y tiene que pasar a izq
  128.         For n = 190 To 130 Step -1
  129.             ServoOut servo, n
  130.             WaitMs 100
  131.         Next n
  132.         WaitMs 200
  133.         rojo = 0
  134.         verde = 0
  135.         WaitMs 200
  136.         rojo = 0
  137.         verde = 1
  138.         rele = 0
  139.         Write 01, 03
  140.     Endif
  141.  
  142.     If posicion = 03 Then
  143.     'el servo está en izq y tiene que pasar a dch
  144.         For n = 130 To 190 Step 1
  145.             ServoOut servo, n
  146.             WaitMs 100
  147.         Next n
  148.         WaitMs 200
  149.         rojo = 0
  150.         verde = 0
  151.         WaitMs 200
  152.         rojo = 1
  153.         verde = 0
  154.         rele = 1
  155.         Write 01, 02
  156.     Endif
  157. Return
« Última modificación: 18 de Octubre de 2010, 19:12:48 por dogflu66 »
Saludos desde Granada, España.

Desconectado fco1306

  • PIC16
  • ***
  • Mensajes: 128
Re: Control servos con pic simulador
« Respuesta #4 en: 15 de Octubre de 2010, 16:17:43 »
 :) :)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: [Seleccionar]
'
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                                           


Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3554
Re: Control servos con pic simulador
« Respuesta #5 en: 16 de Octubre de 2010, 01:38:35 »
Control de velocidad:

Código: vb.net
  1. velocidad = 50  'Velocidad a la que se mueve el servo
  2. For outon = 160 To 190  'De un punto a otro
  3.     outoff = (periodo - outon) * 10  'Calculo tiempo de la senal a Off en uSeg.
  4.     For n = 0 To velocidad 'Control velocidad
  5.         ServoOut servo, outon  'Senal a on
  6.         WaitUs outoff  'Tiempo de la senal a Off
  7.     Next n
  8. Next outon
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3554
Re: Control servos con pic simulador
« Respuesta #6 en: 16 de Octubre de 2010, 12:14:32 »
No tienes por qué trabajar con la función del sistema, puedes crearte la tuya propia:

Código: vb.net
  1. Define CONF_WORD = 0x31c4
  2. Define CLOCK_FREQUENCY = 4
  3. '********************************************************************************
  4. 'NOMBRE: 12F675 Mini-EBasic Trabajando con Servos 1
  5. 'MICRO: PIC12F675, 4Mhz Interno
  6. 'DESCRIPCION: Circuito para hacer practicas con PWM, ADC, RS232 y ICSP
  7. 'FECHA/AUTOR: By COS, 09/07, 16/10
  8. 'Version 1.0
  9. 'Puerto RS232 optoacoplado para depuracion y muestra de datos
  10. 'Programacion del microcontrolador en placa (ICSP)
  11. '********************************************************************************
  12. 'Define SEROUT_DELAYUS = 0
  13. '************* Configuracion modulos generales (E/S) *********
  14. CMCON = 0x07  'comparator off
  15. VRCON = 0x00  'vref off, comparador
  16. ANSEL = %00010100  'fosc/8 (4Mhz=2uSeg.), an2 en mode analogico, resto de pin digitales
  17. ADCON0 = %00001001  'adc a 8bit, vdd reference, adc On
  18. OSCCAL = 68  'calibracion del oscilador interno
  19. TRISIO = 0xff  'tri-state pins, entradas
  20. TRISIO.4 = 0  'GP4 pin, como salida, Tx puerto serie
  21. TRISIO.5 = 0  'GP5 pin, como salida, Control del servomotor
  22. GPIO.5 = 0  'valor inicial a cero
  23. '*********************Configuracion del Timer1*****************************
  24. T1CON.TMR1CS = 0  'bit de seleccion de reloj para el timer1, interno Fosc/4
  25. T1CON.T1CKPS0 = 0  'bit de seleccion del prescaler para el reloj del timer1
  26. T1CON.T1CKPS1 = 0  'bit de seleccion del prescaler para el reloj del timer1
  27. TMR1H = 0xff  'carga el byte alto del registro del tiemr1 (1mSeg)
  28. TMR1L = 0x9c  'carga el byte bajo del registro del timer1 (1mSeg)
  29. 'INTCON.T1IE = 1  'bit de habilitacion de interrupcion de TMR1 por rebose
  30. T1CON.TMR1ON = 1  'bit de habilitacion del temporizador timer1
  31. 'PIE1.TMR1IE = 1  'activa la interrupcion del timer1
  32. '*********************Habilitacion****************************************
  33. 'INTCON.PEIE = 1  'habilitacion de interrupciones de perifericos
  34. 'Enable  'intcon.GIE = 1, habilita las interrupciones generales
  35. '************* Rutina del programa ***************************************
  36. '----Definiciones
  37. '--- Variables
  38. Dim outon As Word
  39. Dim n As Word
  40. main:
  41.     For n = 0 To 75  'Posicion inicial
  42.         Call servo(400, 5)
  43.     Next n
  44.     For outon = 400 To 2250 Step 5  'De un extremo al otro
  45.             Call servo(outon, 5)
  46.     Next outon
  47.     For outon = 2250 To 400 Step -10  'De un extremo al otro
  48.             Call servo(outon, 5)
  49.     Next outon
  50.     For outon = 400 To 2250 Step 50  'De un extremo al otro
  51.             Call servo(outon, 5)
  52.     Next outon
  53.     While n = n  'Servo parado manteniendo la ultima posicion
  54.         Call servo(outon, 5)
  55.     Wend
  56. Goto main
  57. End                                              
  58. 'Mi función para controlar Servos Futaba S3003
  59. 'x = Posición del servo
  60. 'pin = pin de la senal de control del servo
  61. 'Máximo izquierda 2250, minimo derecha 400
  62. '20000uSeg. para servos de 50Hz
  63. Proc servo(x As Word, pin As Byte)
  64.     Const periodo = 20000  'Periodo en uSeg. para servos de 50Hz
  65.     Dim outoff As Word  'Variable local
  66.     outoff = periodo - x  'Calculo de la senal a Off
  67.     If x < 400 Then x = 400  'Máximo derecha
  68.     If x > 2250 Then x = 2250  'Máximo izquierda
  69.     If pin = 0 Then GPIO.0 = 1  '*/ Seleccina pin de control
  70.     If pin = 1 Then GPIO.1 = 1
  71.     If pin = 2 Then GPIO.2 = 1
  72.     If pin = 4 Then GPIO.4 = 1
  73.     If pin = 5 Then GPIO.5 = 1  '*/
  74.     WaitUs x  'Senal de control a On
  75.     If pin = 0 Then GPIO.0 = 0  '*/ Selecciona pin de control
  76.     If pin = 1 Then GPIO.1 = 0
  77.     If pin = 2 Then GPIO.2 = 0
  78.     If pin = 4 Then GPIO.4 = 0
  79.     If pin = 5 Then GPIO.5 = 0  '*/
  80.     WaitUs outoff  'Senal de control a Off
  81. End Proc

Un video con el ejemplo anterior:

Saludos desde Granada, España.

Desconectado fco1306

  • PIC16
  • ***
  • Mensajes: 128
Re: Control servos con pic simulador
« Respuesta #7 en: 17 de Octubre de 2010, 15:44:30 »
He probado con el código
Código: [Seleccionar]
velocidad = 50  'Velocidad a la que se mueve el servo
For outon = 160 To 190  'De un punto a otro   
outoff = (periodo - outon) * 10  'Calculo tiempo de la senal a Off en uSeg.   
For n = 0 To velocidad 'Control velocidad     
  ServoOut servo, outon  'Senal a on     
  WaitUs outoff  'Tiempo de la senal a Off   
 Next n
Next outon
y los servos se comportan de manera extraña.
Se mueven muy despacio,llega un momento en que dejan de moverse y comienzan a temblar.Parece como si quisieran moverse pero no pueden ,al mismo tiempo los leds y relés comienzan a conectarse y desconectarse.
Estoy usando servos minis.No son de la misma calidad que el futaba que aparece en el vídeo.
Con el código
Código: [Seleccionar]
For n = 160 To 190 Step 1
ServoOut servo, n
WaitMs 100
Next n
Se mueven sin problemas , con un movimiento lento, pero a saltitos.
Si aumento la pausa,se mueven más despacio,pero a saltos más bruscos.
La calidad de los servos que uso no es muy buena,pienso que puede ser por ello.
Un saludo y muchas gracias,me has sido de gran ayuda.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3554
Re: Control servos con pic simulador
« Respuesta #8 en: 17 de Octubre de 2010, 17:42:01 »
OK, lo he probado con un servo pequeño sin marca, y ajustando los márgenes y bajando el periodo a 15mSeg, funciona bien.

En tu caso:
For n = 160 To 190 Step 1
ServoOut servo, n
WaitMs 100
Next n

100 + n = Periodo muy elevado, fuera de rango, el servo se mueve a saltos y genera ruidos y pierde fuerza.

El mío sin marca y sin datasheet y teniendo en cuenta que está bastante cascado funciona con estos parámetros:
'izq. 2450uSeg. (X), der. 500uSeg. (X), periodo 15mSeg+XmSeg.

Y desconozco con que hardware estas trabajando, si quieres, por pura curiosidad puedes ver el esquema de la Mini-EBasic, que tiene las protecciones
mínimas como para funcionar en casa, en otro tipo de ambiente es posible que se tenga que añadir alguna más.
http://www.todopic.com.ar/foros/index.php?topic=24123.0
http://www.todopic.com.ar/foros/index.php?topic=24123.msg195614#msg195614
« Última modificación: 17 de Octubre de 2010, 18:01:55 por dogflu66 »
Saludos desde Granada, España.

Desconectado fco1306

  • PIC16
  • ***
  • Mensajes: 128
Re: Control servos con pic simulador
« Respuesta #9 en: 18 de Octubre de 2010, 06:44:21 »

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3554
Re: Control servos con pic simulador
« Respuesta #10 en: 18 de Octubre de 2010, 08:28:44 »
No se donde puede estar el problema el servo se ve bueno.
http://www.rctoys.com/pdf/hitec-servos/HIT-HS55.pdf
Saludos desde Granada, España.

Desconectado fco1306

  • PIC16
  • ***
  • Mensajes: 128
Re: Control servos con pic simulador
« Respuesta #11 en: 18 de Octubre de 2010, 11:56:30 »
Pues no sé.
He mirado la electrónica un montón de veces. No encuentro donde puede estar el fallo. Una duda que tengo es que uso un 7805 para 4 leds,4 relés 4 pic y 4 servos. Que la fuente no sea suficiente para alimentar al circuito.
Lo que no acabo de entender es el control de la velocidad. Por la web aparecen páginas que explican el posicionamiento del servo ,pero no he encontrado nada que me sirva para la velocidad.
Si no he entendido mal , la separación entre pulsos 20mseg. Es decir el tiempo a on+el tiempo a off=20mseg.
que es lo que hace el código:

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

repitiéndose varias veces para dar tiempo al servo a posicionarse.
Pero, el  control de velocidad no lo veo. ¿alguna página en donde aparezca explicado?
Muchas gracias

Desconectado fco1306

  • PIC16
  • ***
  • Mensajes: 128
Re: Control servos con pic simulador
« Respuesta #12 en: 18 de Octubre de 2010, 16:34:08 »
Pues casi seguro que tengo un problema con la fuente de alimentación.En un momento hice una con un 7805 y un par de condensadores y funciona sin ningún problema.Los servos se han movido con bastante suavidad aplicando tu código. Voy a hacer otra.
Ya entiendo como se controla la velocidad.
Muchas gracias por tu ayuda.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3554
Re: Control servos con pic simulador
« Respuesta #13 en: 18 de Octubre de 2010, 19:10:21 »
Parece que ya dominas la técnica, pero de todas formas:

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

Esto está basado en que cuando envías una posición al servo el no la memoriza, y tienes que ir repitiéndola hasta que llegue a ella. Este tiene que hacer un recorrido que le llevara un tiempo, por esto se repite la misma orden hasta que llega a la posición deseada.
Según el bucle anterior:
En el caso del ejemplo 1.6mSeg + 18.4mSeg. = 20mSg. * 75 veces se repite el bucle = 1500mSeg., en realidad esta equivocado es * 76 ya que el cero se cuenta 1520mSeg. De esto deducimos que durante 1520mSeg. estaremos enviando la misma orden al servo, para que le dé tiempo a llegar a su posición, realmente no deberíamos parar de enviar la posición ya que si paramos, el servo se desconecta y queda flojo, solo con la fuerza que oponen sus mecanismos internos al giro, en el caso de querer obtener toda su potencia hay que mantener la trama de control de forma permanente, de esta manera si ejercemos fuerza exterior para moverlo, el servo, se opondrá a ser movido absorbiendo corriente, proporcionalmente a la fuerza que ejerza el mecanismo exterior que controla.

PD: Es cierto, no he visto ninguna rutina de control de velocidad en la red.

« Última modificación: 18 de Octubre de 2010, 19:32:07 por dogflu66 »
Saludos desde Granada, España.

Desconectado fco1306

  • PIC16
  • ***
  • Mensajes: 128
Re: Control servos con pic simulador
« Respuesta #14 en: 01 de Enero de 2011, 19:16:06 »
Sigo intentando mejorar el programa.He añadido otro pulsador más. Uno aumenta el recorrido del servo ,el otro lo disminuye. además el recorrido a dch e izq se puede ajustar independientemente. Al probarlo en proteus va bien, cuando lo paso a la placa que tengo hace cosas raras. Sí aumento y disminuyo el ángulo del servo pero después no se mueve bien.
Os dejo los ficheros por si podéis hacer algo.
Un saludo