ayuda!! paso a paso con potenciometro

hola amigos tengo de tarea mover un motor paso a paso con un potenciometro y lo tengo que hacer sin librerias.

en el programa el potenciometro siempre empieza en 0.

con el uso de la funcion map() simulo que mi motor paso a paso tiene que dar 20 pasos para dar una vuelta de 360 grados.

vean que simulo las bobinas de un motor paso a paso con 4 leds que tienen de nombre led1, led2, led3, led4. esto es solo una simulacion, cuando termine el programa comprare el motor paso a paso y ahi en ves de leds seran las bobinas del motor.

volviendo al tema segun mi programa para dar un paso adelante osea en sentido de las manecillas del reloj se hace el primer bucle for que enciende led1, led2, led3, led4. para dar un paso hacia atras osea en sentido contrario de las manecillas del reloj se hace el bucle for que enciende led4,led3,led2,led1.

todo trabaja perfectamente hasta aqui, tengo un contador que le llamo “n” el cual actua como una retroalimentacion de donde se encuentra el pot.

ejemplo:
teniendo en cuenta que 20 pasos es 360 grados, muevo el pot a la mitad (10), osea 180 grados, y empieza el programa a mover el paso a paso hacia adelante, en sentido horario, led1, led2, led3, led4, hasta que mi contador “n” vea que lo hizo 10 veces y parara, de igual manera si estando en 180 grados lo muevo a cero, este se movera 10 pasos para atras, led4, led3, led2, led1 hasta que el contador “n” llegue a 0 de nuevo.

Bien hasta aqui trabaja perfecto pero tengo un detalle que necesito.

ejemplo:
teniendo en cuenta que 20 pasos es 360 grados, muevo el pot a la mitad (10), osea 180 grados, y empieza el programa a mover el paso a paso hacia adelante, en sentido horario, led1, led2, led3, led4, cuando mi contador “n” lleve 7 pasos, yo muevo el pot a 3 osea 54 grados y quiero que este pare el contador en 7 inmediatamente y empieze el ciclo hacia atras led4, led3, led2, led1 hasta que mi contador “n” vea sepa que este en 3 y parara.

hasta el momento lo que me hace el programa es que primero tiene que llegar hasta el valor del pot que le dimos al principio y ya que mi contador “n” llega a ese valor ya ejecuta el siguiente. lo quiero en tiempo real.

espero me entiendan muchas gracias.

/*
	   En este proyecto leemos el valor de un potenciometro
	   y con este valor damos velocidad a un motor paso a paso

	 */

	   // Declaramos las constantes que vamos a usar
	   const int pinSensor1 = 0;   // pin del sensor analogico, con un potenciometro
	   // Declaramos las variables que vamos a usar
	   int velocidad1          = 0; //variable para guardar valor del potenciometro
       int velocidad2          = 0;// variable para guardar el valor 
       int velocidad3          = 0;
	   int valorPotenciometro1 = 0;
       int led1          = 2;
       int led2          = 4;
       int led3          = 7;
       int led4          = 8;
       int led5          = 12;
       int led6          = 13;
       int led7          = 11;
       float n          = 0; //variable para guardar el valor de "n" siendo n un contador
	   void setup() {
	       pinMode(pinSensor1, INPUT); // Incializa el pin del pot como entrada
           pinMode(led1, OUTPUT);
           pinMode(led2, OUTPUT);
           pinMode(led3, OUTPUT);
           pinMode(led4, OUTPUT);
           pinMode(led5, OUTPUT);
           pinMode(led6, OUTPUT);
           pinMode(led7, OUTPUT);
	   }
	   void loop(){
	       valorPotenciometro1 = analogRead(pinSensor1);     //  Lee el valor del sensor
           velocidad1 = map(valorPotenciometro1, 0, 1023, 0, 20);//  Transforma  este valor en el valor que usaremos con funcion map
           velocidad2= map(velocidad1, 0 ,100,100,0);//futuros valores
           velocidad3= map(velocidad1, 140 ,255,0,255);//futuros valores
         
         if ((velocidad1)<20)// una vuelta completa del pot es igual a 20 segun el mapeo aqui solo mide que sea verdad
{    
           if ((velocidad1)>n)// comprueba que el valor del pot sea mayor a "n" nuestro contador 
           {
             if (velocidad1>0) // comprueba que giremos primero el pot para empezar secuencia
             {
           for (int i=0;n<velocidad1;i++) //empezara secuencia de bucle cuando giremos el pot
           {
             digitalWrite(led1, HIGH);
             delay(100);
             digitalWrite(led1, LOW);
             delay(100);
             digitalWrite(led2, HIGH);
             delay(100);
             digitalWrite(led2, LOW);
             delay(100);
             digitalWrite(led3, HIGH);
             delay(100);
             digitalWrite(led3, LOW);
             delay(100);
             digitalWrite(led4, HIGH);
             delay(100);
             digitalWrite(led4, LOW);
             delay(100);
             digitalWrite(led5, HIGH);
             n=n+1;                    // aqui iremos sumando nuestro contador para llegar a ser igual a velocidad1   
           }               
           }            
           }   
}
           if ((velocidad1)<n) // aqui mide que cuando velocidad1 sea mayor a nuestro contador ejecute
           {
           for (int j=0;n>velocidad1;j++) // empezara la secuencia de bucle cuando velocidad 1 sea menor a n
           {
             digitalWrite(led4, HIGH);
             delay(100);
             digitalWrite(led4, LOW);
             delay(100);
             digitalWrite(led3, HIGH);
             delay(100);
             digitalWrite(led3, LOW);
             delay(100);
             digitalWrite(led2, HIGH);
             delay(100);
             digitalWrite(led2, LOW);
             delay(100);
             digitalWrite(led1, HIGH);
             delay(100);
             digitalWrite(led1, LOW);
             delay(100);
             digitalWrite(led6, HIGH);
             n=n-1;                       // disminuira nuestro contador
}           
         }

TheUnnamedCircuit.ino (4.04 KB)

Bueno, aqui hay varios detalles con tu codigo...
#1.- usas la funcion delay.... lo que detiene el procesador, durante ese tiempo el procesador no "vera" cuanto has movido el pot.

#2.- Si quieres mover el pot y que el motor se mueva a esa posicion y solo hasta despues se cambie a otra... necesitas,

1.- Una guarda boleana .. al comenzar a detectar el movimiento, mueve proporcionalmente el motor (sin delay) una vez que completes esemovmiento... espera un tiempo x... y entonces vuelve a sensar el pot

Pero vamos... comencemos por lo sencillo...

Investiga como usar arrays bidimensionles como
{0001,
0010
0100,
1000, }

de esta manera tendras solo un ciclo for para mover hacia delante y hacia atras el motor... en tiempo real..

Saludos.
-Alex.

Reemplazar delay por millis() es tu tarea. Ahora para usarla ya que no es inmediato el cambio, debes crear una máquiina de estados simple.
millis() es un cronómetro que arranca cuando Arduino es alimentado. Lleva una cuenta en milisegundos que no para hasta los 49 dias aprox.
Asi que tu deben tomar valores parciales y comparar contra tu demora por ejemplo 100 mseg
supon que usas una variable que llamas
unsigned long start;
le asignas el valor de millis() asi
start = millis();
y luego dices... a ver cuando supere 100mseg quiero prender un led

if (millis()-start > 100) {
   digitalWrite(pin, HIGH);
   start = millis();
}

Bueno dentro del if debes volver a tomar el valor del cronómetro para la siguiente consulta y asi los vas encadenando.
Ahora una maquina de estados es algo que va cumpliendo tareas y cuando la tarea finaliza le cambias el estado por lo que en el siguiente ciclo del loop el programa no pasará por ese estado sino por otro porque se cumplió la condición de cambio.
para ello usas una variable que llamas estado del tipo byte (0 a 255) ya que no tendras muchos estados tampoco.
y supongamos quires hacer

digitalWrite(led1, HIGH);
             delay(100);
             digitalWrite(led1, LOW);
             delay(100);
             digitalWrite(led2, HIGH);
             delay(100);
             digitalWrite(led2, LOW);
             delay(100);
             digitalWrite(led3, HIGH);
             delay(100);
             digitalWrite(led3, LOW);
             delay(100);
             digitalWrite(led4, HIGH);
             delay(100);
             digitalWrite(led4, LOW);
             delay(100);
             digitalWrite(led5, HIGH);

solo hare algunos porque es todo igual
recuerdas necesitamos millis() y necesitamos la maquina de estados.

byte estado = 0;
unsigned long start;
/// en el loop

switch (estado) {
     case 0:    // estado 0 de este caso
                  start = millis();
                  estado = 1;  // solo tome el dato de millis()
                  break;
     case 1:  if ( millis()-start > 100UL) {  // El UL es porque son unsigned long
                     digitalWrite(led1, LOW);
                     start = millis();  
                     estado = 2;  // solo tome el dato de millis()
                  }
                  break;
     case 2: if ( millis()-start > 100UL) {  // El UL es porque son unsigned long
                     digitalWrite(led2, HIGH);
                     start = millis();  
                     estado = 3;  // solo tome el dato de millis()
                  }
                  break;
     case 3:  if ( millis()-start > 100UL) {  // El UL es porque son unsigned long
                     digitalWrite(led2, LOW);
                     start = millis();  
                     estado = 4;  // solo tome el dato de millis()
                  }
                  break;
     case 4: if ( millis()-start > 100UL) {  // El UL es porque son unsigned long
                     digitalWrite(led3, HIGH);
                     start = millis();  
                     estado = 5;  // solo tome el dato de millis()
                  }
                  break;
     case 5: if ( millis()-start > 100UL) {  // El UL es porque son unsigned long
                     digitalWrite(led3, LOW);
                     start = millis();  
                     estado = 6;  // solo tome el dato de millis()
                  }
                  break;
     case 6: if ( millis()-start > 100UL) {  // El UL es porque son unsigned long
                     digitalWrite(led4, HIGH);
                     start = millis();  
                     estado = 7;  // solo tome el dato de millis()
                  }
                  break;
     case 7: if ( millis()-start > 100UL) {  // El UL es porque son unsigned long
                     digitalWrite(led4, LOW);
                     start = millis();  
                     estado = 8;  // solo tome el dato de millis()
                  }
                  break;
     case 8: if ( millis()-start > 100UL) {  // El UL es porque son unsigned long
                     digitalWrite(led5, HIGH);
                     start = millis();  
                     estado = 9;  // solo tome el dato de millis()
                  }
                  break;
     default: break;
}

Espero no haber cometido algun error. Miralo con detenimiento y verás que es fácil de entender.
Cada estado permanece hasta no completar la condición que lo envía al siguiente.
Si los delays cambiaran usa otro valor en lugar de 100UL. Es flexible.