[Smooth] [Stepper] fix. Motor de pasos con smooth fijo.

166 views
Skip to first unread message

Democrito

unread,
Aug 10, 2020, 11:48:00 AM8/10/20
to FPGAwars: explorando el lado libre
Hola,

En un proyecto anterior presenté un controlador de motor de pasos controlado a través del serial. Ahora le he añadido la parte "smooth" (suaviza arranques y llegadas). Os dejo con un vídeo antes de entrar en detalles, pero he de comentar lo que veréis.

  • Son tres motores de pasos, dos unipolares y uno bipolar. Los tres tienen el control en paralelo, sólo cambia el driver para el bipolar (puente en H versus  ULN2803).
  • El motor unipolar es de 48 pasos, el bipolar es de 200 pasos, y el pequeño (unipolar) lleva mucha reducción de engranajes y no recuerdo el número de pasos.
  • Los hago ir a cierta posición y luego volver a la posición 0. Primero a la posición 200, luego a la 400 y finalmente a la 1200.
  • El tipo de movimiento es "smooth" no es trapezoidal. Más adelante ahondaremos en esto.


Introducción:

La idea de este proyecto ha sido crear un "smooth fijo" de 8 bits. Se trata de que las primeras 255 posiciones tengan velocidades graduadas según la posición sea más alta (más veloz) o más baja (menos veloz) dentro de esas 255 posiciones posibles, y a partir de la posición 256 en adelante siempre estará a velocidad máxima.

Esas velocidades no han sido elegidas al azar, sino que tomé los datos que daba otro smooth que hice (es un proyecto incompleto) y los puse en una tabla. Esta vez, en vez de usar un algoritmo electrónico he usado una tabla en la que luego entraré en más detalles.


Partes claves del diseño y funcionamiento:

circuito principal.PNG


Si abrimos el ICE que adjunto a este post y luego hacemos doble clic al módulo que señalo en rojo, entre otras cosas veremos esta parte:

Controladores de posición versus velocidad.PNG

A la izquierda está el controlador que se encarga de que dependiendo de las 255 primeras posiciones un reloj marcará la velocidad de "tics" que corresponda con esa posición.

El módulo izquierdo funciona de la siguiente manera:

rampa ascendente descendente.PNG

  • Resta la posición actual del motor con la posición deseada y toma su valor absoluto (si fuese negativo lo convierte a positivo).
  • Memoriza el resultado.
  • Comprueba si el resultado es par o impar. 
  • Si fuese par no hace nada, pero si fuese impar le sumaría 1 a ese resultado. Esto es debido a que como no usamos decimales ni fracciones (con números impares siempre nos daría "algo.5" hemos de aproximarnos al siguiente entero.
  • Por otra parte hay en el circuito un contador reversible que está contando los pasos que va dando el motor.
  • El resultado calculado anteriormente será comparado en todo momento con el valor absoluto que haya en ese momento y cuando llega a esa posición (mitad del trayecto, por eso dividimos entre 2), lo que hace es activar una báscula RS que hará que el contador reversible comience a descontar con cada paso que hace el motor.
  • El contador reversible ha de contar todos los pasos, sin embargo sólo nos interesa los 8 bits más bajos y se le añade un pequeño módulo para que muestre todos los valores inferior a 256, si fuese mayor de 255 se mantenga en 255 (no haya cambios).
Para hacernos una idea gráfica el resultado del funcionamiento sería el siguiente:

relacion de posicion.PNG

Ahora que tenemos hecho esta parte es cuando lo aplicamos al concepto de smooth. Se trata de tener un circuito que genere pulsos de forma programable, es decir, que si le doy como dato "255", me de muy pocos pulsos por unidad de tiempo y si le doy como dato "0" me dé un número máximo de pulsos por unidad de tiempo, para todos los demás sería su equivalente.


En la segunda imagen que puse arriba se ve un módulo (el derecho) con el icono de un reloj, dentro de ese módulo está el generador de pulsos programable. Haciendo doble clic veremos lo siguiente:

modulo reloj.PNG

Vemos una tabla que recibe los datos y van a ser "traducidos" a periodos de tiempo. Esa tabla contiene los datos de un smooth real. Si este circuito fuese trapezoidal entonces no necesitaría la tabla.


Este circuito lo que hace esencialmente es repetir el periodo (pin "us", marca el tiempo entre un pulso y el siguiente) el número de veces marcado en la tabla de la dirección/dato que corresponda.



Características del circuito:

  • La entrada de datos (0..6534) se hace a través del serial y puedes usar cualquier terminal serie. Está diseñado para no permitir otra entrada de datos mientras el motor esté en movimiento. Para saber cuándo ha finalizado usa la patilla "done".
  • La patilla "home" tiene dos funciones. Si le das un tic se pondrá a girar en sentido contrario a como iría si fuese hacia delante, y lo hace a la mínima velocidad. Esto nos sirve para llevar el motor a la posición 0 (luego explico esto con otra patilla). Y si "home" se mantiene a 1, se pondrá a girar a la máxima velocidad. Esto nos servirá para configurar la velocidad máxima y se hace en la constante "us", como se aprecia en la imagen de abajo. Le puse 5000 us (5 ms) y pienso que es un tiempo en el que la mayoría de los motores de pasos pueden funcionar bien. Si quieres más velocidad has de bajar ese valor (es el periodo mínimo entre un paso y el siguiente) hasta detectar que pierde pasos y terminar poniendo un valor adecuado a tu motor de pasos.


periodo.PNG

  • La patilla "rst" se encarga de parar el motor y poner a 0 los contadores internos que hay dentro del circuito. Es decir, que si has pulsado "home" verás que el motor nunca se para y la patilla "rst" es la encargada de pararlo. En la realidad esta patilla se tendría que conectar a una foto-célula o final de carrera para conseguir la posición 0 real. Si a esta patilla le añades una puerta OR, le puedes añadir un paro de emergencia.
  • Hay dos patillas llamadas "shtdw" (Shutdown). Observa la imagen de abajo un momento. El "shtdwn" izquierdo activa o desactiva esta función. Con un 0 la desactiva y con un 1 la activa. Si la activamos, transcurrido un tiempo configurable (en "shtdwn" derecho) el motor dejará de estar magnetizado, es decir, quedará suelto.

shutdown.PNG

En el circuito principal veréis a la izquierda varias "cajas" con nombres como R500...R4000. Son tablas que contienen smooth de diferentes velocidades de reacción. Por ejemplo con "R500" es un smooth rápido y puede servir para motores que vayan a recorrer distancias cortas. El R4000 es el más lento de todos. Calcular los datos de un smooth no es algo trivial y es por eso que he dejado varias configuraciones y dé margen para ser ajustado a un proyecto en concreto.

selección de smooth.PNG



En realidad este diseño está pensado para ser manejado con un driver de impresora 3D, es por ello que la parte que maneja el motor no la he integrado dentro del circuito principal, y es por ello también que tiene los pines de salida "dir" y "step" a la vista, porque es ahí donde se harían las conexiones al driver de impresora 3D.

driver de impresora 3d.PNG

Son muy pequeños, puedes ajustar la corriente máxima, permiten micro-pasos (esto es la leche!) y son muy muy baratos.


Por pedagogía no he utilizado todavía estos drivers porque he creído necesario profundizar en el funcionamiento de los motores de pasos, pero a partir de ahora los siguientes proyectos que haga con este tipo de motores llevarán esos drivers.


Adjunto ICE y un saludo.


Smooth_Stepper_fix.ice

Angel Rodriguez Santalla

unread,
Aug 10, 2020, 4:56:48 PM8/10/20
to FPGAwars: explorando el lado libre
Interesante lo de la velocidad intermedia acelerada... mi impresora 3d subiria y bajaria de altura durante la preparacion mucho mas rapido y no como ahora que tras imprimir un objeto muy alto, me da tiempo de ir a tomar un cafe antes de que alcance la altura de la cama.

Democrito

unread,
Aug 10, 2020, 6:19:18 PM8/10/20
to FPGAwars: explorando el lado libre
Hola Ángel,

Quizás la tardanza se deba a que la impresora tenga (no lo sé) una varilla roscada típica de las de 8 mm, esas tienen "un paso" muy corto. Yo las cambié hace varios años por este tipo:

varilla roscada moderna.JPG

Otro cambio que se puede hacer es toquetear (si uno se atreve) dentro de la configuración del Marlin, aunque hace años que dejé de hacerlo una vez que me iba bien, y recuerdo que el eje Z en este sentido (como el que comentas) era bastante puñetero.


Marlin (y otros firmwares parecidos) ya llevan incluido el "smooth", al menos para los ejes X e Y, incluso pueden tener en cuenta "la velocidad de la aceleración" y se le nombra como "Jerk" (equivale a una tercera derivada, donde la segunda derivada sería la aceleración y la primera es la velocidad).


Gracias por tu comentario y aprovecho para comentar que quizás me ponga a investigar/comprobar si este circuito "smooth" pueda servir con motores DC de toda la vida, aunque lo que tengo pensado es convertir el motor DC en uno de pasos gracias a un encoder y tendría como máximo 4 pulsos por vuelta. Ya hice algo parecido en este sentido [* ver post data] pero las inercias eran tan fuertes que siempre había un corto balanceo al parar (a veces persistente). Que el motor inicie y termine de forma suave quizás ayudaría a eliminar esas inercias, no lo sé, pero es algo que me gustaría experimentar en breve.


Un saludo!


post data:

1.) https://www.youtube.com/watch?v=7LCj__UI_s4

2.) https://www.youtube.com/watch?v=o5FU0IMdsDs


Democrito

unread,
Aug 10, 2020, 6:26:03 PM8/10/20
to FPGAwars: explorando el lado libre
Me acabo de dar cuenta al volver a ver los vídeos que no funcionaría lo que comenté en el post anterior. Entre un paso y el siguiente siempre va haber ese balanceo. Con un sólo paso ya lo hace.

Pues nada, PID al canto y listos.

Democrito

unread,
Aug 10, 2020, 6:50:24 PM8/10/20
to FPGAwars: explorando el lado libre
Se me olvidó comentar que tuve una errata en el primer post: Pongo una imagen.

errata.PNG

Donde digo "(0..6534)" quise decir "(0..65535)".

Germán Agudelo

unread,
Aug 10, 2020, 7:50:04 PM8/10/20
to fpga-wars-explora...@googlegroups.com
Gracias, ustedes son unos tesos, muy interesante

--
Has recibido este mensaje porque estás suscrito al grupo "FPGAwars: explorando el lado libre" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a fpga-wars-explorando-el...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/fpga-wars-explorando-el-lado-libre/1c06eb59-b2a4-496c-b17d-3a794b0e05bbo%40googlegroups.com.

Democrito

unread,
Aug 11, 2020, 8:54:58 AM8/11/20
to FPGAwars: explorando el lado libre
Hola de nuevo,

Traigo otro vídeo.

Anoche estuve haciendo varios cambios internos, entre ellos mejorar el generador de frecuencia y resultó que afectaba positivamente al movimiento sin tocar las tablas de velocidades. Y a raíz del comentario de Ángel (sobre impresoras 3D), me preguntaba cómo se movería de forma lineal, que seguramente se apreciaría mejor el movimiento. Cuando desperté me puse manos a la obra. Desconecté el eje X de la RAMPS y se lo conecté a la Alhambra (con puente en H).


Es muy ruidoso porque funciona a paso completo, entonces es un (onomatopeya) "tak! tak! tak!..." con cada paso.

En breve adjuntaré la nueva versión (he de revisarlo para subirlo de forma oficial), que es la que he utilizado en el vídeo. La versión anterior que subí (primer post) también funciona estupendamente bien, pero los arranques y paradas son como más artificiales y esta nueva versión es más natural.



Saludos.


charli va

unread,
Aug 11, 2020, 9:53:54 AM8/11/20
to fpga-wars-explora...@googlegroups.com
No tengo ni idea de motores, pero me parece todo esto super interesante. Gracias Demócrito!

--
Has recibido este mensaje porque estás suscrito al grupo "FPGAwars: explorando el lado libre" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a fpga-wars-explorando-el...@googlegroups.com.

Democrito

unread,
Aug 11, 2020, 1:14:03 PM8/11/20
to FPGAwars: explorando el lado libre
Un placer Charli!

Hace unos años me hice un brazo robot tipo SCARA (mirar post data) con motores de pasos y manejado desde un Arduino. El control era el habitual, en plan bruto. Le dices a los motores "ponte aquí" y allá que iban. Me di cuenta que si le pedía movimientos largos, las inercias por el propio peso de cada grado de libertad se pasaba siempre de lo marcado. La solución para mí no era que fuese más lento porque necesitaba que fuese lo más rápido posible. Entonces me puse a investigar y descubrí el "smooth motion". Pero por motivos de tiempo, ese tiempo se lo dí a las FPGAs. Pasado un tiempo de aprendizaje y con mejores herramientas (me refiero a Icestudio) llegó el momento de "intentar" ese tipo de movimiento y aquí estoy compartiendo lo que voy experimentando.

En este post adjunto una versión (para mí) mejorada en el tipo de movimiento y posibilidades de configuración. 

De paso pongo otro gráfico para comprender mejor cómo se mueven los motores.

speed_position.PNG


El tipo de movimiento que se crea es como se ve en la imagen, una aceleración y deseleración progresiva según la posición que esté de la trayectoria. De esta manera se puede conseguir eliminar (hasta cierto punto) gran parte de la inercia, ya que no hay un paro seco del motor cuando finaliza el recorrido, sino que antes ha estado desacelerando (y se aplica lo mismo para acelerar).

El último vídeo que puse no se aprecia mucho detalle porque no hay "contraste", es decir, que no puse cómo se mueve un motor con arranques y paros "de golpe" y estamos acostumbrados a que una impresora 3D se mueva con suavidad.

El nuevo diseño contempla poder graduarse la velocidad mínima del motor y la máxima, pero hasta cierto punto.

V_min_max.PNG

En "tlow" se configura la velocidad máxima que llevará el motor, el valor que ponemos ahí es en realidad "periodo de tiempo"; y en "Hz" se configura la velocidad mínima que llevará el motor. Estos ajustes pueden resultar hasta cierto punto. En valores muy exagerados irían perdiendo esa propiedad. Has de ir probando y viendo el resultado. No hace falta que envíes posiciones mientras haces estos ajustes, sólo has de pulsar (un pulso corto) en "home" y el motor te mostrará su movimiento lento. Y si mantienes pulsado "home" te mostrará cómo se mueve a máxima velocidad, claro está según lo que hayas configurado. Todo esto está pensado para ajustarse lo máximo posible a las necesidades que cada uno/a tenga.

Me parece que esto es lo más destacable del nuevo diseño.

Un saludo.

Post Data:
Voy a poner un vídeo que no es mío, de un brazo SCARA parecido al que hice, pertenece a un hombre que hace cosas maravillosas (echa un vistazo a su lista de vídeos). El control del brazo lo hace a través de programas, firmware y hardware ya existentes para impresoras 3D (en vez de controlar una impresora, pues controlas un brazo robot).
En mi proyecto (incompleto) yo mismo me hice el firmware del arduino y un programa (simulador visual para PC) para memorizar posiciones e incluso poder dibujar, pero el programa me absorbía demasiado tiempo y dedicación.



SmoothStepper_rev.ice

Angel Rodriguez Santalla

unread,
Aug 11, 2020, 6:33:54 PM8/11/20
to FPGAwars: explorando el lado libre


El martes, 11 de agosto de 2020, 0:19:18 (UTC+2), Democrito escribió:
Hola Ángel,

Quizás la tardanza se deba a que la impresora tenga (no lo sé) una varilla roscada típica de las de 8 mm, esas tienen "un paso" muy corto...

Diste en el clavo!... tiene varillas de 8mm tipicas!

Gracias por la informacion!
Un Saludo.

Albert Garcia

unread,
Aug 19, 2020, 1:37:04 AM8/19/20
to FPGAwars: explorando el lado libre
muy interesante!
Reply all
Reply to author
Forward
0 new messages