Aby uzyskać kierunek pracy odwrotny do poprzedniego wystarczy zamienić wartości napięć na portach sterujących.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
void loop() { int predkosc; digitalWrite(sterowanie_silnikami[0],HIGH); digitalWrite(sterowanie_silnikami[1],LOW); analogWrite(pwmA, predkosc); //dla silnika A digitalWrite(sterowanie_silnikami[2],HIGH); digitalWrite(sterowanie_silnikami[3],LOW); analogWrite(pwmB, predkosc); //dla silnika B delay(10); } |
Programowanie w ten sposób przysparza wiele problemów oraz możliwości popełnienia błędów. Przy kolejnych linijkach przejrzystość programu ulega rozmyciu dlatego też opracowano funkcję która w znaczący sposób upraszcza obsługę powyższego układu.
Założenia funkcji:
- sterowanie silnikiem za pomocą polecenia ustaw_predkosc(x,y), gdzie:
x – numer silnika
y -wartość prędkości
- umożliwienie ustawienie pracy silnika w kierunku odwrotnym za pomocą wartości ujemnych
- wymuszenie dostosowania programu do założeń sygnału PWM (wartości (0;255))
- zabezpieczenie przed wprowadzeniem nieznanego silnika do programu
Rozpoczynamy pisanie funkcji.
- Definicja funkcji
1 2 3 |
void ustaw_predkosc(int silnik, int predkosc) { } |
Od tej pory wywołanie funkcji będzie odbywało się poprzez wpisanie
1 |
ustaw_predkosc(1, 127) //ustawienie prędkości silnika A na 50% |
- Ustawienie kierunku pracy silnika w zależności od znaku przy wartości pwm
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// do nagłówka int kierunek; if (predkosc>0) { kierunek=1; } // dla prędkości dodatnich kierunek pracy silnika ustalony jako „do przodu” else { kierunek=2; // dla prędkości ujemnych kierunek pracy silnika ustalony jako „do tyłu” predkosc=predkosc*(-1); //wartość prędkości ponownie zostaje ustalona jako wartość dodatnia } |
- Ustawienie zabezpieczeń przed doborem wartości przekraczających przedział (0;255)
1 2 3 4 |
if (predkosc>255) { predkosc=255; } |
- Wymuszenie wyboru silnika 1 lub silnika 2
1 2 |
if (silnik!=1&&silnik!=2) {predkosc=0;} //w przypadku wstawienia wartości spoza zakresu {1,2} wartość prędkości silnika zostanie ustawiona na 0 |
Postulaty zabezpieczeń zostały rozpisane, pozostaje jedynie dopisać przypadki zachowań silników. Schematem do opisu tego przypadków będzie poniższy wzór.
1 2 3 4 5 6 7 |
if ((silnik==x)&&(kierunek==y)) //wybór kierunku i prędkości pracy silnika { digitalWrite(sterowanie_silnikami[z1],LOW); digitalWrite(sterowanie_silnikami[z2],HIGH); analogWrite(pwm, predkosc); } |
gdzie:
- x – numer silnika
- y – kierunek pracy
- z1,z2 – porty sterujące
- pwm – port pwm
- predkosc – prędkość pracy
Wykorzystując wszystkie powyższe adnotacje funkcja powinna przyjąć następującą postać:
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 |
void ustaw_predkosc(int silnik, int predkosc) { //dobranie silnika oraz kierunku jego pracy if (predkosc>0) { kierunek=1; } else { kierunek=2; predkosc=predkosc*(-1); } //zabezpieczenie przed wprowadzeniem blednych wartosci if (predkosc>255) { predkosc=255; } //zabiezpieczenie przed brakiem oznaczenia silnika if (silnik!=1&&silnik!=2) {predkosc=0;} if ((silnik==1)&&(kierunek==1)) //wybór kierunku i prędkości pracy silnika { digitalWrite(sterowanie_silnikami[0],LOW); digitalWrite(sterowanie_silnikami[1],HIGH); analogWrite(pwmA, predkosc); } if ((silnik==1)&&(kierunek==2)) { digitalWrite(sterowanie_silnikami[0],HIGH); digitalWrite(sterowanie_silnikami[1],LOW); analogWrite(pwmA, predkosc); } if ((silnik==2)&&(kierunek==1)) { digitalWrite(sterowanie_silnikami[2],LOW); digitalWrite(sterowanie_silnikami[3],HIGH); analogWrite(pwmB, predkosc); } if ((silnik==2)&&(kierunek==2)) { digitalWrite(sterowanie_silnikami[2],HIGH); digitalWrite(sterowanie_silnikami[3],LOW); analogWrite(pwmB, predkosc); } } |
Umieszczając powyższą funkcję poniżej programu zyskujemy możliwość sterowania silnikami przy wykorzystaniu adnotacji:
1 2 3 4 5 6 7 8 9 |
void loop() { //wykorzystanie funkcji ustaw prędkość ustaw_predkosc(1, 120); ustaw_predkosc(2, 45); delay(10); //opóźnienie //pojazd powinien poruszać się po okręgu } |
Dla uatrakcyjnienia kodu do portu A0 został doprowadzony sygnał z potencjometru który reguluje szybkość pracy silnika. Taki efekt otrzymamy przy wprowadzeniu następujących linijek kodu:
1 2 3 4 5 6 7 8 9 10 |
void loop() { potencjometr=analogRead(A0)/5; //wykorzystanie funkcji ustaw prędkość ustaw_predkosc(1, potencjometr); ustaw_predkosc(2, potencjometr/4); delay(10); //opóźnienie //pojazd powinien poruszać się po okręgu } |