Arduino: Controlul unui motor pas cu pas
Descriere: Comanda unui motor pas cu pas folosind Arduino
De învățat:
- cum funcționează motoarele pas cu pas
- cum se identifică firele
- cum se realizează o rotație în sensul acelor de ceasornic și invers
- cum se poate modifica viteza de rotație
Materiale necesare:
- un motor pas cu pas (eu am folosit un motor Tandon KP4M4, 3.6 grade/pas, 12V de la un floppy vechi de 5.25)
- un integrat ULN2003AN
- un soclu 16 pini
- sursă de alimentare pentru motoraș (se poate folosi o sursa DC reglabilă)
- fludor 0.6 mm
- letcon 30W
- fire de legătură (se pot folosi foarte bine cele dintr-un cablu utp)
- placuță Arduino Duemillanove + softul aferent instalat
Cost proiect:
- motoraș – nou aproximativ 40 Lei, dar se pot găsi mult mai ieftine în talcioc
- integrat 1 Leu
- soclu 16 pini 1.35 Lei
- sursa de curent (tensiune de la 3-15v) aproximativ 15 Lei
Complexitate/Timp realizare: începători/10 minute
Cum funcționează un motor pas cu pas:
- Motoarele pas cu pas sunt foarte diferite de motoarele DC obișnuite (acele mici motorașe pe care le găsim în orice jucarie simplă și care au doar 2 fire). În loc să se rotească precum un motor DC, motorul pas cu pas se va roti la un anumit unghi pentru fiecare impuls primit. Motorașul pe care l-am folosit are nevoie de 100 de impulsuri pentru a se roti la 360 de grade.
- Un alt avantaj al acestor motoare este faptul că viteza de rotație (mult mai mică decât un motor DC) se obține aproape instantaneu, chiar dacă se schimbă sensul de rotație
- Motoarele pas cu pas au ca orice motor o parte dinamică numită rotor, cu magneți permanenti, care se rotește în interior, și o parte fixă numită stator care are patru bobine dispuse la un unghi de 90 de grade una față de cealaltă. Rotorul este pus în mișcare prin aplicarea de impulsuri de curent continuu pe una sau două bobine la un moment dat.
Realizare:
- motorașul pe care l-am folosit are 5 fire. Pentru a determina care este firul comun (cel care se alimentează de la +12V) și care sunt cele pentru faze, am folosit un ohmetru. Rezistența dintre firul comun și oricare fază este mereu aceași.
- la motorașul folosit de mine am avut următoarele culori:
- negru –> +12V
- maro –> faza 1
- verde –> faza 2
- roșu –> faza 3
- alb –> faza 4
- motorașul se va conecta la circuitul integrat astfel:
- faza 1 –> pinul 16
- faza 2 –> pinul 15
- faza 3 –> pinul 14
- faza 4 –> pinul 13
- firul comun –> pinul 9 și de acolo se alimentează de la +12V
- circuitul integrat se conecteaza la arduino astfel:
- pinul 1 –>la ieșirea digitală 11
- pinul 2 –>la ieșirea digitală 10
- pinul 3 –>la ieșirea digitală 9
- pinul 4 –>la ieșirea digitală 8
- pinul 8 –>la ieșirea digitală GND și de acolo la – 12V
- În mediul de dezvoltare se va executa următorul cod:
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);
} - Codul va trimite impulsuri la intervalul delayTime către motoraș generând astfel o rotație constantă întro singură direcție.
- Dacă dorim să modificăm direcția de rotație trebuie schimbată ordinea impulsurilor. Mai jos este codul folosit pentru a roti motorul în funcție de unde vine lumina (un astfel de circuit poate fi folosit pentru a roti panourile solare dupa soare pentru un randament maxim). Pentru acest lucru am folosit două circuite asemănătoare cu cel din primul tutorial. Fotorezistențele folosite sunt puse la o oarecare distanță și la un unghi de 90 de grade pentru ca unul să capteze doar lumina din partea stângă iar altul doar din dreapta:
int motorPins[] = {8, 9, 10, 11};
int count = 0;
int count2 = 0;
int delayTime = 100;
int val1,val2;
int f=0;
int b=0;void setup() {
Serial.begin(9600); // se seteaza viteza pentru portul serial
for (count = 0; count < 4; count++) {
pinMode(motorPins[count], OUTPUT);
}
}void moveForward() {
if ((count2 == 0) || (count2 == 1)) {
count2 = 16;
}
count2>>=1;
for (count = 3; count >= 0; count–) {
digitalWrite(motorPins[count], count2>>count&0×01);}
f++;
delay(delayTime);
}void moveBackward() {
if ((count2 == 0) || (count2 == 1)) {
count2 = 16;
}
count2>>=1;
for (count = 3; count >= 0; count–) {
digitalWrite(motorPins[3 - count], count2>>count&0×01);}
b++;
delay(delayTime);
}void loop() {
val1 = analogRead(0);
//Serial.print(val1, DEC); // se afiseaza valoarea citita
val2 = analogRead(1);
//Serial.print(”-”); // se afiseaza un spatiu intre numere
// Serial.print(val2, DEC); // se afiseaza valoarea citita
// Serial.print(” “); // se afiseaza un spatiu intre numere
Serial.print(f,DEC);
Serial.print(”-”);
Serial.print(b,DEC);
Serial.print(” “);if (val1 – val2 > 50) {
moveForward();
}
else {
if (val1-val2<-50) {
moveBackward();
}
else{
delay(delayTime);
}
}
}
Proiectul asamblat:

