[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
}

Dominik Bednarski porównuje STM32MP1 i OpenSTLinux oraz Raspberry Pi 5
Technologie End of Life i bezpieczeństwo sieci – wyzwania Europy związane z tzw. długiem technologicznym
Najczęstsze błędy firm przy wyborze dostawcy energii i jak ich uniknąć 



