Przejdź do treści

~/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.

CZCzarek Zawolski--aktualizacja=--czas=8 min--dział=Sprzęt i elektronika
Silnik bezszczotkowy podłączony do płytki Arduino i sterownika
tldr.txt — W skrócie

~ 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.

MetodaTypowy silnikSterownikZaletyOgraniczenia
ESC (regulator modelarski)Outrunnery do dronów, samolotów RCESC 20–60 ATanio, prosto, wysokie obrotySłaba kontrola przy niskich obrotach, zwykle jeden kierunek
Moduł z czujnikami HallaSilniki z e-rowerów, hulajnóg, napędy przemysłoweNp. moduły JYQD, sterowniki do e-rowerówMocny start pod obciążeniem, wejście kierunkuWiększe gabaryty, różne opisy wyprowadzeń
FOC (sterowanie wektorowe)Silniki gimbalowe, napędy robotówDRV8313, SimpleFOC Shield, B-G431B-ESC1Pł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

  1. 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.
  2. Grube przewody zasilania ESC (czerwony i czarny) — do akumulatora, najlepiej przez bezpiecznik.
  3. 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.
  4. Ś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.
  5. 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:

WyprowadzenieFunkcjaPołączenie z Arduino
MA, MB, MCFazy silnika— (do silnika)
Ha, Hb, Hc, 5V, GND (Hall)Czujniki Halla silnika— (do silnika)
VRZadawanie prędkości napięciem 0–5 V lub PWMPin PWM przez filtr RC lub wyjście DAC
Z/FKierunek obrotówPin cyfrowy
ELWłączenie / zatrzymaniePin cyfrowy
SignalImpulsy proporcjonalne do prędkościPin z przerwaniem do pomiaru obrotów
GNDMasa sygnałowaGND 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ć

  1. 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.
  2. 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.
  3. Brak reakcji na sygnał — sprawdź wspólną masę. Bez połączenia GND Arduino i sterownika sygnał sterujący nie ma punktu odniesienia.
  4. 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.
  5. 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

CZ

$ whoami

Czarek Zawolski

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ń.

~ ls ../podobne