Hľadať kód

Výukový program ESP32 17/55 - Ovládanie servomotora pomocou ESP32 a potenciometra - ESP32 IoT výuková súprava

Výukový program ESP32 17/55 - Ovládanie servomotora pomocou ESP32 a potenciometra - ESP32 IoT výuková súprava

V tomto návode sa naučíme, ako ovládať servomotor pomocou mikrokontroléra ESP32 a potenciometra zo súpravy ESP32 IoT Learning kit od SunFounder. Na konci tohto projektu budete schopní plynule nastavovať uhol servomotora pomocou potenciometra, čo umožní presné ovládanie. Je to skvelý spôsob, ako preskúmať možnosti ESP32 a to, ako komunikuje s motormi.

Keď sa ponoríme do detailov, prejdeme si potrebné hardvérové komponenty, pokyny na zapojenie a príklady kódu, aby všetko fungovalo. Pre vizuálnejšie znázornenie si určite pozrite video spojené s týmto návodom (vo videu o 0:30).

Vysvetlenie hardvéru

Hlavné komponenty pre tento projekt zahŕňajú mikrokontrolér ESP32, servomotor (SG90) a potenciometer. ESP32 je výkonný mikrokontrolér, ktorý ponúka vstavané Wi-Fi a Bluetooth, vďaka čomu je vhodný pre IoT projekty. Je schopný ovládať rôzne zariadenia, vrátane motorov, s vysokou presnosťou.

Servomotor SG90 je široko používaný komponent, ktorý sa môže otáčať približne o 270 stupňov. Funguje na princípe pulzno-šírkovej modulácie (PWM), kde je uhol otočenia určený šírkou pulzu, ktorý je mu zaslaný. Potenciometer funguje ako premenný odpor, ktorý vám umožňuje nastaviť napätie odoslané do ESP32, čo následne riadi polohu serva.

Detaily z datasheetu

Výrobca SG
Označenie dielu SG90
Logické/IO napätie 3,3 V (ESP32)
Napájacie napätie 5 V
Výstupný prúd (na kanál) 1,2 A
Špičkový prúd (na kanál) 2,5 A
Odporúčaná frekvencia PWM 50 Hz
Vstupné logické prahy 0,2 V (nízka), 2,5 V (vysoká)
Pokles napätia / RDS(on) / saturácia 0,5 V
Tepelné limity max. 85 °C
Puzdro Plastové
Poznámky / varianty Dostupné s rôznymi typmi prevodov

 

  • Uistite sa, že je servo napájané vhodným napätím (5V).
  • Pripojte uzemnenie serva k uzemneniu ESP32 pre spoločnú referenciu.
  • Na ovládanie polohy serva používajte vhodné PWM signály.
  • Buďte si vedomí prúdových požiadaviek serva; v prípade potreby použite externý zdroj napájania.
  • Pri zapájaní skontrolujte správne priradenie pinov, aby ste predišli chybnej konfigurácii.

Pokyny na zapojenie

ESP32-17-Sevo_motor-wiring

Na zapojenie servomotora a potenciometra k ESP32 začnite pripojením uzemňovacieho vodiča serva (zvyčajne čierny alebo hnedý) k jednému z uzemňovacích pinov na ESP32. Ďalej pripojte napájací vodič serva (zvyčajne červený) na 5V pin na ESP32. Nakoniec pripojte signálny vodič serva (zvyčajne oranžový alebo biely) na pin 25 na ESP32.

Pre potenciometer pripojte jeden krajný pin na 3,3V pin na ESP32 a druhý krajný pin na uzemnenie. Stredný pin potenciometra by mal byť pripojený na pin 34 na ESP32. Toto zapojenie umožňuje ESP32 čítať meniace sa výstupné napätie z potenciometra, ktoré sa použije na ovládanie polohy serva.

Príklady kódu a vysvetlenie

Nasledujúci úryvok kódu inicializuje servo a nastaví parametre na riadenie jeho pohybu:

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

V tomto kóde zahrnieme knižnicu ESP32Servo a vytvoríme inštanciu serva s názvom myServo. Definujeme číslo pinu pre servo a nastavíme minimálnu a maximálnu šírku pulzu, ktoré zodpovedajú limitom uhla serva.

ESP32_servo_lib

Ďalej sa pozrime na slučku, ktorá nepretržite pohybuje servom tam a späť:

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

Táto slučka postupne mení uhol z 0 na 180 stupňov a späť, pričom na prevod uhla na zodpovedajúcu šírku pulzu pre servo používa funkciu map. Po každej zmene nasleduje krátke oneskorenie, aby sa servo mohlo plynulo dostať do novej polohy.

Demonštrácia / Čo očakávať

Keď bude všetko zapojené a kód nahraný, mali by ste vidieť, ako sa servomotor plynulo pohybuje z 0 na 180 stupňov a späť. Ak nastavíte potenciometer, servo by malo odrážať novú polohu na základe napätia poskytnutého potenciometrom. Buďte opatrní pri zapájaní s obrátenou polaritou, pretože by to mohlo poškodiť vaše komponenty (vo videu o 3:45).

Časové značky videa

  • 00:00 Začiatok
  • 1:56 Čo je servomotor
  • 5:00 Stránka dokumentácie
  • 6:33 Zapojenie serva vysvetlené
  • 7:45 Výber COMP portu pre ESP32 v Arduino IDE
  • 9:27 Vysvetlenie kódu Arduino
  • 14:31 Ukážka ovládania serva pomocou ESP32
  • 16:04 Napájanie serva iným ako 5V
  • 18:47 Ovládanie serva bez slučky
  • 20:15 Ovládanie serva potenciometrom
  • 21:37 Vysvetlenie kódu Arduino pre servo s potenciometrom

Obrázky

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

Súbory📁

Datasheet (pdf)

Iné súbory