Tutoriel ESP32 30/55 - Contrôler un servomoteur sur le web en utilisant MQTT avec le service Adafruit IO | Kit d'apprentissage IoT ESP32 de SunFounder
Na boyekoli oyo, tokoyekola ndenge ya kokamba esika ya moteur ya servo na kosalela microcontrôleur ya ESP32 mpe protocole ya MQTT na internet. Na kosalela mosala ya Adafruit IO, okokoka kokamba servo na ba angles ndenge na ndenge lokola 0°, 90°, to 180° na mosika. Projet oyo emonisi makoki ya ESP32, oyo ezali na Wi-Fi mpe Bluetooth ya kati, oyo esalaka yango etilé ya makasi mpo na ba applications ya IoT.

Na projet oyo, tokobongisa broker ya MQTT na kosalela Adafruit IO, tokosala tableau ya kokamba servo, mpe tokokangisa ESP32 na yango. Esika ya servo ekobongisama na slider na tableau, oyo ekopesa nzela ya kokamba na tango ya solo longwa na esika nyonso oyo ezali na internet (na vidéo na 5:30).
Matériel Explicé
Ba composants ya liboso ya projet oyo ezali microcontrôleur ya ESP32 mpe moteur ya servo. ESP32 ezali microcontrôleur ya polyvalent oyo ezali na Wi-Fi mpe Bluetooth ya kati, oyo esalaka yango idéal mpo na ba applications ya IoT. Esololaka na mosala ya Adafruit IO na kosalela protocole ya MQTT, oyo ezali légèr mpe efficace mpo na kotinda ba messages na internet.
Moteur ya servo ezali actuateur ya rotation oyo epesaka nzela ya kokamba ya précision ya esika ya angulaire. Esalaka na kozwa signal ya pulse-width modulation (PWM) oyo elobaka esika na yango. Na projet oyo, tokokangisa servo na moko ya ba pins ya digitale na ESP32, oyo ekopesa nzela ya kokamba angle na yango na mosika.
Détails ya Datasheet
| Fabricant | Parallax |
|---|---|
| Numéro ya partie | SG90 |
| Tension ya logique/IO | 3.3 V - 5 V |
| Tension ya alimentation | 4.8 V - 6.0 V |
| Courant ya sortie (na canal) | 1 A max |
| Guidance ya fréquence ya PWM | 50 Hz |
| Seuils ya logique ya entrée | 0.3 V - 0.7 V |
| Chute ya tension / RDS(on) / saturation | 0.2 V max |
| Limites thermiques | Température ya fonctionnement: -10°C to 60°C |
| Paquet | Boîtier ya plastique |
| Notes / variantes | Mini servo, rotation ya 180° |
- Kokamba tension ya alimentation ya servo (4.8 V - 6.0 V).
- Kosalela terre commune kati na ESP32 mpe servo.
- Kotala signal ya PWM mpo na kokima koleka ba limites ya servo.
- Kokangisa servo na ndenge ya semba mpo na kokima ba déconnexions na tango ya fonctionnement.
- Kobongisa bibliothèque ya Adafruit MQTT mpo na kolakisa compatibilité.
Diagrammes ya MQTT
Instructions ya Câblage

Mpo na kokangisa moteur ya servo na ESP32, banda na kokangisa fil ya terre ya servo na pin ya terre na ESP32. Na sima, kokangisa fil ya puissance (mbala mingi motane) ya servo na pin ya 5V na ESP32. Na suka, kokangisa fil ya signal (mbala mingi ya jaune to ya pembe) na pin ya digitale 25 na ESP32. Kotala ete ba connexions ezali ya semba mpo na kokima ba déconnexions na tango ya fonctionnement.
Soki ozali kosalela batterie mpo na kopesa ESP32, kotala ete tension ya batterie ezali na kati ya intervalle oyo endimami mpo na ESP32 mpe servo. Na libanda, kotala lisusu ete câblage ekokani na ba définitions ya pins oyo esalelami na code na yo mpo na kokima ba problèmes (na vidéo na 12:45).
Ba Exemples ya Code & Explication
Na code oyo epesami, tobandi na kosangisa ba bibliothèques ya nécessaires mpo na ESP32 mpe MQTT. Totindiki objet ya servo mpe tolimboli pin oyo ekangisami na yango na const int servoPin = 25;. Angle ya défaut mpe esalemi na const int defaultServoAngle = 90;, oyo ekozala esika ya liboso ntango ESP32 ebandi.
Servo myServo;
const int servoPin = 25;
const int defaultServoAngle = 90;
int servoAngle = defaultServoAngle;
Extrait oyo ebandisi servo na pin 25 mpe esili kopesa angle ya défaut na yango 90°. Variable servoAngle ekobongisama kolanda ba messages oyo ezali kozwa longwa na broker ya MQTT.
Na fonction setup(), tokangisaka na Wi-Fi mpe tobongisaka client ya MQTT. Ba identifiants mpo na Adafruit IO balimbolami awa, na kosangisa nom d'utilisateur mpe clé:
#define AIO_USERNAME "robojax"
#define AIO_KEY "aio_xmIW58uNNsjJCSOqzZ9QoHyq29wu"
Section oyo etiyaka connexion na mosala ya Adafruit IO. Kotala ete okokitola ba valeurs oyo na ba identifiants na yo moko ya Adafruit IO ntango okosalela code.
Na suka, boucle ya principale esalaka ete connexion na serveur ya MQTT etikala active mpe eprocess messages oyo ezali koya. Esika ya servo ebongisamaka kolanda angle oyo ezali kozwa:
mqtt.processPackets(500);
int pulseWidth = map(servoAngle, 0, 180, minPulseWidth, maxPulseWidth);
myServo.writeMicroseconds(pulseWidth);
Lokasa oyo ekomi motángo ya angle ya servo na pulse width oyo ekokani na yango mpe ezali kotinda yango na moteur ya servo. Fonction processPackets() epesi ESP32 nzela ya kosala ba messages MQTT oyo ezali koya, mpo servo ezala na réaction na ba commandes oyo batindi na ndenge ya Adafruit IO dashboard.
Démonstration / Nini Okomona
Ntango nyonso esili kotongama, okoki kokamba servo longwa na Adafruit IO dashboard na slider oyo osalaki. Ntango ozali kotambwisa slider, servo ekobongola angle na yango na temps réel. Tála ete ESP32 na yo ezali connecté na Wi-Fi, mpe connexion MQTT ezali stable. Soki servo eyanoli te, tála ba branchements mpe alimentation ya servo (na vidéo na 20:15).
Zala na likebi na ba limites ya étendue ya servo; kotinda valeur oyo ezali na libándá ya 0° kino 180° ekoki kosala ete ezala na ndenge oyo ezali kolikya te. Code ezali na ba vérifications mpo na kopekisa makambo ya ndenge wana na kokanga angle na kati ya étendue oyo.
Ba Timestamps ya Vidéo
- 00:00 Ebandeli
- 1:54 Introduction ya projet
- 2:52 Introduction na MQTT
- 6:50 Mise en place ya Adafruit IO
- 9:54 Branchement ya servo
- 11:07 Code elobami
- 18:59 Kopona carte ESP32 mpe port COM
- 22:10 Démonstration ya projet
/***********************************************************************
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
Nko o na nki.
-
AliExpressPurchase SG90 Servo motor 180 or 360 from AliExpresss.click.aliexpress.com
Mokili na bisika
-
DokumentasiESP32 Tutorial 17/55- SunFunder Servo motor documentationdocs.sunfounder.com
-
L'extérieurSG90 servo on Amazon USAamzn.to
Fichiers📁
Mabala a mangwe
-
SG90 Seroo motor datasheet
robojax-servo-SG90_datasheet.pdf0.12 MB