Koyarwar ESP32 30/55 - Sarrafa Servo ta hanyar yanar gizo ta amfani da MQTT ta amfani da Sabis na Adafruit IO | Kayan Koyon IoT na SunFounder's ESP32
A cikin wannan koyawa, za mu koyi yadda ake sarrafa matsayin motar servo ta amfani da microcontroller na ESP32 da kuma ka'idar MQTT a kan yanar gizo. Ta hanyar amfani da sabis na Adafruit IO, za ka iya sanya servo a kusurwoyi daban-daban kamar 0°, 90°, ko 180° daga nesa. Wannan aikin yana nuna iyawar ESP32, wanda ya haɗa da Wi-Fi da Bluetooth na ciki, yana mai da shi kayan aiki mai ƙarfi don aikace-aikacen IoT.

A cikin wannan aikin, za mu kafa mai ba da MQTT ta amfani da Adafruit IO, ƙirƙirar dashboard don sarrafa servo, da haɗa ESP32 zuwa gare shi. Matsayin servo zai kasance mai iya daidaitawa ta hanyar slider a kan dashboard, yana ba da damar sarrafawa na ainihi daga kowace na'urar da ke da intanet (a cikin bidiyo a 5:30).
Bayanin Kayan Aiki
Babban abubuwan wannan aikin sun haɗa da microcontroller na ESP32 da motar servo. ESP32 microcontroller ne mai yawan amfani wanda ke da haɗin Wi-Fi da Bluetooth, yana mai da shi manufa don aikace-aikacen IoT. Yana sadarwa da sabis na Adafruit IO ta amfani da ka'idar MQTT, wanda yake da sauƙi kuma mai inganci don aika saƙonni a kan intanet.
Motar servo mai juyawa ce wadda ke ba da damar sarrafa matsayin kusurwa daidai. Tana aiki ta hanyar karɓar siginar pulse-width modulation (PWM) wanda ke nuna matsayinta. A cikin wannan aikin, za mu haɗa servo zuwa ɗaya daga cikin fil ɗin dijital na ESP32, yana ba mu damar sarrafa kusurwarta daga nesa.
Cikakkun Bayanai na Datasheet
| Mai ƙirƙira | Parallax |
|---|---|
| Lambar sashi | SG90 |
| Wutar Logic/IO | 3.3 V - 5 V |
| Wutar samarwa | 4.8 V - 6.0 V |
| Fitar da wutar (kowane tashar) | 1 A max |
| Jagorar mitar PWM | 50 Hz |
| Matsakaicin ƙofar shigarwa | 0.3 V - 0.7 V |
| Rage wutar / RDS(on) / saturation | 0.2 V max |
| Iyakokin zafi | Yanayin aiki: -10°C zuwa 60°C |
| Marufi | Akwatin filastik |
| Bayanan kula / bambance-bambance | Mini servo, juyawa 180° |
- Tabbatar da samar da wutar da ta dace ga servo (4.8 V - 6.0 V).
- Yi amfani da ƙasa guda ɗaya tsakanin ESP32 da servo.
- Kula da siginar PWM don guje wa wuce gona da iri na iyakokin servo.
- Haɗa servo da kyau don guje wa yankewa yayin aiki.
- Sabunta ɗakin karatu na Adafruit MQTT don tabbatar da dacewa.
Zane-zanen MQTT
Umarnin Haɗin Waya

Don haɗa motar servo zuwa ESP32, fara da haɗa wayar ƙasa na servo zuwa fil ɗin ƙasa a kan ESP32. Na gaba, haɗa wayar wutar (yawanci ja) na servo zuwa fil ɗin 5V a kan ESP32. A ƙarshe, haɗa wayar sigina (sau da yawa rawaya ko fari) zuwa fil ɗin dijital 25 a kan ESP32. Tabbatar cewa haɗin suna da ƙarfi don hana yankewa yayin aiki.
Idan kana amfani da baturi don kunna ESP32, tabbatar cewa ƙarfin baturin yana cikin iyakar da aka yarda da shi ga duka ESP32 da servo. Bugu da ƙari, sake duba cewa haɗin waya ya dace da ma'anar fil ɗin da aka yi amfani da su a cikin lambar ka don guje wa kowace matsala (a cikin bidiyo a 12:45).
Misalan Lamba & Bayani
A cikin lambar da aka bayar, mun fara haɗa ɗakunan karatu da ake buƙata don ESP32 da MQTT. Mun ayyana abin servo kuma mun ƙayyade fil ɗin da aka haɗa shi da const int servoPin = 25;. An kuma saita kusurwar tsoho tare da const int defaultServoAngle = 90;, wanda zai zama matsayin farko lokacin da ESP32 ya kunna.
Servo myServo;
const int servoPin = 25;
const int defaultServoAngle = 90;
int servoAngle = defaultServoAngle;
Wannan ɓangaren yana fara servo akan fil 25 kuma yana saita kusurwar tsoho zuwa 90°. Mai canzawa servoAngle za a sabunta shi bisa ga saƙonnin da aka karɓa daga mai ba da MQTT.
A cikin aikin setup(), muna haɗawa zuwa Wi-Fi kuma muna saita abokin ciniki na MQTT. An ayyana bayanan shiga na Adafruit IO a nan, gami da sunan mai amfani da maɓalli:
#define AIO_USERNAME "robojax"
#define AIO_KEY "aio_xmIW58uNNsjJCSOqzZ9QoHyq29wu"
Wannan ɓangaren yana kafa haɗin zuwa sabis na Adafruit IO. Tabbatar musanya waɗannan ƙimar da naka na Adafruit IO lokacin aiwatar da lambar.
A ƙarshe, babban madauki yana tabbatar da cewa haɗin zuwa uwar garken MQTT ya kasance mai aiki kuma yana sarrafa saƙonnin da ke shigowa. Matsayin servo ana sabunta shi bisa ga kusurwar da aka karɓa:
mqtt.processPackets(500);
int pulseWidth = map(servoAngle, 0, 180, minPulseWidth, maxPulseWidth);
myServo.writeMicroseconds(pulseWidth);
Wannan lambar tana taswirar kusurwar servo zuwa faɗin bugun jini daidai kuma tana aika shi zuwa motar servo. Aikin processPackets() yana ba da damar ESP32 ya sarrafa saƙonnin MQTT masu shigowa, yana tabbatar da cewa servo yana amsa umarnin da aka aika ta hanyar dashboard na Adafruit IO.
Nuni / Abin da za ka Yi Tsammani
Da zarar an shirya komai, ya kamata ka iya sarrafa servo daga dashboard na Adafruit IO ta amfani da slider ɗin da ka ƙirƙira. Yayin da kake motsa slider, servo zai daidaita kusurwarsa a lokaci-lokaci. Tabbatar cewa ESP32 ɗinka yana da haɗin Wi-Fi, kuma haɗin MQTT yana da ƙarfi. Idan servo bai amsa ba, duba wayoyi da kuma wutar lantarki ga servo (a cikin bidiyo a 20:15).
Ka lura da iyakokin kewayon servo; aika ƙima a waje da 0° zuwa 180° na iya sa shi ya yi hali ba zato ba tsammani. Lambar ta haɗa da dubawa don hana irin waɗannan abubuwan ta hanyar danne kusurwar a cikin wannan kewayon.
Lokutan Bidiyo
- 00:00 Farko
- 1:54 Gabatarwar aikin
- 2:52 Gabatarwa ga MQTT
- 6:50 Saitin Adafruit IO
- 9:54 Haɗin wayoyi na servo
- 11:07 Bayanin lambar
- 18:59 Zaɓin board na ESP32 da tashar COM
- 22:10 Nunin aikin
/***********************************************************************
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
Abin da zaka iya bukata
-
AliExpressPurchase SG90 servo motor 180 or 360 from AliExpresss.click.aliexpress.com
Albarkatun da kuma shafukan da za a duba
-
TakarduESP32 Tutorial 17/55 - SunFounder Servo motor documentationdocs.sunfounder.com
-
WajeSG90 Servo on Amazon USAamzn.to
Fayiloli📁
Sauran fayiloli
-
SG90 Seroo motar datasheet
robojax-servo-SG90_datasheet.pdf0.12 MB