[ARDUINO, EAGLE i TY] Biblioteki Arduino dla sterownika H silnika elektrycznego
Aby uzyskać kierunek pracy odwrotny do poprzedniego wystarczy zamienić wartości napięć na portach sterujących.
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
void ustaw_predkosc(int silnik, int predkosc) { }
Od tej pory wywołanie funkcji będzie odbywało się poprzez wpisanie
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
// 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)
if (predkosc>255) { predkosc=255; }
- Wymuszenie wyboru silnika 1 lub silnika 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.
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ć:
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:
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:
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 }