Sterowanie silnikami prądu stałego (DC) za pomocą Arduino to podstawa wielu projektów robotycznych, od prostych wózków po zaawansowane roboty mobilne. W tym artykule skupimy się na praktycznym wykorzystaniu pętli for do precyzyjnej kontroli prędkości obrotowej, opierając się na popularnym module L298N.
Pętla for pozwala płynnie rozpędzać i wyhamowywać silniki, co przekłada się na lepszą kontrolę trakcji i mniejsze obciążenie układu.
Podstawy sprzętowe – podłączenie Arduino i modułu L298N
Aby zacząć, potrzebujemy Arduino UNO, modułu L298N, dwóch silników DC (np. 6–12 V) oraz zewnętrznego zasilania (5–35 V dla silników). Moduł L298N działa jako mostek H i obsługuje prądy do 2 A na kanał.
Kluczowe piny modułu L298N
Najważniejsze złącza na płytce i ich rola to:
- IN1, IN2 – sterowanie kierunkiem silnika A (wysoki/niski stan logiczny określa kierunek);
- IN3, IN4 – sterowanie kierunkiem silnika B;
- ENA, ENB – wejścia PWM do regulacji prędkości (po usunięciu zworki);
- OUT1/OUT2 – podłączenie silnika A;
- OUT3/OUT4 – podłączenie silnika B;
- VCC – zasilanie silników (5–35 V), oddzielone od logiki (5 V z Arduino).
Typowy schemat podłączenia dla Arduino UNO wygląda następująco:
| Sygnał L298N | Pin Arduino | Uwagi |
|---|---|---|
| ENA | 9 (PWM) | regulacja prędkości silnika A |
| IN1 | 8 | kierunek silnika A |
| IN2 | 7 | kierunek silnika A |
| ENB | 3 (PWM) | regulacja prędkości silnika B |
| IN3 | 5 | kierunek silnika B |
| IN4 | 4 | kierunek silnika B |
| GND | GND | wspólna masa Arduino i zasilania silników |
Podłącz silniki do zacisków A i B. Zasilanie logiki modułu pobierz z 5 V Arduino, a silniki zawsze z zewnętrznego źródła, aby uniknąć przeciążenia mikrokontrolera.
Uwaga bezpieczeństwa: L298N ma spadek napięcia ok. 2–4 V, dlatego dla silnika 6 V zastosuj co najmniej 9 V zasilania.
Oprogramowanie – inicjalizacja i podstawowe funkcje sterujące
W Arduino IDE zacznij od definicji pinów i konfiguracji w setup(). Oto minimalna konfiguracja pinów:
int enA = 9; // PWM dla silnika A
int in1 = 8; // Kierunek A
int in2 = 7;
int enB = 3; // PWM dla silnika B
int in3 = 5;
int in4 = 4;
void setup() {
pinMode(enA, OUTPUT);
pinMode(enB, OUTPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
// Stan początkowy: silniki wyłączone
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}
Funkcja digitalWrite ustawia kierunek: np. digitalWrite(in1, HIGH); digitalWrite(in2, LOW); – obrót do przodu. Prędkość kontroluje analogWrite(pin, wartość), gdzie wartość od 0 (zatrzymany) do 255 (maksimum).
Praktyczne zastosowanie pętli for – rozpędzanie i zwalnianie silników
Pętla for świetnie nadaje się do stopniowej zmiany prędkości PWM, tworząc efekt płynnego startu. Poniżej przykład funkcji zmiany kierunku i rampy prędkości:
Funkcja directionControl() – zmiana kierunku
Prosta demonstracja przełączania kierunku bez PWM:
void directionControl() {
// Do przodu (oba silniki)
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
analogWrite(enA, 255); // Maks prędkość
analogWrite(enB, 255);
delay(2000);
// Odwrót
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
delay(2000);
// Stop
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}
Funkcja speedControl(): pętla for w akcji
Tutaj pętla for rozpędza silniki od 0 do 255, a następnie je zwalnia:
void speedControl() {
// Kierunek wstecz dla demonstracji
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
// Rozpędzanie (pętla for rosnąca)
for (int i = 0; i < 256; i++) {
analogWrite(enA, i);
analogWrite(enB, i);
delay(20); // Opóźnienie dla płynności (ok. 50 kroków/sek)
}
// Zwalnianie (pętla for malejąca)
for (int i = 255; i >= 0; i--) {
analogWrite(enA, i);
analogWrite(enB, i);
delay(20);
}
// Stop
analogWrite(enA, 0);
analogWrite(enB, 0);
}
Wywołaj obie funkcje w loop() tak, aby przetestować pełny cykl:
void loop() {
directionControl();
delay(1000);
speedControl();
delay(1000);
}
Dlaczego pętla for? Iteruje dokładnie 256 razy (0–255), zapewniając liniową zmianę PWM. delay(20) daje widocznie płynny efekt – ok. 5 sekund na pełny cykl i chroni silniki przed nagłym obciążeniem.
Zaawansowane warianty z pętlą for
1. Synchronizacja z potencjometrem
Podłącz potencjometr do wejścia A0 i płynnie dochodź do zadanej prędkości:
void loop() {
int targetSpeed = analogRead(A0) / 4; // 0-255
for (int i = 0; i <= targetSpeed; i++) {
analogWrite(enA, i);
delay(10);
}
}
Dzielenie przez 4 konwertuje zakres 0–1023 na 0–255.
2. Różne prędkości dla silników (skręt robota)
Prosty manewr skrętu przez różnicowanie PWM:
void turnRight() {
for (int i = 0; i < 256; i++) {
analogWrite(enA, i); // Lewy: pełna prędkość
analogWrite(enB, i / 2); // Prawy: połowa
delay(10);
}
}
3. Hamowanie regeneracyjne (symulacja)
Uwaga: ustawienie obu wejść IN na ten sam stan (HIGH lub LOW) powoduje zwarcie uzwojeń silnika i szybkie wytracenie obrotów – stosuj ostrożnie i z krótkimi interwałami. Wykorzystaj pętlę for z malejącym PWM, a na końcu zatrzymaj silniki poleceniem digitalWrite.
Tabela porównawcza sterowników
Dla kontekstu wyboru układu sterującego, poniżej krótkie zestawienie:
| Sterownik | Max prąd/kanał | Piny PWM | Zasilanie silnika | Zastosowanie z for |
|---|---|---|---|---|
| L298N | 2 A | ENA/ENB | 5–35 V | rampy prędkości, akceleracja |
| L293D | 0,6 A | Enable | do 36 V | proste sterowanie prędkością |
| Arduino Motor Shield | 2 A | wbudowane | do 18 V | I2C/SPI + pętle for |
Rozwiązywanie problemów i optymalizacje
Poniższe wskazówki pomogą szybko zdiagnozować typowe problemy:
- Silnik nie kręci? – sprawdź zworki (usuń dla PWM), zasilanie, wspólne GND oraz czy używasz pinów PWM (3, 5, 6, 9, 10, 11);
- Grzeje się L298N? – dodaj radiator; przy prądzie > 1 A rozważ wentylator;
- Płynniejsza regulacja? – zmniejsz
delayw pętli for, ale unikaj < 5 ms (ryzyko utraty stabilności PWM); - Enkoder dla RPM? – dodaj enkoder i porównuj prędkość zadaną z mierzoną (np. prosty PID).
W projektach robotycznych łącz sterowanie prędkością z czujnikami: pętla for do jazdy, a warunki if do unikania przeszkód i reakcji na otoczenie.
Przykładowe projekty z pętlą for
Oto trzy szybkie inspiracje do wdrożenia:
- Wózek śledzący linię – pętla for do akceleracji na zakrętach;
- Robot sumo – szybki start for (0 do 255);
- Samochód zdalnie sterowany – aplikacja Bluetooth modyfikuje zakres pętli.