Controllare un motore passo passo unipolari con Arduino

In queste settimane i miei studenti stanno svolgendo una serie di esercitazioni in cui è necessario controllare la rotazione di un motore passo passo (stepper). L’obiettivo delle esercitazioni è quello di simulare il sistema di controllo di un forno a microonde e lo stepper viene utilizzato per la rotazione del piatto.

In un precedente articolo ho dettagliato il principio di funzionamento di questa tipologia di motori, in questo post ne riassumo le principali caratteristiche e condivido alcuni esempi che sono di base per la realizzazione delle sperimentazioni svolte per il laboratorio di TPSEE e Sistemi.

Richiami

Il vantaggio principale rispetto ad un motore brushed (a spazzola) in corrente continua e di un servomotore e che l’albero di rotazione di uno stepper può essere posizionati con precisione, spostandolo in avanti o all’indietro di un “passo” alla volta, ma possono anche ruotare continuamente.
In questa lezione verrà mostrato come controllare un motore passo-passo utilizzando Arduino ed un ponte H L293D, lo stesso utilizzato per controllare un motore a spazzola come quelli utilizzati in molti dei kit robotici che trovate sia questo sito.

Caratteristiche principali di uno stepper

  • La differenza sostanziale da un motore brushed in corrente continua risiede nel fatto che un motore passo passo mantiene la velocità di rotazione costante anche con un carico applicato, ovvero se sottoposti a sforzo mantengono velocità costante. Questa caratteristica consente di evitare sistemi di controreazione, utilizzando ad esempio degli encoder, per il mantenimento costante della velocità.
  • i motori passo passo erogano coppie elevate anche a basso numero di giri.
  • accelerazioni e frenate repentine
  • mantenimento del carico fermo e senza vibrazioni

Difetti

  • E’ necessario utilizzare un circuito elettrico di pilotaggio
  • rendimento energetico basso
  • velocità di rotazione ridotta
  • costo di acquisto elevato

Per le caratteristiche tecniche, il principio di funzionamento e le modalità di connessione vi rimando all’articolo: Controllo di un motore passo-passo bipolare NEMA17 con Driver L298N

Negli sketch di esempio che troverete in questo articolo prendo in considerazione 3 tipologie di stepper: i piccoli stepper dei CD-ROM e dei DVD dei computer, 28BYJ-48 comuni in molti kit Arduino, e i NEMA 17.

Negli sketch di esempio che troverete in questo articolo prendo in considerazione 3 tipologie di stepper: i micro stepper dei CD-ROM e dei DVD dei computer, i 28BYJ-48 comuni in molti kit Arduino, e i nema 17.

Negli sketch troverete alcune parti commentate, togliendo il commento ad alcune linee di codice, potrete impostare il funzionamento per una delle tre tipologie di stepper.

Una delle attività svolte nello scorso anno scolastico dai miei allievi è stato il recupero di tutti gli stepper dei vecchi pc alienati della scuola, ciò mi ha permesso di realizzare velocemente tutta una serie di esercitazioni sull’uso dei motori passo passo.

Gli tutti gli stepper recuperati sono stati posti su supporti stampati in 3D e fissati su basette di compensato. L’utilizzo degli stepper dei CD-ROM consente inoltre di realizzare attività di progetto interessanti, come ad esempio piccoli plotter oppure dei laser engraver.

Raccomandazioni per i miei studenti

Punto 1

Ricordate di individuare le bobine di un motore passo passo, l’operazione è un po’ difficoltosa per i passo passo dei CD-ROM che in genere non sono identificati da colori o dalla posizione.
Prima di collegare il motore alla scheda motori è necessario individuare i cavi A+, A-, B+ e B- sul motore. La maniera migliore è quella di consultare la scheda tecnica del motore in cui vi è una corrispondenza tra colore filo e cavo. In alternativa potete utilizzare un multimetro in modalità ohmmetro e misurare la resistenza tra le coppie dei cavi, quando misurerete un valore tra i 2 e i 4 ohm tra due terminali avrete individuato una delle bobine.

Punto 2

Sempre per i passo passo dei CD-ROM i fili di collegamento sono saldati al motore ed il punto di saldatura è molto piccolo, inoltre i fili di collegamento sono sottili è molto alto il rischio di romperli. Per evitare ciò ho utilizzato una strategia semplice ed economica, un ponte con un mammut su cui collego poi i fili che vanno ad essere collegati alla breadboard, così come rappresentato nell’immagine.

Punto 3

La spiegazione del funzionamento di ogni sketch è dettagliata con commenti nello sketch e tutti gli esempi sono da considerare come base di partenza per le esercitazioni svolte in presenza.

Esempio 1

Controllo rotazione stepper da Serial Monitor mediante tastiera. Valori positivi rotazione oraria, valori negativi rotazione antioraria

1// Prof. Michele Maffucci
2// 20.10.2020
3 
4// Controllo rotazione stepper mediante tastiera
5// valori positi rotazione oraria
6// valori negativi rotazione antioraria
7 
8#include <Stepper.h>
9 
10int in1Pin = 12;
11int in2Pin = 11;
12int in3Pin = 10;
13int in4Pin = 9;
14 
15/*
16in1 L293D - pin 12 Arduino
17in1 L293D - pin 11 Arduino
18in1 L293D - pin 10 Arduino
19in1 L293D - pin 9 Arduino
20*/
21 
22// 200 per stepper 17PM-M041-P1 - 12 V - 1,8 gradi per step
23 
24// 200 per microstepper CDROM - 5 V - 1,8 gradi per step
25// per evitare che slitti sul supporto impostare 170 come limite massimo
26 
27// 512 per stepper 28BY J-48 - 5 V - 5,525 gradi per step
28// per questo stepper il valore passato non e' step/giro
29// per un giro completo 2048 step. 512 equivale ad 1/4 di giro
30 
31// inizializzazione della libreria Stepper
32 
33const int stepPerGiro = 200;  // adattare al passo di rotazione del vostro stepper
34 
35Stepper myStepper(stepPerGiro, in1Pin, in2Pin, in3Pin, in4Pin); 
36  
37void setup()
38{
39  pinMode(in1Pin, OUTPUT);
40  pinMode(in2Pin, OUTPUT);
41  pinMode(in3Pin, OUTPUT);
42  pinMode(in4Pin, OUTPUT);
43   
44  Serial.begin(9600);
45   
46  // rotazioni per minuto, funzione dello stepper a disposizione
47  // e' un valore positivo.
48  // la funzione setSpeed non fa ruotare il stepper, imposta solamente la velocita'
49  myStepper.setSpeed(70);    // imposta la velocita' di rotazione a 20 rpm:
50}
51 
52void loop()
53{
54  if (Serial.available())
55  {
56    int steps = Serial.parseInt();
57     
58    // valori positivi fanno girare il mySteppere in senso orario
59    // valori negativi fanno girare il mySteppere in senso antioraio
60    myStepper.step(steps);
61  }
62}

Esercizio 2

Realizzare uno sketch che permetta di contare il numero di passi di rotazione fissato il numero di step per passo. Si evidenzi il raggiungimento di un passo con l’accensione di un LED.

Si visualizzi sulla serial monitor il messaggio:

“PASSO” – passo rotazione modulo “MODULO” passo: “CONTATORE STEP”

sono variabili:

“PASSO”,
“MODULO”
“CONTATORE STEP”

Nell’esempio:

PASSO: numero sequenziale
MODUOLO: step per passo
CONTATORE STEP: modulo del passo

1// Prof. Michele Maffucci
2// 20.10.2020
3 
4// contatore passi
5// il programma puo' pilotare stepper unipolari o bipolari
6// il numero di passi fissato nella variabile moduloStep
7// ad ogni passo viene rilevato anche da un LED
8 
9// 200 per stepper 17PM-M041-P1 - 12 V - 1,8 gradi per step
10 
11// 200 per microstepper CDROM - 5 V - 1,8 gradi per step
12// per evitare che slitti sul supporto impostare 170 come limite massimo
13 
14// 512 per stepper 28BY J-48 - 5 V - 5,525 gradi per step
15// per questo stepper il valore passato non e' step/giro
16// per un giro completo 2048 step. 512 equivale ad 1/4 di giro
17 
18 
19#include <Stepper.h>
20 
21const int stepPerGiro = 170;  // adattare al passo di rotazione del vostro stepper
22 
23// inizializzazione della libreria Stepper
24Stepper myStepper(stepPerGiro, 12, 11, 10, 9);
25 
26int contatorePassi = 0;         // numero di step raggiunto
27int moduloStep = 20;            // modulo rotazione stepper da 1 a numero massimo di passi
28                                // se moduloStep = 1 diventa un contatore di step
29int conta = 0;                  // conteggio fase
30 
31int ledPin = 7;                 // led rilevamento fase
32 
33void setup() {
34  // inizializzazione porta seriale
35  Serial.begin(9600);
36  // imposta la velocita' di rotazione a 20 rpm
37  myStepper.setSpeed(20);
38   
39  pinMode(ledPin, OUTPUT);
40}
41 
42void loop() {
43  // passi di rotazione
44  myStepper.step(moduloStep);
45  Serial.print(conta);
46  Serial.print(" - ");
47  Serial.print("passo rotazione modulo ");
48  Serial.print(moduloStep);
49  Serial.print(" ");
50  Serial.print("passo: ");
51  Serial.println(contatorePassi);
52  digitalWrite(ledPin, HIGH);
53  conta++;
54  contatorePassi=contatorePassi+moduloStep;
55  if (contatorePassi &amp;gt; stepPerGiro){
56    contatorePassi = 0;
57    conta = 0;
58  }
59  delay(500);
60  digitalWrite(ledPin, LOW);
61}

Variante per stepper 28BY J 48

1// Prof. Michele Maffucci
2// 20.10.2020
3 
4// contatore passi
5// il programma puo' pilotare stepper unipolari o bipolari
6// il numero di passi fissato nella variabile moduloStep
7// ad ogni passo viene rilevato anche da un LED
8 
9// in questo sketch si puo' effettuare le dovute correzioni per lo stepper
10// 28BY J-48
11 
12// 200 per stepper 17PM-M041-P1 - 12 V - 1,8 gradi per step
13 
14// 200 per microstepper CDROM - 5 V - 1,8 gradi per step
15// per evitare che slitti sul supporto impostare 170 come limite massimo
16 
17// 512 per stepper 28BY J-48 - 5 V - 5,525 gradi per step
18// per questo stepper il valore passato non e' step/giro
19// per un giro completo 2048 step. 512 equivale ad 1/4 di giro
20 
21 
22#include <Stepper.h>
23 
24const int stepPerGiro = 512;  // adattare al passo di rotazione del vostro stepper
25 
26const int BY = 1;             // 1 uso di BY - 0 uso di altro motore passo passo
27 
28// inizializzazione della libreria Stepper
29Stepper myStepper(stepPerGiro, 11, 9, 10, 8);
30 
31int contatorePassi = 0;         // numero di step raggiunto
32int moduloStep = 512;           // modulo rotazione stepper da 1 a numero massimo di passi
33// se moduloStep = 1 diventa un contatore di step
34int conta = 0;                  // conteggio fase
35 
36int ledPin = 13;                 // led rilevamento fase
37 
38void setup() {
39  // inizializzazione porta seriale
40  Serial.begin(9600);
41  // imposta la velocita' di rotazione a 20 rpm
42  myStepper.setSpeed(70);
43 
44  pinMode(ledPin, OUTPUT);
45}
46 
47void loop() {
48  // passi di rotazione
49  myStepper.step(moduloStep);
50  Serial.print(conta);
51  Serial.print(" - ");
52  Serial.print("passo rotazione ");
53  Serial.print("modulo ");
54  Serial.print(moduloStep);
55  Serial.print(" ");
56  Serial.print("passo: ");
57  Serial.println(contatorePassi);
58  digitalWrite(ledPin, HIGH);
59  contatore();
60  delay(500);
61  digitalWrite(ledPin, LOW);
62}
63 
64// funzione che conta i passi in funzione dello stepper utilizzato
65void contatore() {
66  conta++;
67  contatorePassi = contatorePassi + moduloStep;
68  switch (BY) {
69    case 0:
70      if (contatorePassi &amp;gt; stepPerGiro) {
71        contatorePassi = 0;
72        conta = 0;
73      }
74      break;
75    case 1:
76      if (contatorePassi &amp;gt; stepPerGiro * 4) {
77        contatorePassi = 0;
78        conta = 0;
79      }
80      break;
81  }
82}

Esempio 3

Realizzare uno sketch che permetta di far compiere in modo continuo un giro completo in senso orario ed uno in senso antiorario.

Svolgere l’esercizio sia con lo stepper 28BY J-48 che con il microstepper del CDROM

Noterete che per il microstepper del CDROM il carrello giunto alla fine slitta, in quanto 200 step per rotazione sono troppi. Valutare (in modo empirico) quanti stemp sono necessari affinche il carrello non slitti e modificare lo sketch di conseguenza.

Variante 1

Fare in modo che al completamento di un giro venga acceso un diodo LED

Variante 2

Utilizzando il microstepper fare in modo che il verso di spostamento della slitta sia segnalato da due LED ed i LED siano accesi in modo alternato in funzione del verso di scorrimento della slitta

    • Direzione 1 – LED rosso acceso, LED verde spendo
    • Direzione 2 – LED rosso spento, LED verde acceso
1// Prof. Michele Maffucci
2// 20.10.2020
3 
4// rotazione oraria e antioraria sequenziale
5 
6/*
7in1 L293D - pin 12 Arduino
8in1 L293D - pin 11 Arduino
9in1 L293D - pin 10 Arduino
10in1 L293D - pin 9 Arduino
11*/
12 
13// 200 per stepper 17PM-M041-P1 - 12 V - 1,8 gradi per step
14 
15// 200 per microstepper CDROM - 5 V - 1,8 gradi per step
16// per evitare che slitti sul supporto impostare 170 come limite massimo
17 
18// 512 per stepper 28BY J-48 - 5 V - 5,525 gradi per step
19// per questo stepper il valore passato non e' step/giro
20// per un giro completo 2048 step. 512 equivale ad 1/4 di giro
21 
22#include <Stepper.h>
23 
24const int stepPerGiro = 170;  // adattare al passo di rotazione del vostro stepper
25 
26// inizializzazione della libreria Stepper
27Stepper myStepper(stepPerGiro, 12, 11, 10, 9);
28 
29void setup() {
30  // inizializzazione porta seriale
31  Serial.begin(9600);
32  // imposta la velocita' di rotazione a 60 rpm:
33  myStepper.setSpeed(60);
34}
35 
36void loop() {
37  // un giro completo in senso orario
38  Serial.println("antiorario");
39  myStepper.step(stepPerGiro);
40  delay(500);
41   
42  // un giro completo in senso antiorario
43  Serial.println("orario");
44  myStepper.step(-stepPerGiro);
45  delay(500);
46}

Esempio 4

Realizzare uno sketch che permetta di far cambiare il senso di rotazione alla pressione di un pulsante.
Rilevare la pressione del pulsante con l’accensione del LED collegato al pin 13.
Si colleghi il pulsante al pin 2 di Arduino, secondo quanto specificato nello schema di seguito. Utilizzare per questo esercizio il microstepper.

1// Prof. Michele Maffucci
2// 20.10.2020
3 
4// Cambio direzione rotazione alla pressione di un pulsante
5 
6// il programma puo' pilotare stepper unipolari o bipolari
7// il numero di passi  fissato nella variabile moduloStep
8// ad ogni passo viene rilevato anche da un LED
9 
10// 200 per stepper 17PM-M041-P1 - 12 V - 1,8 gradi per step
11 
12// 200 per microstepper CDROM - 5 V - 1,8 gradi per step
13// per evitare che slitti sul supporto impostare 170 come limite massimo
14 
15// 512 per stepper 28BY J-48 - 5 V - 5,525 gradi per step
16// per questo stepper il valore passato non e' step/giro
17// per un giro completo 2048 step. 512 equivale ad 1/4 di giro
18 
19 
20#include <Stepper.h>
21 
22const int stepPerGiro = 200;  // adattare al passo di rotazione del vostro stepper
23 
24// inizializzazione della libreria Stepper
25Stepper myStepper(stepPerGiro, 12, 11, 10, 9);
26 
27int contatorePassi = 0;         // numero di step raggiunto
28int moduloStep = 10;            // modulo rotazione stepper da 1 a numero massimo di passi
29                                // se moduloStep = 1 diventa un contatore di step
30 
31int moduloStepCorrente;         // variabile in cui memorizzare la direzione di rotazione corrente
32                                // alla pressione del pulsante
33 
34 
35const int pinPulsante = 2;      // pin a cui e' collegato il pulsante
36const int ledPin = 13;          // pin a cui e' collegato il LED
37 
38int statoPulsante = 0;           // stato corrente del pulsante
39 
40 
41void setup() {
42   
43  // inizializzazione pin a cui e' collegato il pulsante
44  pinMode(pinPulsante, INPUT);
45   
46  // inizializzazione pin a cui e' collegato il LED
47  pinMode(ledPin, OUTPUT);
48 
49  // imposta la velocita' di rotazione a 20 rpm
50  myStepper.setSpeed(20);
51}
52 
53void loop() {
54 
55  statoPulsante = digitalRead(pinPulsante);
56  if (statoPulsante == HIGH) {
57    digitalWrite(ledPin, HIGH);
58    moduloStepCorrente = -moduloStep;
59    myStepper.step(moduloStepCorrente);
60  }
61  else {
62    digitalWrite(ledPin, LOW);
63    myStepper.step(moduloStep);
64  }
65}

Lascia un commento

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

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.