Bincika Lambar

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

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.

ESP32-30_MQTT_diagram-0

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

ESP32-30_MQTT_diagram-2
ESP32-30_MQTT_diagram
ESP32-28_dht_temperature-sensor-main

Umarnin Haɗin Waya

ESP32-17-Sevo_motor-wiring

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

Hotuna

ESP32-17-Sevo_motor-schematic
ESP32-17-Sevo_motor-schematic
ESP32-17-Sevo_motor-wiring
ESP32-17-Sevo_motor-wiring
ESP32-28_dht_temperature-sensor-main
ESP32-28_dht_temperature-sensor-main
ESP32-30_MQTT_diagram
ESP32-30_MQTT_diagram
ESP32-30_MQTT_diagram-0
ESP32-30_MQTT_diagram-0
ESP32-30_MQTT_diagram-2
ESP32-30_MQTT_diagram-2
831-ESP32 Tutorial 30/55- ESP32 to control Servo motor using MQTT service of Adafruit
Harshe: C++
/***********************************************************************
 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!");
}

Abin da zaka iya bukata

Albarkatun da kuma shafukan da za a duba

Fayiloli📁

Sauran fayiloli