// =======================================================
// ESP32-S3 + A4988 + NEMA17
// Pot = FAST movement
// Button = SLOW full clockwise turn
// NO movement at startup (FIXED)
// =======================================================
// -------------------- PIN DEFINITIONS --------------------
#define STEP_PIN 16
#define DIR_PIN 17
#define ENABLE_PIN 15
#define POT_PIN 13
#define BUTTON_PIN 14
// -------------------- MOTOR SETTINGS --------------------
#define MICROSTEPS 16
#define MOTOR_STEPS 200
#define STEPS_PER_REV (MOTOR_STEPS * MICROSTEPS)
// -------------------- SPEED SETTINGS --------------------
#define SLOW_STEP_DELAY 1200
#define FAST_STEP_DELAY 100
long lastPotPosition = 0;
bool buttonPressed = false;
// =======================================================
void setup() {
// 🚫 Disable driver immediately
pinMode(ENABLE_PIN, OUTPUT);
digitalWrite(ENABLE_PIN, HIGH); // DISABLE A4988
pinMode(STEP_PIN, OUTPUT);
pinMode(DIR_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
delay(500); // allow ESP32 to fully boot
// 🔑 Sync pot BEFORE enabling motor
lastPotPosition = map(analogRead(POT_PIN), 0, 4095, 0, STEPS_PER_REV);
// ✅ Now enable motor (safe)
digitalWrite(ENABLE_PIN, LOW);
}
// =======================================================
void loop() {
// ---------- BUTTON ----------
if (digitalRead(BUTTON_PIN) == LOW && !buttonPressed) {
buttonPressed = true;
slowClockwiseTurn();
}
if (digitalRead(BUTTON_PIN) == HIGH) {
buttonPressed = false;
}
// ---------- POT ----------
int potValue = analogRead(POT_PIN);
long targetPosition = map(potValue, 0, 4095, 0, STEPS_PER_REV);
long stepsToMove = targetPosition - lastPotPosition;
if (stepsToMove != 0) {
digitalWrite(DIR_PIN, stepsToMove > 0 ? HIGH : LOW);
for (int i = 0; i < abs(stepsToMove); i++) {
stepMotor(FAST_STEP_DELAY);
}
lastPotPosition = targetPosition;
}
}
// =======================================================
void stepMotor(int delayTime) {
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(delayTime);
digitalWrite(STEP_PIN, LOW);
delayMicroseconds(delayTime);
}
// =======================================================
void slowClockwiseTurn() {
digitalWrite(DIR_PIN, HIGH);
for (long i = 0; i < STEPS_PER_REV; i++) {
stepMotor(SLOW_STEP_DELAY);
}
}
Loading
esp32-s3-devkitc-1
esp32-s3-devkitc-1