//Movimiento de corona modificado para usar Driver A4988 (o DMA806E)
//Pueba en vivo 05-04-24
#include <AccelStepper.h>
//#include <LiquidCrystal.h>
#include <Keypad.h>
// Configura los pines para el controlador ULN2003
/*const int In1 = 5;
const int In2 = 4;
const int In3 = 3;
const int In4 = 2;
*/
const int pul = 3;
const int dir = 2;
// Crea una instancia de AccelStepper para driver A4988
//AccelStepper stepper(AccelStepper::DRIVER, stepPin, dirPin);
//Comentar la línea anterior y Activar la línea siguiente si se va usar ULN2003
//AccelStepper stepper(AccelStepper::FULL4WIRE, In1, In3, In2, In4);
//(Keep in mind that the step sequence for these motors is IN1-IN3-IN2-IN4)
AccelStepper stepper(1,pul,dir);
// Usamos display I2C
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 16, 2);
// Configura el teclado matricial (ajusta según tu conexión)
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {13, 12, 11, 10}; //Conecta los pines del teclado a estos pines digitales
byte colPins[COLS] = {9, 8, 7, 6};
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
//Variable para el nuevo ángulo
//int oldAngle = 0; //variable pensada para implementar un movimiento incremental
void setup() {
//Serial.begin(9600); // Inicializa puerta serie
//Serial.print("ingresar Angulo:");
Wire.begin();
lcd.begin(16, 2); // Inicializa el display LCD (16 columnas x 2 filas)
lcd.backlight();
lcd.print("Control de Corona"); // Muestra instrucciones en la primera línea
lcd.setCursor(0, 1);
lcd.print("Ingrese Ang:"); // Instrucciones en la segunda línea
// Configura la velocidad máxima y la aceleración
stepper.setMaxSpeed(1000); // Ajusta la velocidad máxima según tus necesidades
stepper.setSpeed(1000);
stepper.setAcceleration(100); // Ajusta la aceleración según tus necesidades
}
void loop() {
// Espera a que se ingrese el ángulo desde el teclado
//Al comentar esta línea eliminamos la lectura de teclado
int angle = readAngleFromKeypad();
// Calcula los pasos necesarios para el ángulo ingresado ** Usando variable int maximo 32767 **
int totalSteps = 200; // CUIDADO AJUSTAR Ej: motor con 1.8 grados por paso (200 pasos por revolución)
int stepsNeeded = calculateStepsForAngle(angle, totalSteps);
// Muestra el resultado en el display
lcd.clear();
lcd.print("Ang:");
lcd.print(angle);
//lcd.setCursor(0, 1);
lcd.print(" Pasos:");
lcd.print(stepsNeeded);
// Set the target position:
stepper.moveTo(stepsNeeded);
// Run to target position with set speed and acceleration/deceleration:
stepper.runToPosition();
// Espera un tiempo para mostrar la posición final (opcional)
delay(2000); // Puedes ajustar el tiempo según tus necesidades
lcd.clear();
lcd.setCursor(0, 1);
lcd.print("Pos. final: ");
//lcd.setCursor(0, 3);
lcd.print(stepper.currentPosition());
//oldAngle = angle;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Angulo final: ");
lcd.print(angle);
lcd.setCursor(0, 1);
lcd.print("Nuevo Angulo:");
}
// Función para leer el ángulo desde el teclado
int readAngleFromKeypad() {
String input = "";
char key;
while (input.length() < 3) { // Asumimos que el ángulo es de 000 a 360 grados
key = keypad.getKey();
if (key) {
input += key;
delay(100); // Pequeña pausa para evitar lecturas duplicadas
}
}
return input.toInt();
}
// Función para calcular los pasos necesarios para un ángulo dado
int calculateStepsForAngle(int angle, int totalSteps) {
// Calcula los pasos necesarios para el ángulo deseado
// (360 grados = totalSteps pasos)
return map(angle, 0, 360, 0,totalSteps);
}