Problema con Delay y Millis manejando ServoMotor y Motor Steper

Hola amigos, recurro a ustedes para ver si logran ayudarme tras 4 días y noches de no encontrar la solución a este problema.

El proyecto es una correa con un motor stepper que sube un elevador pequeño 60 cm de trayectoria del piso hacia arriba. y un servo mg995 esta sobre ese elevador y mueve un brazo entre 0 y 180grados.

Un ejemplo de lo que sucede:

  1. subir el elevador unos 10 cm
  2. girar el brazo hacia un lado por ejemplo 0°
  3. Ir Bajando hasta tocar un objeto
  4. empezar a subir a hasta unos 40cm
  5. girar el brazo a 180° y empezar a bajar hasta tocar otro objeto.

El paso numero 4 es saltado siempre y cuando haga uso de Delay o tambien Millis en el codigo empleado
para girar el servoMotor lentamente con el ciclo For.

Cuando hago uso de myservo.write(0); directamente el código si se ejecuta perfectamente. pero la velocidad de movimiento de mi servoMotor es muy excesiva.

He estado haciendo uso de:

#include <Servo.h>

También he probado la siguiente librería

#include <VarSpeedServo.h>

He resumido el codigo a su totalidad para enfocarme en la parte que genera el problema.

  digitalWrite(reset, HIGH);   
  digitalWrite(direccion, LOW);
  
                  for (int i = 0; i<800; i++)       //Sube altura del ascensor un poco. 
                       {
                       digitalWrite(steps, LOW);  
                       digitalWrite(steps, HIGH);   
                       delayMicroseconds(VELOCIDAD);    
                       
                          if (i == 799) {
                            digitalWrite(steps, HIGH);   
                            digitalWrite(steps, HIGH);    
                                        } 
                             } 
//Esta parte del código es la que hace fallar todo el resto

  for(pos = 180; pos>=0; pos-=1)    
  {                                
    myservo.write(pos);              
    delay(15);                       
  } 


// BAJANDO PRIMERA VEZ ( ESTA PARTE DEL CODIGO ES TOTALMENTE ANULADA CUADO USO el codigo del myServo con el ciclo for ya sea usando delay o millis. y salta a BAJANDO POR SEGUNDA VEZ 

digitalWrite(reset, HIGH);   
  digitalWrite(direccion, HIGH); 

  for (int i = 0; i<350; i++)       
  {
      
  val = digitalRead(inPin);  
       
       
       if (val == HIGH ) {        
                 
                               
                
                 digitalWrite(steps, HIGH);   
                 digitalWrite(steps, HIGH);    
                 
                 
                 delay(1000);
                 digitalWrite(RELAY16, LOW);
                 digitalWrite(RELAY15, LOW); 
                 Serial.println("Se enciende la bomba de vacio por primera vez");
                 delay(1000);   
                 
                              
                              digitalWrite(reset, HIGH);   
                              digitalWrite(direccion, LOW);
                               
                               for (int i = 0; i<1300; i++)       
                               {
                                digitalWrite(steps, LOW);  
                                digitalWrite(steps, HIGH);  
                                delayMicroseconds(VELOCIDAD);    
                                    if (i == 500) {
                                    digitalWrite(RELAY16, HIGH); 
                                     }
                                    
                                      if (i == 1299) { 
                                    digitalWrite(steps, HIGH);   
                                    digitalWrite(steps, HIGH);    
                                     digitalWrite(RELAY12,LOW);   
                                    delay(500);
                                    digitalWrite(RELAY12,HIGH);   
                                    delay(1000);
                                    
                                    myservo.write(95); 
                                    
                             
                                 
                                    delay(4000);
                                    digitalWrite(RELAY15, HIGH); 
                                    
                                    delay(2000);
                                    
                                   
                               }
                               
                               } // cierra ciclo for i<1300
                               break;
       }
   else
      {   
     digitalWrite(steps, HIGH);  
     digitalWrite(steps, LOW); 
     delayMicroseconds(VELOCIDAD); 
      }                              
                    
} 

// BAJANDO 2DA VEZ 




//for (int i = 0; i<4; i++) {    
 
  

  


  digitalWrite(reset, HIGH);   
  digitalWrite(direccion, HIGH); 

  for (int i = 0; i<1400; i++)       
  {
  myservo.write(0);
  val = digitalRead(inPin);  
       
       
       if (val == HIGH ) {         
                 Serial.println("encontro por 2da vez");
                 
                 Serial.println("SE PARA EL MOVIMIENTO"); 
                 
                 ///digitalWrite(reset, LOW);
                
                
                 digitalWrite(steps, HIGH);   
                 digitalWrite(steps, HIGH);    
                 
                 delay(1000);
                 digitalWrite(RELAY16, LOW); 
                 digitalWrite(RELAY15, LOW); 
                 
                 delay(1000);   
                 
                              
                              digitalWrite(reset, HIGH);   
                              digitalWrite(direccion, LOW);
                               
                               for (int i = 0; i<1300; i++)       
                               {
                                digitalWrite(steps, LOW);  
                                digitalWrite(steps, HIGH);  
                                delayMicroseconds(VELOCIDAD);    
                                  if (i == 500) {
                                  digitalWrite(RELAY16, HIGH); 
                                  }
                                    
                                    if (i == 1299) {
                                    digitalWrite(steps, HIGH);   
                                    digitalWrite(steps, HIGH);
                                    digitalWrite(RELAY12,LOW);   
                                    delay(500);
                                    digitalWrite(RELAY12,HIGH);   
                                    delay(1000);
                                    
                                    myservo.write(95);
                                    
                                     
                                    delay(4000);
                                    digitalWrite(RELAY15, HIGH); 
                                    
                                    delay(2000);
                                     digitalWrite(RELAY12,LOW);   
                                    delay(500);
                                    digitalWrite(RELAY12,HIGH);  
                                    
                                    
                                    }
                               }
                               break;
       }
   else
      {   
     digitalWrite(steps, HIGH);  
     digitalWrite(steps, LOW); 
     delayMicroseconds(VELOCIDAD); 
      }                              
                    
} 
                

 

delay(3000);

Que podria utilizar para evitar este salto de codigo? o para bajar la velocidad del ServoMotor sin el uso de Delay o Millis? ya que es excesiva para lo que requiero.

He revisado la libreria pero servo.h pero no logro descrifrar si hay algun valor predeterminado para su velocidad.

Mil Gracias

Sube todo el código. No supongas nada respecto del problema porque puede ocurrir que el problema este en otro sitio.

Si la verdad que he llenado mi sketch con muchos serial.println para monitoriar los pasos y ver que falla.

Si coloco el siguiente codigo para girar con suavidad el servo a 0 grados se salta el proximo tramo del codigo.

for(pos = 180; pos>=0; pos-=1) { myservo.write(pos); delay(15); }

si coloco solamente:

myservo.write(0);

El codigo corre perfectamente sin saltarse ninguna parte. pero la velocidad de mi servo es muy rápida no me sirve asi.

Tengo entendido que el Loop debe detenerse en ese caso unos 2700 mili-segundos mientras completa el for de 180 grados.. y luego continuar con la siguiente parte. pero luego de girar suavemente el servo salta el siguiente tramo de código.

Gracias surbyte, minutos despues que me sugeriste copiar todo el codigo y que el error posiblemente estuviese en otro sitio me di cuenta que el problema no era el Delay.

Mi problema estaba en la pequeña cantidad de pasos que le indicaba al stepper en la primera bajada, lo que hacia que terminara e iniciara el siguiente tramo.

digitalWrite(reset, HIGH);
digitalWrite(direccion, HIGH);

for (int i = 0; i<350; i++)
{

han sido 4 dias y noches de desvelo total. la verdad no queria cambiar el modelo construido en el taller. Gracias

Bueno directa o indirectamente te sirvió. Muchas veces uno esta tercamente ofuscado con que el problema está en determinado lugar y no es el caso. Es dificil abstraerse de un problema y mirarlo con otros ojos. Por eso a mi me sirve contarle el problema a mi Sra o a mi Madre. Como no entienden nada debo bajar el nivel, y al hacerlo describir partes que paso por alto. Casi siempre ese ejercicio a mi me hace presetarle atención a sectores del proyecto que doy por sentando que estan bien y no es el caso.