ESP32 оқулығы 30/55 - Adafruit IO қызметін пайдаланып MQTT арқылы веб-те сервоны басқару | SunFounder ESP32 IoT оқу жиынтығы
Бұл оқулықта біз ESP32 микроконтроллері мен MQTT протоколын интернет арқылы пайдаланып, серво қозғалтқышының орнын қалай басқаруға болатынын үйренеміз. Adafruit IO қызметін пайдалана отырып, сервоны 0°, 90° немесе 180° сияқты әртүрлі бұрыштарға қашықтан орната аласыз. Бұл жоба ESP32 мүмкіндіктерін көрсетеді, оған кірістірілген Wi-Fi және Bluetooth кіреді, бұл оны IoT қолданбалары үшін қуатты құрал етеді.

Бұл жобада біз Adafruit IO көмегімен MQTT брокерін орнатамыз, сервоны басқару үшін басқару панелін жасаймыз және ESP32-ны оған қосамыз. Серво орны панельдегі сырғытпа арқылы реттеледі, бұл интернеті бар кез келген құрылғыдан нақты уақыт режимінде басқаруға мүмкіндік береді (бейнеде 5:30).
Аппараттық құрал түсіндірмесі
Бұл жобаның негізгі компоненттеріне ESP32 микроконтроллері және серво қозғалтқышы кіреді. ESP32 - бұл кірістірілген Wi-Fi және Bluetooth мүмкіндіктері бар әмбебап микроконтроллер, бұл оны IoT қолданбалары үшін өте қолайлы етеді. Ол Adafruit IO қызметімен MQTT протоколы арқылы байланысады, бұл интернет арқылы хабарламаларды жіберу үшін жеңіл және тиімді.
Серво қозғалтқышы - бұрыштық позицияны дәл басқаруға мүмкіндік беретін айналмалы жетек. Ол оның орнын анықтайтын импульстік ені модуляциясы (PWM) сигналын қабылдау арқылы жұмыс істейді. Бұл жобада біз сервоны ESP32-дегі цифрлық түйреуіштердің біріне қосамыз, бұл оның бұрышын қашықтан басқаруға мүмкіндік береді.
Деректер парағының мәліметтері
| Өндіруші | Parallax |
|---|---|
| Бөлшек нөмірі | SG90 |
| Логика/IO кернеуі | 3.3 В - 5 В |
| Қоректендіру кернеуі | 4.8 В - 6.0 В |
| Шығыс тогы (арнаға) | 1 А макс |
| PWM жиілігі бойынша нұсқау | 50 Гц |
| Кіріс логикалық шектері | 0.3 В - 0.7 В |
| Кернеу төмендеуі / RDS(on) / қанығу | 0.2 В макс |
| Жылулық шектер | Жұмыс температурасы: -10°C - 60°C |
| Қаптама | Пластикалық корпус |
| Ескертулер / нұсқалар | Мини серво, 180° айналу |
- Сервоға дұрыс кернеу берілуін қамтамасыз етіңіз (4.8 В - 6.0 В).
- ESP32 мен серво арасында ортақ жерді пайдаланыңыз.
- Сервоның шектерінен асып кетпеу үшін PWM сигналын бақылаңыз.
- Жұмыс кезінде үзілістерді болдырмау үшін сервоны сенімді қосыңыз.
- Үйлесімділікті қамтамасыз ету үшін Adafruit MQTT кітапханасын жаңартыңыз.
MQTT диаграммалары
Сымды қосу нұсқаулары

Серво қозғалтқышын ESP32-ге қосу үшін алдымен сервоның жер сымын ESP32-дегі жер түйреуішіне қосыңыз. Әрі қарай, сервоның қуат сымын (әдетте қызыл) ESP32-дегі 5В түйреуішіне қосыңыз. Соңында, сигнал сымын (көбінесе сары немесе ақ) ESP32-дегі 25 цифрлық түйреуішіне қосыңыз. Жұмыс кезінде үзілістерді болдырмау үшін қосылымдардың сенімді екеніне көз жеткізіңіз.
ESP32-ні қуаттандыру үшін батареяны пайдалансаңыз, батарея кернеуі ESP32 мен серво үшін қолайлы диапазонда екеніне көз жеткізіңіз. Сонымен қатар, сымдар кодыңызда қолданылған түйреуіш анықтамаларына сәйкес келетінін екі рет тексеріңіз (бейнеде 12:45).
Код мысалдары және түсіндірме
Берілген кодта біз алдымен ESP32 және MQTT үшін қажетті кітапханаларды қосамыз. Біз серво нысанын анықтаймыз және ол қосылған түйреуішті const int servoPin = 25; арқылы көрсетеміз. Әдепкі бұрыш та const int defaultServoAngle = 90; арқылы орнатылады, бұл ESP32 іске қосылғандағы бастапқы позиция болады.
Servo myServo;
const int servoPin = 25;
const int defaultServoAngle = 90;
int servoAngle = defaultServoAngle;
Бұл үзінді сервоны 25 түйреуішінде инициализациялайды және оның әдепкі бұрышын 90° етіп орнатады. servoAngle айнымалысы MQTT брокерінен алынған хабарламаларға негізделген жаңартылады.
setup() функциясында біз Wi-Fi-ға қосыламыз және MQTT клиентін орнатамыз. Adafruit IO үшін тіркелгі деректері осында анықталады, оның ішінде пайдаланушы аты мен кілт:
#define AIO_USERNAME "robojax"
#define AIO_KEY "aio_xmIW58uNNsjJCSOqzZ9QoHyq29wu"
Бұл бөлім Adafruit IO қызметіне қосылуды орнатады. Кодты іске асырған кезде осы мәндерді өзіңіздің Adafruit IO тіркелгі деректеріңізбен ауыстырыңыз.
Соңында, негізгі цикл MQTT серверіне қосылудың белсенді болуын қамтамасыз етеді және кіріс хабарламаларды өңдейді. Серво орны алынған бұрышқа негізделген жаңартылады:
mqtt.processPackets(500);
int pulseWidth = map(servoAngle, 0, 180, minPulseWidth, maxPulseWidth);
myServo.writeMicroseconds(pulseWidth);
Бұл код серво бұрышын сәйкес импульс еніне кескіндейді және оны серво қозғалтқышына жібереді. processPackets() функциясы ESP32-ге кіріс MQTT хабарламаларын өңдеуге мүмкіндік береді, осылайша серво Adafruit IO басқару тақтасы арқылы жіберілген пәрмендерге жауап береді.
Демонстрация / Не күтуге болады
Барлығы орнатылғаннан кейін, сіз жасаған сырғытпаны пайдаланып, Adafruit IO басқару тақтасынан сервоны басқара аласыз. Сырғытпаны жылжытқанда, серво өз бұрышын нақты уақытта реттейді. ESP32-нің Wi-Fi-ға қосылғанына және MQTT қосылымының тұрақты екеніне көз жеткізіңіз. Егер серво жауап бермесе, сымдарды және сервоға қуат көзін тексеріңіз (бейнеде 20:15-те).
Сервоның диапазон шектеулерін ескеріңіз; 0°-ден 180°-ге дейінгі диапазоннан тыс мән жіберу оның күтпеген әрекет етуіне себеп болуы мүмкін. Код бұрышты осы диапазонда ұстап, мұндай жағдайлардың алдын алу үшін тексерулерді қамтиды.
Бейне уақыт белгілері
- 00:00 Басы
- 1:54 Жобамен таныстыру
- 2:52 MQTT-ге кіріспе
- 6:50 Adafruit IO орнату
- 9:54 Сервоны қосу
- 11:07 Кодты түсіндіру
- 18:59 ESP32 тақтасын және COM портын таңдау
- 22:10 Жоба демонстрациясы
/***********************************************************************
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
Сізге қажет болуы мүмкін нәрселер
-
AliExpressPurchase SG90 servo motor 180 or 360 from AliExpresss.click.aliexpress.com
Ресурстар мен сілтемелер
-
ҚұжаттамаESP32 Tutorial 17/55 - SunFounder Servo motor documentationdocs.sunfounder.com
-
СыртқыSG90 Servo on Amazon USAamzn.to
Файлдар📁
Басқа файлдар
-
SG90 Seroo моторының деректер парағы
robojax-servo-SG90_datasheet.pdf0.12 MB