Como regresar un motor a pasos a su posicion inicial

estoy utilizando el IC l923d para controlarlo pero no logro hacer que regrese a su punto de partida una vez, que haya alcanzado el angulo indicado

int retardo=45.5;          // Tiempo de retardo en milisegundos (Velocidad del Motor)
int dato_rx;            // valor recibido en grados
int numero_pasos = 0;   // Valor en grados donde se encuentra el motor
String leeCadena;       // Almacena la cadena de datos recibida

void setup() {                
Serial.begin(9600);     // inicializamos el puerto serie a 9600 baudios
pinMode(11, OUTPUT);    // Pin 11 conectar a IN4
pinMode(10, OUTPUT);    // Pin 10 conectar a IN3
pinMode(9, OUTPUT);     // Pin 9 conectar a IN2
pinMode(8, OUTPUT);     // Pin 8 conectar a IN1

 }



void loop() {
  while (Serial.available()) {    // Leer el valor enviado por el Puerto serial
    delay(retardo);
    char c  = Serial.read();     // Lee los caracteres
    leeCadena += c;              // Convierte Caracteres a cadena de caracteres
  }  
  if (leeCadena.length()>0){       
        dato_rx = leeCadena.toInt();   // Convierte Cadena de caracteres a Enteros
         Serial.print(dato_rx);         // Envia valor en Grados 
         Serial.println(" Grados");
        delay(retardo);
        dato_rx = (dato_rx * 1.422222222); // Ajuste de 512 vueltas a los 360 grados
  }  

   while (dato_rx>numero_pasos){   // Girohacia la izquierda en grados
       paso_izq();
       numero_pasos = numero_pasos + 1;
      
   }
   while (dato_rx<numero_pasos){   // Giro hacia la derecha en grados
        paso_der();
        delay(retardo);
      
        numero_pasos = numero_pasos -1;
   }
  leeCadena = "";   // Inicializamos la cadena de caracteres recibidos 
  apagado();         // Apagado del Motor para que no se caliente
}  ///////////////////// Fin del Loop ///////////////////////////

void paso_der(){         // Pasos a la derecha
 digitalWrite(11, LOW); 
 digitalWrite(10, LOW);  
 digitalWrite(9, HIGH);  
 digitalWrite(8, HIGH);  
   delay(retardo); 
 digitalWrite(11, LOW); 
 digitalWrite(10, HIGH);  
 digitalWrite(9, HIGH);  
 digitalWrite(8, LOW);  
   delay(retardo); 
 digitalWrite(11, HIGH); 
 digitalWrite(10, HIGH);  
 digitalWrite(9, LOW);  
 digitalWrite(8, LOW);  
  delay(retardo); 
 digitalWrite(11, HIGH); 
 digitalWrite(10, LOW);  
 digitalWrite(9, LOW);  
 digitalWrite(8, HIGH);  
  delay(retardo);



}

void paso_izq() {        // Pasos a la izquierda
 digitalWrite(11, HIGH); 
 digitalWrite(10, HIGH);  
 digitalWrite(9, LOW);  
 digitalWrite(8, LOW);  
  delay(retardo); 
 digitalWrite(11, LOW); 
 digitalWrite(10, HIGH);  
 digitalWrite(9, HIGH);  
 digitalWrite(8, LOW);  
  delay(retardo); 
 digitalWrite(11, LOW); 
 digitalWrite(10, LOW);  
 digitalWrite(9, HIGH);  
 digitalWrite(8, HIGH);  
  delay(retardo); 
 digitalWrite(11, HIGH); 
 digitalWrite(10, LOW);  
 digitalWrite(9, LOW);  
 digitalWrite(8, HIGH);  
  delay(retardo); 

  
}
        
void apagado() {         // Apagado del Motor
 digitalWrite(11, LOW); 
 digitalWrite(10, LOW);  
 digitalWrite(9, LOW);  
 digitalWrite(8, LOW);  
 }

como mueves un motor paso a paso? Le dices cuantos pasos deseas que se desplace.
Sabes de cuantos pasos tiene el motor para dar una vuelta de modo que la diferencia es lo que debes indicarle para que vuelva a la posicion inicial.

Es un motor de 64 pasos para una vuelta completa, pero le indico la posición en grados a la que debe llegar y después regresarse a su posición inicial

Si, pero con los grados calculas los pasos de avance o retroceso así que lo que te dice @Surbyte aplica perfectamente.
Y aunque se manejase solamente por grados, si avanza tantos grados luego lo haces retroceder la misma cantidad de grados y vuelve al punto de partida.

360/64 = 5.625 grados x paso
No se cuantos grados se mueve pero hacerlo de este modo sera y te llevará a errores.
Mucho mas facil es pensarlo en pasos.. Muevo 20
Recupero 20
Muevo 200, recupero 8 porque 8?
200/64 te da 3.125 vueltas si le quitas 3 son 3 vueltas y a 0.125 lo multiplicas por 64 = 0.125*64 = 8
eso es lo mismo que calcular 200%64 se dice 200 modulo 64
Modulo es el resto de la division de 200 entre 64 y te da 8
Ahi tienes tu respuesta.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.