Controllare uno Stepper 28BYJ-48 con ULN2003 mediante Arduino

Il 28BYJ-48 è un motore passo passo unipolare a 5 fili tra i più economici che potete trovare in commercio (poco meno di 3€), è spesso inserito all’interno dei kit Arduino compatibili che troviamo su molti store online.

Si presenta in due versioni, a 5V e a 12V

Generalmente forniscono una buona coppia anche in stato di stop fintanto che viene fornita alimentazione al motore. L’unico aspetto negativo è l’elevato assorbimento anche in stato di stop che risulta di 240 mA.

Specifiche tecniche (derivate dal datasheet del motore)

Dimensioni del motore (derivate dal datasheet del motore)
Di seguito le dimensioni fisiche del motore nel caso in cui dobbiate realizzare parti meccaniche (bracci robot, plotter, ecc…) su cui fissare il motore.

Per quanto riguarda il funzionamento degli Stepper Motor vi rimando ai due articoli:

Questo tipo di motore è spesso venduto con una scheda di controllo.
Ho utilizzato spesso questo stepper per piccoli bracci robot o piccoli plotter, avrei potuto ovviamente utilizzare motori più performanti, ma il basso costo risulta particolarmente compatibile con il portafoglio anche dei miei studenti.

Per questa lezione useremo:

  • motore passo passo 28BYJ-48
  • scheda di controllo con ULN2003A
  • scheda Arduino UNO R3
  • 6 connettori maschio femmina
  • una breadboard

Ma prima di iniziare con la pratica alcuni richiami di teoria.

Sono presenti 5 fili di connessione che fanno riferimento alle bobine e all’alimentazione. All’interno del motore sono presenti due bobine, al centro di ogni bobine abbiamo la connessione alla tensione di alimentazione (5V o 12V) filo di colore rosso, mentre gli altri connettori:

  • arancione;
  • rosa;
  • giallo;
  • blu;

saranno connessi ciclicamente a massa in modo che ci sia passaggio di corrente tra questi e il positivo ed ogni volta vi sarà il passaggio di corrente in queste bobine, l’albero del motore compirà un passo.

All’interno del motore sono presenti due bobine, al centro di ogni bobine abbiamo la connessione alla tensione di alimentazione (5V) filo di colore rosso, mentre gli altri connettori: arancione, rosa, giallo, blu saranno connessi ciclicamente a massa in modo che ci sia passaggio di corrente tra questi e il positivo ed ogni volta vi sarà il passaggio di corrente in queste bobine l’albero del motore compirà un passo (fare riferimento agli articoli indicati all’inizio).

Secondo la scheda tecnica, quando il motore 28BYJ-48 funziona in modalità a full step, ogni passo corrisponderà ad una rotazione di 11,25°. Ciò significa che verranno effettuati 32 passi per giro (360°/11,25° = 32), però il motore possiede al suo interno una riduzione di 1/63,68395 che viene approssimato ad 1/64 ciò implica che ci saranno in realtà 32*63,68395 passi per giro = 2037,8864 all’incirca 2038 passi (attenzione che se si approssima il rapporto la riduzione ad 1/64 il numero di passi per giro risulta 2048).

E’ possibile controllare questo motore in modo più preciso utilizzando i micro stepping, in questa guida ne mostrerò il funzionamento in full step e successivamente utilizzando un’apposita libreria, che ne semplifica l’utilizzo, verrà controllato in half step.

Per i 28BYJ-48 l’intervallo tra ogni passo è di 2 millisecondi, quindi teoricamente potrebbe funzionare ad una velocità massima di 500 passi/s, da ciò si desume che per fare una rotazione completa sono necessari 4 secondi.

La scheda di controllo.

Sulla scheda di controllo trova posto l’integrato ULN2003A che include un array di 7 transistor Darlington, ognuno in grado di gestire una corrente di 500mA con tensioni nell’ordine dei 50V

L’ULN2003A risulta utile per la gestione di carichi di tipo induttivo come: stepper (passo-passo), motori CC, rele’, ecc… E’ presente su ogni Darlington un diodo che consente la soppressione di disturbi, rendendo superflua l’installazione di diodi esterni.

Sulla scheda di controllo troviamo anche 4 diodi LED con in serie le resistenze per limitane la corrente. I 4 LED indicati con le lettere A, B, C, D indicano lo stato di attivazione delle varie bobine.

La scheda può essere utilizzata per stepper 28BYJ-48 a 5V o a 12 V. Inserire il negativo sul pin in cui è presente il e il positivo dove è presente il simbolo +. I pin ON/OFF consentono di attivare o disattivare la scheda di controllo, nella posizione indicata nell’immagine che segue la scheda è in stato ON, togliendo il ponticello passa nello stato OFF.

Poiché l’assorbimento del passo passo può arrivare fino a 240 mA è indispensabile utilizzare un’alimentazione esterna mantenendo comuni le masse tra il microcontrollore e scheda di controllo dello stepper, però in questa lezione per rendere agevole la sperimentazione a titolo dimostrativo utilizzerò l’alimentazione a 5V direttamente ad Arduino, di seguito sono riportati i due circuiti con alimentazione da scheda Arduino ed esterna.


Schema di collegamento
(con alimentazione presa da scheda Arduino)


Schema di collegamento
(con alimentazione esterna)

Collegherò i pin IN1, IN2, IN3, IN4 della scheda di controllo del motore ai pin di Arduino: 8, 9, 10, 11.

Per rendere più semplice la programmazione possiamo utilizzare la libreria stepper presente all’interno dell’IDE di Arduino così come fatto nei due articoli indicati ad inizio di questa lezione. La libreria permette il controllo di stepper unipolari che bipolari.

Come indicato sul reference di Arduino, la libreria è dotata delle seguenti funzioni:

Utilizzerò lo sketch stepper_oneRevolution presente nell’IDE di Arduino.
Lo sketch farà muovere il motore passo-passo in senso orario lentamente e poi rapidamente in senso antiorario.

Come detto nella parte iniziale di questa lezione, l’albero del motore eseguirà 2048 passi per effettuare un’intera rotazione.

In questo esempio, l’albero esegue una rotazione completa in senso orario, eseguendo il numero di 2048 passi utilizzando la libreria Arduino Stepper.
Così come per l’esempio precedente utilizzeremo anche in questo caso i pin digitali di Arduino: 8, 9, 10, 11 così come indicato nello schema precedente.

Come detto nella parte iniziale di questa lezione, l’albero del motore eseguirà 2048 passi per effettuare un’intera rotazione.

In questo esempio, l’albero esegue una rotazione completa in senso orario, eseguendo il numero di 2048 passi utilizzando la libreria Arduino Stepper.
Così come per l’esempio precedente utilizzeremo anche in questo caso i pin digitali di Arduino: 8, 9, 10, 11 così come indicato nello schema precedente.

/*
 * Prof. Michele Maffucci
 * 28.10.2020
 */

// inclusione della libreria Stepper 
#include <Stepper.h>

// definizione del numero di passi per rotazione
const int stepsPerRevolution = 2048;

// creazione dell'istanza della classe stepper

/*
 * IN1 -> 8
 * IN2 -> 9
 * IN3 -> 10
 * IN4 -> 11
 */

Stepper myStepper(stepsPerRevolution, 8, 10, 9, 11);

void setup() {
  /* 
   * non è necessario impostare i pin di Arduino
   * a cui collegare la scheda dello stepper 
   * vengono gestiti dalla libreria
   */

// imposta la velocità a 15 rpm:
  myStepper.setSpeed(15);

// inizializzazione della porta seriale
  Serial.begin(9600);
}

void loop() {
  // imposta una rotazione in senso orario
  Serial.println("orario");
  myStepper.step(stepsPerRevolution);
  delay(500);

// imposta una rotazione in senso antiorario
  Serial.println("antiorario");
  myStepper.step(-stepsPerRevolution);
  delay(500);
}

Spiegazione del codice

Lo sketch inizia con l’inclusione della libreria Stepper.

#include <Stepper.h>

Successivamente, definiamo una costante stepsPerRevolution che contiene il numero di “passi” che il motore eseguirà per completare un giro. Nel nostro caso, è il 2048

const int stepsPerRevolution = 2048;

Il motore passo-passo unipolare 28BYJ-48 viene azionato agendo sui pin IN1-IN3-IN2-IN4 per fare ciò deve essere create un’istanza della libreria stepper chiamata myStepper in cui inseriamo la sequenza di pin 8, 10, 9, 11.
Assicuratevi di effettuare questa operazione correttamente altrimenti il motore non funzionerà correttamente.

Stepper myStepper(stepsPerRevolution, 8, 10, 9, 11);

Nel setup definiamo la velocità di rotazione e inizializziamo la Serial Monitor in quanto invieremo su questa il senso di rotazione del motore.

void setup() {
  /* 
   * non è necessario impostare i pin di Arduino
   * a cui collegare la scheda dello stepper 
   * vengono gestiti dalla libreria
   */

// imposta la velocità a 15 rpm:
  myStepper.setSpeed(15);

// inizializzazione della porta seriale
  Serial.begin(9600);
}

Nella funzione loop, nella prima parte del codice, stampiamo sulla Serial Monitor la stringa “orario” e successivamente usiamo la funzione step() per impostare il numero di passi che deve effettuare, nella seconda parte del codice stampiamo sulla Serial Monitor la stringa “antiorario” e successivamente usiamo la funzione step() impostando un valore negativo che farà ruotare il motore in senso antiorario.

void loop() {
  // imposta una rotazione in senso orario
  Serial.println("orario");
  myStepper.step(stepsPerRevolution);
  delay(500);

// imposta una rotazione in senso antiorario
  Serial.println("antiorario");
  myStepper.step(-stepsPerRevolution);
  delay(500);
}

Il primo frammento di codice farà ruotare il motore in senso orario molto lentamente. E il secondo farà girare il motore in senso antiorario a una velocità molto più veloce.

Esercizi per i miei studenti

Esercizio 1
Fare ruotare in modo continuo l’albero dello stepper, ad ogni rivoluzione accendere un LED per 200 ms. Visualizzare sulla serial monitor il contatore di rivoluzioni.

Esercizio 2
Aggiungere due pulsanti di controllo per lo start e per lo stop del motore. Indicare lo stato del pulsante sulla Serial Monitor.

Esercizio 3
Alla pressione del pulsante P1 il motore avanza di 512 passi alla pressione del pulsante P2 il motore torna indietro di 512 passi.

Esercizio 4
All’avvio del programma sulla Serial Monitor inserire un numero che identifica il numero di passi utilizzati per incrementare e decrementare il numero di passi mediante due pulsanti P1 e P2. Il numero di passi per l’incremento e il decremento è lo stesso.
Stampare sulla Serial Monitor il valore totale dei passi compiuti dallo stepper.

Esercizio 5
All’avvio del programma sulla Serial Monitor inserire due valori che identificano: il numero di passi utilizzati per incrementare e il numero di passi per decrementare. In questo esercizio si desidera impostare due valori che possono essere anche diversi per l’incremento e il decremento dei passi del motore.
Stampare sulla Serial Monitor il valore totale dei passi compiuti dallo stepper.

Esercizio 6
Mediante un sensore ad ultrasuoni realizzare un programma che nell’intervallo tra 3 cm e 19 cm avvicinando un ostacolo, per ogni centimetro il sensore incrementa di 128 passi e allontanandosi dall’ostacolo per ogni centimetro il numero di passi decremento di 128 passi.

3 pensieri su “Controllare uno Stepper 28BYJ-48 con ULN2003 mediante Arduino

  1. Claudio Di Cesare

    Salve Michele, seguo sempre con interesse i tuoi articoli che mi hanno insegnato molto e spesso aiutato per migliorare schemi di mia ideazione.
    Volevo segnalarti che le didascalie delle due figure “Schema di collegamento” mi sembrano invertite. Puoi dirmi se è così o meno.
    Grazie
    Claudio

    Rispondi
    1. admin Autore articolo

      Ciao Claudio,
      grazie mille 🙂

      In realtà volevo utilizzare i testi come titolo dello schema e non come didascalia, ma come evidenzi ciò crea confusioni. Li ho ora inseriti come titolo dello schema.

      Grazie per la segnalazione.

      Rispondi

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.