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 delay w 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.