boolean mode = false;
int SW1 = 3;
int SW2 = 4;
int SWMODE = 6;
int pot;
int steps = 2; //Posición del pin contador de pasos
int direccion = 5; //Posición del pin dirección
int reset = 8; //Posición del reset
unsigned int pasos = 19200; //Cantidad de pasos a meter.
int minimo = 50; //velocidad maxima. 110 = 10 seg en recorrer el rail
int maximo = 750; //velocidad minima. 4500 = 180 seg en recorrer el rail. 2500 = 100 seg. 1500 = 63 seg.
/*
* 3200 equivale a una vuelta de motor. COmo estan activados M1, M2 y M3 cada micropaso es 1/16 pasos. Por lo tanto si 200 pasos son una vuelta, con esta configuración será 16*200=3200
*/
// La rutina de inicialización
void setup()
{
// initialize the digital pin as an output.
pinMode(steps, OUTPUT);
pinMode(direccion, OUTPUT);
pinMode(reset, OUTPUT);
pinMode(SW1, INPUT);
pinMode(SW2, INPUT);
pinMode(SWMODE, INPUT);
delay(100);
digitalWrite(reset, HIGH); //Cuando reset se encuentre en LOW el motor arrancará y leerá los comandos enviados.
digitalWrite(direccion, LOW);
for (int i = 0; i<20; i++) //Equivale al numero de vueltas (200 es 360º grados) o micropasos
{
digitalWrite(steps, HIGH); // This LOW to HIGH change is what creates the
digitalWrite(steps, LOW); // al A4988 de avanzar una vez por cada pulso de energia.
delayMicroseconds(300); // Regula la velocidad, cuanto mas bajo mas velocidad.
}
}
// La rutina que se repite cíclicamente
void loop()
{
if (digitalRead(SWMODE) == HIGH) //Con SWMODE seleccionaremos alta o baja velocidad. Dependiendo de la selección realizará un ciclo u otro. delay o delaymicroseconds
{
mode = true;
}
if (mode == true)
//------------------------------------------------------------------------------CICLO1-IDA
{
digitalWrite(reset, HIGH); //Mientras reset este en HIGH el motor permanecerá apagado y no sufrirá. El chip apagará todos los puertos y no leerá comandos.
delay(2000);
digitalWrite(reset, LOW); //Cuando reset se encuentre en LOW el motor arrancará y leerá los comandos enviados.
digitalWrite(direccion, LOW);
//Se repite un bucle hasta final de carril.
for (int i = 0; i<pasos; i++) //Equivale al numero de vueltas (200 es 360º grados) o micropasos
{
pot=analogRead(A0); //Lectura potenciómetro
pot = map(pot, 0, 1023, minimo, maximo); //Establecemos la velocidad entre 30 y 150 rpm
// Con el pot aqui variamos la velocidad, incluso cuando esté en movimiento.
digitalWrite(steps, HIGH);
digitalWrite(steps, LOW);
delayMicroseconds(pot); // Regula la velocidad, cuanto mas bajo mas velocidad.
}
delayMicroseconds(10);
//--------------------------------------------------------------------------CICLO2-IDA
digitalWrite(direccion, LOW);
//Se repite un bucle hasta final de carril.
for (int i = 0; i<pasos; i++) //Equivale al numero de vueltas (200 es 360º grados) o micropasos
{
//tenemos que repetir el mismo coclo de steps y direccion que no acepta valores de mas de 32767. En este caso, ponemos dos ciclos de 19200 que es lo que tiene el "int" pasos
pot=analogRead(A0); //Lectura potenciómetro
pot = map(pot, 0, 1023, minimo, maximo); //Establecemos la velocidad entre 30 y 150 rpm
// Con el pot aqui variamos la velocidad, incluso cuando esté en movimiento.
digitalWrite(steps, HIGH);
digitalWrite(steps, LOW);
delayMicroseconds(pot); // Regula la velocidad, cuanto mas bajo mas velocidad.
}
digitalWrite(reset, HIGH); //Mientras reset este en HIGH el motor permanecerá apagado y no sufrirá. El chip apagará todos los puertos y no leerá comandos.
delay(2000);
//------------------------------------------------------------------------CICLO1-VUELTA
digitalWrite(reset, LOW); //Cuando reset se encuentre en LOW el motor arrancará y leerá los comandos enviados.
digitalWrite(direccion, HIGH);
for (int i = 0; i<pasos; i++) //Equivale al numero de vueltas (200 es 360º grados) o micropasos
{
pot=analogRead(A0); //Lectura potenciómetro
pot = map(pot, 0, 1023, minimo, maximo); //Establecemos la velocidad entre min y max
digitalWrite(steps, LOW);
digitalWrite(steps, HIGH);
delayMicroseconds(pot); // Regula la velocidad, cuanto mas bajo mas velocidad.
}
delayMicroseconds(10);
//-------------------------------------------------------------------------CICLO2-VUELTA
digitalWrite(direccion, HIGH);
for (int i = 0; i<pasos; i++) //Equivale al numero de vueltas (200 es 360º grados) o micropasos
{
pot=analogRead(A0); //Lectura potenciómetro
pot = map(pot, 0, 1023, minimo, maximo); //Establecemos la velocidad entre min y max
digitalWrite(steps, LOW);
digitalWrite(steps, HIGH);
delayMicroseconds(pot); // Regula la velocidad, cuanto mas bajo mas velocidad.
}
}
//--------------------------------------------------------------------------------------FIN CICLO ALTA VELOCIDAD
//--------------------------------------------------------------------------------------INICIO CICLO BAJA VELOCIDAD
if (mode == false)
{
digitalWrite(reset, HIGH); //Mientras reset este en HIGH el motor permanecerá apagado y no sufrirá. El chip apagará todos los puertos y no leerá comandos.
delay(2000);
digitalWrite(reset, LOW); //Cuando reset se encuentre en LOW el motor arrancará y leerá los comandos enviados.
digitalWrite(direccion, LOW);
//Se repite un bucle hasta final de carril.
for (int i = 0; i<pasos; i++) //Equivale al numero de vueltas (200 es 360º grados) o micropasos
{
pot=analogRead(A0); //Lectura potenciómetro
pot = map(pot, 0, 1023, minimo, maximo); //Establecemos la velocidad entre 30 y 150 rpm
// Con el pot aqui variamos la velocidad, incluso cuando esté en movimiento.
digitalWrite(steps, HIGH);
digitalWrite(steps, LOW);
delay(pot); // Regula la velocidad, cuanto mas bajo mas velocidad.
}
delayMicroseconds(10);
//--------------------------------------------------------------------------CICLO2-IDA
digitalWrite(direccion, LOW);
//Se repite un bucle hasta final de carril.
for (int i = 0; i<pasos; i++) //Equivale al numero de vueltas (200 es 360º grados) o micropasos
{
//tenemos que repetir el mismo coclo de steps y direccion que no acepta valores de mas de 32767. En este caso, ponemos dos ciclos de 19200 que es lo que tiene el "int" pasos
pot=analogRead(A0); //Lectura potenciómetro
pot = map(pot, 0, 1023, minimo, maximo); //Establecemos la velocidad entre 30 y 150 rpm
// Con el pot aqui variamos la velocidad, incluso cuando esté en movimiento.
digitalWrite(steps, HIGH);
digitalWrite(steps, LOW);
delay(pot); // Regula la velocidad, cuanto mas bajo mas velocidad.
}
digitalWrite(reset, HIGH); //Mientras reset este en HIGH el motor permanecerá apagado y no sufrirá. El chip apagará todos los puertos y no leerá comandos.
delay(2000);
//------------------------------------------------------------------------CICLO1-VUELTA
digitalWrite(reset, LOW); //Cuando reset se encuentre en LOW el motor arrancará y leerá los comandos enviados.
digitalWrite(direccion, HIGH);
for (int i = 0; i<pasos; i++) //Equivale al numero de vueltas (200 es 360º grados) o micropasos
{
pot=analogRead(A0); //Lectura potenciómetro
pot = map(pot, 0, 1023, minimo, maximo); //Establecemos la velocidad entre min y max
digitalWrite(steps, LOW);
digitalWrite(steps, HIGH);
delay(pot); // Regula la velocidad, cuanto mas bajo mas velocidad.
}
delayMicroseconds(10);
//-------------------------------------------------------------------------CICLO2-VUELTA
digitalWrite(direccion, HIGH);
for (int i = 0; i<pasos; i++) //Equivale al numero de vueltas (200 es 360º grados) o micropasos
{
pot=analogRead(A0); //Lectura potenciómetro
pot = map(pot, 0, 1023, minimo, maximo); //Establecemos la velocidad entre min y max
digitalWrite(steps, LOW);
digitalWrite(steps, HIGH);
delay(pot); // Regula la velocidad, cuanto mas bajo mas velocidad.
}
}
}