Ẹkọ ESP32 30/55 - Ṣàkóso Servo Lori ayelujara nipa lilo MQTT pẹlu Adafruit IO Service | SunFounder's ESP32 IoT Leaning kit
Nínú ẹ̀kọ́ yìí, a óò kọ́ bí a ṣe lè ṣàkóso ipò ẹ̀rọ servo kan nípa lílo microcontroller ESP32 àti ìlànà MQTT lórí wẹ́ẹ̀bù. Nípa lílo iṣẹ́ Adafruit IO, ìwọ yóò lè fi servo sí oríṣiríṣi igun bíi 0°, 90°, tàbí 180° láti ọ̀nà jíjìn. Iṣẹ́ yìí fi agbára ESP32 hàn, tí ó ní Wi-Fi àti Bluetooth nínú rẹ̀, tí ó sì jẹ́ irinṣẹ́ alágbára fún àwọn ohun èlò IoT.

Nínú iṣẹ́ yìí, a óò ṣètò MQTT broker kan nípa lílo Adafruit IO, dá dashboard kan sílẹ̀ láti ṣàkóso servo, kí a sì so ESP32 pọ̀ mọ́ ọ. Ipo servo yóò jẹ́ àtúnṣe nípa lílo slider kan lórí dashboard, tí yóò gba ọ̀nà fún ìṣàkóso ní àkókò gidi láti ọ̀dọ̀ ẹ̀rọ èyíkéyìí tí ó ní asopọ̀ ayélujára (nínú fídíò ní 5:30).
Àlàyé Ohun Èlò
Àwọn ohun pàtàkì nínú iṣẹ́ yìí ni ESP32 microcontroller àti ẹ̀rọ servo. ESP32 jẹ́ microcontroller tí ó ní ọ̀pọ̀lọpọ̀ iṣẹ́ tí ó ní Wi-Fi àti Bluetooth nínú rẹ̀, tí ó sì dára fún àwọn ohun èlò IoT. Ó ń bá iṣẹ́ Adafruit IO sọ̀rọ̀ nípa lílo ìlànà MQTT, tí ó rọrùn àti tí ó gbéṣẹ́ fún gbígba àti fífi àwọn ifiranṣẹ́ ránṣẹ́ lórí ayélujára.
Ẹ̀rọ servo jẹ́ ẹ̀rọ tí ń yípo tí ó gba ọ̀nà fún ìṣàkóso igun ní ọ̀nà pípé. Ó ń ṣiṣẹ́ nípa gbígba ifiranṣẹ́ pulse-width modulation (PWM) tí ó sọ ipò rẹ̀. Nínú iṣẹ́ yìí, a óò so servo pọ̀ mọ́ ọ̀kan lára àwọn pin onímọ̀-ẹ̀rọ lórí ESP32, tí yóò gba wa láàyè láti ṣàkóso igun rẹ̀ láti ọ̀nà jíjìn.
Àwọn Àlàyé Datasheet
| Olùṣelọ́pọ̀ | Parallax |
|---|---|
| Nọ́mbà apá | SG90 |
| Fóltíìjì Logic/IO | 3.3 V - 5 V |
| Fóltíìjì ìpèsè | 4.8 V - 6.0 V |
| Ìjáde lọ́wọ́lọ́wọ́ (fún ikanni kọ̀ọ̀kan) | 1 A tó pọ̀jù |
| Ìtọ́sọ́nà ìgbohùnsáfẹ́fẹ́ PWM | 50 Hz |
| Àwọn ìpele ìgbìmọ̀ ìfidání | 0.3 V - 0.7 V |
| Ìdínkù fóltíìjì / RDS(on) / ìkúnra | 0.2 V tó pọ̀jù |
| Àwọn ìwọ̀n ooru | Ìwọ̀n ìṣiṣẹ́: -10°C sí 60°C |
| Àpótí | Àpótí ṣíkí |
| Àwọn àkíyèsí / oríṣiríṣi | Servo kékeré, yípo 180° |
- Ríi dájú pé fóltíìjì ìpèsè tó tọ́ wà fún servo (4.8 V - 6.0 V).
- Lo ilẹ̀ kan náà fún ESP32 àti servo.
- Ṣàkíyèsí ifiranṣẹ́ PWM láti yẹra fún lílo tí ó ré kọjá àwọn ìwọ̀n servo.
- So servo pọ̀ dáradára láti yẹra fún yíyọ kúrò nígbà ìṣiṣẹ́.
- Ṣàtúnṣe Adafruit MQTT library láti ríi dájú pé ó bá àwọn ohun èlò mu.
Àwọn Àwòrán MQTT
Àwọn Ìtọ́sọ́nà Ìsopọ̀

Láti so ẹ̀rọ servo pọ̀ mọ́ ESP32, bẹ̀rẹ̀ nípa sísopọ̀ okun ilẹ̀ servo pọ̀ mọ́ pin ilẹ̀ lórí ESP32. Lẹ́yìn náà, so okun agbára (tí ó sábà máa ń pupa) ti servo pọ̀ mọ́ pin 5V lórí ESP32. Níkẹyìn, so okun ifiranṣẹ́ (tí ó sábà máa ń ofeefee tàbí funfun) pọ̀ mọ́ pin onímọ̀-ẹ̀rọ 25 lórí ESP32. Ríi dájú pé àwọn ìsopọ̀ náà ṣe dáradára láti yẹra fún yíyọ kúrò nígbà ìṣiṣẹ́.
Bí o bá ń lo bátàrí láti fi agbára fún ESP32, ríi dájú pé fóltíìjì bátàrí wà nínú ìwọ̀n tí ó bá mu fún àwọn méjèèjì ESP32 àti servo. Ní àfikún, ṣàyẹ̀wò lẹ́ẹ̀kan sí i pé ìsopọ̀ bá àwọn ìtumọ̀ pin tí a lò nínú kóòdù rẹ mu láti yẹra fún àwọn ìṣòro (nínú fídíò ní 12:45).
Àwọn Àpẹẹrẹ Kóòdù & Ìtọ́sọ́nà
Nínú kóòdù tí a pèsè, a kọ́kọ́ fi àwọn library tí a nílò fún ESP32 àti MQTT sí inú. A ṣàlàyé ohun servo àti a sọ pin tí ó ti sopọ̀ pẹ̀lú const int servoPin = 25;. A tún ṣètò igun àìbínú pẹ̀lú const int defaultServoAngle = 90;, tí yóò jẹ́ ipò àkọ́kọ́ nígbà tí ESP32 bá bẹ̀rẹ̀.
Servo myServo;
const int servoPin = 25;
const int defaultServoAngle = 90;
int servoAngle = defaultServoAngle;
Àkójọpọ̀ yìí bẹ̀rẹ̀ servo lórí pin 25 àti ó ṣètò igun àìbínú rẹ̀ sí 90°. Àwọn àyípadà servoAngle yóò jẹ́ àtúnṣe nípa lílo àwọn ifiranṣẹ́ tí a gbà láti ọ̀dọ̀ MQTT broker.
Nínú iṣẹ́ setup(), a sopọ̀ sí Wi-Fi àti a ṣètò MQTT client. Àwọn ìdánimọ̀ fún Adafruit IO ni a ṣàlàyé níbí, pẹ̀lú orúkọ olùṣàmúlò àti bọ́tìnnì:
#define AIO_USERNAME "robojax"
#define AIO_KEY "aio_xmIW58uNNsjJCSOqzZ9QoHyq29wu"
Apá yìí fi ìsopọ̀ sí iṣẹ́ Adafruit IO múlẹ̀. Ríi dájú pé o rọ́pò àwọn iye wọ̀nyí pẹ̀lú àwọn ìdánimọ̀ Adafruit IO tirẹ̀ nígbà tí o bá ń ṣe kóòdù náà.
Níkẹyìn, ìyípo àkọ́kọ́ ríi dájú pé ìsopọ̀ sí MQTT server ṣiṣẹ́ nígbà gbogbo àti pé ó ń ṣiṣẹ́ lórí àwọn ifiranṣẹ́ tí ń bọ̀. Ipo servo ni a ṣàtúnṣe nípa lílo igun tí a gbà:
mqtt.processPackets(500);
int pulseWidth = map(servoAngle, 0, 180, minPulseWidth, maxPulseWidth);
myServo.writeMicroseconds(pulseWidth);
Koodu yii ṣe àwòrán igun servo sí ìwọ̀n pulse tó bá mu, ó sì fi ránṣẹ́ sí ẹ̀rọ servo. Iṣẹ́ processPackets() jẹ́ kí ESP32 gba àwọn ifiranṣẹ́ MQTT tó ń bọ̀, tí ó sì rí i pé servo ń fèsì sí àwọn àṣẹ tí a rán nípasẹ̀ dashibodu Adafruit IO.
Ìfihàn / Ohun Tí O Lè Retí
Nígbà tí ohun gbogbo bá ti ṣètò dáradára, o yẹ kí o lè ṣàkóso servo láti dashibodu Adafruit IO nípa lílo slider tí o dá. Bí o ṣe ń gbé slider náà, servo yóò ṣàtúnṣe igun rẹ̀ ní àkókò gidi. Rí i dájú pé ESP32 rẹ ti ní ìsopọ̀ pẹ̀lú Wi-Fi, àti pé ìsopọ̀ MQTT dúró ṣinṣin. Bí servo kò bá fèsì, ṣàyẹ̀wò ìsopọ̀ oníná àti agbára tí ń pèsè fún servo (nínú fídíò ní 20:15).
Kíyè sí àwọn ààlà ìwọ̀n fún servo; ṣíṣe fífi iye tí ó ju 0° sí 180° lọ lè mú kí ó hùwà láìròtẹ́lẹ̀. Koodu náà ní àwọn àyẹ̀wò tí ń ṣèdíwọ́ fún irú bẹ́ẹ̀ nípa dídi igun náà mọ́ sínú ààlà yìí.
Àwọn Àkókò Nínú Fídíò
- 00:00 Ìbẹ̀rẹ̀
- 1:54 Ìfihàn iṣẹ́-ọnà
- 2:52 Ìfihàn MQTT
- 6:50 Ìṣètò Adafruit IO
- 9:54 Ìsopọ̀ oníná servo
- 11:07 Àlàyé koodu
- 18:59 Yíyàn bọ́ọ̀dù ESP32 àti ibùdó COM
- 22:10 Ìfihàn iṣẹ́-ọnà
/***********************************************************************
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
Ohun ti o le nilo
-
AliExpressPurchase SG90 servo motor 180 or 360 from AliExpresss.click.aliexpress.com
Orisun & itọkasi
-
Iwe-ẹriESP32 Tutorial 17/55 - SunFounder Servo motor documentationdocs.sunfounder.com
-
Ita gbangbaSG90 Servo on Amazon USAamzn.to
Fáìlìs📁
Awọn faili miiran
-
SG90 Seroo motor datasheet
robojax-servo-SG90_datasheet.pdf0.12 MB