Componenti · 6 min di lettura

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.

Motore passo-passo 28BYJ-48 e scheda driver ULN2003
Motore passo-passo 28BYJ-48 e driver ULN2003: il connettore a 5 fili del motore si inserisce nella scheda; i quattro LED mostrano quale bobina è attiva.

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?

CaratteristicaMotore DCServomotoreMotore passo-passo
MovimentoGira di continuoVa a un angolo (di solito 0–180°)Giri illimitati, passo dopo passo
Informazione sulla posizioneNessunaSì (retroazione interna)Nota contando i passi
VelocitàMolto veloceMediaBassa–media
Coppia a bassa velocitàBassaMediaAlta
Uso tipicoRuote, ventole, pompeBracci robot, serrature, sterzoStampanti 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

CaratteristicaValore
TipoMotore passo-passo unipolare a 4 fasi
Tensione di lavoro5 V DC
Riduttore internoCirca 1:64
Passi per giro2048 (passo intero), 4096 (mezzo passo)
Angolo di passoCirca 0,18° (passo intero)
AssorbimentoCirca 200–250 mA
Velocità massimaCirca 10–15 giri/min
Fili5 (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'ULN2003Arduino Uno
IN1D8
IN2D9
IN3D10
IN4D11
+ (5–12 V)5 V esterni (per un solo motore va bene il pin 5V dell'Uno)
– (GND)GND (comune con Arduino)
Il 28BYJ-48 assorbe circa 240 mA. Un Uno alimentato via USB regge un motore, ma con due motori o altri carichi usa un'alimentazione esterna a 5 V e collega le masse. Anche da fermo la corrente attraversa le bobine, perciò il motore si scalda; se deve restare fermo a lungo, libera le bobine mettendo a LOW tutti e quattro i pin.

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.

Arduino (C++)
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}
Per trasformare un angolo in passi usa passi = angolo × 2048 / 360. Per esempio 90 gradi sono 512 passi e 45 gradi 256 passi.

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?

Arduino (C++)
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:

Arduino (C++)
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

Modulo driver per motori passo-passo A4988
Driver A4988: si comanda solo con i pin STEP e DIR; il piccolo trimmer limita la corrente del motore.

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.

Arduino (C++)
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}
Prima di usare un A4988, regola con il suo trimmer il limite di corrente adatto al tuo motore, metti un condensatore da 100 µF sull'alimentazione del motore e non staccare mai i fili del motore con il driver alimentato: potrebbe guastarsi all'istante.

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:

MicroPython
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 back

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

Vedi tutti i progetti
Utilizzo del motore passo-passo
#67Intermedio
Premium

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.

4.5(31)
41
Costruzione del servomotore a 360 gradi dal motore passo-passo
#68Intermedio
Premium

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

4.5(22)
30
Servocomando con joystick
#60Intermedio
Premium

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.

4.7(42)
58
Servomotore ESP32 (controllo tramite potenziometro)
#118Intermedio
Premium

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.

4.3(29)
42
Auto controllata via Bluetooth con L298N
#80Avanzato
Premium

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

5.0(38)
64
Robot che evita gli ostacoli
#81Avanzato
Premium

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.

5.0(38)
49
Controllo a led con joystick
#59Intermedio
Premium

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

4.7(50)
66
Sensore di parcheggio ESP32 (HC-SR04 + barra a 5 LED + cicalino + OLED)
#142Avanzato
Premium

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

0.0(0)
14

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.

Cos'è un motore passo-passo? Rotazione precisa con 28BYJ-48 e ULN2003 su Arduino | BlueGrays