Pilotare motori passo-passo con Arduino

Visto il mio interesse verso le stampanti 3D e vista la progettazione che sto seguendo di una di esse, voglio parlarvi di come pilotare motori passo-passo (stepper) con Arduino e un integrato di tipo ULN2003A. Andremo a vedere, in modo sintetico, il funzionamento di un motore stepper e dell'integrato, la realizzazione di un circuito di test e la stesura del codice per Arduino.

Un motore passo-passo, anche definito stepper, è un tipo di motore sincrono che può, a seconda degli avvolgimenti eccitati dalla corrente continua, dividere i suoi movimenti in passi (step). Questo tipo di motori non ha spazzole e, rispetto ai normali motori CC, ha il vantaggio di poter fare movimenti precisi, tenendo fermo l'albero con poco margine di errore. Ne esistono di due tipi, riconoscibili in base al numero di fili che indicano le fasi:

  • unipolari (5, 6 o 8 fili)
  • bipolari (4 o 8 fili)

Nel nostro caso andremo ad utilizzare un motore unipolare del tipo Nema 17 da 200 passi 0,44A. Il motore avrà una corrente di 0,44A perchè l'integrato che useremo potrà gestire una corrente massima di 0.5A. 

L'integrato ULN2003A (qui trovate il suo datasheet) è composto da 7 transistor Darlington e, come è stato detto, può gestire una corrente massima di 0.5A e tensioni massime in uscita di 50V. E' da sottolineare che per ogni motore che vogliamo usare bisognerà utilizzare un  integrato: infatti, ULN2003A può gestire 1 motore stepper oppure 2 motori CC semplici.

Passiamo ora allo schema elettrico da usare. Lo schema è questo proposto di seguito

Nell'immagine è indicato l'integrato 2004 ma il datasheet è lo stesso del 2003A quindi sono identici.

Dallo schema elettrico si può notare che verranno usati gli input 1, 2, 3, 4 per ricevere il segnale da Arduino e i rispettivi output (13, 14, 15 e 16) per collegare le 4 fasi del motore. Useremo poi il pin 8 a massa (GND) e il rispettivo (COM) come comune con il motore e l'alimentazione dello stesso. Per l'alimentazione, possiamo utilizzare una tensione supportata da entrambi oppure alimentare separatamente i due componenti, cioè utilizzare 5v per il Darlington ed un alimentatore a parte per il motore.

Per capire meglio i collegamenti generali e costruire un circuito di test, si può osservare la seguente immagine esplicativa

In questo caso si può notare come l'alimentazione sia presa esternamente, anche se è presente un collegamento con i 5V di Arduino. La fonte, però, come si può leggere dal datasheet dell'integrato, non deve superare i 30V in entrata.

Tenendo in considerazione che stiamo usando dei motori che funzionano a 5V 0.44A, si potrebbe anche usare la sola alimentazione che arriva da Arduino per entrambi i dispositivi in quanto il computer riesce a pilotare entrambi senza causare sovraccarichi della porta USB.

Nello schema generale, i pin 8, 9, 10 e 11 di Arduino sono collegati con i pin 1, 2, 3 e 4 dell'integrato; i restanti pin dell'ULN2003A sono collegati come precedentemente descritto.

A questo punto, costruito il nostro circuito, possiamo passare ai test ma prima ancora serve effettuare la stesura del codice di Arduino. Sul sito ufficiale si possono trovare numerosi tutorial e parti di codice utili per qualsiasi evenienza. Prendiamo in esame il codice per pilotare un solo motore:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
/* Stepper Copal
 * -------------
 *
 * Program to drive a stepper motor coming from a 5'25 disk drive
 * according to the documentation I found, this stepper: "[...] motor
 * made by Copal Electronics, with 1.8 degrees per step and 96 ohms
 * per winding, with center taps brought out to separate leads [...]"
 * [http://www.cs.uiowa.edu/~jones/step/example.html]
 *
 * It is a unipolar stepper motor with 5 wires:
 *
 * - red: power connector, I have it at 5V and works fine
 * - orange and black: coil 1
 * - brown and yellow: coil 2
 *
 * (cleft) 2005 DojoDave for K3
 * http://www.0j0.org | http://arduino.berlios.de
 *
 * @author: David Cuartielles
 * @date: 20 Oct. 2005
 */
 
int motorPin1 = 8;
int motorPin2 = 9;
int motorPin3 = 10;
int motorPin4 = 11;
int delayTime = 500;
 
void setup() {
  pinMode(motorPin1, OUTPUT);
  pinMode(motorPin2, OUTPUT);
  pinMode(motorPin3, OUTPUT);
  pinMode(motorPin4, OUTPUT);
}
 
void loop() {
  digitalWrite(motorPin1, HIGH);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, LOW);
  delay(delayTime);
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, LOW);
  delay(delayTime);
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, HIGH);
  digitalWrite(motorPin4, LOW);
  delay(delayTime);
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, HIGH);
  delay(delayTime);
}
  • le linee 23-26 indicano la corrispondenza tra la fase del motore e il pin al cui è collegata ad Arduino
  • la linea 27 indica il ritardo di rotazione, in millisecondi, tra uno step e quello successivo
  • le linee 29-34 impostano i pin di Arduino in modalità OUTPUT
  • le linee 36 e 57 indicano la funzione di "loop" in modo da far compiere un ciclo continuo all'albero del motore
  • le linee 37-40 indicano ad Arduino di invare un segnale HIGH sul pin 8. Quest'ultimo, collegato con l'ULN2003A, collegherà la fase corrispondente del motore facendolo avanzare. Le stesse righe indicano ad Arduino anche di inviare un segnale LOW ai pin dal 9 a 11, mentre la riga 40 impone di aspettare 500 ms prima di procedere con altre istruzioni
  • le linee 42-56 impostano un segnale HIGH in successione ai pin 9, 10 e 11 attendendo, per ogni passo, un tempo di 500 millisecondi

Come si può vedere, pilotare un motore stepper non è molto complicato e il codice descritto può essere ampliato per pilorare più di un motore. Questo tipo di motori è molto utile per far muovere, nel caso di una stampante 3D, tutti i meccanismi, dalle barre filettate alle cinghie all'estrusore, per la loro precisione e per la maggiore coppia motrice che hanno rispetto ai normali motori a corrente continua. Inoltre questo tipo di motori non ha spazzole, a differenza dei normali motori, e quindi ha una maggiore vita. Uno svantaggio di questi però è l'eccessivo costo, ma si può ovviare a ciò cercando su siti di materiale usato, come ad esempio qui, oppure procedere in sano spirito Open e recuperare alcuni motori da vecchie stampanti Canon (dalla mia esperienza le Hp hanno sempre semplici motori CC) oppure da scanner.

BUONA PROGETTAZIONE!

Scarica subito una copia gratis

46 Commenti

  1. Avatar photo Luca Di Capita 21 Dicembre 2013
  2. Avatar photo adrirobot 21 Dicembre 2013
  3. Avatar photo Antonello.90 21 Dicembre 2013
  4. Avatar photo CristianPadovano 22 Dicembre 2013
  5. Avatar photo CristianPadovano 22 Dicembre 2013
  6. Avatar photo CristianPadovano 22 Dicembre 2013
  7. Avatar photo adrirobot 22 Dicembre 2013
  8. Avatar photo Antonello.90 22 Dicembre 2013
  9. Avatar photo adrirobot 22 Dicembre 2013
  10. Avatar photo Antonello.90 22 Dicembre 2013
  11. Avatar photo CristianPadovano 22 Dicembre 2013
  12. Avatar photo Antonello.90 22 Dicembre 2013
  13. Avatar photo CristianPadovano 22 Dicembre 2013
  14. Avatar photo Luca Di Capita 23 Dicembre 2013
  15. Avatar photo CristianPadovano 23 Dicembre 2013
  16. Avatar photo Marven 26 Dicembre 2013
  17. Avatar photo CristianPadovano 26 Dicembre 2013
  18. Avatar photo Ahmed.Shahzad 29 Dicembre 2013
  19. Avatar photo Luca Di Capita 31 Dicembre 2013
  20. Avatar photo CristianPadovano 31 Dicembre 2013
  21. Avatar photo adrirobot 31 Dicembre 2013
  22. Avatar photo Luca Di Capita 31 Dicembre 2013
  23. Avatar photo Marven 31 Dicembre 2013
  24. Avatar photo Marven 31 Dicembre 2013
  25. Avatar photo adrirobot 31 Dicembre 2013
  26. Avatar photo Giuseppe.Cammarata 7 Gennaio 2014
  27. Avatar photo Giuseppe.Cammarata 7 Gennaio 2014
  28. Avatar photo Giuseppe.Cammarata 7 Gennaio 2014
  29. Avatar photo adrirobot 7 Gennaio 2014
  30. Avatar photo adrirobot 7 Gennaio 2014
  31. Avatar photo CristianPadovano 8 Gennaio 2014
  32. Avatar photo Kristian.Cristian 12 Gennaio 2014
  33. Avatar photo adrirobot 12 Gennaio 2014
  34. Avatar photo Kristian.Cristian 13 Gennaio 2014
  35. Avatar photo Roberto.Tacca 25 Aprile 2014
  36. Avatar photo riky2k 25 Gennaio 2015
  37. Avatar photo palladinoRC 13 Agosto 2015
    • Avatar photo SaraE 14 Agosto 2015
      • Avatar photo vincent 15 Agosto 2015
  38. Avatar photo palladinoRC 15 Agosto 2015
    • Avatar photo adrirobot 18 Agosto 2015
  39. Avatar photo Davide Japan 18 Ottobre 2015
  40. Avatar photo Fabrizio Marchetto 26 Maggio 2017
  41. Avatar photo MattPuzz98 1 Luglio 2017
  42. Avatar photo MattPuzz98 3 Luglio 2017

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend