Motore passo passo con Arduino e joystick
Controlliamo la posizione e il verso di rotazione di un motore stepper usando un joystick analogico e un driver EasyDriver collegato ad Arduino.
Cosa imparerai
- come leggere un joystick analogico;
- come usare un driver EasyDriver;
- la differenza tra STEP e DIR;
- come impostare il microstepping con MS1 e MS2;
- come spostare un motore stepper verso posizioni predefinite;
- come limitare la corsa via software.
Come funziona il progetto
Il progetto utilizza un motore passo passo da 5 V che assorbe circa 0,4 A e una scheda driver in grado di pilotare correnti superiori a quelle gestibili direttamente dai pin di Arduino.
Motore passo passo utilizzato in questo progetto.
Materiale necessario
🧰 Kit Arduino consigliato
Molti progetti del sito utilizzano joystick, breadboard, cavetti e componenti di base. Un kit completo può essere comodo per iniziare.
👉 Guarda il kit Arduino consigliatoLink di affiliazione Amazon: in qualità di Affiliato Amazon ricevo un guadagno dagli acquisti idonei, senza alcun costo aggiuntivo per te.
📘 Vuoi imparare Arduino passo dopo passo?
Nei miei libri trovi spiegazioni progressive, schemi chiari e progetti pratici pensati anche per chi parte da zero.
👉 Scopri i miei libri su ArduinoLink di affiliazione Amazon: in qualità di Affiliato Amazon ricevo un guadagno dagli acquisti idonei, senza alcun costo aggiuntivo per te.
Schema di collegamento
Schema del progetto con joystick, EasyDriver e motore passo passo.
Pin utilizzati
| Segnale | Pin Arduino | Funzione |
|---|---|---|
| STEP | D3 | Genera gli impulsi di avanzamento |
| DIR | D2 | Imposta il verso di rotazione |
| MS1 | D5 | Selezione microstepping |
| MS2 | D4 | Selezione microstepping |
| SLEEP | D7 | Abilita il driver |
| Joystick asse X | A0 | Legge la posizione della leva |
Come funziona STEP e DIR
Con EasyDriver il motore non viene pilotato direttamente dalle quattro fasi nel codice. Arduino invia un impulso sul pin STEP per ogni passo richiesto, mentre il pin DIR stabilisce il verso.
Microstepping con MS1 e MS2
| MS1 | MS2 | Modalità |
|---|---|---|
| LOW | LOW | Full step |
| HIGH | LOW | Half step |
| LOW | HIGH | Quarter step |
| HIGH | HIGH | Eighth step |
Codice Arduino commentato
// ==========================================================
// MOTORE PASSO PASSO CON JOYSTICK
// Driver EasyDriver
// ==========================================================
#define STEP_PIN 3
#define DIR_PIN 2
#define MS1_PIN 5
#define MS2_PIN 4
#define SLEEP_PIN 7
// Asse X del joystick
#define X_PIN A0
// Posizione software del motore.
// Il valore iniziale riprende il progetto.
int posizione = 1025;
void setup() {
pinMode(MS1_PIN, OUTPUT);
pinMode(MS2_PIN, OUTPUT);
pinMode(DIR_PIN, OUTPUT);
pinMode(STEP_PIN, OUTPUT);
pinMode(SLEEP_PIN, OUTPUT);
// Riattiva EasyDriver
digitalWrite(SLEEP_PIN, HIGH);
delay(5);
// Full step
digitalWrite(MS1_PIN, LOW);
digitalWrite(MS2_PIN, LOW);
}
// Genera un singolo impulso STEP
void faiPasso(bool direzione) {
// Imposta il verso
digitalWrite(DIR_PIN, direzione ? HIGH : LOW);
// Impulso sul pin STEP
digitalWrite(STEP_PIN, HIGH);
delay(1);
digitalWrite(STEP_PIN, LOW);
delay(1);
}
void loop() {
// Legge una sola volta il joystick
int joystick = analogRead(X_PIN);
// Zona estrema sinistra:
// porta il motore verso posizione 0
if (joystick <= 100) {
if (posizione > 0) {
faiPasso(HIGH);
posizione--;
}
}
// Zona sinistra intermedia:
// porta il motore verso posizione 512
else if (joystick <= 400) {
if (posizione < 512) {
faiPasso(LOW);
posizione++;
}
else if (posizione > 512) {
faiPasso(HIGH);
posizione--;
}
}
// Zona centrale:
// porta il motore verso posizione 1025
else if (joystick <= 600) {
if (posizione < 1025) {
faiPasso(LOW);
posizione++;
}
else if (posizione > 1025) {
faiPasso(HIGH);
posizione--;
}
}
// Zona destra intermedia:
// porta il motore verso posizione 1535
else if (joystick <= 900) {
if (posizione < 1535) {
faiPasso(LOW);
posizione++;
}
else if (posizione > 1535) {
faiPasso(HIGH);
posizione--;
}
}
// Zona estrema destra:
// porta il motore verso posizione 2050
else {
if (posizione < 2050) {
faiPasso(LOW);
posizione++;
}
}
}
Che cosa fa davvero questo programma
Il codice non usa il joystick come comando continuo di velocità. Divide invece il valore analogico in cinque fasce e associa ogni fascia a una posizione software del motore:
| Valore joystick | Posizione obiettivo |
|---|---|
| 0–100 | 0 passi |
| 101–400 | 512 passi |
| 401–600 | 1025 passi |
| 601–900 | 1535 passi |
| 901–1023 | 2050 passi |
analogRead() nei cicli while. Ora il joystick viene letto una volta per ogni ciclo, rendendo il codice più semplice da seguire e meno bloccante.Attenzione: la posizione non è assoluta
La variabile posizione conta i passi inviati dal momento dell’accensione. Arduino non sa dove si trovi realmente l’albero del motore se questo viene mosso a mano, perde passi o il sistema viene riavviato.
Per ottenere una posizione assoluta reale serve un sistema di riferimento, per esempio un finecorsa di homing oppure un encoder.
Alimentazione del motore
Il motore deve essere alimentato in modo coerente con le sue specifiche e con quelle del driver. La logica Arduino può rimanere separata dalla potenza del motore, mantenendo però un riferimento di massa comune quando previsto dal circuito.
Immagini del progetto
Scarica lo sketch
⬇️ Scarica arduino_passo_passo_con_joystick.inoDebug rapido
- controlla che il joystick sia collegato ad A0;
- verifica STEP su D3 e DIR su D2;
- controlla MS1, MS2 e SLEEP;
- verifica alimentazione e corrente del motore;
- se il motore vibra ma non gira, controlla le coppie delle bobine;
- se gira al contrario, inverti la logica DIR oppure scambia il riferimento di direzione nel software;
- se perde passi, riduci la velocità e controlla corrente e carico meccanico.
Varianti del progetto
- usare il joystick per controllare direttamente velocità e direzione;
- aggiungere finecorsa di homing;
- usare un driver A4988 o DRV8825;
- aggiungere un display con posizione corrente;
- realizzare un piccolo asse lineare;
- controllare due motori con joystick XY.
Cosa devi ricordare
- Il joystick viene letto su A0.
- STEP genera il movimento, DIR decide il verso.
- MS1 e MS2 selezionano il microstepping.
- Il programma originale usa cinque posizioni obiettivo.
- La posizione è soltanto software e non è assoluta.
- Il motore richiede un driver e un’alimentazione adeguati.
Domande frequenti
Posso usare un A4988 al posto di EasyDriver?
Sì, ma il cablaggio e i pin di configurazione cambiano. Il principio STEP/DIR rimane simile.
Perché il motore perde la posizione dopo un riavvio?
Perché Arduino memorizza solo un conteggio software dei passi. Senza homing o encoder non conosce la posizione fisica reale dell’albero.
Posso controllare la velocità col joystick?
Sì. In una variante puoi usare la distanza del joystick dal centro per modificare l’intervallo tra gli impulsi STEP e quindi la velocità.
Perché il motore vibra senza girare?
Le cause più comuni sono collegamento errato delle bobine, corrente insufficiente, sequenza di pilotaggio non corretta o carico meccanico troppo elevato.

