Mafunzo ya ESP32 30/55 - Kudhibiti Servo kwenye wavuti kwa kutumia MQTT kwa kutumia Huduma ya Adafruit IO | Kifurushi cha Kujifunza cha ESP32 IoT cha SunFounder
Katika mafunzo haya, tutajifunza jinsi ya kudhibiti nafasi ya motor ya servo kwa kutumia microcontroller ya ESP32 na itifaki ya MQTT kupitia wavuti. Kwa kutumia huduma ya Adafruit IO, utaweza kuweka servo katika pembe mbalimbali kama 0°, 90°, au 180° kwa mbali. Mradi huu unaonyesha uwezo wa ESP32, ambao unajumuisha Wi-Fi na Bluetooth zilizojengewa ndani, na kuifanya kuwa chombo chenye nguvu kwa matumizi ya IoT.

Katika mradi huu, tutasanidi broker ya MQTT kwa kutumia Adafruit IO, kuunda dashibodi ya kudhibiti servo, na kuunganisha ESP32 nayo. Nafasi ya servo itaweza kubadilishwa kupitia slaida kwenye dashibodi, ikiruhusu udhibiti wa wakati halisi kutoka kwa kifaa chochote kilicho na mtandao (katika video saa 5:30).
Vifaa Vimeelezwa
Vipengele vikuu vya mradi huu vinajumuisha microcontroller ya ESP32 na motor ya servo. ESP32 ni microcontroller yenye uwezo mwingi na Wi-Fi na Bluetooth zilizojengewa ndani, na kuifanya kuwa bora kwa matumizi ya IoT. Inawasiliana na huduma ya Adafruit IO kwa kutumia itifaki ya MQTT, ambayo ni nyepesi na yenye ufanisi kwa kutuma ujumbe kupitia mtandao.
Motor ya servo ni actuator inayozunguka ambayo inaruhusu udhibiti sahihi wa nafasi ya angular. Inafanya kazi kwa kupokea ishara ya pulse-width modulation (PWM) ambayo inaamuru nafasi yake. Katika mradi huu, tutaunganisha servo kwenye moja ya pini za dijiti kwenye ESP32, ikituruhusu kudhibiti pembe yake kwa mbali.
Maelezo ya Datasheet
| Mtengenezaji | Parallax |
|---|---|
| Nambari ya sehemu | SG90 |
| Voltage ya Logic/IO | 3.3 V - 5 V |
| Voltage ya usambazaji | 4.8 V - 6.0 V |
| Current ya pato (kwa kila channel) | 1 A max |
| Mwongozo wa frequency ya PWM | 50 Hz |
| Viwango vya kizingiti cha logic ya kuingiza | 0.3 V - 0.7 V |
| Kushuka kwa voltage / RDS(on) / kueneza | 0.2 V max |
| Mipaka ya joto | Joto la kufanya kazi: -10°C hadi 60°C |
| Kifurushi | Kasha la plastiki |
| Vidokezo / lahaja | Mini servo, mzunguko wa 180° |
- Hakikisha usambazaji sahihi wa voltage kwa servo (4.8 V - 6.0 V).
- Tumia ardhi ya pamoja kati ya ESP32 na servo.
- Fuatilia ishara ya PWM ili kuepuka kuzidi mipaka ya servo.
- Unganisha servo kwa usalama ili kuepuka kukatika wakati wa operesheni.
- Sasisha maktaba ya Adafruit MQTT ili kuhakikisha utangamano.
Michoro ya MQTT
Maagizo ya Wiring

Ili kuunganisha motor ya servo kwenye ESP32, anza kwa kuunganisha waya wa ardhi wa servo kwenye pini ya ardhi kwenye ESP32. Kisha, unganisha waya wa nguvu (kawaida nyekundu) wa servo kwenye pini ya 5V kwenye ESP32. Hatimaye, unganisha waya wa ishara (mara nyingi njano au nyeupe) kwenye pini ya dijiti 25 kwenye ESP32. Hakikisha miunganisho ni salama ili kuzuia kukatika wakati wa operesheni.
Ikiwa unatumia betri kuwezesha ESP32, hakikisha voltage ya betri iko ndani ya kiwango kinachokubalika kwa ESP32 na servo. Zaidi ya hayo, angalia mara mbili kwamba wiring inalingana na ufafanuzi wa pini unaotumika katika msimbo wako ili kuepuka matatizo yoyote (katika video saa 12:45).
Mifano ya Msimbo & Maelekezo
Katika msimbo uliotolewa, kwanza tunajumuisha maktaba muhimu za ESP32 na MQTT. Tunafafanua kitu cha servo na kubainisha pini ambayo imeunganishwa na const int servoPin = 25;. Pembe ya default pia imewekwa na const int defaultServoAngle = 90;, ambayo itakuwa nafasi ya awali wakati ESP32 inapoanza.
Servo myServo;
const int servoPin = 25;
const int defaultServoAngle = 90;
int servoAngle = defaultServoAngle;
Kipande hiki kinaanzisha servo kwenye pini 25 na kuweka pembe yake ya default kuwa 90°. Kigezo servoAngle kitasasishwa kulingana na ujumbe unaopokelewa kutoka kwa broker ya MQTT.
Katika kazi ya setup(), tunaunganisha kwenye Wi-Fi na kusanidi mteja wa MQTT. Vitambulisho vya Adafruit IO vimefafanuliwa hapa, ikijumuisha jina la mtumiaji na ufunguo:
#define AIO_USERNAME "robojax"
#define AIO_KEY "aio_xmIW58uNNsjJCSOqzZ9QoHyq29wu"
Sehemu hii inaanzisha muunganisho kwenye huduma ya Adafruit IO. Hakikisha unabadilisha maadili haya na vitambulisho vyako vya Adafruit IO wakati wa kutekeleza msimbo.
Hatimaye, kitanzi kikuu kinahakikisha kwamba muunganisho kwenye seva ya MQTT unabaki hai na kuchakata ujumbe unaoingia. Nafasi ya servo inasasishwa kulingana na pembe inayopokelewa:
mqtt.processPackets(500);
int pulseWidth = map(servoAngle, 0, 180, minPulseWidth, maxPulseWidth);
myServo.writeMicroseconds(pulseWidth);
Msimbo huu unachora pembe ya servo kwa upana wa pigo unaolingana na kuutuma kwa motor ya servo. Kazi ya processPackets() inaruhusu ESP32 kushughulikia ujumbe wa MQTT unaoingia, kuhakikisha servo inaitikia maagizo yaliyotumwa kupitia dashibodi ya Adafruit IO.
Maonyesho / Nini cha Kutarajia
Mara tu kila kitu kikiwa kimewekwa, utaweza kudhibiti servo kutoka kwenye dashibodi ya Adafruit IO kwa kutumia kitelezi ulichounda. Unaposogeza kitelezi, servo itarekebisha pembe yake kwa wakati halisi. Hakikisha ESP32 yako imeunganishwa kwenye Wi-Fi, na muunganisho wa MQTT ni thabiti. Ikiwa servo haijibu, angalia wiring na usambazaji wa nguvu kwa servo (katika video saa 20:15).
Jua kuhusu mipaka ya anuwai ya servo; kutuma thamani nje ya 0° hadi 180° kunaweza kusababisha itende kwa njia isiyotarajiwa. Msimbo unajumuisha ukaguzi wa kuzuia matukio kama haya kwa kubana pembe ndani ya anuwai hii.
Vidokezo vya Muda wa Video
- 00:00 Mwanzo
- 1:54 Utangulizi wa mradi
- 2:52 Utangulizi wa MQTT
- 6:50 Usanidi wa Adafruit IO
- 9:54 Wiring ya servo
- 11:07 Msimbo ulioelezwa
- 18:59 Kuchagua bodi ya ESP32 na bandari ya COM
- 22:10 Maonyesho ya mradi
/***********************************************************************
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
Tänker att du kanske behöver
-
AliExpressPurchase SG90 servo motor 180 or 360 from AliExpresss.click.aliexpress.com
Resurser och referenser
-
DokumentationESP32 Tutorial 17/55 - SunFounder Servo motor documentationdocs.sunfounder.com
-
Extern.SG90 Servo on Amazon USAamzn.to
Filer📁
Andra filer
-
SG90 Seroo motor datablad
robojax-servo-SG90_datasheet.pdf0.12 MB