// Stepper motor on Wokwi!
#include <Stepper.h>
#define STEPS_REVOLUTION 200
Stepper stepper1(STEPS_REVOLUTION, 4, 5, 6, 7);
Stepper stepper2(STEPS_REVOLUTION, 8, 9, 10, 11);
const uint8_t btnCW = 2;
const uint8_t btnCCW = 3;
const uint8_t selPin = 12;
// Variabile per selezione dello stepper attuale
int8_t stepperIndex = -1;
typedef struct {
Stepper* stepper; // Puntatore alla classe Stepper
uint16_t speed = 30; // Velocità di default
int32_t position = 0; // Posizione attuale (in step)
} MyStepper;
// Array di struct MyStepper
MyStepper steppers[2];
// Inizializzo ciascun elemento dell'array,
// modificando i valori predefiniti se necessario
void initSteppers() {
steppers[0].stepper = &stepper1;
steppers[0].stepper->setSpeed(steppers[0].speed);
steppers[1].stepper = &stepper2;
steppers[1].speed = 100;
steppers[1].stepper->setSpeed(steppers[1].speed);
}
// Funzione a cui passo l'indice dell'array e
// il numero di step da eseguire (il segno determina la direzione)
void runStepper (int8_t idx, int8_t steps) {
if (idx != -1 && idx < sizeof(steppers) / sizeof(steppers[0])) {
steppers[idx].stepper->step(steps);
steppers[idx].position += steps;
}
else {
printStepper(idx);
}
}
// Funzione che stampa a monitor seriale qualche informazione
// riguardo allo stepper selezionato (potrebbe essere un display)
void printStepper(int8_t idx) {
if (idx < 0) {
Serial.println("Premere il pulsante di selezione motore ");
return;
}
Serial.print("Selezione motore ");
Serial.println(stepperIndex + 1);
Serial.print("Velocità impostata ");
Serial.println(steppers[stepperIndex].speed);
Serial.print("Posizione di partenza ");
Serial.println(steppers[stepperIndex].position);
}
void setup() {
Serial.begin(115200);
pinMode(btnCW, INPUT_PULLUP);
pinMode(btnCCW, INPUT_PULLUP);
pinMode(selPin, INPUT_PULLUP);
initSteppers();
printStepper(stepperIndex);
}
void loop() {
static uint32_t debounceTime;
if (!digitalRead(selPin) && millis() - debounceTime > 200) {
debounceTime = millis();
stepperIndex = (stepperIndex + 1) % 2;
printStepper(stepperIndex);
}
if (!digitalRead(btnCW))
runStepper(stepperIndex, 1);
if (!digitalRead(btnCCW))
runStepper(stepperIndex, -1);
}