Foros del Web » Programación para mayores de 30 ;) » Programación General » Visual Basic clásico »

Aplicacion para servomotor

Estas en el tema de Aplicacion para servomotor en el foro de Visual Basic clásico en Foros del Web. Hola, Estoy haciendo un programa para controlar servomotores, y necesito que envie por el puerto paralelo impulsos de 0,1 milisegundos, y la propiedad interval del ...
  #1 (permalink)  
Antiguo 11/06/2010, 11:57
 
Fecha de Ingreso: febrero-2007
Mensajes: 7
Antigüedad: 17 años, 1 mes
Puntos: 0
Aplicacion para servomotor

Hola,

Estoy haciendo un programa para controlar servomotores, y necesito que envie por el puerto paralelo impulsos de 0,1 milisegundos, y la propiedad interval del timer no me deja usar valores decimales.

En concreto necesito enviar un impulso de 20 milisg y otro de entre 0,5 y 2,5 milisg (max y min giro) y esto en bucle infinito. Pero aun con 1ms no me funciona la aplicación.

Pego el codigo por si alguien puede ayudarme :

Código:
Private Sub Form_Load()
Tiempo.Text = HScroll1.Value
TEMP_ESPERA.Interval = 20 'espera de 20 ms
TEMP_PULSO.Interval = (Tiempo.Text) ' * 1000
Comenzar.Enabled = True
Detener.Enabled = False
Motor1.BackColor = &H0
End Sub
Private Sub TEMP_ESPERA_Timer()

'espera y despues del interval ejecuta la acción.

Motor1.BackColor = &HFF00&
Out Val("&H" + "378"), Val(10)
TEMP_ESPERA.Enabled = False
TEMP_PULSO.Enabled = True

End Sub
Private Sub TEMP_PULSO_Timer()

'espera y despues del interval ejecuta la acción.

Motor1.BackColor = &HFF&
Out Val("&H" + "378"), Val(0)
TEMP_PULSO.Enabled = False
TEMP_ESPERA.Enabled = True
End Sub
Private Sub Comenzar_Click()
TEMP_ESPERA.Enabled = True
Comenzar.Enabled = False
Detener.Enabled = True
End Sub
Private Sub Detener_Click()
Detener.Enabled = False
Comenzar.Enabled = True
TEMP_ESPERA.Enabled = False
TEMP_PULSO.Enabled = False
Motor1.BackColor = &H0
End Sub
Private Sub HScroll1_Change()
Tiempo.Text = HScroll1.Value
TEMP_PULSO.Interval = (Tiempo.Text) ' *1000
End Sub
Private Sub HScroll1_Scroll()
HScroll1_Change
End Sub
Saludos.
  #2 (permalink)  
Antiguo 11/06/2010, 14:05
Avatar de pkj
pkj
 
Fecha de Ingreso: julio-2006
Ubicación: Órbita sincrónica
Mensajes: 899
Antigüedad: 17 años, 9 meses
Puntos: 29
Respuesta: Aplicacion para servomotor

A ver si esto te sirve:

Código vb:
Ver original
  1. Sub Pulso1(ByVal DuracionActivoMS As Double, Optional ByVal DuracionNoActivoMS As Double)
  2.   Static DuracionActivo As Double
  3.   Static DuracionNoActivo As Double
  4.   Dim Tiempo As Double
  5.   DuracionActivo = DuracionActivoMS / 1000
  6.   DuracionNoActivoMS = DuracionNoActivoMS / 1000
  7.   Do
  8.     If DuracionActivo = 0 Then Exit Do
  9.     Tiempo = Timer + DuracionActivo
  10.     Motor1.BackColor = &HFF00&
  11.     Out Val("&H" + "378"), Val(10)
  12.     DoEvents
  13.     Do While Timer < Tiempo
  14.     Loop
  15.     Tiempo = Timer + DuracionNoActivo
  16.     Motor1.BackColor = &HFF&
  17.     Out Val("&H" + "378"), Val(0)
  18.     DoEvents
  19.     Do While Timer < Tiempo
  20.     Loop
  21.   Loop
  22. End Sub
  23.  
  24. Private Sub Command1_Click()
  25.   Pulso1 2.5, 1
  26. End Sub
  27.  
  28. Private Sub Command2_Click()
  29.   Pulso1 0
  30. End Sub
El command1 debería activar un pulso ciclico de 2.5 ms (aproximadamente) de duracion activo y 1 ms de duracion NO activo (por si la duracion es diferente en ambos estados).

El command2 desactiva el bucle.

Saludos
__________________
No hay preguntas tontas, solo gente estup..., ¡No!, ¿como era? No hay gente que pregunte a tontos... ¡Nooo!... ¡Vaya cabeza!

Última edición por pkj; 11/06/2010 a las 14:14
  #3 (permalink)  
Antiguo 12/06/2010, 03:28
 
Fecha de Ingreso: febrero-2007
Mensajes: 7
Antigüedad: 17 años, 1 mes
Puntos: 0
Respuesta: Aplicacion para servomotor

Muchas gracias por la respuesta PKJ,

La verdad que tras muchas ayer no consegui hacer funcionar tu codigo. Fijo que es fallo mio, pues me da un error en la compilacion, al entrar en "Sub Pulso1" y prober a copiar la subrutina y meterla en "Form_Load" y entonces me cascaba Form_load.

Uso una version de vb6 portable pero imagino que eso dara igual, te adjunto una captura de como queda el codigo con el modulo.



Muchas gracias.
  #4 (permalink)  
Antiguo 12/06/2010, 04:02
Avatar de pkj
pkj
 
Fecha de Ingreso: julio-2006
Ubicación: Órbita sincrónica
Mensajes: 899
Antigüedad: 17 años, 9 meses
Puntos: 29
Respuesta: Aplicacion para servomotor

He encontrado un fallo en la línea:

DuracionNoActivoMS = DuracionNoActivoMS / 1000

que debería ser:

DuracionNoActivo = DuracionNoActivoMS / 1000

Por otro lado puede que el fallo que dices sea porque la variable DuracionNoActivoMS es opcional.

Prueba a cambiar la línea que he comentado y la declaracion de la sub cambiala por:

Sub Pulso1(ByVal DuracionActivoMS As Double, Optional ByVal DuracionNoActivoMS As Double = 1)

Si no es eso no se me ocurre otra cosa.

Suerte.

PD: Comentanos que error te muestra. Yo he compilado ambos códigos sin problemas. Eso si, sin incluir las líneas del Out Val(...., que no tengo declarado.
__________________
No hay preguntas tontas, solo gente estup..., ¡No!, ¿como era? No hay gente que pregunte a tontos... ¡Nooo!... ¡Vaya cabeza!

Última edición por pkj; 12/06/2010 a las 04:36
  #5 (permalink)  
Antiguo 12/06/2010, 06:09
 
Fecha de Ingreso: febrero-2007
Mensajes: 7
Antigüedad: 17 años, 1 mes
Puntos: 0
Respuesta: Aplicacion para servomotor

Hola PKJ,

Gracias de nuevo por tu ayuda. Te resumo.

He instalado vb6 completo por si era de la versión portable, y nada.

El error que me da al compilar es:

Error de compilación:
Procedimiento Sub o Function no definido

He probado a cambiar el sub por function y tampoco.....

Como no se xq me falla y tiene que ser una tonteria, subo el programa por si podeis ojearlo rapidamente.

http://www.mediafire.com/?wmoei5jyzqy

Muchas gracias de nuevo y saludos.
  #6 (permalink)  
Antiguo 12/06/2010, 06:24
Avatar de pkj
pkj
 
Fecha de Ingreso: julio-2006
Ubicación: Órbita sincrónica
Mensajes: 899
Antigüedad: 17 años, 9 meses
Puntos: 29
Respuesta: Aplicacion para servomotor

Aparte de que por algún motivo aparecen errores al cargar el proyecto, el fallo que tienes está en 3 caracteres que parecen espacios pero no son espacios y que te están generando el error.

Carga el proyecto y reemplaza los 2 espacios que hay al comienzo de estas 3 líneas:

DuracionActivo = DuracionActivoMS / 1000
DuracionNoActivo = DuracionNoActivoMS / 1000

Motor1.BackColor = &HFF00&

PD: El error de carga no es a causa de tu proyecto. Es un fallo de mi PC, al que he instalado un nuevo cortafuegos y parece ser que me dá ese error con cualquier proyecto que cargo.
__________________
No hay preguntas tontas, solo gente estup..., ¡No!, ¿como era? No hay gente que pregunte a tontos... ¡Nooo!... ¡Vaya cabeza!

Última edición por pkj; 12/06/2010 a las 06:32
  #7 (permalink)  
Antiguo 12/06/2010, 08:23
 
Fecha de Ingreso: febrero-2007
Mensajes: 7
Antigüedad: 17 años, 1 mes
Puntos: 0
Respuesta: Aplicacion para servomotor

Hola de nuevo,

Por fin puedo ejecutar, cosa rara esos simbolos aparecidos.

Me vas a llamar pesado pero......hay un par de lineas que no entiendo de tu codigo y me gustaria saber como funciona para poder hacer cambios el dia de mañana.

Código:
   Do
        If DuracionActivo = 0 Then Exit Do
        Tiempo = Timer + DuracionActivo ' ¿¿¿¿¿¿¿¿¿ QUE SIGNIFICA ESTA LINEA???????
        Motor1.BackColor = &HFF00&
        Out Val("&H" + "378"), Val(10)
        DoEvents
        Do While Timer < Tiempo   ' Aqui se queda indefinidamente.
    Loop
    
        Tiempo = Timer + DuracionNoActivo
        Motor1.BackColor = &HFF&
        Out Val("&H" + "378"), Val(0)
        DoEvents
        Do While Timer < Tiempo
        Loop
    Loop
La funcion timer no la entiendo en la linea:

Tiempo = Timer + DuracionNoActivo

no se si es el timer de un temporizador, el timer de la hora de sistema....y al llegar al primer bucle => Do While Timer < Tiempo se queda colgado.

Gracias.
  #8 (permalink)  
Antiguo 12/06/2010, 09:21
Avatar de pkj
pkj
 
Fecha de Ingreso: julio-2006
Ubicación: Órbita sincrónica
Mensajes: 899
Antigüedad: 17 años, 9 meses
Puntos: 29
Respuesta: Aplicacion para servomotor

Timer es un contador del sistema que siempre está en marcha.

Tiempo = Timer + DuracionNoActivo
Esto carga la variable tiempo con el valor que contenga el timer mas el tiempo que debe esperar.


Do While Timer < Tiempo
Loop
Aqui hacemos un bucle hasta que el timer del sistema supere el valor de la variable tiempo. En ese momento pasamos el loop y continuamos con la siguiente instrucción.

Espero haberme explicado.

Saludos
__________________
No hay preguntas tontas, solo gente estup..., ¡No!, ¿como era? No hay gente que pregunte a tontos... ¡Nooo!... ¡Vaya cabeza!

Última edición por pkj; 12/06/2010 a las 09:27
  #9 (permalink)  
Antiguo 12/06/2010, 15:14
 
Fecha de Ingreso: febrero-2007
Mensajes: 7
Antigüedad: 17 años, 1 mes
Puntos: 0
De acuerdo Respuesta: Aplicacion para servomotor

Gracias PKJ por la explicación, queda perfectamente claro.

Es una buena idea usar el timer de la propia CPU .

El programa ya esta correcto, y funciona bien. Pero el servo no me gira correctamente, estoy seguro que ya no es fallo de la aplicacion, sino que es algo hardware, imagino que sera por que el puerto paralelo no esta preparado para enviar señales tan rapido.

Asi que tendre que buscar otra de hacerlo.

Muchas gracias por tu ayuda, saludos!!!
  #10 (permalink)  
Antiguo 12/06/2010, 17:04
Avatar de pkj
pkj
 
Fecha de Ingreso: julio-2006
Ubicación: Órbita sincrónica
Mensajes: 899
Antigüedad: 17 años, 9 meses
Puntos: 29
Respuesta: Aplicacion para servomotor

No creo que sea el puerto. La velocidad de cualquier puerto es mucho mayor que eso.

He estado haciendo pruebas y el método no parece ser suficientemente rápido.

He pueso un contador y con ciclos de 50+50ms la velocidad era aproximadamente de 10 ciclos por segundo, pero cuando he probado con 10+10ms ya no pasa de 40 ciclos por segundo, cuando deberían ser 50, y con 1+1ms la velocidad parecía prácticamente la misma.

He probado usando 2 timers y el resultado es casi el mismo. Un poquito más lento aún pero casi igual.

Teniendo en cuenta que mi equipo es bastante decente (lo que descarta falta de potencia) me pregunto si habrá un modo de hacer en eso en VB, y cual será ese modo.

En fin, que haya suerte.
__________________
No hay preguntas tontas, solo gente estup..., ¡No!, ¿como era? No hay gente que pregunte a tontos... ¡Nooo!... ¡Vaya cabeza!
  #11 (permalink)  
Antiguo 12/06/2010, 17:17
 
Fecha de Ingreso: febrero-2007
Mensajes: 7
Antigüedad: 17 años, 1 mes
Puntos: 0
Respuesta: Aplicacion para servomotor

Buffffff......pues tenemos una limitación para VB, jejejeee!!!!

Es mucha frecuencia de operaciones, y aunq el micro lo soporte, = VB no es capaz de gestionarlo.

Por eso los timmer tienen la minima precision en 1 milesima de sg.

Nada, toca buscar otra forma.

Saludos y gracias.
  #12 (permalink)  
Antiguo 28/06/2010, 12:36
 
Fecha de Ingreso: junio-2010
Mensajes: 2
Antigüedad: 13 años, 10 meses
Puntos: 0
De acuerdo Respuesta: Aplicacion para servomotor

Hola, saben, yo creo que la solución no es cambiar de lenguaje de programación de Visual Basic a otro. Lo que tienen que hacer es controlar los servomotores con un circuito controlador de servos (hardware), y éste a su vez, ser manejado por el puerto paralelo. De esta manera logran los pulsos necesarios sin que el procesador de la PC se sature, ni obligar a VB a sacar pulsos extremos, porque la placa controladora se encargará de manejar los pulsos de los servos, ustedes deben manejar la placa controladora por el puerto paralelo, pero no controlar directamente por el puerto paralelo los servos, porque en algún momento los timer de VB se ralentizan y surgen cambios de pulsos y todo cambiaría finalmente.

Si les parece la idea podrían evaluar el plan de construir el circuito que aparece en esta página: http://cfievalladolid2.net/tecno/cyr_01/control/practicas/p_3.htm

Vayan a control de un servomotor (casi a la mitad de la página), allí está el circuito electrónico.

Yo también quiero controlar servos y como vi este método me parece interesante, espero sopesen esta opción y cualquier cosa estamos para ayudarnos. Saludos.
  #13 (permalink)  
Antiguo 28/06/2010, 14:15
Avatar de pkj
pkj
 
Fecha de Ingreso: julio-2006
Ubicación: Órbita sincrónica
Mensajes: 899
Antigüedad: 17 años, 9 meses
Puntos: 29
Respuesta: Aplicacion para servomotor

Tienes razón. La velocidad del puerto se puede aprovechar solo gracias al buffer que tiene, donde tu metes un monton de datos de una sola vez y el puerto los envia a su ritmo.
En su caso necesita un circuito externo que active un cierto pulso, para lo cual solo hay que mandar una señal que lo active y otra que lo pare despues.
El caso era intentarlo al menos.

Saludos
__________________
No hay preguntas tontas, solo gente estup..., ¡No!, ¿como era? No hay gente que pregunte a tontos... ¡Nooo!... ¡Vaya cabeza!
  #14 (permalink)  
Antiguo 28/06/2010, 14:29
 
Fecha de Ingreso: junio-2010
Mensajes: 2
Antigüedad: 13 años, 10 meses
Puntos: 0
Sonrisa Respuesta: Aplicacion para servomotor

Espero les sirva, lo que vendría después del circuito electrónico, sería el software adecuado. Cuídense.

Etiquetas: aplicaciones
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 20:29.