Cos'è un motore passo-passo? Rotazione precisa con 28BYJ-48 e ULN2003 su Arduino
Come funziona un motore passo-passo? Collegamento del 28BYJ-48 e del driver ULN2003, passi per giro (2048), librerie Stepper e AccelStepper, rotazione a un angolo, NEMA 17 con A4988, uso con ESP32 e Pico.
Un motore passo-passo divide la sua rotazione in piccoli passi uguali. A ogni comando ruota di un angolo fisso, quindi sai esattamente dove si è fermato il motore senza bisogno di sensori aggiuntivi. Stampanti 3D, macchine CNC, slider per fotocamere e tende automatiche usano i motori passo-passo proprio per questa precisione. Il modo più economico per iniziare con Arduino è il motore 28BYJ-48 con la scheda driver ULN2003 venduta insieme.

Come funziona un motore passo-passo?
Dentro il motore ci sono diverse bobine disposte intorno a un rotore magnetico dentato. Quando le bobine vengono alimentate in un certo ordine, il rotore viene attirato ogni volta verso la bobina più vicina e avanza di un passo. Se la sequenza è veloce il motore gira veloce, se è lenta gira piano; se la inverti, gira al contrario. Poiché il motore conta ogni passo, la sua posizione è nota, ma se viene sovraccaricato può perdere passi senza accorgersene.
Motore passo-passo, servo o motore DC?
| Caratteristica | Motore DC | Servomotore | Motore passo-passo |
|---|---|---|---|
| Movimento | Gira di continuo | Va a un angolo (di solito 0–180°) | Giri illimitati, passo dopo passo |
| Informazione sulla posizione | Nessuna | Sì (retroazione interna) | Nota contando i passi |
| Velocità | Molto veloce | Media | Bassa–media |
| Coppia a bassa velocità | Bassa | Media | Alta |
| Uso tipico | Ruote, ventole, pompe | Bracci robot, serrature, sterzo | Stampanti 3D, CNC, slider, orologi |
Se basta raggiungere un angolo e restarci, un servo è più semplice; i dettagli sono in Cos'è un servomotore? Se ti serve una rotazione veloce e continua, va meglio un motore DC con un driver L298N. Per i lavori che richiedono sia più giri sia una posizione nota, il motore passo-passo è imbattibile.
Caratteristiche tecniche del 28BYJ-48
| Caratteristica | Valore |
|---|---|
| Tipo | Motore passo-passo unipolare a 4 fasi |
| Tensione di lavoro | 5 V DC |
| Riduttore interno | Circa 1:64 |
| Passi per giro | 2048 (passo intero), 4096 (mezzo passo) |
| Angolo di passo | Circa 0,18° (passo intero) |
| Assorbimento | Circa 200–250 mA |
| Velocità massima | Circa 10–15 giri/min |
| Fili | 5 (il rosso è il comune) |
Collegamento del driver ULN2003
Il connettore a 5 fili del motore entra nella scheda ULN2003 in un solo verso, quindi non puoi sbagliare. Collega i pin IN1–IN4 della scheda ai pin 8–11 di Arduino e i morsetti + e – a un'alimentazione a 5 V. L'ULN2003 è un array di transistor Darlington che amplifica il piccolo segnale del pin di Arduino fino alla corrente necessaria alla bobina, e i quattro LED sulla scheda mostrano le bobine che si attivano in sequenza.
| Pin dell'ULN2003 | Arduino Uno |
|---|---|
| IN1 | D8 |
| IN2 | D9 |
| IN3 | D10 |
| IN4 | D11 |
| + (5–12 V) | 5 V esterni (per un solo motore va bene il pin 5V dell'Uno) |
| – (GND) | GND (comune con Arduino) |
Primo giro con la libreria Stepper
La libreria Stepper è inclusa nell'Arduino IDE e non va installata. L'unica attenzione riguarda l'ordine dei pin: per il 28BYJ-48 l'oggetto va dichiarato nell'ordine 8, 10, 9, 11 (IN1, IN3, IN2, IN4). Se scrivi 8, 9, 10, 11 il motore vibra sul posto invece di girare: è l'errore più comune.
1#include <Stepper.h>
2
3const int STEPS_PER_REV = 2048; // 28BYJ-48 tam tur / full revolution
4Stepper motor(STEPS_PER_REV, 8, 10, 9, 11); // sıra: IN1, IN3, IN2, IN4 / order: IN1, IN3, IN2, IN4
5
6void setup() {
7 motor.setSpeed(10); // devir/dakika, en fazla ~15 / RPM, max ~15
8}
9
10void loop() {
11 motor.step(STEPS_PER_REV); // bir yönde tam tur / one full turn
12 delay(1000);
13 motor.step(-STEPS_PER_REV / 2); // ters yönde yarım tur / half a turn back
14 delay(1000);
15}Controllo della posizione con un potenziometro
Se tieni la posizione attuale del motore in una variabile, puoi mandarlo in qualsiasi punto. Il codice qui sotto trasforma la posizione del potenziometro in 0–2048 passi e il motore si porta nello stesso punto, come se seguisse la manopola. Una tolleranza di 10 passi ignora le piccole oscillazioni. Il collegamento del potenziometro è in Cos'è un potenziometro?
1#include <Stepper.h>
2
3Stepper motor(2048, 8, 10, 9, 11);
4int position = 0; // şu anki adım / current step
5
6void setup() {
7 motor.setSpeed(12);
8}
9
10void loop() {
11 int target = map(analogRead(A0), 0, 1023, 0, 2048); // potansiyometre → hedef / pot → target
12 if (abs(target - position) > 10) { // küçük titreşimleri yok say / ignore jitter
13 motor.step(target - position);
14 position = target;
15 }
16}AccelStepper: accelerazione morbida senza bloccare il programma
Il comando step() della libreria Stepper blocca il programma finché la rotazione non è finita; nel frattempo non puoi leggere pulsanti né aggiornare un display. AccelStepper, installabile dal Gestore librerie, fa avanzare il motore passo dopo passo in background e aggiunge accelerazione e decelerazione per evitare partenze brusche. Per il 28BYJ-48 si usa la modalità a mezzo passo (HALF4WIRE), in cui un giro è di 4096 passi:
1#include <AccelStepper.h>
2
3// 28BYJ-48 + ULN2003, yarım adım: tur başına 4096 / half-step: 4096 per turn
4AccelStepper motor(AccelStepper::HALF4WIRE, 8, 10, 9, 11);
5
6void setup() {
7 motor.setMaxSpeed(1000); // adım/saniye / steps per second
8 motor.setAcceleration(400); // adım/saniye² / steps per second²
9 motor.moveTo(4096); // bir tur ileri / one turn forward
10}
11
12void loop() {
13 if (motor.distanceToGo() == 0) {
14 motor.moveTo(-motor.currentPosition()); // geri dön / go back
15 }
16 motor.run(); // her döngüde çağır, bekletmez / call every loop, non-blocking
17}Motori più potenti: NEMA 17 e A4988

Per lavori che richiedono forza, come stampanti 3D e macchine CNC, si usano motori passo-passo bipolari come il NEMA 17. Questi motori fanno 200 passi per giro (1,8°) e sono molto più potenti del 28BYJ-48. Si pilotano con driver come l'A4988 o il DRV8825: a ogni impulso su STEP il motore fa un passo e il pin DIR stabilisce il verso. Il driver si alimenta a 8–35 V e, con il microstepping, divide ogni passo fino a 16 volte per un movimento più fluido.
1const int STEP_PIN = 3;
2const int DIR_PIN = 4;
3
4void setup() {
5 pinMode(STEP_PIN, OUTPUT);
6 pinMode(DIR_PIN, OUTPUT);
7}
8
9void loop() {
10 digitalWrite(DIR_PIN, HIGH); // yön / direction
11 for (int i = 0; i < 200; i++) { // NEMA 17'de 200 adım = 1 tur / 200 steps = 1 turn
12 digitalWrite(STEP_PIN, HIGH);
13 delayMicroseconds(800); // küçüldükçe hız artar / smaller = faster
14 digitalWrite(STEP_PIN, LOW);
15 delayMicroseconds(800);
16 }
17 delay(1000);
18}Motore passo-passo con ESP32 e Raspberry Pi Pico
Gli ingressi dell'ULN2003 funzionano senza problemi con segnali a 3,3 V; alimenta comunque il motore a parte con 5 V. Sull'ESP32 la libreria AccelStepper funziona così com'è; usa pin diversi da 6–11 e 34–39, per esempio GPIO 19, 18, 5 e 17. Sul Pico con MicroPython fai girare il motore scrivendo a turno la sequenza a mezzo passo sui quattro pin:
1from machine import Pin
2import time
3
4pins = [Pin(n, Pin.OUT) for n in (2, 3, 4, 5)] # IN1–IN4 → GP2–GP5
5SEQ = [[1,0,0,0],[1,1,0,0],[0,1,0,0],[0,1,1,0],
6 [0,0,1,0],[0,0,1,1],[0,0,0,1],[1,0,0,1]] # yarım adım dizisi / half-step sequence
7
8def rotate(steps, delay_ms=2):
9 direction = 1 if steps > 0 else -1
10 for i in range(abs(steps)):
11 for pin, value in zip(pins, SEQ[(i * direction) % 8]):
12 pin.value(value)
13 time.sleep_ms(delay_ms)
14 for pin in pins:
15 pin.value(0) # bobinleri bırak / release coils
16
17rotate(4096) # bir tur / one turn (half-step)
18rotate(-1024) # çeyrek tur geri / quarter turn backIdee di progetti con il motore passo-passo
- Orologio analogico: un orologio da tavolo con lancette mosse da motori passo-passo.
- Slider per fotocamera: un binario che muove la fotocamera molto lentamente per i timelapse.
- Mangiatoia automatica per pesci: un meccanismo che ruota il serbatoio due volte al giorno per far cadere il mangime.
- Pannello che segue il sole: orienta un pannello verso la direzione più luminosa con due sensori di luce; per la parte luce vedi Sensore di luce LDR.
- Piatto rotante: un piatto che ruota un oggetto ad angoli uguali per foto di prodotto o scansioni 3D.
- Tenda automatica: un motore che apre e chiude la tenda avvolgendo la corda e ricorda la sua posizione.
Errori comuni e come risolverli
- Il motore vibra ma non gira: l'ordine dei pin nella libreria Stepper è sbagliato; scrivi 8, 10, 9, 11 invece di 8, 9, 10, 11.
- Il motore perde passi: la velocità è troppo alta o il carico troppo pesante; tieni il 28BYJ-48 sotto i 15 giri/min e aggiungi l'accelerazione con AccelStepper.
- Arduino si riavvia: l'alimentazione non basta; alimenta il motore con una sorgente esterna a 5 V e collega le masse.
- Il motore si scalda da fermo: le bobine restano alimentate; metti a LOW i quattro pin al termine del movimento.
- Il numero di giri non torna: a passo intero sono 2048 passi, a mezzo passo 4096, mentre un NEMA 17 ne ha 200. Non confondere modalità e motore.
- Con l'A4988 il motore non gira: il limite di corrente è troppo basso, manca l'alimentazione del motore oppure i pin RESET e SLEEP non sono collegati tra loro.
Il motore passo-passo è il modo più semplice per dire "gira esattamente di tanto", ed è alla base di macchine come le fresatrici CNC e le stampanti 3D. Nell'app BlueGrays trovi progetti sull'uso del 28BYJ-48 e sulla costruzione di un servo a 360 gradi da un motore passo-passo, passo passo con schemi e codice.
Domande frequenti
Quanti passi fa il 28BYJ-48 per giro?
Circa 2048 in modalità a passo intero e circa 4096 a mezzo passo. Poiché il riduttore interno non è esattamente 1:64, su rotazioni molto lunghe può accumularsi un piccolo scarto; nei lavori di precisione conviene azzerare ogni tanto la posizione con un finecorsa.
Perché il mio motore passo-passo vibra ma non gira?
La causa più comune è l'alimentazione delle bobine nell'ordine sbagliato. Nella libreria Stepper di Arduino i pin del 28BYJ-48 vanno scritti nell'ordine 8, 10, 9, 11 (IN1, IN3, IN2, IN4). Il motore può vibrare invece di girare anche se la velocità è troppo alta o l'alimentazione troppo debole.
Posso alimentare l'ULN2003 dal pin 5V di Arduino?
Per un solo 28BYJ-48 di solito sì: il motore assorbe circa 240 mA e l'USB li regge. Con due motori, servo o altri carichi il regolatore e la porta USB di Arduino vanno sotto sforzo; in quel caso usa un'alimentazione esterna a 5 V e collega le masse.
Come fa un motore passo-passo a conoscere la sua posizione?
Un motore passo-passo non misura la sua posizione: la conosce contando i passi fatti. Per questo all'avvio conviene portarlo a un punto di riferimento (per esempio un finecorsa) per azzerarlo, ed evitare che perda passi per sovraccarico o velocità eccessiva.
Meglio un motore passo-passo o un servomotore?
Se basta raggiungere un angolo tra 0 e 180 gradi e mantenerlo, un servo è più semplice e ha il driver integrato. Per più giri, coppia elevata a bassa velocità o posizionamenti molto precisi scegli un motore passo-passo.
Che differenza c'è tra il 28BYJ-48 e il NEMA 17?
Il 28BYJ-48 è un motore piccolo ed economico a 5 V che, grazie al riduttore, gira lentamente ma con precisione. Il NEMA 17 è un motore bipolare molto più potente e veloce, da 200 passi per giro; richiede un driver come l'A4988 e un'alimentazione di 12–24 V. Il 28BYJ-48 è adatto ai progetti hobbistici, il NEMA 17 a macchine come stampanti 3D e CNC.
Progetti da realizzare dopo questo articolo
Vedi tutti i progetti
Utilizzo del motore passo-passo
Progetto di base che fa ruotare il motore passo-passo 28BYJ-48 in senso orario e antiorario con la scheda driver ULN2003A. Insegna il controllo del passo e della direzione del motore passo-passo.

Costruzione del servomotore a 360 gradi dal motore passo-passo
Progetto di controllo simile a un servo che può posizionare il motore passo-passo a determinati angoli (0°-360°) e calcolare i gradi per passo. Insegna il calcolo preciso degli angoli e la logica di i

Servocomando con joystick
Progetto di pan-tilt che controlla in modo indipendente due servomotori sugli assi X e Y con un modulo joystick. Insegna la logica dell'integrazione joystick-servo e l'inseguimento della posizione.

Servomotore ESP32 (controllo tramite potenziometro)
In questo progetto controlliamo un servomotore SG90 tramite un potenziometro. Regoliamo l'angolo del servomotore mappando il valore analogico letto dal potenziometro su un intervallo compreso tra 0 e 180 gradi. Grazie alla libreria ESP32Servo, qualsiasi GPIO dell'ESP32 può generare un segnale PWM. Si tratta di un metodo di controllo fondamentale per bracci robotici, gimbal per telecamere e meccanismi di porte automatiche.

Auto controllata via Bluetooth con L298N
Progetto di auto robot 2WD (due motori, quattro ruote) che può essere controllata dal telefono con Arduino e il modulo HC-05 Bluetooth. Un totale di quattro ruote sono azionate simultaneamente collega

Robot che evita gli ostacoli
Che ne dite di costruire un veicolo intelligente che trova la propria strada? L'Obstacle Avoiding Robot scruta costantemente l'ambiente circostante grazie al sensore a ultrasuoni posto davanti a lui.

Controllo a led con joystick
Progetto di controllo che illumina i LED in 4 direzioni diverse in base ai valori degli assi X e Y del modulo joystick. Insegna la lettura analogica del joystick e la logica di rilevamento della direz

Sensore di parcheggio ESP32 (HC-SR04 + barra a 5 LED + cicalino + OLED)
La versione ESP32 del sensore di parcheggio per auto! Grazie al sensore a ultrasuoni HC-SR04 misuriamo la distanza dall'oggetto davanti al veicolo. Man mano che la distanza diminuisce, la barra composta da 5 LED si riempie (da verde → giallo → rosso) e l'intervallo tra i bip del cicalino si accorcia. Quando ci si avvicina troppo (meno di 10 cm), l'allarme suona ininterrottamente e tutti i LED si accendono. Sul display OLED SSD1306 vengono visualizzati in caratteri grandi il valore istantaneo in
Altri articoli
Impara come gira un motore passo-passo, a collegare il 28BYJ-48 ad Arduino con un ULN2003, a portarlo a qualsiasi angolo, ad accelerare dolcemente con AccelStepper e a passare ai potenti motori NEMA 17.

