Motore passo-passo 28BYJ-48 con Arduino e due pulsanti
Controlliamo il verso di rotazione di un motore passo-passo 28BYJ-48 tramite Arduino Uno, driver ULN2003A e due semplici pulsanti.
Motore passo-passo con Arduino. L’immagine mantiene una larghezza massima di 476 px.
Perché serve ULN2003A
Il 28BYJ-48 è un motore passo-passo a più avvolgimenti. Arduino non deve alimentare direttamente le bobine: il modulo ULN2003A usa un array di transistor Darlington per pilotarle in sicurezza.
Nel circuito vengono usati quattro ingressi del driver, controllati dai pin D8, D9, D10 e D11 di Arduino.
Materiale necessario
🧰 Kit Arduino consigliato
Un kit completo è utile per avere breadboard, cavetti, resistenze, pulsanti e molti componenti di base per sperimentare con Arduino.
👉 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?
Se vuoi approfondire e realizzare progetti più completi, puoi dare un’occhiata anche ai miei libri dedicati ad Arduino. All’interno troverai spiegazioni semplici, schemi chiari e molti progetti pratici pensati 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 del circuito
Schema del motore passo-passo controllato da due pulsanti.
Collegamenti
| Elemento | Pin Arduino |
|---|---|
| Pulsante 1 | D2 |
| Pulsante 2 | D3 |
| ULN2003A IN1 | D8 |
| ULN2003A IN2 | D9 |
| ULN2003A IN3 | D10 |
| ULN2003A IN4 | D11 |
Come ruota un motore passo-passo
Un motore passo-passo non viene alimentato semplicemente con ON e OFF. Le bobine devono essere eccitate secondo una sequenza precisa. Cambiando l’ordine della sequenza cambia anche il verso di rotazione.
In questo progetto usiamo una sequenza a quattro fasi:
1000
0100
0010
0001
Per ruotare nel verso opposto basta eseguire le stesse quattro fasi al contrario.
Codice Arduino commentato
/*
MOTORE PASSO-PASSO 28BYJ-48 CON ULN2003A E DUE PULSANTI
Pulsante 1 -> D2
Pulsante 2 -> D3
ULN2003A:
IN1 -> D8
IN2 -> D9
IN3 -> D10
IN4 -> D11
Funzionamento:
- tenendo premuto il pulsante 1 il motore gira in un verso
- tenendo premuto il pulsante 2 il motore gira nel verso opposto
*/
const int BUTTON_1 = 2;
const int BUTTON_2 = 3;
const int MOTOR_PIN_1 = 8;
const int MOTOR_PIN_2 = 9;
const int MOTOR_PIN_3 = 10;
const int MOTOR_PIN_4 = 11;
// Tempo tra uno step e il successivo.
// Valori più bassi aumentano la velocità,
// ma se troppo bassi il motore può perdere passi.
const int MOTOR_SPEED = 4;
// Sequenza full-step a 4 fasi
const byte sequence[4][4] = {
{HIGH, LOW, LOW, LOW },
{LOW, HIGH, LOW, LOW },
{LOW, LOW, HIGH, LOW },
{LOW, LOW, LOW, HIGH}
};
void setup() {
pinMode(BUTTON_1, INPUT);
pinMode(BUTTON_2, INPUT);
pinMode(MOTOR_PIN_1, OUTPUT);
pinMode(MOTOR_PIN_2, OUTPUT);
pinMode(MOTOR_PIN_3, OUTPUT);
pinMode(MOTOR_PIN_4, OUTPUT);
stopMotor();
}
void loop() {
int statoPulsante1 = digitalRead(BUTTON_1);
int statoPulsante2 = digitalRead(BUTTON_2);
// Pulsante 1: rotazione in un verso
if (statoPulsante1 == HIGH && statoPulsante2 == LOW) {
stepForward();
}
// Pulsante 2: rotazione nel verso opposto
else if (statoPulsante2 == HIGH && statoPulsante1 == LOW) {
stepBackward();
}
// Nessun pulsante oppure entrambi premuti: motore fermo
else {
stopMotor();
}
}
// Esegue quattro fasi in avanti
void stepForward() {
for (int fase = 0; fase < 4; fase++) {
applyPhase(fase);
delay(MOTOR_SPEED);
}
}
// Esegue le stesse fasi in ordine inverso
void stepBackward() {
for (int fase = 3; fase >= 0; fase--) {
applyPhase(fase);
delay(MOTOR_SPEED);
}
}
// Applica una fase della sequenza al driver
void applyPhase(int fase) {
digitalWrite(MOTOR_PIN_1, sequence[fase][0]);
digitalWrite(MOTOR_PIN_2, sequence[fase][1]);
digitalWrite(MOTOR_PIN_3, sequence[fase][2]);
digitalWrite(MOTOR_PIN_4, sequence[fase][3]);
}
// Disattiva tutte le bobine
void stopMotor() {
digitalWrite(MOTOR_PIN_1, LOW);
digitalWrite(MOTOR_PIN_2, LOW);
digitalWrite(MOTOR_PIN_3, LOW);
digitalWrite(MOTOR_PIN_4, LOW);
}
Come funziona lo sketch
1. Lettura dei pulsanti
D2 e D3 vengono letti a ogni ciclo. Se è premuto soltanto il primo pulsante viene eseguita la sequenza in avanti; con il secondo viene eseguita al contrario.
2. Sequenza del motore
L’array sequence contiene le quattro combinazioni che eccitano una fase alla volta.
3. Velocità
La costante MOTOR_SPEED stabilisce il tempo tra uno step e il successivo.
4. Arresto
Quando nessun pulsante è premuto, tutte le uscite vengono portate LOW tramite stopMotor().
Alimentazione del motore
Per un funzionamento stabile è preferibile alimentare il modulo motore con una sorgente adatta al 28BYJ-48, invece di caricare inutilmente il regolatore di Arduino.
Pulsanti e resistenze da 10 kΩ
Il circuito usa resistenze da 10 kΩ per mantenere definiti gli ingressi quando i pulsanti non sono premuti. In alternativa è possibile riprogettare gli ingressi con INPUT_PULLUP, collegando i pulsanti verso GND e invertendo la logica di lettura.
Scarica lo sketch
⬇️ Scarica arduino_controllo_stepper_con_pulsanti.ino
Debug rapido
- se il motore vibra ma non gira, verifica l’ordine IN1–IN4;
- se gira nel verso opposto, inverti la sequenza oppure scambia i pulsanti;
- se perde passi, aumenta
MOTOR_SPEED; - se Arduino si riavvia, controlla l’alimentazione del motore;
- se il motore resta fermo, verifica driver, connettore del 28BYJ-48 e massa comune;
- se un pulsante sembra sempre premuto, controlla le resistenze da 10 kΩ.
Varianti del progetto
- aggiungere un terzo pulsante di stop;
- aggiungere un potenziometro per regolare la velocità;
- controllare un numero preciso di passi per ogni pressione;
- aggiungere finecorsa;
- usare un encoder rotativo;
- controllare lo stepper via Bluetooth;
- utilizzare la libreria Stepper o AccelStepper per movimenti più evoluti.
Cosa devi ricordare
- Il motore utilizzato è il 28BYJ-48.
- ULN2003A pilota le bobine del motore.
- I due pulsanti sono collegati a D2 e D3.
- Le quattro fasi vengono pilotate da D8, D9, D10 e D11.
- Invertendo l’ordine della sequenza si inverte la rotazione.
- Il valore del delay influenza la velocità e la coppia.
Domande frequenti
Posso alimentare il 28BYJ-48 direttamente dai pin Arduino?
No. Il motore deve essere pilotato tramite ULN2003A o altro driver adatto.
Perché il motore vibra senza ruotare?
La causa più comune è un ordine errato delle quattro fasi oppure un collegamento sbagliato tra Arduino e driver.
Come aumento la velocità?
Puoi ridurre MOTOR_SPEED, ma oltre un certo limite il motore può perdere passi o non riuscire a partire.
Posso far fare al motore un numero preciso di giri?
Sì. Devi contare gli step eseguiti e fermare la sequenza quando raggiungi il numero desiderato.

