~/sprzet cat sterowanie-silnikiem-bezszczotko….md
Sterowanie silnikiem bezszczotkowym (BLDC) z Arduino — ESC, sterownik z hallotronami i FOC
Jak sterować silnikiem bezszczotkowym z Arduino: przez ESC i bibliotekę Servo, moduł z czujnikami Halla (np. JYQD) albo sterownik FOC z SimpleFOC. Schematy i kod.

~ xad tldr sterowanie-silnikiem-bezsz…
- Arduino nie zasili silnika BLDC bezpośrednio z pinów — zawsze potrzebny jest sterownik mocy, który przełącza prąd w trzech fazach.
- Najprościej: silnik modelarski + regulator ESC sterowany z Arduino sygnałem serwa 1000–2000 µs przez bibliotekę Servo.
- Silniki z czujnikami Halla (np. z e-rowerów i hulajnóg) obsłużysz gotowym modułem, któremu Arduino podaje tylko prędkość, kierunek i sygnał włączenia.
- Do precyzyjnej, cichej pracy na niskich obrotach (gimbale, robotyka) służy sterowanie FOC, np. biblioteka SimpleFOC i trójfazowy driver.
- Podczas testów zdejmij śmigło, dodaj bezpiecznik i połącz masy wszystkich układów.
$ tree --spis-tresci
Sterowanie silnikiem bezszczotkowym z Arduino zawsze wymaga pośrednika: Arduino generuje tylko sygnał sterujący, a prąd w trzech fazach silnika przełącza sterownik mocy. W praktyce masz trzy drogi — regulator ESC sterowany sygnałem serwa (najprostsza), gotowy moduł dla silników z czujnikami Halla albo trójfazowy driver z algorytmem FOC, np. z biblioteką SimpleFOC.
Wybór zależy od silnika, który masz, i od tego, czego od niego oczekujesz: wysokich obrotów śmigła, momentu na kole robota czy płynnego obrotu o ułamek stopnia. Poniżej każda z metod z połączeniami i kodem.
Jak działa silnik BLDC i dlaczego potrzebuje sterownika
Silnik bezszczotkowy (BLDC, brushless DC) ma magnesy trwałe na wirniku i uzwojenia na stojanie, zwykle połączone w trzy fazy. W silniku szczotkowym prąd przełącza mechaniczny komutator; tutaj robi to elektronika. Sterownik musi w odpowiedniej kolejności podawać napięcie na pary faz tak, żeby pole magnetyczne „ciągnęło” wirnik.
Żeby wiedzieć, kiedy przełączyć fazy, sterownik musi znać położenie wirnika. Robi to na dwa sposoby:
- czujniki Halla — trzy hallotrony rozmieszczone co 120° elektrycznych dają 6 kombinacji stanów na cykl elektryczny; silniki z e-rowerów, hulajnóg i wentylatorów zwykle je mają (dodatkowe 5 cienkich przewodów),
- bezczujnikowo (sensorless) — sterownik mierzy siłę elektromotoryczną indukowaną w niezasilanej fazie (back-EMF). Tak działają regulatory modelarskie. Wada: przy bardzo niskich obrotach back-EMF jest za słabe, więc silnik startuje z lekkim szarpnięciem i nie utrzyma precyzyjnie małej prędkości.
Jeśli potrzebujesz porównania ze zwykłym silnikiem szczotkowym i mostkiem H, zajrzyj do artykułu o sterowaniu silnikiem prądu stałego w lewo i prawo.
| Metoda | Typowy silnik | Sterownik | Zalety | Ograniczenia |
|---|---|---|---|---|
| ESC (regulator modelarski) | Outrunnery do dronów, samolotów RC | ESC 20–60 A | Tanio, prosto, wysokie obroty | Słaba kontrola przy niskich obrotach, zwykle jeden kierunek |
| Moduł z czujnikami Halla | Silniki z e-rowerów, hulajnóg, napędy przemysłowe | Np. moduły JYQD, sterowniki do e-rowerów | Mocny start pod obciążeniem, wejście kierunku | Większe gabaryty, różne opisy wyprowadzeń |
| FOC (sterowanie wektorowe) | Silniki gimbalowe, napędy robotów | DRV8313, SimpleFOC Shield, B-G431B-ESC1 | Płynna praca od zera obrotów, sterowanie pozycją | Wymaga enkodera i strojenia, małe prądy w tanich driverach |
Metoda 1: ESC i biblioteka Servo — najprostsze sterowanie
Regulator ESC (Electronic Speed Controller) ma wbudowany mikrokontroler, który sam dba o komutację. Z punktu widzenia Arduino zachowuje się jak serwo: oczekuje impulsu co 20 ms (50 Hz), którego długość określa gaz — 1000 µs to minimum, 2000 µs pełna moc.
Potrzebne elementy
- Arduino Uno, Nano lub zgodne,
- silnik BLDC i ESC dobrany do jego prądu (z zapasem 20–30%),
- akumulator LiPo lub zasilacz o napięciu zgodnym z ESC (np. 2S–3S, czyli 7,4–11,1 V nominalnie),
- potencjometr 10 kΩ do regulacji prędkości.
Połączenia
- Trzy grube przewody ESC łączysz z trzema przewodami silnika w dowolnej kolejności. Jeśli silnik kręci się w złą stronę, zamień dowolne dwa.
- Grube przewody zasilania ESC (czerwony i czarny) — do akumulatora, najlepiej przez bezpiecznik.
- Z trójżyłowej wtyczki sygnałowej ESC: przewód sygnałowy (biały lub żółty) do pinu 9 Arduino, masę (czarny lub brązowy) do GND Arduino.
- Środkowy, czerwony przewód wtyczki to wyjście BEC (zwykle 5 V). Jeśli Arduino jest zasilane z USB, nie podłączaj go — dwa źródła 5 V połączone razem mogą uszkodzić płytkę lub port USB.
- Potencjometr: skrajne wyprowadzenia do 5 V i GND, środkowe do A0.
Kod
#include <Servo.h>
Servo esc;
const int ESC_PIN = 9;
const int POT_PIN = A0;
void setup() {
esc.attach(ESC_PIN, 1000, 2000);
esc.writeMicroseconds(1000); // minimalny gaz - uzbrojenie ESC
delay(3000); // czekamy na sygnały dźwiękowe ESC
}
void loop() {
int odczyt = analogRead(POT_PIN); // 0-1023
int impuls = map(odczyt, 0, 1023, 1000, 2000); // 1000-2000 us
esc.writeMicroseconds(impuls);
delay(20);
}
Biblioteka Servo na Arduino Uno wyłącza sprzętowe PWM (analogWrite) na pinach 9 i 10 — pamiętaj o tym, jeśli w projekcie sterujesz jeszcze czymś innym.
Uzbrajanie i kalibracja ESC
Większość regulatorów po włączeniu zasilania czeka na sygnał minimalnego gazu — to zabezpieczenie przed nagłym startem śmigła. Dlatego kod najpierw przez 3 sekundy wysyła 1000 µs. Jeśli ESC nie reaguje na pełny zakres, wykonaj kalibrację: zwykle polega na włączeniu zasilania ESC przy sygnale 2000 µs, odczekaniu na sekwencję dźwięków i przejściu na 1000 µs. Dokładna procedura różni się między modelami, więc sprawdź instrukcję swojego regulatora.
Uwaga: Przed pierwszym uruchomieniem zdejmij śmigło i przymocuj silnik do stołu. Silnik modelarski na pełnym gazie potrafi poważnie zranić, a błąd w kodzie lub niepodłączony potencjometr (pływające wejście) może dać pełną moc od razu.
Ograniczenia ESC
Regulatory do samolotów i dronów kręcą zwykle w jednym kierunku. Ruch w obie strony zapewniają ESC samochodowe (neutralna pozycja 1500 µs) albo regulatory dronowe z oprogramowaniem obsługującym tryb dwukierunkowy (np. AM32, Bluejay). Nowoczesne ESC dronowe obsługują też cyfrowy protokół DShot, ale do nauki z Arduino w zupełności wystarczy klasyczny sygnał PWM.
Metoda 2: moduł sterownika dla silników z czujnikami Halla
Silniki z hulajnóg, e-rowerów i wiele silników przemysłowych ma wbudowane czujniki Halla. Do nich najwygodniej użyć gotowego modułu — popularne są tanie płytki z serii JYQD (np. JYQD-V7.3E2) dla napięć rzędu 12–36 V. Sterownik sam realizuje komutację na podstawie hallotronów, a Arduino podaje mu tylko polecenia.
Typowe wyprowadzenia takich modułów:
| Wyprowadzenie | Funkcja | Połączenie z Arduino |
|---|---|---|
| MA, MB, MC | Fazy silnika | — (do silnika) |
| Ha, Hb, Hc, 5V, GND (Hall) | Czujniki Halla silnika | — (do silnika) |
| VR | Zadawanie prędkości napięciem 0–5 V lub PWM | Pin PWM przez filtr RC lub wyjście DAC |
| Z/F | Kierunek obrotów | Pin cyfrowy |
| EL | Włączenie / zatrzymanie | Pin cyfrowy |
| Signal | Impulsy proporcjonalne do prędkości | Pin z przerwaniem do pomiaru obrotów |
| GND | Masa sygnałowa | GND Arduino |
Opisy i logika wejść różnią się między wersjami modułów, dlatego zawsze sprawdź dokumentację sprzedawcy. Wejście VR najpewniej steruje się napięciem stałym: wystarczy filtr RC (np. 10 kΩ i 10 µF) między pinem PWM Arduino a VR, który zamienia PWM na napięcie proporcjonalne do wypełnienia.
Wskazówka: Zanim podłączysz Arduino, uruchom moduł z potencjometrem na wejściu VR. Jeśli silnik w ogóle nie rusza albo drga, problemem jest kolejność przewodów faz lub hallotronów, a nie Twój program. Kombinacji jest kilka — zmieniaj kolejność faz przy stałym podłączeniu czujników, aż silnik zacznie płynnie pracować.
Metoda 3: sterowanie FOC z biblioteką SimpleFOC
FOC (Field Oriented Control, sterowanie wektorowe) to metoda, w której sterownik na bieżąco reguluje prądy wszystkich trzech faz tak, żeby pole magnetyczne było zawsze prostopadłe do pola wirnika. Efekt: płynna i cicha praca od zera obrotów, możliwość trzymania pozycji i sterowania momentem. Tak działają gimbale kamer i napędy precyzyjnych robotów.
Otwarta biblioteka SimpleFOC (Arduino SimpleFOClibrary) udostępnia FOC na Arduino, ESP32, STM32 i innych płytkach. Potrzebujesz:
- trójfazowego drivera z trzema wejściami PWM — np. SimpleFOC Shield, moduł z układem DRV8313 lub L6234,
- silnika o stosunkowo dużej rezystancji uzwojeń, najlepiej gimbalowego (kilka–kilkanaście omów), bo tanie drivery dają do ok. 2 A,
- do pracy w pętli zamkniętej — czujnika położenia, np. magnetycznego enkodera AS5600 lub AS5048A.
Najprostszy przykład to sterowanie prędkością w pętli otwartej, bez enkodera:
#include <SimpleFOC.h>
// liczba par biegunów silnika (np. 7 dla silnika 14-biegunowego)
BLDCMotor motor = BLDCMotor(7);
// piny PWM faz A, B, C oraz pin enable drivera
BLDCDriver3PWM driver = BLDCDriver3PWM(9, 5, 6, 8);
float predkosc = 6.28; // rad/s, czyli ok. 1 obrót na sekundę
void setup() {
driver.voltage_power_supply = 12;
driver.init();
motor.linkDriver(&driver);
motor.voltage_limit = 3; // ograniczenie napięcia chroni silnik i driver
motor.controller = MotionControlType::velocity_openloop;
motor.init();
}
void loop() {
motor.loopFOC(); // w nowszych wersjach biblioteki wywoływane także w pętli otwartej
motor.move(predkosc);
}
W pętli otwartej silnik nie wie, gdzie jest wirnik, więc grzeje się bardziej i może gubić kroki pod obciążeniem. Po dodaniu enkodera przechodzisz na tryb velocity lub angle, wywołujesz motor.initFOC() i w pętli motor.loopFOC() przed motor.move(). Szczegóły i aktualne przykłady znajdziesz w dokumentacji projektu na docs.simplefoc.com, a kod biblioteki — w repozytorium na GitHubie (jeśli dopiero poznajesz tę platformę, zobacz, czym Git różni się od GitHuba).
Arduino Uno wystarczy do pierwszych prób, ale FOC wymaga szybkich obliczeń. Przy wyższych obrotach i sterowaniu w pętli zamkniętej znacznie lepiej sprawdzą się ESP32 lub STM32. Jeśli programujesz je na Linuksie, toolchainy producentów najlepiej wspiera Ubuntu LTS — szerzej piszemy o tym w tekście jaki Linux wybrać do programowania.
Typowe problemy i jak je rozwiązać
- Silnik tylko drga lub piszczy — przy ESC: brak uzbrojenia lub zła kalibracja; przy module Hall: zła kolejność faz lub czujników; przy FOC: zła liczba par biegunów lub za niskie
voltage_limit. - Arduino resetuje się przy starcie silnika — spadek napięcia lub zakłócenia. Zasilaj Arduino osobno, dodaj kondensator elektrolityczny (np. 470–1000 µF) przy zasilaniu sterownika i prowadź przewody silnika z dala od sygnałowych.
- Brak reakcji na sygnał — sprawdź wspólną masę. Bez połączenia GND Arduino i sterownika sygnał sterujący nie ma punktu odniesienia.
- Sterownik lub silnik mocno się grzeje — za wysokie napięcie lub prąd dla danego drivera, zbyt długa praca w pętli otwartej, brak radiatora.
- Silnik kręci się w złą stronę — zamień dwie fazy (ESC), zmień stan wejścia kierunku (moduł Hall) albo podaj ujemną prędkość (SimpleFOC).
Od czego zacząć
Jeśli chcesz po prostu zakręcić silnikiem i regulować obroty, kup tani zestaw: silnik modelarski z ESC i zacznij od metody 1 — cały układ uruchomisz w kwadrans. Do pojazdu lub robota z kołami, który musi ruszać pod obciążeniem, wybierz silnik z czujnikami Halla i gotowy moduł. A jeśli interesuje Cię precyzja — gimbal, ramię robota, napęd z pozycjonowaniem — sięgnij po SimpleFOC, silnik gimbalowy i magnetyczny enkoder. Więcej projektów elektronicznych znajdziesz w kategorii Sprzęt i elektronika.
~ man faq
Najczęściej zadawane pytania
Czy można podłączyć silnik bezszczotkowy bezpośrednio do Arduino?
Nie. Silnik BLDC potrzebuje kilku amperów prądu przełączanego w trzech fazach we właściwej kolejności. Piny Arduino dają kilkanaście–dwadzieścia kilka mA, więc konieczny jest sterownik: ESC, moduł z czujnikami Halla lub trójfazowy mostek tranzystorowy.
Jak sterować ESC za pomocą Arduino?
ESC przyjmuje taki sam sygnał jak serwo modelarskie: impuls 1000 µs oznacza minimalny gaz, a 2000 µs pełny. W Arduino użyj biblioteki Servo i funkcji writeMicroseconds, a po włączeniu zasilania podaj przez kilka sekund minimalny gaz, aby uzbroić regulator.
Jak zmienić kierunek obrotów silnika bezszczotkowego?
Fizycznie wystarczy zamienić miejscami dwa z trzech przewodów silnika. Zmiana kierunku w trakcie pracy wymaga ESC dwukierunkowego (np. samochodowego z biegiem wstecznym) lub sterownika z wejściem kierunku, jak moduły z czujnikami Halla.
Dlaczego ESC piszczy i silnik nie rusza?
Najczęściej regulator nie został uzbrojony, bo przy włączeniu nie dostał sygnału minimalnego gazu, albo zakres sygnału nie jest skalibrowany. Sprawdź też wspólną masę Arduino i ESC oraz napięcie akumulatora, bo przy zbyt niskim ESC blokuje start.
Jaki sterownik do silnika BLDC z Arduino wybrać?
Do silników modelarskich (drony, samoloty) — ESC. Do silników z czujnikami Halla z e-rowerów i hulajnóg — moduł sterownika Hall. Do silników gimbalowych i robotyki wymagającej precyzji — trójfazowy driver obsługiwany przez SimpleFOC, np. na układzie DRV8313.
Ten artykuł jest częścią tematu
$ whoami
Założyciel i redaktor XAD.pl. Pisze o sieciach, bezpieczeństwie IT, administracji systemami Windows i Linux oraz o sprzęcie, który sprawia ludziom problemy na co dzień.


