suave movimiento de motor

7

Tengo un motor paso a paso (controlado por un arduino) que mueve algunos engranajes y una polea. El problema es que la polea se sacude mucho: el movimiento comienza y se detiene demasiado repentinamente. para hacer que el movimiento sea más fluido, creo que puedo usar una especie de rampa: el primer movimiento es lento, cuando los motores alcanzan la velocidad a la que siguen y luego disminuyen la velocidad suavemente.

He intentado usar una onda sinusoidal de esta manera:

// generate ramp
float t = 0;
float deltat = PI/(200+1)
for(int i=0; i<200; i++) {
    ramp[i] = 1000 - sin(t)*900;
    t += deltat;
}

ahora tengo una rampa de 200 elementos que va de 1000 (muy lento) a 100 (muy rápido) siguiendo una onda sinusal. Ahora muevo el motor con este código:

for(int i=0; i<200; i++) {
    int delay_velocity = ramp[i];

    digitalWrite(STEP_PIN, HIGH);
    delayMicroseconds(delay_velocity); 

    digitalWrite(STEP_PIN, LOW);
    delayMicroseconds(delay_velocity);
}

esto funciona bastante bien: la polea no se mueve demasiado y tengo control sobre cuántos pasos debo hacer.

pero esta solución también tiene problemas:

  • no puedo hacer rampas muy largas (debido al desbordamiento en atmega): diga una matriz que no tenga más de 400 elementos más o menos (depende de cuánto tiempo dura el boceto del arduino)
  • tengo control sobre cuántos pasos, pero no tengo idea de cuánto tiempo se tarda en completarlo (creo que puedo calcularlo con algún resumen o integral, pero no es tan práctico)

así que estoy buscando otra forma de suavizar mi movimiento. Creo que puedo tener una curva diferente en lugar de una onda sinusoidal. ¿Algo más como esto?

hasta ahora no he considerado generar la rampa en una computadora y luego pasarla a arduino, pero podría ser una posibilidad.

algunos consejos? pensamientos?

    
pregunta nkint

2 respuestas

7

Lo que estás buscando se llama Perfil de velocidad trapezoidal .

Nohaynecesidaddeusarondasdepecado.Sepuedelograrunmovimientosuavesimplementeincrementandolinealmentelavelocidadalmáximo,manteniéndolaallí,luegodejándoladescenderdenuevo.MuchasfresadorasCNCyrobotsutilizanestetipodeperfil.

Sideseasupermovimientosuave,puedeoptarporunperfilS-Curve.

Las matemáticas para esto son considerablemente más difíciles, pero el movimiento es hermoso. En este video muestran cómo los dos perfiles de movimiento afectan un vaso de agua.

    
respondido por el Rocketmagnet
0

En lugar de poner tus valores de rampa en una matriz, solo calculalos sobre la marcha, si tienes suficiente potencia en tu Arduino:

function ramp (int i)
{
    return 1000 - sin(t * i) * 900;
}

Puedes modificar la ecuación según sea necesario.

    
respondido por el Robert Harvey

Lea otras preguntas en las etiquetas