Ante la imposibilidad de compatibilizar "enable" con "sleep" me he decantado por dejar sleep exclusivamente. Por ahora todo parece evolucionar y practicamente consideraba que estaba a punto de finalizar esta parte, pero tengo un problema bastante gordo y sinceramente estoy totalmente bloqueado y ya no se me vienen a la cabeza que mas puedo hacer de ahí que os pida vuestra ayuda.
En este momento el código para gestionar el motor está practicamente preparado, habiendo conseguido gestionar el motor mediante una pantalla lcd 16x2 dos botones para su manejo y tiene las posibilidades de elegir velocidad, giro y resolución de pasos, pero tras todo esto está el problema no consigo que el motor gire 1 o 2 pasos, solo se mueve a partir de que selecciono 3 pasos.
Por supuesto he verificado esto con varios motores y siempre ocurre lo mismo.
Os agradezco por anticipado la ayuda que podais prestar, para lo cual íncluyo el código si bien faltan la definición de las variables que exceden el límite del post.
Gracias.
void edita_datos1(){
byte currentOption = 0;
for(boolean exit = false;!exit;){
lcd.clear();
if (currentOption==0) {lcd.setCursor(0,0); lcd.print("giro ");}
if (currentOption==1) {lcd.setCursor(4,0); lcd.print("tipo de paso");}
lcd.setCursor(1,1); if (sentido_giro) lcd.write(0x00); else lcd.write(0x01);
lcd.setCursor(9,1); if (tipo_paso==1) lcd.print(" 1 ");
else if (tipo_paso==2) lcd.print("1/2");
else if (tipo_paso==3) lcd.print("1/4");
else if (tipo_paso==4) lcd.print("1/8");
keyboard_waitForAnyKey();
if (lastKey==KEY_A) {
if (currentOption==0) sentido_giro=!sentido_giro;
if (currentOption==1) {tipo_paso=tipo_paso-1; if (tipo_paso==0) tipo_paso=4;}
}
else if (lastKey==KEY_B) {
if (currentOption==0) sentido_giro=!sentido_giro;
if (currentOption==1) {tipo_paso=tipo_paso+1; if (tipo_paso==5) tipo_paso=1;}
}
else if (lastKey==KEY_BH){
if (currentOption==1) {Motor_MS1_MS2(); edita_datos2();} // Activa entradas MS1 y MS2 del driver y edita pausa y pasos
if (currentOption==0) currentOption = 1; //
}
else if (lastKey==KEY_AH) {
if (currentOption==0) exit=true;
if (currentOption==1) currentOption = 0;
}
}
}
void edita_datos2(){
byte currentOption = 0;
for(boolean exit = false;!exit;){
lcd.clear();
if (currentOption==0) {lcd.setCursor(0,0); lcd.print("pausa");}
if (currentOption==1) {lcd.setCursor(5,0); lcd.print("pasos");}
if (currentOption==2) {lcd.setCursor(12,0); if (tipo_paso==2) lcd.print("1/2");
else if (tipo_paso==3) lcd.print("1/4");
else if (tipo_paso==4) lcd.print("1/8");
}
lcd.setCursor(0,1); lcd.print(pausa); lcd.print(" ");
lcd.setCursor(6,1); lcd.print(pasos_uno); lcd.print(" ");
lcd.setCursor(13,1); if (tipo_paso==2) lcd.print(pasos_medio);
else if (tipo_paso==3) lcd.print(pasos_cuarto);
else if (tipo_paso==4) lcd.print(pasos_octavo);
keyboard_waitForAnyKey();
if (lastKey==KEY_A) {
if (currentOption==0) {if (pausa>1) pausa=pausa-1;}
if (currentOption==1) {if (pasos_uno>0) pasos_uno=pasos_uno-1;}
if (currentOption==2) {if (tipo_paso==2) {if (pasos_medio>0) pasos_medio=pasos_medio-1;}
else if (tipo_paso==3) {if (pasos_cuarto>0) pasos_cuarto=pasos_cuarto-1;}
else if (tipo_paso==4) {if (pasos_octavo>0) pasos_octavo=pasos_octavo-1;}
}
}
else if (lastKey==KEY_B) {
if (currentOption==0) { pausa=pausa+1;}
if (currentOption==1) {if (pasos_uno<Pasos_Motor) pasos_uno=pasos_uno+1;}
if (currentOption==2) {if (tipo_paso==2) {if (pasos_medio<1) pasos_medio=pasos_medio+1;}
else if (tipo_paso==3) {if (pasos_cuarto<3) pasos_cuarto=pasos_cuarto+1;}
else if (tipo_paso==4) {if (pasos_octavo<7) pasos_octavo=pasos_octavo+1;}
}
}
else if (lastKey==KEY_BH){
if (currentOption==2) {total_micropasos();principal(); }
if (currentOption==1) {if (tipo_paso==1) {total_micropasos();principal();} else currentOption=2;}
if (currentOption==0) currentOption = 1;
}
else if (lastKey==KEY_AH) {
if (currentOption==0) exit=true;
if (currentOption==1) currentOption = 0; // -> edita pausa
if (currentOption==2) currentOption = 1; // -> edita pasos
}
}
}
void principal(){
digitalWrite(dirPin,sentido_giro);
digitalWrite(sleep, HIGH); //activa el puerto sleep controladora
// lcd.setCursor(0,0);lcd.print("girando... ");
// lcd.setCursor(0,1);lcd.print("pasos ");
for(boolean exit = false;!exit;){ // mueve el motor un nº de pasos determinado
lcd.setCursor(0,0);lcd.print("girando... ");
lcd.setCursor(0,1);
if (tipo_paso==1) lcd.print(" 1 ");
else if (tipo_paso==2) lcd.print("1/2");
else if (tipo_paso==3) lcd.print("1/4");
else if (tipo_paso==4) lcd.print("1/8");
lcd.print(" paso: ");
for (int n=1;n<=micropasos; n++){
lcd.setCursor(10,1);lcd.print(n);
lcd.print(" ");
steps(); // Esta función da un solo paso. Como está dentro de un ciclo, los pasos se repiten.
}
lcd.setCursor(0,0);lcd.print("Fin de giro. ");
buzzer_beep(100);
delay(1000);
digitalWrite(sleep, LOW); //deja en modo sleep al motor
lcd.setCursor(0,1);lcd.print("pulsa una tecla ");
keyboard_waitForAnyKey();
if (lastKey==KEY_AH) exit=true;
else { digitalWrite(sleep, HIGH);
}
}
}
void steps(){
digitalWrite(stepperPin, LOW);
digitalWrite(stepperPin, HIGH);
delay(pausa);
}
// hace cambio de sentido del giro
void cambio_de_giro(){
sentido_giro=!sentido_giro;
digitalWrite(dirPin,sentido_giro);
}
//Activa las entradas MS1 y MS2 de Easydriver en función del tipo de paso escogido.
void Motor_MS1_MS2(){
if (tipo_paso==1) {digitalWrite(MS1, LOW); digitalWrite (MS2, LOW); }
else if (tipo_paso==2) {digitalWrite(MS1, HIGH); digitalWrite (MS2, LOW); }
else if (tipo_paso==3) {digitalWrite(MS1, LOW); digitalWrite (MS2, HIGH); }
else if (tipo_paso==4) {digitalWrite(MS1, HIGH); digitalWrite (MS2, HIGH); }
}
// CALCULA el nº de micropasos en función del nº y el tipo de pasos escogido.
void total_micropasos(){
if (tipo_paso==1) micropasos = pasos_uno;
if (tipo_paso==2) micropasos = pasos_uno*2 + pasos_medio;
if (tipo_paso==3) micropasos = pasos_uno*4 + pasos_cuarto;
if (tipo_paso==4) micropasos = pasos_uno*8 + pasos_octavo;
}
// Beeps buzzer a time in ms
void buzzer_beep(int time){
analogWrite(PINS_BUZZER,64);
delay(time);
analogWrite(PINS_BUZZER,0);
}
Edito: Tras eliminar las líneas respecto a "slepp" sí que se consigue que el motor dé un solo paso, pero sigo sin saber cual es el motivo para ello.