Pretraži kod

ESP32 Tutorijal 17/55 - Upravljanje servo motorom koristeći ESP32 i potenciometar -ESP32 IoT komplet za učenje

ESP32 Tutorijal 17/55 - Upravljanje servo motorom koristeći ESP32 i potenciometar -ESP32 IoT komplet za učenje

U ovom tutorijalu naučit ćemo kako upravljati servo motorom koristeći ESP32 mikrokontroler i potenciometar iz ESP32 IoT Learning kita kompanije SunFounder. Do kraja ovog projekta moći ćete glatko podešavati ugao servo motora pomoću potenciometra, što omogućava preciznu kontrolu. Ovo je odličan način da istražite mogućnosti ESP32-a i kako on komunicira s motorima.

Kako ulazimo u detalje, pokrit ćemo potrebne hardverske komponente, upute za povezivanje i primjere koda kako bismo sve pokrenuli. Za vizualniji prikaz, svakako pogledajte video povezan s ovim tutorijalom (u videu na 0:30).

Objašnjenje hardvera

Primarne komponente za ovaj projekt uključuju ESP32 mikrokontroler, servo motor (SG90) i potenciometar. ESP32 je moćan mikrokontroler koji nudi ugrađeni Wi-Fi i Bluetooth, što ga čini pogodnim za IoT projekte. Sposoban je upravljati različitim uređajima, uključujući motore, s visokom preciznošću.

SG90 servo motor je široko korištena komponenta koja se može rotirati približno 270 stupnjeva. Radi na principu pulsno-širinske modulacije (PWM) signala, gdje je ugao rotacije određen širinom pulsa koji mu se šalje. Potenciometar djeluje kao promjenjivi otpornik, omogućavajući vam podešavanje napona koji se šalje na ESP32, što zauzvrat kontrolira poziciju serva.

Detalji iz podatkovne tablice

Proizvođač SG
Broj dijela SG90
Logički/IO napon 3.3 V (ESP32)
Napon napajanja 5 V
Izlazna struja (po kanalu) 1.2 A
Vršna struja (po kanalu) 2.5 A
Smjernice za PWM frekvenciju 50 Hz
Ulazni logički pragovi 0.2 V (nisko), 2.5 V (visoko)
Pad napona / RDS(on) / zasićenje 0.5 V
Toplinska ograničenja 85 °C maks
Paket Plastični
Napomene / varijante Dostupan u različitim tipovima zupčanika

 

  • Osigurajte da servo bude napajan odgovarajućim naponom (5V).
  • Spojite uzemljenje serva na uzemljenje ESP32-a radi zajedničke reference.
  • Koristite odgovarajuće PWM signale za kontrolu pozicije serva.
  • Budite svjesni strujnih zahtjeva serva; koristite vanjsko napajanje ako je potrebno.
  • Provjerite ispravne dodjele pinova prilikom povezivanja kako biste izbjegli pogrešne konfiguracije.

Upute za povezivanje

ESP32-17-Sevo_motor-wiring

Da biste povezali servo motor i potenciometar na ESP32, počnite spajanjem žice za uzemljenje serva (obično crne ili smeđe) na jedan od pinova za uzemljenje na ESP32-u. Zatim spojite žicu za napajanje (obično crvenu) serva na 5V pin na ESP32-u. Na kraju, spojite signalnu žicu (obično narančastu ili bijelu) sa serva na pin 25 na ESP32-u.

Za potenciometar, spojite jedan vanjski pin na 3.3V pin na ESP32-u, a drugi vanjski pin na uzemljenje. Srednji pin potenciometra treba spojiti na pin 34 na ESP32-u. Ova postavka omogućava ESP32-u da čita promjenjivi naponski izlaz s potenciometra, koji će se koristiti za kontrolu pozicije serva.

Primjeri koda i objašnjenje

Sljedeći isječak koda inicijalizira servo i postavlja parametre za kontrolu njegovog kretanja:

#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); // Standardni 50Hz servo
}

U ovom kodu uključujemo ESP32Servo biblioteku i kreiramo instancu serva s imenom myServo. Definiramo broj pina za servo i postavljamo minimalne i maksimalne širine pulsa koje odgovaraju granicama ugla serva.

ESP32_servo_lib

Zatim, pogledajmo petlju koja kontinuirano pomiče servo naprijed-nazad:

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);
  }
}

Ova petlja postupno mijenja ugao od 0 do 180 stupnjeva i natrag, koristeći funkciju map za pretvaranje ugla u odgovarajuću širinu pulsa za servo. Svaka promjena praćena je kratkim kašnjenjem kako bi servo glatko stigao do svoje nove pozicije.

Demonstracija / Šta očekivati

Kada je sve povezano i kod je učitan, trebali biste vidjeti servo motor kako se glatko kreće od 0 do 180 stupnjeva i natrag. Ako podesite potenciometar, servo bi trebao odražavati novu poziciju na osnovu napona koji potenciometar pruža. Budite oprezni s obrnutim polaritetom prilikom povezivanja, jer može oštetiti vaše komponente (u videu na 3:45).

Vremenske oznake videa

  • 00:00 Početak
  • 1:56 Šta je servo motor
  • 5:00 Stranica dokumentacije
  • 6:33 Objašnjeno povezivanje serva
  • 7:45 Odabir COMP porta za ESP32 u Arduino IDE
  • 9:27 Objašnjen Arduino kod
  • 14:31 Demonstracija upravljanja servom pomoću ESP32
  • 16:04 Napajanje serva drugačije od 5V
  • 18:47 Upravljanje servom bez petlje
  • 20:15 Upravljanje servom pomoću potenciometra
  • 21:37 Objašnjen Arduino kod za servo s potenciometrom

Slike

ESP32-17-Sevo_motor-schematic
ESP32-17-Sevo_motor-schematic
ESP32-17-Sevo_motor-wiring
ESP32-17-Sevo_motor-wiring
ESP32_servo_lib
ESP32_servo_lib
816-ESP32 Tutorial 17/55- Arduino code for controling servo motor
Jezik: C++
#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);
  }
}

Datoteke📁

Tehnički list (pdf)

Ostale datoteke