ESP32 Tutorijal 30/55 - Kontrolišite servo preko weba koristeći MQTT koristeći Adafruit IO servis | SunFounder-ov ESP32 IoT komplet za učenje
U ovom tutorijalu naučit ćemo kako kontrolirati poziciju servo motora koristeći ESP32 mikrokontroler i MQTT protokol putem weba. Korištenjem Adafruit IO usluge, moći ćete pozicionirati servo pod različitim uglovima kao što su 0°, 90° ili 180° daljinski. Ovaj projekat demonstrira mogućnosti ESP32, koji uključuje ugrađeni Wi-Fi i Bluetooth, što ga čini moćnim alatom za IoT aplikacije.

U ovom projektu, postavit ćemo MQTT broker koristeći Adafruit IO, kreirati kontrolnu ploču za upravljanje servom i povezati ESP32 na nju. Pozicija serva bit će podesiva putem klizača na kontrolnoj ploči, omogućavajući kontrolu u realnom vremenu s bilo kojeg uređaja povezanog na internet (u videu na 5:30).
Objašnjenje hardvera
Primarne komponente ovog projekta uključuju ESP32 mikrokontroler i servo motor. ESP32 je svestran mikrokontroler s integriranim Wi-Fi i Bluetooth mogućnostima, što ga čini idealnim za IoT aplikacije. Komunicira s Adafruit IO uslugom koristeći MQTT protokol, koji je lagan i efikasan za prijenos poruka putem interneta.
Servo motor je rotacioni aktuator koji omogućava preciznu kontrolu ugaone pozicije. Radi tako što prima signal širinsko-impulsne modulacije (PWM) koji diktira njegovu poziciju. U ovom projektu, spojit ćemo servo na jedan od digitalnih pinova na ESP32, omogućavajući nam da kontroliramo njegov ugao daljinski.
Detalji iz tehničke dokumentacije
| Proizvođač | Parallax |
|---|---|
| Broj dijela | SG90 |
| Logički/IO napon | 3.3 V - 5 V |
| Napon napajanja | 4.8 V - 6.0 V |
| Izlazna struja (po kanalu) | 1 A max |
| Smjernice za PWM frekvenciju | 50 Hz |
| Ulazni logički pragovi | 0.3 V - 0.7 V |
| Pad napona / RDS(on) / zasićenje | 0.2 V max |
| Termička ograničenja | Radna temperatura: -10°C do 60°C |
| Pakovanje | Plastično kućište |
| Napomene / varijante | Mini servo, 180° rotacija |
- Osigurajte odgovarajući napon napajanja za servo (4.8 V - 6.0 V).
- Koristite zajedničko uzemljenje između ESP32 i serva.
- Pratite PWM signal kako biste izbjegli prekoračenje ograničenja serva.
- Sigurno povežite servo kako biste izbjegli prekide tokom rada.
- Ažurirajte Adafruit MQTT biblioteku kako biste osigurali kompatibilnost.
MQTT Dijagrami
Upute za povezivanje

Za povezivanje servo motora na ESP32, počnite spajanjem žice za uzemljenje serva na pin za uzemljenje na ESP32. Zatim spojite žicu za napajanje (obično crvenu) serva na 5V pin na ESP32. Na kraju, spojite signalnu žicu (često žutu ili bijelu) na digitalni pin 25 na ESP32. Osigurajte da su veze sigurne kako biste spriječili prekide tokom rada.
Ako koristite bateriju za napajanje ESP32, provjerite da je napon baterije unutar prihvatljivog raspona i za ESP32 i za servo. Dodatno, provjerite da povezivanje odgovara definicijama pinova korištenim u vašem kodu kako biste izbjegli probleme (u videu na 12:45).
Primjeri koda i objašnjenje
U priloženom kodu, prvo uključujemo potrebne biblioteke za ESP32 i MQTT. Definiramo servo objekat i specificiramo pin na koji je spojen s const int servoPin = 25;. Zadani ugao je također postavljen s const int defaultServoAngle = 90;, što će biti početna pozicija kada se ESP32 pokrene.
Servo myServo;
const int servoPin = 25;
const int defaultServoAngle = 90;
int servoAngle = defaultServoAngle;
Ovaj isječak inicijalizira servo na pinu 25 i postavlja njegov zadani ugao na 90°. Varijabla servoAngle bit će ažurirana na osnovu poruka primljenih od MQTT brokera.
U setup() funkciji, povezujemo se na Wi-Fi i postavljamo MQTT klijenta. Akreditivi za Adafruit IO definirani su ovdje, uključujući korisničko ime i ključ:
#define AIO_USERNAME "robojax"
#define AIO_KEY "aio_xmIW58uNNsjJCSOqzZ9QoHyq29wu"
Ovaj odjeljak uspostavlja vezu s Adafruit IO uslugom. Obavezno zamijenite ove vrijednosti s vlastitim Adafruit IO akreditivima prilikom implementacije koda.
Na kraju, glavna petlja osigurava da veza s MQTT serverom ostane aktivna i obrađuje dolazne poruke. Pozicija serva ažurira se na osnovu primljenog ugla:
mqtt.processPackets(500);
int pulseWidth = map(servoAngle, 0, 180, minPulseWidth, maxPulseWidth);
myServo.writeMicroseconds(pulseWidth);
Ovaj kod mapira ugao serva na odgovarajuću širinu impulsa i šalje je servo motoru. Funkcija processPackets() omogućava ESP32 da obrađuje dolazne MQTT poruke, osiguravajući da servo reaguje na komande poslane putem Adafruit IO kontrolne ploče.
Demonstracija / Šta očekivati
Kada je sve podešeno, trebalo bi da možete kontrolisati servo sa Adafruit IO kontrolne ploče koristeći klizač koji ste kreirali. Dok pomičete klizač, servo će podešavati svoj ugao u realnom vremenu. Osigurajte da je vaš ESP32 povezan na Wi-Fi i da je MQTT veza stabilna. Ako servo ne reaguje, provjerite ožičenje i napajanje serva (u videu na 20:15).
Budite svjesni ograničenja opsega za servo; slanje vrijednosti izvan 0° do 180° može uzrokovati neočekivano ponašanje. Kod uključuje provjere koje sprječavaju takve slučajeve ograničavanjem ugla unutar ovog opsega.
Vremenske oznake videa
- 00:00 Početak
- 1:54 Uvod u projekat
- 2:52 Uvod u MQTT
- 6:50 Adafruit IO podešavanje
- 9:54 Ožičenje serva
- 11:07 Objašnjen kôd
- 18:59 Odabir ESP32 ploče i COM porta
- 22:10 Demonstracija projekta
/***********************************************************************
This is Arduino sketch for ESP32 to control Servo motor using MQTT service of Adafruit
www.Robojax.com
Written By Ahamd Shamshiri
on Feb 2nd, 2024
Watch video instruction for this code on YouTube https://youtu.be/T4DhWNg2Rb8
Adafruit MQTT Library ESP32 Adafruit IO SSL/TLS example
this code can be downloaded from https://robojax.com/RJT671
/// ref: https://www.electronicwings.com/esp32/esp32-mqtt-client
*/
#include <ESP32Servo.h>
// Define the servo and the pin it is connected to
Servo myServo;
const int servoPin = 25;
const int defaultServoAngle = 90;
int servoAngle =defaultServoAngle;
// Define the minimum and maximum pulse widths for the servo
const int minPulseWidth = 500; // 0.5 ms
const int maxPulseWidth = 2500; // 2.5 ms
#include <WiFi.h>
#include "WiFiClientSecure.h"
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"
/************************* WiFi Access Point *********************************/
#define WLAN_SSID "Barqasaa"
#define WLAN_PASS "wan9&Jang~5"
/************************* Adafruit.io Setup *********************************/
#define AIO_SERVER "io.adafruit.com"
// Using port 8883 for MQTTS
#define AIO_SERVERPORT 8883
// Adafruit IO Account Configuration
// (to obtain these values, visit https://io.adafruit.com and click on Active Key)
// #define AIO_USERNAME "YOUR_ADAFRUIT_IO_USERNAME"
// #define AIO_KEY "YOUR_ADAFRUIT_IO_KEY"
#define AIO_USERNAME "robojax"
#define AIO_KEY "aio_xmIW58uNNsjJCSOqzZ9QoHyq29wu"
/************ Global State (you don't need to change this!) ******************/
// WiFiFlientSecure for SSL/TLS support
WiFiClientSecure client;
// Setup the MQTT client class by passing in the WiFi client and MQTT server and login details.
Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
// io.adafruit.com root CA
const char* adafruitio_root_ca = \
"-----BEGIN CERTIFICATE-----\n"
"MIIEjTCCA3WgAwIBAgIQDQd4KhM/xvmlcpbhMf/ReTANBgkqhkiG9w0BAQsFADBh\n"
"MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\n"
"d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH\n"
"MjAeFw0xNzExMDIxMjIzMzdaFw0yNzExMDIxMjIzMzdaMGAxCzAJBgNVBAYTAlVT\n"
"MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j\n"
"b20xHzAdBgNVBAMTFkdlb1RydXN0IFRMUyBSU0EgQ0EgRzEwggEiMA0GCSqGSIb3\n"
"DQEBAQUAA4IBDwAwggEKAoIBAQC+F+jsvikKy/65LWEx/TMkCDIuWegh1Ngwvm4Q\n"
"yISgP7oU5d79eoySG3vOhC3w/3jEMuipoH1fBtp7m0tTpsYbAhch4XA7rfuD6whU\n"
"gajeErLVxoiWMPkC/DnUvbgi74BJmdBiuGHQSd7LwsuXpTEGG9fYXcbTVN5SATYq\n"
"DfbexbYxTMwVJWoVb6lrBEgM3gBBqiiAiy800xu1Nq07JdCIQkBsNpFtZbIZhsDS\n"
"fzlGWP4wEmBQ3O67c+ZXkFr2DcrXBEtHam80Gp2SNhou2U5U7UesDL/xgLK6/0d7\n"
"6TnEVMSUVJkZ8VeZr+IUIlvoLrtjLbqugb0T3OYXW+CQU0kBAgMBAAGjggFAMIIB\n"
"PDAdBgNVHQ4EFgQUlE/UXYvkpOKmgP792PkA76O+AlcwHwYDVR0jBBgwFoAUTiJU\n"
"IBiV5uNu5g/6+rkS7QYXjzkwDgYDVR0PAQH/BAQDAgGGMB0GA1UdJQQWMBQGCCsG\n"
"AQUFBwMBBggrBgEFBQcDAjASBgNVHRMBAf8ECDAGAQH/AgEAMDQGCCsGAQUFBwEB\n"
"BCgwJjAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEIGA1Ud\n"
"HwQ7MDkwN6A1oDOGMWh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEds\n"
"b2JhbFJvb3RHMi5jcmwwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEW\n"
"HGh0dHBzOi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwDQYJKoZIhvcNAQELBQADggEB\n"
"AIIcBDqC6cWpyGUSXAjjAcYwsK4iiGF7KweG97i1RJz1kwZhRoo6orU1JtBYnjzB\n"
"c4+/sXmnHJk3mlPyL1xuIAt9sMeC7+vreRIF5wFBC0MCN5sbHwhNN1JzKbifNeP5\n"
"ozpZdQFmkCo+neBiKR6HqIA+LMTMCMMuv2khGGuPHmtDze4GmEGZtYLyF8EQpa5Y\n"
"jPuV6k2Cr/N3XxFpT3hRpt/3usU/Zb9wfKPtWpoznZ4/44c1p9rzFcZYrWkj3A+7\n"
"TNBJE0GmP2fhXhP1D/XVfIW/h0yCJGEiV9Glm/uGOa3DXHlmbAcxSyCRraG+ZBkA\n"
"7h4SeM6Y8l/7MBRpPCz6l8Y=\n"
"-----END CERTIFICATE-----\n";
/****************************** Feeds ***************************************/
// Setup a feed called 'test' for publishing and 'test2' for subscription.
// Notice MQTT paths for AIO follow the form: <username>/feeds/<feedname>
Adafruit_MQTT_Subscribe SERVO = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/servo-angle-1");
/*************************** Sketch Code ************************************/
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
Serial.begin(115200);
delay(10);
Serial.println(F("Adafruit IO MQTTS (SSL/TLS) Example"));
// Connect to WiFi access point.
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(WLAN_SSID);
delay(1000);
WiFi.begin(WLAN_SSID, WLAN_PASS);
delay(2000);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
// Set Adafruit IO's root CA
client.setCACert(adafruitio_root_ca);
// register callback for feed
SERVO.setCallback(servoCallback);
// Setup MQTT subscription for time feed.
mqtt.subscribe(&SERVO);
}
// uint32_t x=0;
void loop() {
// Ensure the connection to the MQTT server is alive (this will make the first
// connection and automatically reconnect when disconnected). See the MQTT_connect
// function definition further below.
MQTT_connect();
Serial.print("Angle: ");
Serial.println(servoAngle);
// wait 0.5 seconds for subscription messages
mqtt.processPackets(500);
//from lesson 17
int pulseWidth = map(servoAngle, 0, 180, minPulseWidth, maxPulseWidth);
myServo.writeMicroseconds(pulseWidth);
delay(15);
// wait a couple seconds to avoid rate limit
//delay(2000);
}
void servoCallback(char* message, uint16_t len) {
char messageBuffer[40];
snprintf(messageBuffer, sizeof(messageBuffer), "Servo status is :: %s, len :: %u", message, len);
Serial.println(messageBuffer);
Serial.println(message);
String inString = message;//sotre the message to String
servoAngle = inString.toInt();//convert the message to Integer
if(servoAngle >180 || servoAngle < 0)
{
servoAngle =0;
}
}
// Function to connect and reconnect as necessary to the MQTT server.
// Should be called in the loop function and it will take care if connecting.
void MQTT_connect() {
int8_t ret;
// Stop if already connected.
if (mqtt.connected()) {
return;
}
Serial.print("Connecting to MQTT... ");
uint8_t retries = 3;
while ((ret = mqtt.connect()) != 0) { // connect will return 0 for connected
Serial.println(mqtt.connectErrorString(ret));
Serial.println("Retrying MQTT connection in 5 seconds...");
mqtt.disconnect();
delay(5000); // wait 5 seconds
retries--;
if (retries == 0) {
// basically die and wait for WDT to reset me
while (1)
;
}
}
Serial.println("MQTT Connected!");
}
Common Course Links
Common Course Files
Stvari koje bi vam mogle zatrebati
-
AliExpressPurchase SG90 servo motor 180 or 360 from AliExpresss.click.aliexpress.com
Resursi i reference
-
DokumentacijaESP32 Tutorial 17/55 - SunFounder Servo motor documentationdocs.sunfounder.com
-
EksternoSG90 Servo on Amazon USAamzn.to
Datoteke📁
Ostale datoteke
-
SG90 Servo motor datasheet
robojax-servo-SG90_datasheet.pdf0.12 MB