// Jogging buttons on Uno Protoneer Shield V3
// For https://forum.arduino.cc/t/adding-stepper-motors-to-replace-manual-winding-knobs/1362341/38
// https://wokwi.com/projects/425415578820815873
//
#include <AccelStepper.h>
// Define pins for stepper motors
#define X_STEP_PIN 2
#define X_DIR_PIN 5
#define Y_STEP_PIN 3
#define Y_DIR_PIN 6
#define ENABLE_PIN 8
// Define pins for buttons
#define BUTTON_X_FORWARD A0
#define BUTTON_X_REVERSE A1
#define BUTTON_Y_FORWARD A2
#define BUTTON_Y_REVERSE A3
#define POTENTIOMETER_PIN A5
// Create stepper objects
AccelStepper stepperX(AccelStepper::DRIVER, X_STEP_PIN, X_DIR_PIN);
AccelStepper stepperY(AccelStepper::DRIVER, Y_STEP_PIN, Y_DIR_PIN);
void setup() {
// Set up button pins
pinMode(BUTTON_X_FORWARD, INPUT_PULLUP);
pinMode(BUTTON_X_REVERSE, INPUT_PULLUP);
pinMode(BUTTON_Y_FORWARD, INPUT_PULLUP);
pinMode(BUTTON_Y_REVERSE, INPUT_PULLUP);
// Acitive-low Enable pin management:
if (0) {
; // use physical EN+GND jumper on shield to pull EN pin low
} else if (0) { // control enable pins with digitalWrite(..,LOW)
pinMode(ENABLE_PIN, OUTPUT);
digitalWrite(ENABLE_PIN, LOW); // default HIGH/disabled on Shield
}
else if (1) { // use AccelStepper to control enable with enableOutputs()
stepperX.setEnablePin(ENABLE_PIN);
stepperY.setEnablePin(ENABLE_PIN);
stepperX.setPinsInverted(false, false, true); // active low
stepperY.setPinsInverted(false, false, true); // active low
stepperX.enableOutputs();
stepperY.enableOutputs();
}
// Set maximum speed for steppers
stepperX.setMaxSpeed(1000);
stepperY.setMaxSpeed(1000);
}
void loop() {
// Read potentiometer value (0-1023) and map it to a speed range (e.g., 100-1000)
int potValue = analogRead(POTENTIOMETER_PIN);
int motorSpeed = map(potValue, 0, 1023, 100, 1000);
// Read button states
bool xForward = !digitalRead(BUTTON_X_FORWARD);
bool xReverse = !digitalRead(BUTTON_X_REVERSE);
bool yForward = !digitalRead(BUTTON_Y_FORWARD);
bool yReverse = !digitalRead(BUTTON_Y_REVERSE);
// Control X-axis motor
if (xForward) {
stepperX.setSpeed(motorSpeed); // Move forward
} else if (xReverse) {
stepperX.setSpeed(-motorSpeed); // Move reverse
} else {
stepperX.setSpeed(0); // Stop
}
// Control Y-axis motor
if (yForward) {
stepperY.setSpeed(motorSpeed); // Move forward
} else if (yReverse) {
stepperY.setSpeed(-motorSpeed); // Move reverse
} else {
stepperY.setSpeed(0); // Stop
}
// Run steppers
stepperX.runSpeed();
stepperY.runSpeed();
}