ESP32 Eğitimi 30/55 - Adafruit IO Servisi Kullanarak MQTT ile Web Üzerinden Servo Kontrolü | SunFounder'ın ESP32 IoT Öğrenme Kiti
Bu eğitimde, ESP32 mikrodenetleyicisi ve MQTT protokolünü kullanarak bir servo motorun konumunu internet üzerinden nasıl kontrol edeceğimizi öğreneceğiz. Adafruit IO hizmetini kullanarak, servoyu 0°, 90° veya 180° gibi çeşitli açılara uzaktan konumlandırabileceksiniz. Bu proje, dahili Wi-Fi ve Bluetooth özelliklerine sahip olan ESP32'nin yeteneklerini gösterir ve onu IoT uygulamaları için güçlü bir araç haline getirir.

Bu projede, Adafruit IO kullanarak bir MQTT broker'ı kuracağız, servoyu kontrol etmek için bir kontrol paneli oluşturacağız ve ESP32'yi buna bağlayacağız. Servo konumu, paneldeki bir kaydırıcı ile ayarlanabilir olacak ve internet bağlantısı olan herhangi bir cihazdan gerçek zamanlı kontrol sağlayacaktır (videoda 5:30'da).
Donanım Açıklaması
Bu projenin ana bileşenleri ESP32 mikrodenetleyicisi ve servo motordur. ESP32, entegre Wi-Fi ve Bluetooth özelliklerine sahip çok yönlü bir mikrodenetleyicidir ve bu da onu IoT uygulamaları için ideal kılar. Adafruit IO hizmetiyle, internet üzerinden mesaj iletmek için hafif ve verimli olan MQTT protokolünü kullanarak iletişim kurar.
Servo motor, açısal konumun hassas kontrolüne olanak tanıyan döner bir aktüatördür. Konumunu belirleyen bir darbe genişlik modülasyonu (PWM) sinyali alarak çalışır. Bu projede, servoyu ESP32 üzerindeki dijital pinlerden birine bağlayacağız ve açısını uzaktan kontrol etmemizi sağlayacağız.
Veri Sayfası Detayları
| Üretici | Parallax |
|---|---|
| Parça numarası | SG90 |
| Mantık/IO voltajı | 3.3 V - 5 V |
| Besleme voltajı | 4.8 V - 6.0 V |
| Çıkış akımı (kanal başına) | 1 A maks. |
| PWM frekans kılavuzu | 50 Hz |
| Giriş mantık eşikleri | 0.3 V - 0.7 V |
| Gerilim düşümü / RDS(on) / doyum | 0.2 V maks. |
| Termal sınırlar | Çalışma sıcaklığı: -10°C ila 60°C |
| Paket | Plastik kasa |
| Notlar / varyantlar | Mini servo, 180° dönüş |
- Servoya uygun voltaj beslemesi sağlayın (4.8 V - 6.0 V).
- ESP32 ve servo arasında ortak toprak kullanın.
- Servonun sınırlarını aşmamak için PWM sinyalini izleyin.
- Çalışma sırasında bağlantı kopmalarını önlemek için servoyu güvenli bir şekilde bağlayın.
- Uyumluluğu sağlamak için Adafruit MQTT kütüphanesini güncelleyin.
MQTT Diyagramları
Bağlantı Talimatları

Servo motoru ESP32'ye bağlamak için, servonun toprak kablosunu ESP32 üzerindeki toprak pinine bağlayarak başlayın. Ardından, servonun güç kablosunu (genellikle kırmızı) ESP32 üzerindeki 5V pinine bağlayın. Son olarak, sinyal kablosunu (genellikle sarı veya beyaz) ESP32 üzerindeki dijital pin 25'e bağlayın. Çalışma sırasında bağlantı kopmalarını önlemek için bağlantıların güvenli olduğundan emin olun.
ESP32'ye güç sağlamak için bir pil kullanıyorsanız, pil voltajının hem ESP32 hem de servo için kabul edilebilir aralıkta olduğundan emin olun. Ayrıca, sorunları önlemek için kablolamanın kodunuzda kullanılan pin tanımlarıyla eşleştiğini iki kez kontrol edin (videoda 12:45'te).
Kod Örnekleri ve Açıklama
Sağlanan kodda, önce ESP32 ve MQTT için gerekli kütüphaneleri dahil ediyoruz. Servo nesnesini tanımlıyoruz ve bağlı olduğu pini const int servoPin = 25; ile belirtiyoruz. Varsayılan açı da const int defaultServoAngle = 90; ile ayarlanır; bu, ESP32 açıldığında başlangıç konumu olacaktır.
Servo myServo;
const int servoPin = 25;
const int defaultServoAngle = 90;
int servoAngle = defaultServoAngle;
Bu kod parçası, servoyu pin 25'te başlatır ve varsayılan açısını 90° olarak ayarlar. servoAngle değişkeni, MQTT broker'ından alınan mesajlara göre güncellenecektir.
setup() fonksiyonunda, Wi-Fi'ye bağlanır ve MQTT istemcisini kurarız. Adafruit IO için kimlik bilgileri burada tanımlanır; kullanıcı adı ve anahtar dahil:
#define AIO_USERNAME "robojax"
#define AIO_KEY "aio_xmIW58uNNsjJCSOqzZ9QoHyq29wu"
Bu bölüm, Adafruit IO hizmetine bağlantıyı kurar. Kodu uygularken bu değerleri kendi Adafruit IO kimlik bilgilerinizle değiştirdiğinizden emin olun.
Son olarak, ana döngü MQTT sunucusuna bağlantının aktif kalmasını sağlar ve gelen mesajları işler. Servo konumu, alınan açıya göre güncellenir:
mqtt.processPackets(500);
int pulseWidth = map(servoAngle, 0, 180, minPulseWidth, maxPulseWidth);
myServo.writeMicroseconds(pulseWidth);
Bu kod, servo açısını karşılık gelen darbe genişliğine eşler ve servo motora gönderir. processPackets() işlevi, ESP32'nin gelen MQTT mesajlarını işlemesini sağlayarak servonun Adafruit IO panosu üzerinden gönderilen komutlara tepki vermesini garanti eder.
Gösterim / Beklentiler
Her şey kurulduktan sonra, oluşturduğunuz kaydırıcıyı kullanarak Adafruit IO panosundan servoyu kontrol edebilmelisiniz. Kaydırıcıyı hareket ettirdikçe servo açısını gerçek zamanlı olarak ayarlayacaktır. ESP32'nizin Wi-Fi'ye bağlı olduğundan ve MQTT bağlantısının stabil olduğundan emin olun. Servo tepki vermezse, kablolamayı ve servoya giden güç kaynağını kontrol edin (videoda 20:15'te).
Servo için aralık sınırlarının farkında olun; 0° ile 180° dışında bir değer göndermek beklenmedik davranışlara neden olabilir. Kod, açıyı bu aralıkta sınırlayarak bu tür durumları önlemek için kontroller içerir.
Video Zaman Damgaları
- 00:00 Başlangıç
- 1:54 Proje tanıtımı
- 2:52 MQTT'ye giriş
- 6:50 Adafruit IO kurulumu
- 9:54 Servo kablolaması
- 11:07 Kod açıklaması
- 18:59 ESP32 kartı ve COM portu seçimi
- 22:10 Proje gösterimi
/***********************************************************************
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
İhtiyacın olabileceğini düşünüyor
-
AliExpressPurchase SG90 Servo motor 180 or 360 from AliExpresss.click.aliexpress.com
Kaynaklar ve referanslar
-
BelgelendirmeESP32 Tutorial 17/55- SunFunder Servo motor documentationdocs.sunfounder.com
-
DışSG90 servo on Amazon USAamzn.to
Dosyalar📁
Diğer dosyalar
-
SG90 Seroo motor veri sayfası
robojax-servo-SG90_datasheet.pdf0.12 MB