Korišćenje ESP32 sa servo motorima — poređenje sa Arduino Uno i primer Sweep programa
Servo motor je mali precizni elektromehanički uređaj koji omogućava kontrolu položaja osovine u tačno određenom uglu (najčešće 0–180°). Za razliku od običnog DC motora koji se samo okreće u jednom ili oba smera bez kontrole položaja, servo motor nam omogućava da postavimo tačan ugao i da motor taj položaj zadrži. Zato se servo motori koriste u robotici, automodelima, pan-tilt kamerama, robot-šakama i svim sistemima gde je potrebna precizna kontrola.
Interno, servo motor se sastoji od:
- malog DC motora,
- reduktora (zupčanika),
- potenciometra koji meri ugao,
- elektronike koja vrši korekciju položaja.
Važno je razlikovati servo motor od drugih tipova:
- DC motor: rotira se slobodno, nema kontrolu položaja, samo brzinu i smer.
- Koračni (stepper) motor: rotira se u sitnim koracima i omogućava veliku preciznost, ali zahteva poseban drajver i kompleksniju kontrolu.
- Servo motor: najjednostavniji za precizno upravljanje uglom — samo jedan signalni pin i PWM.
U ovim vežbama koristićemo ESP32 za generisanje PWM impulsa koji određuju ugao servoa. ESP32 je veoma pogodan za ovu namenu jer ima: više PWM kanala, moćniji procesor, stabilniji kontroler i mogućnost bežičnog upravljanja (Wi-Fi/Bluetooth).
Kroz praktične primere pokazaćemo kako da:
- povežemo mali servo motor (npr. SG90) na ESP32,
- izvodimo osnovni test rotacije — Sweep,
- koristimo različite GPIO pinove za PWM,
- pravilno napajamo servo i izbegavamo najčešće greške.
Zašto koristiti ESP32 u projektima sa servo motorima?
ESP32 donosi veću procesorsku snagu i ugrađenu bežičnu komunikaciju (Wi-Fi i Bluetooth) u odnosu na klasične 8-bitne razvojne ploče. U projektima koji koriste servoe, to znači da možete kombinovati precisnu kontrolu aktuatora sa mrežnim funkcijama, daljinskim nadzorom ili naprednim algoritmima upravljanja koji rade direktno na uređaju.
ESP32 vs Arduino Uno — praktično poređenje za upravljanje servo motorima
| Aspekt | ESP32 | Arduino Uno |
|---|---|---|
| Procesor i brzina | 32-bitni dual-core do 240 MHz — može istovremeno da izvršava složeniji kod i mrežne protokole. | 8-bitni AVR @ 16 MHz — jednostavno i predvidljivo vreme izvršavanja, pogodno za osnovne servo zadatke. |
| PWM / tajmeri | ESP32 ima više hardverskih tajmera i LEDC PWM kanala; frekvencija i rezolucija PWM-a se mogu podešavati (fleksibilnije). | Arduino koristi Servo biblioteku zasnovanu na tajmerima (jednostavnije, ali manje PWM kanala bez dodatnog hardvera). |
| Logički napon | 3.3V logika — signal servoa je u većini slučajeva kompatibilan, ali proverite specifikacije servo motora. | 5V logika — signalni nivo je isti kao kod većine hobi servoa. |
| Napajanje | Ugrađeni 3.3V regulator ESP32 nije namenjen napajanju servo motora — potrebno je koristiti eksterni 5V izvor. | Arduino 5V pin može napajati jedan mali servo (SG90) za testiranje, ali više servoa zahteva eksterni izvor. |
| Bežične mogućnosti | Ugrađeni Wi-Fi i Bluetooth omogućavaju bežične komande, OTA ažuriranja, telemetriju i web-kontrolu servoa. | Nema bežične komunikacije bez dodatnih modula. |
Praktične napomene — ESP32 + Servo
- Signal servoa → ESP32 GPIO (primer: GPIO 18). Izaberite GPIO koji je stabilan (izbegavati pinove rezervisane za flash/boot).
- Servo VCC → eksterno 5V napajanje (preporučeno). Ne napajajte servo preko 3.3V regulatora na ESP32.
- Servo GND → zajednička masa sa ESP32 (povezati GND eksternog napajanja sa ESP32 GND).
- Dodajte elektrolitski kondenzator (100–470 µF) između 5V i GND blizu servoa da smanji pad napona pri pokretanju.
- Ako koristite više servoa, razmislite o posebnoj naponskoj magistrali ili servo drajveru (npr. PCA9685) koji ESP32 upravlja preko I2C-a.
Softver: koju biblioteku koristiti?
Na ESP32 najbolje je koristiti biblioteke koje su kompatibilne sa platformom. Najčešće opcije su:
- ESP32Servo — port klasične Arduino Servo biblioteke, prilagođen za ESP32. Jednostavan za pojedinačne servoe.
- Hardverski PWM (LEDC) ili eksterni drajveri — omogućavaju stabilno upravljanje više servoa ili servoa koji zahtevaju precizno vreme.
Primer — Servo Sweep pomoću ESP32Servo biblioteke
Povežite signal servoa na GPIO 18, servo VCC na eksterno 5V, a GND zajedno sa ESP32. Primer ispod pomera servo od 0° do 180° i nazad.
// ESP32 Servo Sweep — korišćenje ESP32Servo biblioteke
#include <ESP32Servo.h>
Servo myServo;
const int servoPin = 18; // primer: GPIO18
void setup() {
// povezivanje servoa (možete podesiti min/max pulse width ako je potrebno)
myServo.attach(servoPin);
}
void loop() {
// pomeranje od 0 do 180 stepeni
for (int pos = 0; pos <= 180; pos += 1) {
myServo.write(pos);
delay(15);
}
// i nazad od 180 do 0 stepeni
for (int pos = 180; pos >= 0; pos -= 1) {
myServo.write(pos);
delay(15);
}
}
Rešavanje problema i saveti
- Ako servo podrhtava ili se ponaša nepredvidivo: proverite masu, dodajte kondenzator, proverite da li izvor može da obezbedi vršne struje.
- Signalna logika: većina servoa prihvata 3.3V signal, ali proverite datasheet ako niste sigurni.
- Za upravljanje većim brojem servoa preporučuje se PCA9685 — skida teret PWM generisanja sa ESP32.
- Kada je Wi-Fi aktivan, javljaju se kratki strujni pikovi — loše napajanje može poremetiti rad servoa.
Dodatno čitanje
Za uvod u rad sa servo motorima, mapiranje impulsa i primere za Arduino, pogledajte: Uvod u servo motore .
Primer: ESP32 i Servo Motor – Sweep test
U ovom primeru povezujemo ESP32 razvojnu ploču sa servo motorom kako bismo izveli klasični sweep test. Ako niste upoznati sa tim kako servo motori rade, možete prvo pročitati uvodni tekst ovde: Uvod u servo motore.
ESP32 vs Arduino UNO za upravljanje servom
Iako je Arduino UNO jedna od najpopularnijih ploča za početnike kada je u pitanju kontrola servo motora, ESP32 nudi dodatne prednosti:
- Procesorska snaga: ESP32 ima dvostruko jezgro, 32-bitni procesor koji radi do 240 MHz, dok Arduino UNO radi na 16 MHz.
- PWM kanali: ESP32 podržava do 16 PWM kanala, što omogućava jednostavno upravljanje većim brojem servoa.
- Povezivanje: Ugrađeni Wi-Fi i Bluetooth omogućavaju bežičnu kontrolu servoa, dok je za Arduino UNO potreban dodatni modul.
Povezivanje
Povežite komponente na sledeći način:
- Servo VCC → 5V (ili 3.3V, u zavisnosti od vrste servoa)
- Servo GND → ESP32 GND
- Servo Signal → ESP32 GPIO18
Šema povezivanja (ESP32 → Servo motor)
Na šemi iznad vidi se tipično povezivanje: servo motor ima tri žice — VCC (crvena), GND (braon), i Signal (žuta). ESP32 obezbeđuje upravljački PWM signal preko pina GPIO18, dok se napajanje može uzeti direktno sa ESP32 (za male 9g servoe) ili iz spoljnog izvora u slučaju jačih servoa.
Primer koda
#include <ESP32Servo.h> // ESP32Servo biblioteka, ne standardni Servo.h
Servo myservo;
int pos = 0; // Trenutna pozicija servoa u stepenu
void setup() {
// Povezivanje signalnog pina servoa na GPIO18 (može se promeniti)
myservo.attach(18);
// Napomena: mali servoi mogu raditi direktno na 3.3V sa ESP32
// Za veće servoe preporučuje se eksterno napajanje
}
void loop() {
// Pokretanje servoa od 0 do 180 stepeni (gore)
for (pos = 0; pos <= 180; pos += 1) {
myservo.write(pos); // Postavi servo na trenutnu poziciju
delay(15); // Sačekaj 15 ms da servo stigne
}
// Povratak servoa od 180 do 0 stepeni (dole)
for (pos = 180; pos >= 0; pos -= 1) {
myservo.write(pos);
delay(15);
}
}
Dodatna napomena: korišćenje drugih pinova
U gornjem primeru koristili smo GPIO18 kao signalni pin. Međutim, možete koristiti i drugi GPIO pin koji podržava PWM. Na primer:
myservo.attach(19); // Korišćenje GPIO19 umesto GPIO18 Budite pažljivi pri izboru pinova za kontrolu servoa na ESP32. Neki pinovi su bootstrap pinovi (npr. GPIO0, GPIO2, GPIO15), koji utiču na proces pokretanja (boot) ESP32 uređaja. Ako se ovi pinovi koriste za servo signal, ESP32 može imati problem pri pokretanju ili se ponašati nepredvidivo pri uključivanju napajanja.
Preporučeni bezbedni GPIO pinovi za kontrolu servo motora uključuju: GPIO18, GPIO19, GPIO21, GPIO22, GPIO23, GPIO25, GPIO26, GPIO27, GPIO32, GPIO33.
ESP32 i servo motori
Ako ste novi u radu sa servo motorima, preporučujemo da prvo pogledate našu stranicu Uvod u servo motore , gde su objašnjene osnove rada servoa.
ESP32 vs Arduino UNO sa servo motorima
U poređenju sa Arduino UNO pločom, ESP32 nudi znatno veći broj GPIO pinova, bržu obradu podataka i ugrađeni WiFi/Bluetooth. Obe ploče mogu upravljati servo motorima, ali ESP32 pruža napredniju PWM podršku zahvaljujući svom LED PWM kontroleru, koji omogućava podešavanje frekvencije i rezolucije. Ovo ga čini pogodnim za preciznije upravljanje servo motorima ili za projekte u kojima se kontroliše više servoa istovremeno.
Arduino UNO koristi biblioteku Servo.h, dok ESP32 koristi biblioteku
ESP32Servo.h, koja je prilagođena njegovom PWM hardveru.
Primer: Servo Sweep sa ESP32
Ispod se nalazi jednostavan primer povezivanja servo motora sa ESP32 pločom i izvođenja
osnovnog pokreta „oscilovanja“ (sweep).
Povežite signalni pin servoa na GPIO18, napajanje (Vcc) na 5V,
a masu na GND.
#include <ESP32Servo.h>
Servo myServo;
void setup() {
myServo.attach(18); // Povezivanje signalnog pina servoa na GPIO18
}
void loop() {
for (int pos = 0; pos <= 180; pos++) {
myServo.write(pos);
delay(15);
}
for (int pos = 180; pos >= 0; pos--) {
myServo.write(pos);
delay(15);
}
}
⚠ Važno upozorenje: izbor pravog pina
Iako primer koristi GPIO18, možete ga zameniti i drugim pogodnim pinom.
Međutim, nisu svi GPIO pinovi na ESP32 preporučljivi za upravljanje servo motorima.
Neki od njih su bootstrapping pinovi (na primer: GPIO0, GPIO2, GPIO15),
koji utiču na proces startovanja ESP32 ploče.
Korišćenje ovih pinova može izazvati probleme pri pokretanju ili nepredvidivo ponašanje uređaja.
Preporučeni i nepreporučeni pinovi
| Preporučeni pinovi | Nepreporučeni pinovi |
|---|---|
| GPIO18, GPIO19, GPIO21, GPIO22, GPIO23, GPIO25, GPIO26, GPIO27 | GPIO0, GPIO2, GPIO12, GPIO15 (bootstrapping pinovi) |
| Takođe pogodni: GPIO32, GPIO33 | GPIO6–11 (rezervisani za flash memoriju) |
Za servo motore je najsigurnije koristiti pinove iz liste „Preporučeni“, i izbegavati one koji su rezervisani za flash memoriju ili utiču na proces pokretanja ESP32 ploče.
Pisanje koda i podešavanje okruženja za ESP32 u Arduino IDE-u
Pre pisanja koda za ESP32, važno je pravilno podesiti Arduino IDE kako bi ploča i biblioteke bile ispravno prepoznate. Najpre instalirajte ESP32 Arduino Core preko Board Manager-a. Ovo dodaje podršku za ESP32 u Arduino IDE i omogućava upload koda. Zatim instalirajte biblioteku ESP32Servo putem Library Manager-a — ova biblioteka je posebno prilagođena za upravljanje servo motorima na ESP32 platformi.
Nakon instalacije potrebnih komponenti, povežite ESP32 ploču sa računarom pomoću USB kabla. U Arduino IDE-u idite na Tools → Board i izaberite ESP32 Dev Module (ili tačan model vaše ploče). Zatim otvorite Tools → Port i izaberite COM port koji odgovara vašem ESP32 uređaju. Ako se nijedan port ne prikazuje, možda je potrebno da instalirate odgovarajući USB drajver (CP210x ili CH340, zavisno od modela ploče).
U ovom primeru koristićemo pin GPIO18 kao signalni pin za servo motor. Povežite servo motor na sledeći način:
- Signal servoa → GPIO18 (pin koji se koristi u kodu)
- Servo VCC → eksterno napajanje +5V
- Servo GND → zajednička masa (GND) sa ESP32
Sada ste spremni da uploadujete sledeći kod na ESP32:
// ESP32 Servo Sweep — korišćenje ESP32Servo biblioteke
#include <ESP32Servo.h>
int pinServo = 18; // Digitalni pin na koji je povezan servo motor
Servo servo; // Kreiranje Servo objekta za upravljanje motorom
int start_angle = 45; // Početni ugao kretanja servoa (u stepenima)
int end_angle = 135; // Krajnji ugao kretanja servoa (u stepenima)
void setup()
{
// Serial.begin(115200); // Inicijalizacija serijske komunikacije (opciono, za debug)
servo.attach(pinServo); // Povezivanje servo objekta sa izabranim pinom
}
void loop()
{
// Pomeranje servoa od start_angle do end_angle
for (int pos = start_angle; pos < end_angle; pos++)
{
servo.write(pos); // Postavljanje servoa na ugao 'pos'
delay(20); // Pauza od 20 ms omogućava servou da stigne na poziciju
}
// Vraćanje servoa od end_angle do start_angle
for (int pos = end_angle; pos >= start_angle; pos--)
{
servo.write(pos); // Postavljanje servoa na ugao 'pos'
delay(20); // Pauza od 20 ms za stabilno kretanje
}
// Funkcija loop() se neprestano ponavlja
}
Objašnjenje
Program koristi biblioteku ESP32Servo za slanje PWM signala servo motoru.
U ovom primeru servo se glatko pomera između 45° i 135°, pa zatim nazad.
- pinServo = 18 → GPIO18 je izabran kao signalni pin.
- servo.attach(pinServo) → Povezuje servo objekat sa pinom GPIO18.
- for petlje → Postepeno pomeraju servo između početnog i krajnjeg ugla.
- delay(20) → Obezbeđuje dovoljno vremena da servo stigne do nove pozicije.
Ovaj primer predstavlja praktičan uvod u upravljanje servo motorima pomoću ESP32, pokazujući kako se kombinuju hardversko povezivanje, instalacija biblioteka i osnovna struktura programa za projekte iz oblasti robotike i IoT-a.