Tutorial ESP32 17/55 - Controlul motorului servo folosind ESP32 și potențiometru - Kit de învățare IoT ESP32
În acest tutorial, vom învăța cum să controlăm un motor servo folosind un microcontroler ESP32 și un potențiometru din kit-ul de învățare IoT ESP32 de la SunFounder. La finalul acestui proiect, veți putea regla unghiul motorului servo lin folosind potențiometrul, permițând un control precis. Aceasta este o modalitate excelentă de a explora capacitățile ESP32 și modul în care acesta interacționează cu motoarele.

Pe măsură ce intrăm în detalii, vom acoperi componentele hardware necesare, instrucțiunile de cablare și exemplele de cod pentru a pune totul în funcțiune. Pentru o reprezentare mai vizuală, asigurați-vă că urmăriți videoclipul asociat acestui tutorial (în videoclip la 0:30).
Hardware Explicat
Componentele principale pentru acest proiect includ microcontrolerul ESP32, un motor servo (SG90) și un potențiometru. ESP32 este un microcontroler puternic care oferă Wi-Fi și Bluetooth integrate, făcându-l potrivit pentru proiecte IoT. Este capabil să controleze diverse dispozitive, inclusiv motoare, cu precizie ridicată.
Motorul servo SG90 este o componentă utilizată pe scară largă care se poate roti aproximativ 270 de grade. Funcționează pe un semnal de modulație a lățimii impulsurilor (PWM), unde unghiul de rotație este determinat de lățimea impulsului trimis către acesta. Potențiometrul acționează ca un rezistor variabil, permițându-vă să reglați tensiunea trimisă către ESP32, care la rândul său controlează poziția servomotorului.
Detalii din Fișa Tehnică
| Producător | SG |
|---|---|
| Număr de piesă | SG90 |
| Tensiune logică/IO | 3,3 V (ESP32) |
| Tensiune de alimentare | 5 V |
| Curent de ieșire (pe canal) | 1,2 A |
| Curent de vârf (pe canal) | 2,5 A |
| Ghid de frecvență PWM | 50 Hz |
| Praguri logice de intrare | 0,2 V (jos), 2,5 V (sus) |
| Cădere de tensiune / RDS(on) / saturație | 0,5 V |
| Limite termice | 85 °C max |
| Pachet | Plastic |
| Note / variante | Disponibil în diferite tipuri de angrenaje |
- Asigurați-vă că servomotorul este alimentat cu o tensiune adecvată (5V).
- Conectați masa servomotorului la masa ESP32 pentru o referință comună.
- Utilizați semnale PWM adecvate pentru a controla poziția servomotorului.
- Fiți conștienți de cerințele de curent ale servomotorului; utilizați o sursă de alimentare externă dacă este necesar.
- Verificați atribuirile corecte ale pinilor la cablare pentru a evita configurații greșite.
Instrucțiuni de Cablare

Pentru a cabla motorul servo și potențiometrul la ESP32, începeți prin conectarea firului de masă al servomotorului (de obicei negru sau maro) la unul dintre pinii de masă de pe ESP32. Apoi, conectați firul de alimentare (de obicei roșu) al servomotorului la pinul de 5V de pe ESP32. În final, conectați firul de semnal (de obicei portocaliu sau alb) de la servomotor la pinul 25 de pe ESP32.
Pentru potențiometru, conectați un pin exterior la pinul de 3,3V de pe ESP32 și celălalt pin exterior la masă. Pinul din mijloc al potențiometrului ar trebui conectat la pinul 34 de pe ESP32. Această configurare permite ESP32 să citească tensiunea variabilă de ieșire de la potențiometru, care va fi utilizată pentru a controla poziția servomotorului.
Exemple de Cod & Explicații
Fragmentul de cod următor inițializează servomotorul și setează parametrii pentru controlul mișcării sale:
#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); // Servo standard de 50Hz
}
În acest cod, includem biblioteca ESP32Servo și creăm o instanță a servomotorului cu numele myServo. Definim numărul pinului pentru servomotor și setăm lățimile minime și maxime ale impulsurilor care corespund limitelor unghiulare ale servomotorului.
În continuare, să ne uităm la bucla care mișcă continuu servomotorul înainte și înapoi:
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);
}
}
Această buclă schimbă treptat unghiul de la 0 la 180 de grade și înapoi, folosind funcția map pentru a converti unghiul în lățimea corespunzătoare a impulsului pentru servomotor. Fiecare schimbare este urmată de o scurtă întârziere pentru a permite servomotorului să ajungă lin la noua sa poziție.
Demonstrație / Ce să Vă Așteptați
Odată ce totul este cablat și codul este încărcat, ar trebui să vedeți motorul servo mișcându-se lin de la 0 la 180 de grade și înapoi. Dacă reglați potențiometrul, servomotorul ar trebui să reflecte noua poziție pe baza tensiunii furnizate de potențiometru. Fiți atenți la polaritatea inversată la cablare, deoarece poate deteriora componentele (în videoclip la 3:45).
Marcaje Temporale din Videoclip
- 00:00 Început
- 1:56 Ce este un servomotor
- 5:00 Pagina de documentație
- 6:33 Cablarea pentru servo explicată
- 7:45 Selectarea portului COMP pentru ESP32 în Arduino IDE
- 9:27 Codul Arduino explicat
- 14:31 Demonstrație a controlului servomotorului folosind ESP32
- 16:04 Alimentarea servomotorului cu altă tensiune decât 5V
- 18:47 Controlul servomotorului fără buclă
- 20:15 Controlul servomotorului cu potențiometru
- 21:37 Servo cu potențiometru - codul Arduino explicat
#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
Resurse și referințe
-
DocumentațieESP32 Tutorial 17/55- SunFunder Servo motor documentationdocs.sunfounder.com
Fișiere📁
Fișă tehnică (pdf)
-
DS5160 Servo motor datasheet
DS5160_datasheet.pdf0.33 MB
Alte fișiere
-
Download SG90 datasheet (PDF)
robojax-servo-sg90_datasheet.pdf