Arduino – sterowanie silnikami DC

Czas czytania: 8 min.

Aby robot mógł się poruszać w różnych kierunkach, w jego konstrukcji należy zaimplementować odpowiednią technikę sterowania.

Sterowanie silnikami DC za pomocą Arduino - sprzęt i oprogramowanie

Niniejszy artykuł przedstawia przykładową realizację sterowania silnikami prądu stałego (np. do napędu robota), z wykorzystaniem sprzętowego sterownika silników prądu stałego opartego na układzie scalonym L298N i płytki Arduino UNO R3. W artykule zawarto sposób podłączenia osprzętu i jego charakterystykę oraz omówiono przykładowy kod źródłowy realizujący sterowanie kierunkiem obrotów i prędkością obrotową silników prądu stałego.

Sterowanie prędkością obrotową silników prądu stałego za pomocą sygnału PWM

Prędkość obrotowa wału silnika prądu stałego jest uzależniona od wartości napięcia zasilającego. Jednym z najbardziej powszechnych sposobów sterowania prędkością obrotową, jest sterowanie PWM (ang. Pulse Width Modulation). Taki sposób polega na cyklicznym włączaniu i wyłączaniu napięcia zasilania w bardzo krótkich odstępach czasowych. Pojedynczy cykl PWM jest zbudowany z następujących etapów:

  1. włączenie napięcia
  2. podtrzymanie włączonego napięcia
  3. wyłączenie napięcia
  4. podtrzymanie wyłączonego napięcia

Średnia wartość napięcia zasilania doprowadzonego do silnika jest obliczana na podstawie współczynnika wypełnienia PW (ang. Pulse Width). Parametr ten określa, przez jaką część czasu trwania pojedynczego cyklu PWM, napięcie zasilania (w tym wypadku dostarczane do silnika) jest włączone. Na podstawie współczynnika wypełnienia i maksymalnej wartości napięcia zasilania, możemy obliczyć średnią wartość napięcia zasilania na przynajmniej pojedynczym cyklu PWM, tak jak obrazują to oscylogramy na rys. 1:

Rys. 1 – Wpływ regulacji współczynnika wypełnienia na wartość średnią przebiegu napięcia zasilania

Z powyższych oscylogramów wynika, że im wyższa wartość współczynnika wypełnienia, tym wyższa średnia wartość napięcia zasilania. Efekt praktyczny w naszych rozważaniach będzie taki, że im wyższa wartość współczynnika wypełnienia, tym wyższa będzie prędkość obrotowa silnika, a zmniejszenie tej wartość spowoduje, że wał silnika będzie odpowiednio zwalniał.

Sterowanie kierunkiem obrotów silników prądu stałego za pomocą mostka “H”

Typowo w silnikach prądu stałego, zmiana kierunku obrotów jest realizowana poprzez zmianę biegunowości napięcia zasilania. Jednym z najczęściej stosowanych rozwiązań technicznych w tym zakresie, jest podłączenie silnika do źródła napięcia zasilania poprzez układ mostka typu “H”, co obrazuje rys. 2:

Rys. 2 – Silnik prądu stałego podłączony do źródła napięcia zasilania poprzez mostek typu “H”

Mostek typu “H” tworzą cztery przełączniki (S1, S2, S3, S4) ułożone wraz z silnikiem M na schemacie w kształt przypominający literę “H”. W praktyce przełączniki są kluczami tranzystorowymi, najczęściej BJT lub MOSFET, na które sygnał sterujący może być podany np. z wyjść mikrokontrolera. Zamknięcie przełączników S1 i S4 i pozostawienie przełączników S2 i S3 otwartych spowoduje podanie napięcia na zaciski silnika, które wprawi go w ruch obrotowy zgodny z ruchem wskazówek zegara, tj. biegun dodatni źródła napięcia na biegun dodatni silnika i biegun ujemny zasilania na biegun ujemny silnika. Teraz jeśli zmienimy stany wszystkich przełączników, wskutek odwrócenia biegunowości napięcia zasilania, ruch obrotowy wału silnika będzie odbywał się także w przeciwnym kierunku.

Moduł sterownika silników DC oparty na układzie L298N

Moduł sterownika silników DC, który wykorzystamy w naszym projekcie, jest oparty na układzie scalonym L298N, który zawiera w sobie mostek typu H. Aby chronić sterownik przed przegrzaniem, do obudowy układu został przykręcony duży radiator, który zwiększa powierzchnię odprowadzania ciepła z układu scalonego L298N. Sterownik ten może maksymalnie obsługiwać dwa silniki jednocześnie. Zasilanie sterownika jest doprowadzane poprzez 3-pinowe złącze śrubowe typu ARK, które zawiera piny zasilania silników (VS), masy (GND) i zasilania części logicznej (VSS). Zakres dopuszczalnych napięć zasilania podawanych na pin VS wynosi do 12V. Natomiast dopuszczalne napięcie zasilania części logicznej podawane na pin VSS, zawiera się w przedziale od 5 do 7V. 

Sterownik silników L298N.

Moduł posiada wbudowany liniowy stabilizator napięcia 5V, który poprzez przestawienie zworki można wyłączyć i ominąć – założenie zworki na piny powoduje włączenie stabilizatora – zasilanie na jego wejście jest doprowadzane bezpośrednio z pinu VS. Maksymalna wydajność prądowa pokładowego stabilizatora napięcia 5V wynosi 0,5A, co umożliwia podłączenie zasilania dla Arduino lub innych modułów zewnętrznych. Natomiast kiedy usuniemy zworkę, napięcie dla części logicznej będzie trzeba dostarczyć z zewnątrz, bezpośrednio na pin VSS. Należy pamiętać, że w takiej sytuacji zabronione jest założenie zworki, ponieważ może to doprowadzić do uszkodzenia stabilizatora napięcia, a nawet całego sterownika! Zgodnie ze specyfikacją techniczną, spadek napięcia na sterowniku silnika L298N wynosi około 2V. Wynika to z wewnętrznego spadku napięcia na złączach tranzystorów przełączających, które tworzą mostek typu ,,H”. Jeśli więc podłączymy napięcie 12V do zacisków zasilania silników, silniki otrzymają maksymalne napięcie wynoszące około 10V. Oznacza to, że jeśli podłączymy do sterownika silnik na napięcie znamionowe 12V, to nigdy nie będzie się on obracał z maksymalną prędkością deklarowaną przez producenta. Aby uzyskać maksymalną prędkość obrotową, napięcie zasilania silnika powinno być nieco wyższe względem rzeczywistego napięcia wymaganego przez silnik do uzyskania maksymalnej prędkości obrotowej. W innym przykładzie, biorąc pod uwagę spadek napięcia wynoszący 2V, jeśli użyjemy silników wymagających napięcia znamionowego 5V do uzyskania pełnej prędkości obrotowej, musimy zapewnić mu napięcie zasilania wynoszące 7V na zaciskach wyjściowych sterownika, a dla silnika 12V, napięcie zasilania silnika wynosić 14 V.

Moduł sterownika silników DC, który wykorzystamy w naszym projekcie, jest oparty na układzie scalonym L298N, który zawiera w sobie mostek typu H. Aby chronić sterownik przed przegrzaniem, do obudowy układu został przykręcony duży radiator, który zwiększa powierzchnię odprowadzania ciepła z układu scalonego L298N. Sterownik ten może maksymalnie obsługiwać dwa silniki jednocześnie. Zasilanie sterownika jest doprowadzane poprzez 3-pinowe złącze śrubowe typu ARK, które zawiera piny zasilania silników (VS), masy (GND) i zasilania części logicznej (VSS). Zakres dopuszczalnych napięć zasilania podawanych na pin VS, zawiera się w przedziale od 5 do 35V. Natomiast dopuszczalne napięcie zasilania części logicznej podawane na pin VSS, zawiera się w przedziale od 5 do 7V. Moduł posiada wbudowany liniowy stabilizator napięcia 5V, który poprzez przestawienie zworki można wyłączyć i ominąć – założenie zworki na piny powoduje włączenie stabilizatora – zasilanie na jego wejście jest doprowadzane bezpośrednio z pinu VS. Maksymalna wydajność prądowa pokładowego stabilizatora napięcia 5V wynosi 0,5A, co umożliwia podłączenie zasilania dla Arduino lub innych modułów zewnętrznych. Natomiast kiedy usuniemy zworkę, napięcie dla części logicznej będzie trzeba dostarczyć z zewnątrz, bezpośrednio na pin VSS. Należy pamiętać, że w takiej sytuacji zabronione jest założenie zworki, ponieważ może to doprowadzić do uszkodzenia stabilizatora napięcia, a nawet całego sterownika! Zgodnie ze specyfikacją techniczną, spadek napięcia na sterowniku silnika L298N wynosi około 2V. Wynika to z wewnętrznego spadku napięcia na złączach tranzystorów przełączających, które tworzą mostek typu ,,H”. Jeśli więc podłączymy napięcie 12V do zacisków zasilania silników, silniki otrzymają maksymalne napięcie wynoszące około 10V. Oznacza to, że jeśli podłączymy do sterownika silnik na napięcie znamionowe 12V, to nigdy nie będzie się on obracał z maksymalną prędkością deklarowaną przez producenta. Aby uzyskać maksymalną prędkość obrotową, napięcie zasilania silnika powinno być nieco wyższe względem rzeczywistego napięcia wymaganego przez silnik do uzyskania maksymalnej prędkości obrotowej. W innym przykładzie, biorąc pod uwagę spadek napięcia wynoszący 2V, jeśli użyjemy silników wymagających napięcia znamionowego 5V do uzyskania pełnej prędkości obrotowej, musimy zapewnić mu napięcie zasilania wynoszące 7V na zaciskach wyjściowych sterownika, a dla silnika 12V, napięcie zasilania silnika wynosić 14 V.

Wyprowadzenia zewnętrzne sterownika L298N

Wyjścia zasilające silniki w sterowniku L298N dla silnika A i B są wyprowadzone do krawędzi modułu za pomocą dwóch zacisków śrubowych o rastrze 3,5 mm. Do tych zacisków można podłączyć dwa silniki prądu stałego o napięciu od 5 do 35 V. Każdy kanał w module może dostarczać do 2A do silnika prądu stałego. Jednak ilość prądu dostarczanego do silnika zależy od napięcia zasilania sterownika. Dla każdego z kanałów wyjściowych sterownika L298N istnieją dwa rodzaje pinów sterujących, które pozwalają nam jednocześnie kontrolować prędkość i kierunek obrotów silników prądu stałego, tj. piny kontroli kierunku i piny kontroli prędkości obrotowej. Za pomocą pinów sterujących kierunkiem obrotów możemy kontrolować, czy silnik ma obracać się zgodnie, czy przeciwnie do ruchu wskazówek zegara. Te piny faktycznie sterują tranzystorami w obwodzie mostka typu ,,H”, umieszczonymi wewnątrz układu L298N IC. Moduł posiada dwa piny sterujące kierunkiem dla każdego kanału. Piny IN1 i IN2 sterują kierunkiem wirowania silnika A, podczas gdy piny IN3 i IN4 sterują kierunkiem wirowania silnika B. Kierunek wirowania silnika może być kontrolowany przez przyłożenie stanu logicznego wysokiego (+5V) lub stanu logicznego niskiego (GND) do tych wejść, zgodnie z poniższym opisem

IN1

IN2

Kierunek obrotów

GND

GND

silnik wyłączony

+5V

GND

zgodny z zegarem

GND

+5V

przeciwny do zegara

+5V

+5V

silnik wyłączony

Na płytce znajdują się także piny ENA i ENB, które służą do włączania i wyłączania silników oraz kontrolowania ich prędkości. Przerzucenie tych pinów w stan wysoki spowoduje wirowanie silników, zaś przerzucenie w stan niski, spowoduje zatrzymanie silników. Dzięki modulacji szerokości impulsu (PWM) możemy faktycznie kontrolować prędkość silników. Moduł zwykle jest wyposażony w zworkę na tych pinach. Gdy ta zworka jest założona, silnik jest włączony i obraca się z maksymalną prędkością. Jeśli chcemy programowo sterować prędkością silników, należy usunąć zworki i podłączyć je do pinów z włączonym generowaniem PWM w Arduino. Pin VCC dostarcza zasilanie do silnika. Może ono wynosić od 5 do 35V. Jeśli zworka 5V-EN jest na miejscu, należy dostarczyć napięcie o 2V wyższe względem rzeczywistego zapotrzebowania na napięcie znamionowe silnika, aby uzyskać maksymalną prędkość silnika. GND to wspólny pin masy. Pin 5V dostarcza zasilanie dla obwodów logicznych przełączających wewnątrz układu scalonego L298N. Jeśli zworka 5V-EN jest na miejscu, ten pin działa jako wyjście i może być używany do zasilania Arduino. Jeśli zworka 5V-EN jest usunięta, należy ją podłączyć do pinu 5V w Arduino. Piny ENA są używane do sterowania prędkością silnika A. Ustawienie tego pinu w stan wysoki (utrzymanie zworki na miejscu) spowoduje obrót silnika A, a ustawienie tego samego pinu do stanu niskiego, powoduje zatrzymanie silnika. Usunięcie zworki i podłączenie tego pinu do wejścia PWM pozwala nam kontrolować prędkość silnika A. Piny IN1 i IN2 służą do sterowania kierunkiem wirowania silnika A. Gdy jeden z nich jest w stanie wysokim, a drugi w stanie niskim, silnik A zacznie się obracać. Jeśli oba wejścia są w stanie albo wysokim, albo w stanie niskim, silnik A zatrzyma się. Piny IN3 i IN4 służą do sterowania kierunkiem wirowania silnika B. Gdy jeden z nich jest w stanie wysokim, a drugi w stanie niskim, silnik B będzie się obracał. Jeśli oba wejścia są albo w stanie wysokim, albo w stanie niskim, silnik B zatrzyma się. Piny ENB są używane do sterowania prędkością silnika B. Przestawienie tego pinu w stan wysoki (utrzymanie zworki na miejscu) spowoduje obracanie się silnika B, podczas gdy przestawienie tego pinu w stan niski, spowoduje zatrzymanie silnika. Usunięcie zworki i podłączenie tego pinu do wyjścia PWM pozwoli nam kontrolować prędkość silnika B. Piny OUT1 i OUT2 są podłączone do silnika A, zaś Piny OUT3 i OUT4 są podłączone do silnika B.

Podłączenie sterownika L298N do Arduino UNO R3

Moduł Arduino UNO R3.

Teraz gdy wiemy już wszystko o module sterownika L298N, możemy zacząć podłączać go do naszego Arduino! Zacznijmy od podłączenia zasilania do silników. W naszym projekcie używamy silników prądu stałego z przekładnią redukcyjną, które zwykle znajdują zastosowanie w robotach z napędem na dwa koła. Ich zakres napięć roboczych wynosi od 3V do 12V. Tak więc podłączymy zewnętrzne zasilanie 12V do zacisku VCC. Biorąc pod uwagę wewnętrzny spadek napięcia na tranzystorach mostka ,,H” w układzie L298N, silniki otrzymają napięcie 10V i będą się kręcić przy nieco niższych obrotach. Ale jest dobrze. Następnie musimy dostarczyć 5V dla części logicznej sterownika L298N. 

Skorzystamy z wbudowanego regulatora 5V i pobierzemy napięcie 5V z zasilania silnika, więc zworka 5 V-EN pozostaje na swoim miejscu. Teraz piny wejściowe i włączające (ENA, IN1, IN2, IN3, IN4 i ENB) modułu L298N są podłączone do sześciu cyfrowych pinów wyjściowych Arduino (9, 8, 7, 5, 4 i 3). Zwróćmy uwagę, że oba piny wyjściowe Arduino, tj. nr 9 i nr 3 obsługują PWM. Na koniec podłączamy jeden silnik do zacisku A (OUT1 i OUT2), a drugi silnik do zacisku B (OUT3 i OUT4). Możemy zamienić połączenia silnika, technicznie nie ma dobrego ani złego sposobu.

Kod programu

Poniższy szkic kodu daje obraz jak kontrolować prędkość i kierunek obrotów silnika prądu stałego za pomocą sterownika silnika L298N i może służyć jako podstawa do bardziej praktycznych eksperymentów i projektów:

				
					// Podlaczanie silnika A ze sterownikiem L298N

int enA = 9;

int in1 = 8;

int in2 = 7;

// Podlaczanie silnika B ze sterownikiem L298N

int enB = 3;

int in3 = 5;

int in4 = 4;



void setup() {

  // Piny sterowania silnikiem ustawione jako wejscia

  pinMode(enA, OUTPUT);

  pinMode(enB, OUTPUT);

  pinMode(in1, OUTPUT);

  pinMode(in2, OUTPUT);

  pinMode(in3, OUTPUT);

  pinMode(in4, OUTPUT);

  // Stan poczatkowy - wylaczenie silnikow

  digitalWrite(in1, LOW);

  digitalWrite(in2, LOW);

  digitalWrite(in3, LOW);

  digitalWrite(in4, LOW);

}



void loop() {

  directionControl();

  delay(1000);

  speedControl();

  delay(1000);

}



// Sterowanie kierunkiem obrotow silnikow

void directionControl() {

  // Ustawienie maksymalnej predkosci obrotowej

  // Zakres predkosci dla PWM od 0 do 255

  analogWrite(enA, 255);

  analogWrite(enB, 255);



  // Wlaczenie silnikow A i B

  digitalWrite(in1, HIGH);

  digitalWrite(in2, LOW);

  digitalWrite(in3, HIGH);

  digitalWrite(in4, LOW);

  delay(2000);

  // Zmiana kierunku wirowania

  digitalWrite(in1, LOW);

  digitalWrite(in2, HIGH);

  digitalWrite(in3, LOW);

  digitalWrite(in4, HIGH);

  delay(2000);

  // Wylaczenie silnikow

  digitalWrite(in1, LOW);

  digitalWrite(in2, LOW);

  digitalWrite(in3, LOW);

  digitalWrite(in4, LOW);

}



// Funkcja pozwalajaca na regulacje predkosci obrotowej

void speedControl() {

  // Wlaczenie silnikow

  digitalWrite(in1, LOW);

  digitalWrite(in2, HIGH);

  digitalWrite(in3, LOW);

  digitalWrite(in4, HIGH);

  // Rozpedzanie silnikow

  for (int i = 0; i < 256; i++) {

    analogWrite(enA, i);

    analogWrite(enB, i);

    delay(20);

  }

  // Hamowanie silnikow

  for (int i = 255; i >= 0; --i) {

    analogWrite(enA, i);

    analogWrite(enB, i);

    delay(20);

  }

  // Wylaczenie silnikow

  digitalWrite(in1, LOW);

  digitalWrite(in2, LOW);

  digitalWrite(in3, LOW);

  digitalWrite(in4, LOW);

}
				
			

W powyższym kodzie wykorzystano dwie funkcje specjalne, tj.:

directionControl() – Ta funkcja powoduje obracanie się obu silników do przodu z maksymalną prędkością przez dwie sekundy. Następnie odwraca kierunek obrotów silnika i powoduje obracanie się ich przez kolejne dwie sekundy. Wreszcie wyłącza silniki. 

speedControl() – Ta funkcja powoduje rozpędzanie obu silników od zera do maksymalnej prędkości, wytwarzając sygnały PWM za pomocą funkcji analogWrite(), a następnie zwalnia silniki z powrotem do zera. Wreszcie wyłącza silniki. 

Jak oceniasz ten wpis blogowy?

Kliknij gwiazdkę, aby go ocenić!

Średnia ocena: 4.6 / 5. Liczba głosów: 15

Jak dotąd brak głosów! Bądź pierwszą osobą, która oceni ten wpis.

Podziel się:

Picture of Mateusz Mróz

Mateusz Mróz

Marzyciel, miłośnik podróży i fan nowinek technologicznych. Swoje pomysły na Raspberry Pi i Arduino chętnie przekuwa w konkrety. Uparty samouk – o pomoc prosi dopiero wtedy kiedy zabraknie pozycji w wyszukiwarce. Uważa, że przy odpowiednim podejściu można osiągnąć każdy cel.

Zobacz więcej:

Masz pytanie techniczne?
Napisz komentarz lub zapytaj na zaprzyjaźnionym forum o elektronice.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Ze względów bezpieczeństwa wymagane jest korzystanie z usługi Google reCAPTCHA, która podlega Polityce prywatności i Warunkom użytkowania.