⚙️ Arduino • Stepper • ULN2003A

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.

Motore28BYJ-48
DriverULN2003A
Comando2 pulsanti
In poche parole: un pulsante fa ruotare il motore in un verso, l’altro lo fa ruotare in quello opposto. Arduino genera la sequenza sulle quattro fasi e il driver ULN2003A fornisce la corrente necessaria alle bobine.
Arduino stepper motor 28BYJ-48 con ULN2003A

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

🔌 Arduino Uno
⚙️ Motore passo-passo 28BYJ-48
🔁 Modulo / integrato ULN2003A
🔘 2 pulsanti
Ω 2 resistenze da 10 kΩ
🔗 Cavetti di collegamento
🧩 Breadboard

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

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 Arduino

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

Schema del circuito

Schema Arduino 28BYJ-48 ULN2003A due pulsanti

Schema del motore passo-passo controllato da due pulsanti.

Collegamenti

ElementoPin Arduino
Pulsante 1D2
Pulsante 2D3
ULN2003A IN1D8
ULN2003A IN2D9
ULN2003A IN3D10
ULN2003A IN4D11

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:

Sequenza delle quattro fasi
1000
0100
0010
0001

Per ruotare nel verso opposto basta eseguire le stesse quattro fasi al contrario.

Codice Arduino commentato

28BYJ-48 + ULN2003A + due pulsanti
/*
  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.

Regolazione: diminuendo il delay il motore gira più velocemente, ma valori troppo bassi possono ridurre la coppia o provocare perdita di passi.

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.

Importante: se utilizzi un’alimentazione esterna per ULN2003A e motore, collega la massa dell’alimentazione alla GND di Arduino affinché i segnali abbiano lo stesso riferimento.

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.