#include // Configuración de pines #define STEP_PIN_1 2 #define DIR_PIN_1 4 #define STEP_PIN_2 7 #define DIR_PIN_2 6 #define STEP_PIN_3 0 #define DIR_PIN_3 1 #define POT_PIN 27 #define POT_PIN_2 28 #define PIN_POT 29 #define PIN_NEOPIXEL 3 #define NUM_PIXELS 75 // Número total de NeoPixels #define GROUP_SIZE 3 // Tamaño del grupo de LEDs encendidos simultáneamente // Definición de arcos #define ARC1_START 0 #define ARC1_END 24 #define ARC2_START 25 #define ARC2_END 48 #define ARC3_START 49 #define ARC3_END 74 #define NUM_READINGS 20 // Número de lecturas del potenciómetro para promediar #define POT_THRESHOLD 10 // Umbral para detectar el movimiento del potenciómetro Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_PIXELS, PIN_NEOPIXEL, NEO_GRB + NEO_KHZ800); int currentPosition1 = 0; // Variable para almacenar la posición actual del primer stepper int currentPosition2 = 0; // Variable para almacenar la posición actual del segundo stepper int lastPotValue = 0; // Último valor del potenciómetro leído void setup() { pinMode(STEP_PIN_1, OUTPUT); pinMode(DIR_PIN_1, OUTPUT); pinMode(STEP_PIN_2, OUTPUT); pinMode(DIR_PIN_2, OUTPUT); pinMode(STEP_PIN_3, OUTPUT); pinMode(DIR_PIN_3, OUTPUT); pinMode(PIN_POT, INPUT); strip.begin(); strip.show(); // Inicializa todos los LEDs apagados moveStepper1(currentPosition1); moveStepper2(currentPosition2); // El motor 3 empieza apagado, no se mueve en setup } void loop() { // Control de los motores stepper int potValueTotal = 0; for (int i = 0; i < NUM_READINGS; i++) { potValueTotal += analogRead(POT_PIN); delay(1); // Pequeño retraso para estabilizar la lectura del ADC } int potValue1 = potValueTotal / NUM_READINGS; int potValue2 = analogRead(POT_PIN_2); if (abs(potValue2 - lastPotValue) > POT_THRESHOLD) { int stepsToMove3 = abs(potValue2 - lastPotValue); digitalWrite(DIR_PIN_3, potValue2 > lastPotValue ? HIGH : LOW); moveStepper3(stepsToMove3); lastPotValue = potValue2; } int stepperSteps1 = map(potValue1, 0, 1023, 0, 100); moveStepper1(stepperSteps1); moveStepper2(stepperSteps1); // Control de los LEDs int potValue = analogRead(PIN_POT); // Devuelve un valor entre 0 y 1023 if (potValue < 10) { // Un umbral bajo para considerar como posición inicial for (int i = 0; i < NUM_PIXELS; i++) { strip.setPixelColor(i, 0, 0, 0); } strip.show(); } else { int position = map(potValue, 0, 1023, 0, NUM_PIXELS - 1); if (position <= ARC1_END) { updateLeds(position, ARC1_START, ARC1_END); } else if (position <= ARC2_END) { position = ARC2_START + (position - ARC1_END - 1); updateLeds(position, ARC2_START, ARC2_END); } else { position = ARC3_START + (position - ARC2_END - 1); updateLeds(position, ARC3_START, ARC3_END); } } delay(15); // Ajustar este valor según la velocidad deseada del movimiento } void moveStepper1(int steps) { int stepsToMove = steps - currentPosition1; if (stepsToMove != 0) { digitalWrite(DIR_PIN_1, stepsToMove > 0 ? HIGH : LOW); stepsToMove = abs(stepsToMove); for (int i = 0; i < stepsToMove; i++) { digitalWrite(STEP_PIN_1, HIGH); delayMicroseconds(100); // Ajustar este valor según la velocidad deseada del movimiento digitalWrite(STEP_PIN_1, LOW); delayMicroseconds(100); // Ajustar este valor según la velocidad deseada del movimiento } currentPosition1 = steps; } } void moveStepper2(int steps) { int stepsToMove = steps - currentPosition2; if (stepsToMove != 0) { digitalWrite(DIR_PIN_2, stepsToMove > 0 ? LOW : HIGH); // Dirección opuesta al motor 1 stepsToMove = abs(stepsToMove); for (int i = 0; i < stepsToMove; i++) { digitalWrite(STEP_PIN_2, HIGH); delayMicroseconds(100); // Ajustar este valor según la velocidad deseada del movimiento digitalWrite(STEP_PIN_2, LOW); delayMicroseconds(100); // Ajustar este valor según la velocidad deseada del movimiento } currentPosition2 = steps; } } void moveStepper3(int steps) { for (int i = 0; i < steps; i++) { digitalWrite(STEP_PIN_3, HIGH); delayMicroseconds(3000); // Ajustar este valor según la velocidad deseada del movimiento digitalWrite(STEP_PIN_3, LOW); delayMicroseconds(3000); // Ajustar este valor según la velocidad deseada del movimiento } } void updateLeds(int position, int arcStart, int arcEnd) { for (int i = 0; i < NUM_PIXELS; i++) { strip.setPixelColor(i, 0, 0, 0); } int limitedPosition = max(arcStart, min(position, arcEnd - GROUP_SIZE + 1)); for (int i = 0; i < GROUP_SIZE; i++) { if (limitedPosition + i <= arcEnd) { strip.setPixelColor(limitedPosition + i, strip.Color(255, 255, 255)); // Blanco al máximo brillo } } strip.show(); }