ESP32 Tutorial 17/55 - Servomotor aansturen met ESP32 en Potentiometer - ESP32 IoT-leerkit
In deze tutorial leren we hoe we een servomotor kunnen aansturen met behulp van een ESP32-microcontroller en een potentiometer uit de ESP32 IoT Learning kit van SunFounder. Aan het einde van dit project kun je de hoek van de servomotor soepel aanpassen met de potentiometer, wat zorgt voor nauwkeurige controle. Dit is een geweldige manier om de mogelijkheden van de ESP32 en de interactie met motoren te verkennen.

Terwijl we dieper op de details ingaan, behandelen we de benodigde hardwarecomponenten, bedradingsinstructies en codevoorbeelden om alles werkend te krijgen. Voor een meer visuele weergave kun je zeker de video bekijken die bij deze tutorial hoort (in video op 0:30).
Hardware uitgelegd
De belangrijkste componenten voor dit project zijn de ESP32-microcontroller, een servomotor (SG90) en een potentiometer. De ESP32 is een krachtige microcontroller met ingebouwde Wi-Fi en Bluetooth, waardoor deze geschikt is voor IoT-projecten. Hij kan verschillende apparaten, waaronder motoren, met hoge precisie aansturen.
De SG90-servomotor is een veelgebruikt onderdeel dat ongeveer 270 graden kan draaien. Hij werkt op een pulsbreedtemodulatie (PWM)-signaal, waarbij de rotatiehoek wordt bepaald door de breedte van de puls die naar de motor wordt gestuurd. De potentiometer fungeert als een variabele weerstand, waarmee je de spanning naar de ESP32 kunt aanpassen, die op zijn beurt de positie van de servo regelt.
Datasheetdetails
| Fabrikant | SG |
|---|---|
| Onderdeelnummer | SG90 |
| Logica/IO-spanning | 3,3 V (ESP32) |
| Voedingsspanning | 5 V |
| Uitgangsstroom (per kanaal) | 1,2 A |
| Piekstroom (per kanaal) | 2,5 A |
| PWM-frequentierichtlijn | 50 Hz |
| Ingangslogische drempels | 0,2 V (laag), 2,5 V (hoog) |
| Spanningsval / RDS(on) / verzadiging | 0,5 V |
| Thermische limieten | 85 °C max |
| Behuizing | Kunststof |
| Opmerkingen / varianten | Beschikbaar in verschillende tandwieltypes |
- Zorg ervoor dat de servo wordt gevoed met een geschikte spanning (5V).
- Verbind de ground van de servo met de ground van de ESP32 voor een gemeenschappelijke referentie.
- Gebruik geschikte PWM-signalen om de positie van de servo te regelen.
- Wees je bewust van de stroomvereisten van de servo; gebruik indien nodig een externe voeding.
- Controleer de juiste pintoewijzingen bij het bedraden om verkeerde configuraties te voorkomen.
Bedradingsinstructies

Om de servomotor en potentiometer op de ESP32 aan te sluiten, begin je met het verbinden van de grounddraad van de servo (meestal zwart of bruin) met een van de groundpinnen op de ESP32. Verbind vervolgens de voedingsdraad (meestal rood) van de servo met de 5V-pin op de ESP32. Sluit tot slot de signaaldraad (meestal oranje of wit) van de servo aan op pin 25 van de ESP32.
Voor de potentiometer verbind je een buitenste pin met de 3,3V-pin op de ESP32 en de andere buitenste pin met ground. De middelste pin van de potentiometer moet worden verbonden met pin 34 op de ESP32. Deze opstelling stelt de ESP32 in staat om de variërende spanningsuitgang van de potentiometer te lezen, die wordt gebruikt om de positie van de servo te regelen.
Codevoorbeelden & uitleg
Het volgende codefragment initialiseert de servo en stelt de parameters in voor het regelen van de beweging:
#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); // Standaard 50Hz servo
}
In deze code nemen we de ESP32Servo-bibliotheek op en maken we een instantie van de servo met de naam myServo. We definiëren het pinnummer voor de servo en stellen de minimale en maximale pulsbreedtes in die overeenkomen met de hoeklimieten van de servo.
Laten we nu eens kijken naar de loop die de servo continu heen en weer beweegt:
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);
}
}
Deze loop verandert geleidelijk de hoek van 0 naar 180 graden en weer terug, met behulp van de map-functie om de hoek om te zetten naar de overeenkomstige pulsbreedte voor de servo. Elke verandering wordt gevolgd door een korte vertraging om de servo soepel naar zijn nieuwe positie te laten bewegen.
Demonstratie / Wat te verwachten
Zodra alles is bedraad en de code is geüpload, zou je de servomotor soepel van 0 naar 180 graden en terug moeten zien bewegen. Als je de potentiometer aanpast, zou de servo de nieuwe positie moeten weerspiegelen op basis van de spanning die door de potentiometer wordt geleverd. Wees voorzichtig met omgekeerde polariteit bij het bedraden, omdat dit je componenten kan beschadigen (in video op 3:45).
Videotijdstempels
- 00:00 Start
- 1:56 Wat is een servomotor
- 5:00 Documentatiepagina
- 6:33 Bedrading voor servo uitgelegd
- 7:45 COMP-poort selecteren voor ESP32 in Arduino IDE
- 9:27 Arduino-code uitgelegd
- 14:31 Demonstratie van servobesturing met ESP32
- 16:04 Servo voeden met andere spanning dan 5V
- 18:47 Servo besturen zonder de loop
- 20:15 Servo besturen met potentiometer
- 21:37 Servo met pot Arduino-code uitgelegd
#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
Hulpmiddelen en referenties
-
DocumentatieESP32 Tutorial 17/55- SunFunder Servo motor documentationdocs.sunfounder.com
Bestanden📁
Datasheet (pdf)
-
DS5160 Servo motor datasheet
DS5160_datasheet.pdf0.33 MB
Andere bestanden
-
Download SG90 datasheet (PDF)
robojax-servo-sg90_datasheet.pdf