#define STEP_PIN 2
#define DIR_PIN 3
#define EN_PIN 4
#define CW_BUTTON 5
#define CCW_BUTTON 6
#define CW_LED 7
#define CCW_LED 8
#define SPEED_POT A0
// Stepper motor characteristics
#define STEPS_PER_REV 200
unsigned long lastStepTime = 0;
unsigned long lastPrintTime = 0;
int adcValue = 0;
int stepDelayUs = 2000;
bool clockwise = true;
void setup()
{
Serial.begin(115200);
// A4988
pinMode(STEP_PIN, OUTPUT);
pinMode(DIR_PIN, OUTPUT);
pinMode(EN_PIN, OUTPUT);
// Buttons
pinMode(CW_BUTTON, INPUT_PULLUP);
pinMode(CCW_BUTTON, INPUT_PULLUP);
// LEDs
pinMode(CW_LED, OUTPUT);
pinMode(CCW_LED, OUTPUT);
// Enable A4988
digitalWrite(EN_PIN, LOW);
// Initial direction
digitalWrite(DIR_PIN, HIGH);
// Initial LED
digitalWrite(CW_LED, HIGH);
digitalWrite(CCW_LED, LOW);
Serial.println("=================================");
Serial.println("STM32 NUCLEO C031C6");
Serial.println("STEPPER MOTOR CONTROL");
Serial.println("=================================");
Serial.println("Red Button = CLOCKWISE");
Serial.println("Black Button = COUNTER-CLOCKWISE");
Serial.println("Potentiometer = SPEED");
Serial.println();
}
void loop()
{
// ------------------------------------------------
// 1. READ POTENTIOMETER
// ------------------------------------------------
adcValue = analogRead(SPEED_POT);
// Convert ADC value to step delay
// Lower delay = higher speed
stepDelayUs = map(adcValue, 0, 4095, 2000, 200);
// ------------------------------------------------
// 2. CLOCKWISE BUTTON
// ------------------------------------------------
if (digitalRead(CW_BUTTON) == LOW)
{
clockwise = true;
digitalWrite(DIR_PIN, HIGH);
digitalWrite(CW_LED, HIGH);
digitalWrite(CCW_LED, LOW);
delay(50); // debounce
}
// ------------------------------------------------
// 3. COUNTER-CLOCKWISE BUTTON
// ------------------------------------------------
if (digitalRead(CCW_BUTTON) == LOW)
{
clockwise = false;
digitalWrite(DIR_PIN, LOW);
digitalWrite(CW_LED, LOW);
digitalWrite(CCW_LED, HIGH);
delay(50); // debounce
}
// ------------------------------------------------
// 4. GENERATE STEP PULSES
// ------------------------------------------------
unsigned long currentTime = micros();
if (currentTime - lastStepTime >= stepDelayUs)
{
lastStepTime = currentTime;
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(5);
digitalWrite(STEP_PIN, LOW);
}
// ------------------------------------------------
// 5. SERIAL MONITOR
// ------------------------------------------------
if (millis() - lastPrintTime >= 500)
{
lastPrintTime = millis();
float stepsPerSecond = 1000000.0 / stepDelayUs;
float rpm =
(stepsPerSecond * 60.0) / STEPS_PER_REV;
Serial.print("ADC = ");
Serial.print(adcValue);
Serial.print(" | Direction = ");
if (clockwise)
Serial.print("CLOCKWISE");
else
Serial.print("COUNTER-CLOCKWISE");
Serial.print(" | Steps/sec = ");
Serial.print(stepsPerSecond, 1);
Serial.print(" | RPM = ");
Serial.println(rpm, 1);
}
}