🕹️ Arduino • Joystick • Motore passo passo

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.

DifficoltàIntermedia
DriverEasyDriver
IngressoJoystick su A0
In poche parole: Arduino legge la posizione del joystick sull’ingresso analogico A0 e, in base alla zona in cui si trova la leva, invia impulsi STEP e il livello DIR al driver per spostare il motore avanti o indietro.

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 con Arduino

Motore passo passo utilizzato in questo progetto.

Importante: non collegare direttamente un motore passo passo ai pin di Arduino. Serve un driver adeguato alla corrente e alla tensione del motore.

Materiale necessario

🔌 Arduino Uno
🕹️ Modulo joystick analogico
⚙️ Motore passo passo
🧠 Driver EasyDriver
🔗 Cavetti jumper
🔋 Alimentazione adatta al motore

🧰 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 consigliato

Link 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 Arduino

Link di affiliazione Amazon: in qualità di Affiliato Amazon ricevo un guadagno dagli acquisti idonei, senza alcun costo aggiuntivo per te.

Schema di collegamento

Schema Arduino joystick con EasyDriver e motore passo passo

Schema del progetto con joystick, EasyDriver e motore passo passo.

Pin utilizzati

SegnalePin ArduinoFunzione
STEPD3Genera gli impulsi di avanzamento
DIRD2Imposta il verso di rotazione
MS1D5Selezione microstepping
MS2D4Selezione microstepping
SLEEPD7Abilita il driver
Joystick asse XA0Legge 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.

Concetto chiave: ogni fronte utile sul pin STEP fa avanzare il motore di un passo o micro-passo, a seconda della configurazione MS1/MS2.

Microstepping con MS1 e MS2

MS1MS2Modalità
LOWLOWFull step
HIGHLOWHalf step
LOWHIGHQuarter step
HIGHHIGHEighth step

Codice Arduino commentato

Joystick + EasyDriver + motore passo passo
// ==========================================================
// 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 joystickPosizione obiettivo
0–1000 passi
101–400512 passi
401–6001025 passi
601–9001535 passi
901–10232050 passi
Miglioria rispetto allo sketch: ho mantenuto la stessa logica delle cinque posizioni, ma ho eliminato le numerose chiamate ripetute a 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.

Non dimensionare il sistema solo sulla corrente nominale: verifica sempre anche i limiti del driver, la corrente per fase, la regolazione della corrente dell’EasyDriver e la dissipazione termica.

Immagini del progetto

Arduino joystick motore passo passo progetto
Motore passo passo e joystick Arduino

Scarica lo sketch

⬇️ Scarica arduino_passo_passo_con_joystick.ino

Debug 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.