Poradnik ESP32 17/55 - Sterowanie serwomechanizmem za pomocą ESP32 i potencjometru - zestaw edukacyjny IoT ESP32
W tym samouczku nauczymy się, jak sterować serwomechanizmem za pomocą mikrokontrolera ESP32 oraz potencjometru z zestawu ESP32 IoT Learning kit firmy SunFounder. Po ukończeniu tego projektu będziesz w stanie płynnie regulować kąt obrotu serwomechanizmu za pomocą potencjometru, co umożliwi precyzyjne sterowanie. To świetny sposób na poznanie możliwości ESP32 i sposobu, w jaki współpracuje on z silnikami.

Zagłębiając się w szczegóły, omówimy niezbędne komponenty sprzętowe, instrukcje podłączenia oraz przykłady kodu, aby wszystko uruchomić. Aby uzyskać bardziej wizualną reprezentację, koniecznie obejrzyj wideo powiązane z tym samouczkiem (na wideo w 0:30).
Omówienie sprzętu
Główne komponenty tego projektu to mikrokontroler ESP32, serwomechanizm (SG90) oraz potencjometr. ESP32 to wydajny mikrokontroler oferujący wbudowane Wi-Fi i Bluetooth, co czyni go odpowiednim do projektów IoT. Jest w stanie precyzyjnie sterować różnymi urządzeniami, w tym silnikami.
Serwomechanizm SG90 to powszechnie używany komponent, który może obracać się o około 270 stopni. Działa on na zasadzie modulacji szerokości impulsu (PWM), gdzie kąt obrotu jest określany przez szerokość wysyłanego impulsu. Potencjometr działa jak rezystor zmienny, umożliwiając regulację napięcia wysyłanego do ESP32, które z kolei steruje pozycją serwomechanizmu.
Szczegóły z karty katalogowej
| Producent | SG |
|---|---|
| Numer części | SG90 |
| Napięcie logiczne/IO | 3,3 V (ESP32) |
| Napięcie zasilania | 5 V |
| Prąd wyjściowy (na kanał) | 1,2 A |
| Prąd szczytowy (na kanał) | 2,5 A |
| Zalecana częstotliwość PWM | 50 Hz |
| Progi logiczne wejścia | 0,2 V (niski), 2,5 V (wysoki) |
| Spadek napięcia / RDS(on) / nasycenie | 0,5 V |
| Limity termiczne | 85 °C maks. |
| Obudowa | Plastikowa |
| Uwagi / warianty | Dostępny w różnych typach przekładni |
- Upewnij się, że serwomechanizm jest zasilany odpowiednim napięciem (5 V).
- Podłącz masę serwomechanizmu do masy ESP32, aby uzyskać wspólny punkt odniesienia.
- Używaj odpowiednich sygnałów PWM do sterowania pozycją serwomechanizmu.
- Zwracaj uwagę na wymagania prądowe serwomechanizmu; w razie potrzeby użyj zewnętrznego zasilacza.
- Sprawdź prawidłowe przypisanie pinów podczas podłączania, aby uniknąć błędów konfiguracji.
Instrukcje podłączenia

Aby podłączyć serwomechanizm i potencjometr do ESP32, zacznij od podłączenia przewodu masy serwomechanizmu (zazwyczaj czarnego lub brązowego) do jednego z pinów masy na ESP32. Następnie podłącz przewód zasilający (zazwyczaj czerwony) serwomechanizmu do pinu 5 V na ESP32. Na koniec podłącz przewód sygnałowy (zazwyczaj pomarańczowy lub biały) z serwomechanizmu do pinu 25 na ESP32.
W przypadku potencjometru podłącz jeden zewnętrzny pin do pinu 3,3 V na ESP32, a drugi zewnętrzny pin do masy. Środkowy pin potencjometru należy podłączyć do pinu 34 na ESP32. Taka konfiguracja pozwala ESP32 odczytywać zmienne napięcie wyjściowe z potencjometru, które będzie używane do sterowania pozycją serwomechanizmu.
Przykłady kodu i omówienie
Poniższy fragment kodu inicjalizuje serwomechanizm i ustawia parametry do sterowania jego ruchem:
#include
Servo myServo;
const int servoPin = 25;
const int minPulseWidth = 500; // 0,5 ms
const int maxPulseWidth = 2500; // 2,5 ms
void setup() {
myServo.attach(servoPin, minPulseWidth, maxPulseWidth);
myServo.setPeriodHertz(50); // Standardowy serwomechanizm 50 Hz
}
W tym kodzie dołączamy bibliotekę ESP32Servo i tworzymy instancję serwomechanizmu o nazwie myServo. Definiujemy numer pinu dla serwomechanizmu oraz ustawiamy minimalną i maksymalną szerokość impulsu odpowiadającą granicom kąta obrotu serwomechanizmu.
Następnie przyjrzyjmy się pętli, która w sposób ciągły porusza serwomechanizmem w przód i w tył:
void loop() {
for (int angle = 0; angle <= 180; angle++) {
int pulseWidth = map(angle, 0, 180, minPulseWidth, maxPulseWidth);
myServo.writeMicroseconds(pulseWidth);
delay(15);
}
for (int angle = 180; angle >= 0; angle--) {
int pulseWidth = map(angle, 0, 180, minPulseWidth, maxPulseWidth);
myServo.writeMicroseconds(pulseWidth);
delay(15);
}
}
Ta pętla stopniowo zmienia kąt od 0 do 180 stopni i z powrotem, używając funkcji map do przeliczenia kąta na odpowiednią szerokość impulsu dla serwomechanizmu. Po każdej zmianie następuje krótkie opóźnienie, aby serwomechanizm mógł płynnie osiągnąć nową pozycję.
Demonstracja / Czego się spodziewać
Po podłączeniu wszystkiego i wgraniu kodu powinieneś zobaczyć, jak serwomechanizm płynnie porusza się od 0 do 180 stopni i z powrotem. Jeśli wyregulujesz potencjometr, serwomechanizm powinien odzwierciedlać nową pozycję na podstawie napięcia dostarczanego przez potencjometr. Zachowaj ostrożność przy odwróconej polaryzacji podczas podłączania, ponieważ może to uszkodzić komponenty (na wideo w 3:45).
Znaczniki czasowe wideo
- 00:00 Start
- 1:56 Co to jest silnik serwo
- 5:00 Strona dokumentacji
- 6:33 Wyjaśnienie podłączenia serwa
- 7:45 Wybór portu COMP dla ESP32 w Arduino IDE
- 9:27 Wyjaśnienie kodu Arduino
- 14:31 Demonstracja sterowania serwem za pomocą ESP32
- 16:04 Zasilanie serwa innym napięciem niż 5V
- 18:47 Sterowanie serwem bez pętli
- 20:15 Sterowanie serwem za pomocą potencjometru
- 21:37 Wyjaśnienie kodu Arduino dla serwa z potencjometrem
#include <ESP32Servo.h>
// Define the servo and the pin it is connected to
Servo myServo;
const int servoPin = 25;
// Define the minimum and maximum pulse widths for the servo
const int minPulseWidth = 500; // 0.5 ms
const int maxPulseWidth = 2500; // 2.5 ms
void setup() {
// Attach the servo to the specified pin and set its pulse width range
myServo.attach(servoPin, minPulseWidth, maxPulseWidth);
// Set the PWM frequency for the servo
myServo.setPeriodHertz(50); // Standard 50Hz servo
}
void loop() {
// Rotate the servo from 0 to 180 degrees
for (int angle = 0; angle <= 180; angle++) {
int pulseWidth = map(angle, 0, 180, minPulseWidth, maxPulseWidth);
myServo.writeMicroseconds(pulseWidth);
delay(15);
}
// Rotate the servo from 180 to 0 degrees
for (int angle = 180; angle >= 0; angle--) {
int pulseWidth = map(angle, 0, 180, minPulseWidth, maxPulseWidth);
myServo.writeMicroseconds(pulseWidth);
delay(15);
}
}
Common Course Links
Common Course Files
Zasoby i odniesienia
-
DokumentacjaESP32 Tutorial 17/55 - SunFounder Servo motor documentationdocs.sunfounder.com
Pliki📁
Karta katalogowa (pdf)
-
DS5160 Servo motor datasheet
DS5160_datasheet.pdf0.33 MB
Inne pliki
-
Download SG90 datasheet (PDF)
robojax-servo-sg90_datasheet.pdf