// Pines de las bobinas del motor stepper
const int pinAPlus = 30;
const int pinAMinus = 31;
const int pinBPlus = 33;
const int pinBMinus = 32;
// Constantes del motor
const float minVel = 0.0377; // Velocidad mínima (m/s)
const float maxVel = 0.6912; // Velocidad máxima (m/s)
const float frecuenciaMinima = 0.0; // Frecuencia mínima de conmutación (Hz)
const float frecuenciaMaxima = 60.0; // Frecuencia máxima de conmutación (Hz)
// Constantes del proceso
const byte minProc = 8; // Cantidad minima de desechos por minuto procesado
const byte maxProc = 20; // Cantidad maxima de desechos por minuto procesado
const float conveyorLength = 1.23; // Longitudo del conveyor (m)
const int procPeriod = 60; // Tiempo en que debe ser procesado el volumen total (s)
const byte minPorcentage = 0; // Porcentaje de velocidad minimo
const byte maxPorcentage = 100; // Porcentaje de velocidad maximo
// Matriz para la secuencia de paso completo del motor (4 pasos)
int secuencia[4][4] = {
{1, 0, 1, 0}, // Estado 1: A+ y B+
{0, 1, 1, 0}, // Estado 2: A- y B+
{0, 1, 0, 1}, // Estado 3: A- y B-
{1, 0, 0, 1} // Estado 4: A+ y B-
};
// Variables para control de tiempo y pasos
unsigned long tiempoAnterior = 0;
int pasoActual = 0;
float periodoPaso = 0; // Período de cada paso en milisegundos
// Definir pin de potenciometro
#define potPin A0
// Función que recibe un valor de 0 a 100 y calcula la frecuencia
int calcularFrecuencia(int valor, bool procesado) {
int frecuencia = 0;
if(!procesado){
if (valor < minPorcentage) valor = 0;
if (valor > maxPorcentage) valor = maxPorcentage;
// Convertimos el valor en una frecuencia entre 0 Hz y 10 kHz
frecuencia = frecuenciaMinima + ((frecuenciaMaxima - frecuenciaMinima) * valor / 100.0);
}
else{
// Comprobar que el valor introducido se halle en el rango adecuado
if(valor<minProc) valor = 0;
else if(valor>maxProc) valor = maxProc;
// Calcular la velocidad lineal requerida para procesar la cantidad introducida
float linearVel = (valor * conveyorLength)/procPeriod;
// Convertir velocidad lineal a frecuencia
frecuencia = frecuenciaMinima + ((frecuenciaMaxima - frecuenciaMinima) * (linearVel / velocidadMaxima));
}
return frecuencia;
}
// Función para conmutar las bobinas del motor stepper
void conmutarStepper(float frecuencia) {
// Calcular el período del paso en función de la frecuencia
if (frecuencia > 0) {
periodoPaso = 1000.0 / frecuencia; // Convertir frecuencia en periodo en milisegundos
// Control del tiempo utilizando millis()
if (millis() - tiempoAnterior >= periodoPaso) {
tiempoAnterior = millis(); // Actualizamos el tiempo
// Cambiamos al siguiente paso de la secuencia
pasoActual = (pasoActual + 1) % 4; // Avanza al siguiente paso (cíclico)
// Aplicamos el estado del paso actual a los pines del motor
digitalWrite(pinAPlus, secuencia[pasoActual][0]);
digitalWrite(pinAMinus, secuencia[pasoActual][1]);
digitalWrite(pinBPlus, secuencia[pasoActual][2]);
digitalWrite(pinBMinus, secuencia[pasoActual][3]);
}
}
}
void setup() {
// Inicializamos los pines del motor como salidas
pinMode(pinAPlus, OUTPUT);
pinMode(pinAMinus, OUTPUT);
pinMode(pinBPlus, OUTPUT);
pinMode(pinBMinus, OUTPUT);
// Definir pin del potenciometro como entrada
pinMode(potPin,INPUT);
Serial.begin(9600); // Inicializamos la comunicación serial
}
void loop() {
// Leemos un valor analógico (por ejemplo, de un potenciómetro en A0)
int valorEntrada = analogRead(potPin);
int valorEscalado = map(valorEntrada, 0, 1023, 0, maxProc); // Escalamos el valor de 0 a 100
// Calculamos la frecuencia en función del porcentaje
int frecuencia = calcularFrecuencia(valorEscalado,true);
// Conmutamos las bobinas del stepper según la frecuencia calculada
conmutarStepper(frecuencia);
// Imprimimos los valores para monitorear por serial
Serial.print("Frecuencia calculada: ");
Serial.print(frecuencia);
Serial.println(" Hz");
// Sin delay para no interrumpir el flujo
}