Guida Completa al Controllo del Motore Passo-Passo con Arduino e ULN2003A
I motori passo-passo, noti anche come "stepper motor", rappresentano una soluzione ingegneristica avanzata per ottenere movimenti precisi e controllati. A differenza dei motori a corrente continua (CC) tradizionali, questi motori sincroni sono in grado di dividere la loro rotazione in incrementi discreti, chiamati "passi" (step). Questa caratteristica intrinseca li rende ideali per applicazioni che richiedono un posizionamento accurato, come nel campo della robotica, delle stampanti 3D e dei sistemi di automazione. La loro struttura, priva di spazzole, contribuisce inoltre a una maggiore longevità operativa rispetto ai motori CC convenzionali.
In questo tutorial, esploreremo in dettaglio come pilotare un motore passo-passo unipolare, nello specifico il modello Nema 17 da 200 passi (con un assorbimento di 0,44A), utilizzando la versatile scheda di controllo ULN2003A e la popolare piattaforma Arduino.

Comprendere il Motore Passo-Passo
Un motore passo-passo è un motore elettrico sincrono che converte impulsi elettrici in movimenti meccanici discreti. Il suo rotore, solitamente composto da magneti permanenti, è circondato da una serie di bobine (avvolte sullo statore). Applicando corrente a queste bobine in una sequenza specifica, si creano campi magnetici che interagiscono con i magneti del rotore, inducendone la rotazione di un angolo fisso, definito "passo".
Tipi di Motori Passo-Passo
Esistono principalmente due categorie di motori passo-passo:
- Motori Passo-Passo Unipolari: Questi motori dispongono tipicamente di cinque o otto fili e quattro bobine, ciascuna divisa a metà con un punto di connessione centrale. I punti centrali di ciascuna bobina vengono uniti e utilizzati come terminale di alimentazione positivo. Gli altri terminali delle bobine sono collegati a un driver esterno. Un esempio comune di motore unipolare è il 28BYJ-48, che opera a 5V con un assorbimento di circa 100mA per fase. Questo motore, sebbene non eccessivamente potente o preciso, è un'ottima scelta per progetti di piccole dimensioni o per chi si avvicina per la prima volta al mondo dei motori passo-passo. Il 28BYJ-48 presenta 64 passi per giro e, grazie a una demoltiplica meccanica interna con un rapporto di 64:1, completa un giro intero in 4096 passi.
- Motori Passo-Passo Bipolari: Questi motori, solitamente dotati di quattro o otto fili, non condividono una connessione centrale comune. Presentano invece due serie indipendenti di bobine. Per controllarli, è necessario invertire la polarità della corrente nelle bobine, operazione che viene comunemente effettuata tramite ponti H, come quelli integrati nel driver L298N.
Vantaggi dei Motori Passo-Passo
L'adozione di motori passo-passo offre diversi vantaggi significativi:
- Precisione di Posizionamento: La capacità di muoversi a passi discreti consente un controllo estremamente preciso della posizione angolare e lineare dell'albero. Questo li rende indispensabili in applicazioni dove l'accuratezza è fondamentale.
- Mantenimento della Posizione: I motori passo-passo possono mantenere la loro posizione con un margine di errore minimo quando l'albero è bloccato, grazie alla ritenzione magnetica. È importante notare che smontare questi motori, specialmente dopo la magnetizzazione iniziale, può comprometterne il magnetismo e ridurre la coppia disponibile.
- Coppia Elevata a Basse Velocità: La coppia massima di un motore passo-passo si ottiene quando l'albero è fermo e diminuisce gradualmente all'aumentare della velocità di rotazione.
- Assenza di Spazzole: A differenza dei motori CC tradizionali, i motori passo-passo non hanno spazzole. Questa caratteristica elimina l'usura meccanica associata alle spazzole, prolungando notevolmente la vita utile del motore e riducendo la necessità di manutenzione.
- Controllo Digitale: Possono essere facilmente pilotati da microcontrollori come Arduino, consentendo la creazione di sistemi di automazione complessi e flessibili.
Il Modulo Driver ULN2003A
L'ULN2003A è un circuito integrato (IC) che funge da "ponte" tra il microcontrollore (Arduino) e il motore passo-passo. Si tratta di un array di transistor Darlington, specificamente progettato per gestire carichi induttivi come i motori.
Caratteristiche dell'ULN2003A
- Array Darlington: L'ULN2003A contiene 7 transistor Darlington indipendenti. Per il pilotaggio di un motore passo-passo unipolare a 4 fasi, se ne utilizzeranno tipicamente 4.
- Capacità di Corrente: Ogni uscita dell'ULN2003A può gestire una corrente massima di 500mA (0.5A). La corrente totale gestibile dall'integrato, specialmente se più uscite vengono attivate simultaneamente, si aggira intorno a 1A.
- Tensione Massima di Uscita: L'integrato è in grado di sopportare tensioni massime in uscita fino a 50V. Tuttavia, per tensioni superiori ai 12V, è consigliabile rimuovere i diodi LED integrati o calcolarne la resistenza di caduta per evitare di bruciarli. Nel nostro caso, dato che il motore 28BYJ-48 opera a 5V, l'alimentazione dell'ULN2003A sarà anch'essa a 5V.
- Pin di Ingresso e Uscita: L'ULN2003A dispone di pin di ingresso (tipicamente dall'1 al 7) che ricevono i segnali di controllo da Arduino, e pin di uscita (dal 10 al 16) che sono collegati alle fasi del motore. Il pin 8 è destinato alla massa (GND) e il pin 9 (COM) funge da punto comune per le bobine del motore e per l'alimentazione esterna.

Schema Elettrico e Collegamenti
Per realizzare il circuito, è necessario collegare i componenti come segue:
- Collegamento Motore-ULN2003A: Le quattro fasi del motore passo-passo (solitamente identificate con colori diversi) vengono collegate alle uscite corrispondenti dell'ULN2003A. Nello specifico, i pin 1, 2, 3 e 4 dell'ULN2003A (che corrispondono agli ingressi 13, 14, 15 e 16 dell'integrato) vanno collegati alle quattro fasi del motore.
- Collegamento Arduino-ULN2003A: I pin digitali di Arduino (ad esempio, i pin 8, 9, 10 e 11) vengono collegati agli ingressi 1, 2, 3 e 4 dell'ULN2003A.
- Alimentazione:
- Il pin 8 (GND) dell'ULN2003A va collegato al pin GND di Arduino.
- Il pin 9 (COM) dell'ULN2003A va collegato al terminale positivo dell'alimentazione esterna del motore. È importante notare che, sebbene sia presente un collegamento con i 5V di Arduino, per un funzionamento ottimale e per evitare di sovraccaricare la scheda Arduino, è preferibile utilizzare un'alimentazione esterna dedicata per il motore (ad esempio, un alimentatore da 5V o 6V a seconda delle specifiche del motore).
- Il polo negativo dell'alimentazione esterna del motore va collegato al pin GND di Arduino.
- Il motore 28BYJ-48 ha un cavo centrale (spesso di colore rosso) che va collegato al pin COM dell'ULN2003A, che a sua volta è collegato all'alimentazione positiva.

Scrittura del Codice Arduino
Una volta assemblato il circuito, è il momento di caricare lo sketch sulla scheda Arduino. Arduino offre una libreria integrata chiamata Stepper che semplifica notevolmente il controllo dei motori passo-passo.
Utilizzo della Libreria Stepper
La libreria Stepper richiede la definizione del numero di passi per ogni rotazione completa del motore. Per il motore 28BYJ-48, considerando la sua demoltiplica interna, il numero di passi per una rotazione completa è 4096.
Ecco un esempio di codice base:
#include <Stepper.h>// Definisci il numero di passi per una rotazione completa del motoreconst int stepsPerRevolution = 4096;// Inizializza la libreria Stepper con i pin collegati all'ULN2003A// I pin devono essere specificati nell'ordine corretto per il driver ULN2003A// L'ordine corretto per molti driver ULN2003A è: IN1, IN3, IN2, IN4// Ad esempio, se hai collegato i pin 8, 9, 10, 11 di Arduino ai pin 1, 2, 3, 4 dell'ULN2003A// allora la sequenza corretta sarà: Stepper myStepper(stepsPerRevolution, 8, 10, 9, 11);// In questo esempio, assumiamo un collegamento generico:Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11); // Sostituisci con i tuoi pin effettivivoid setup() { // Imposta la velocità del motore in RPM (giri al minuto) // Puoi sperimentare con valori diversi per trovare la velocità ottimale myStepper.setSpeed(10); // Esempio: 10 RPM Serial.begin(9600); Serial.println("Test Motore Passo-Passo ULN2003A");}void loop() { // Fai ruotare il motore di un certo numero di passi in una direzione Serial.println("Rotazione in senso orario..."); myStepper.step(2048); // Esempio: 2048 passi (mezza rotazione) delay(1000); // Attendi 1 secondo // Fai ruotare il motore di un certo numero di passi nella direzione opposta Serial.println("Rotazione in senso antiorario..."); myStepper.step(-2048); // Esempio: -2048 passi (mezza rotazione nella direzione opposta) delay(1000); // Attendi 1 secondo}Note importanti sul codice:
- Ordine dei Pin: L'ordine in cui vengono specificati i pin di Arduino nella dichiarazione di
Stepperè cruciale per il corretto funzionamento con l'ULN2003A. L'ordine tipico che funziona con molti moduli ULN2003A è(stepsPerRevolution, pin1, pin3, pin2, pin4). Se il motore non gira correttamente, prova a invertire l'ordine dei pin (ad esempio,8, 9, 10, 11invece di8, 10, 9, 11). - Velocità: La funzione
setSpeed()imposta la velocità del motore in giri al minuto (RPM). Sperimenta con valori diversi per trovare la velocità più adatta al tuo progetto. - Passi: La funzione
step()fa avanzare il motore del numero di passi specificato. Un valore positivo indica una direzione di rotazione, mentre un valore negativo indica la direzione opposta. - Modalità di Controllo: La libreria
Steppersupporta principalmente la modalità "full step" (passo completo). Per un controllo più fluido e per ottenere micro-passi (che aumentano la risoluzione e riducono le vibrazioni), si possono utilizzare librerie più avanzate comeAccelStepper.
Tutorial Arduino ITA 37: motore passo-passo unipolare con driver ULN2003
Modalità di Controllo Avanzate
Oltre alla modalità "full step", esistono altre modalità di controllo che possono migliorare le prestazioni del motore passo-passo:
- Modalità Passo Completo (Full Step):
- Monofase (Single Phase): Attiva una sola bobina alla volta. È la modalità più semplice ma meno efficiente in termini di coppia.
- Bifase (Two Phase): Attiva contemporaneamente due bobine. Questa modalità offre una coppia maggiore rispetto alla monofase.
- Modalità Mezzo Passo (Half Step): Questa modalità alterna l'attivazione di una singola bobina e di due bobine contemporaneamente. In questo modo, si raddoppia il numero di passi per ogni rotazione, aumentando la precisione e riducendo le vibrazioni e il rumore. Per implementare la modalità half step, è necessario modificare la sequenza di attivazione delle bobine nel codice.
Esempio di Sequenza Half Step (illustrativo)
Una sequenza tipica per la modalità half step potrebbe seguire uno schema simile a questo (dove 1 indica bobina attiva e 0 inattiva):
| Passaggio | Bobina A | Bobina B | Bobina C | Bobina D |
|---|---|---|---|---|
| 1 | 1 | 0 | 0 | 0 |
| 2 | 1 | 1 | 0 | 0 |
| 3 | 0 | 1 | 0 | 0 |
| 4 | 0 | 1 | 1 | 0 |
| 5 | 0 | 0 | 1 | 0 |
| 6 | 0 | 0 | 1 | 1 |
| 7 | 0 | 0 | 0 | 1 |
| 8 | 1 | 0 | 0 | 1 |
Questa sequenza, ripetuta ciclicamente, permette di ottenere passi più piccoli e un movimento più fluido.
Applicazioni Pratiche
I motori passo-passo pilotati con Arduino e ULN2003A trovano impiego in una vasta gamma di progetti:
- Stampanti 3D: Sono fondamentali per il movimento preciso degli assi X, Y e Z, nonché per il movimento dell'estrusore. La loro capacità di posizionamento preciso è essenziale per la costruzione di oggetti strato per strato.
- Robotica: Permettono di controllare con precisione i movimenti di bracci robotici, ruote o altri attuatori, rendendoli ideali per la costruzione di robot autonomi o telecomandati.
- Sistemi di Automazione Domestica: Possono essere utilizzati per creare tende automatiche, sistemi di irrigazione controllati, serrature motorizzate e molto altro.
- Cursorini per Fotocamere: Consentono movimenti fluidi e controllati per riprese fotografiche e video professionali.
- Progetti Didattici: Sono uno strumento eccellente per imparare i principi della robotica e dell'elettronica.
Considerazioni sull'Alimentazione e la Corrente
È fondamentale prestare attenzione all'alimentazione del motore e alla corrente erogata dal driver. L'ULN2003A è in grado di gestire fino a 500mA per uscita. Se il motore utilizzato assorbe più corrente, potrebbe essere necessario un driver più potente o una configurazione con più driver.
Per motori che richiedono tensioni superiori ai 12V, come menzionato, è necessario valutare la dissipazione termica e l'eventuale rimozione dei diodi di protezione (LED) dall'ULN2003A.
Per un controllo più avanzato della corrente, sono disponibili driver specifici che permettono di regolarla tramite un trimmer, come nel caso dei driver A4988 o DRV8825. Questi driver gestiscono anche i microstep, offrendo un controllo ancora più fine.
Conclusione Provvisoria
Pilotare un motore passo-passo con Arduino e un driver ULN2003A si rivela un processo relativamente semplice ma estremamente gratificante. La combinazione di questi componenti apre le porte alla creazione di sistemi di automazione complessi e precisi, adatti a una moltitudine di progetti fai-da-te e professionali. Comprendere le caratteristiche del motore, le capacità del driver e le modalità di controllo del codice permette di sfruttare appieno il potenziale di questa tecnologia per realizzare movimenti meccanici accurati e affidabili.
