Pilotare motori passo-passo con Arduino

Motor_PassoPasso-20120206-160920

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!

35 Comments

  1. Ahmed.Shahzad 29 dicembre 2013
  2. Roberto.Tacca 25 aprile 2014
  3. Kristian.Cristian 12 gennaio 2014
  4. adrirobot 12 gennaio 2014
  5. Luca Di Capita 31 dicembre 2013
  6. CristianPadovano 31 dicembre 2013
  7. Kristian.Cristian 13 gennaio 2014
  8. adrirobot 31 dicembre 2013
  9. Luca Di Capita 31 dicembre 2013
  10. Marven 31 dicembre 2013
  11. Marven 31 dicembre 2013
  12. adrirobot 31 dicembre 2013
  13. Luca Di Capita 21 dicembre 2013
  14. adrirobot 21 dicembre 2013
  15. Antonello.90 21 dicembre 2013
  16. CristianPadovano 22 dicembre 2013
  17. CristianPadovano 22 dicembre 2013
  18. CristianPadovano 22 dicembre 2013
  19. adrirobot 22 dicembre 2013
  20. Antonello.90 22 dicembre 2013
  21. adrirobot 22 dicembre 2013
  22. Antonello.90 22 dicembre 2013
  23. CristianPadovano 22 dicembre 2013
  24. Antonello.90 22 dicembre 2013
  25. CristianPadovano 22 dicembre 2013
  26. Luca Di Capita 23 dicembre 2013
  27. CristianPadovano 23 dicembre 2013
  28. Marven 26 dicembre 2013
  29. CristianPadovano 26 dicembre 2013
  30. Giuseppe.Cammarata 7 gennaio 2014
  31. Giuseppe.Cammarata 7 gennaio 2014
  32. Giuseppe.Cammarata 7 gennaio 2014
  33. adrirobot 7 gennaio 2014
  34. adrirobot 7 gennaio 2014
  35. CristianPadovano 8 gennaio 2014

Leave a Reply