Tafuta Msimbo

Mafunzo ya ESP32 30/55 - Kudhibiti Servo kwenye wavuti kwa kutumia MQTT kwa kutumia Huduma ya Adafruit IO | Kifurushi cha Kujifunza cha ESP32 IoT cha SunFounder

Mafunzo ya ESP32 30/55 - Kudhibiti Servo kwenye wavuti kwa kutumia MQTT kwa kutumia Huduma ya Adafruit IO | Kifurushi cha Kujifunza cha ESP32 IoT cha SunFounder

Katika mafunzo haya, tutajifunza jinsi ya kudhibiti nafasi ya motor ya servo kwa kutumia microcontroller ya ESP32 na itifaki ya MQTT kupitia wavuti. Kwa kutumia huduma ya Adafruit IO, utaweza kuweka servo katika pembe mbalimbali kama 0°, 90°, au 180° kwa mbali. Mradi huu unaonyesha uwezo wa ESP32, ambao unajumuisha Wi-Fi na Bluetooth zilizojengewa ndani, na kuifanya kuwa chombo chenye nguvu kwa matumizi ya IoT.

ESP32-30_MQTT_diagram-0

Katika mradi huu, tutasanidi broker ya MQTT kwa kutumia Adafruit IO, kuunda dashibodi ya kudhibiti servo, na kuunganisha ESP32 nayo. Nafasi ya servo itaweza kubadilishwa kupitia slaida kwenye dashibodi, ikiruhusu udhibiti wa wakati halisi kutoka kwa kifaa chochote kilicho na mtandao (katika video saa 5:30).

Vifaa Vimeelezwa

Vipengele vikuu vya mradi huu vinajumuisha microcontroller ya ESP32 na motor ya servo. ESP32 ni microcontroller yenye uwezo mwingi na Wi-Fi na Bluetooth zilizojengewa ndani, na kuifanya kuwa bora kwa matumizi ya IoT. Inawasiliana na huduma ya Adafruit IO kwa kutumia itifaki ya MQTT, ambayo ni nyepesi na yenye ufanisi kwa kutuma ujumbe kupitia mtandao.

Motor ya servo ni actuator inayozunguka ambayo inaruhusu udhibiti sahihi wa nafasi ya angular. Inafanya kazi kwa kupokea ishara ya pulse-width modulation (PWM) ambayo inaamuru nafasi yake. Katika mradi huu, tutaunganisha servo kwenye moja ya pini za dijiti kwenye ESP32, ikituruhusu kudhibiti pembe yake kwa mbali.

Maelezo ya Datasheet

Mtengenezaji Parallax
Nambari ya sehemu SG90
Voltage ya Logic/IO 3.3 V - 5 V
Voltage ya usambazaji 4.8 V - 6.0 V
Current ya pato (kwa kila channel) 1 A max
Mwongozo wa frequency ya PWM 50 Hz
Viwango vya kizingiti cha logic ya kuingiza 0.3 V - 0.7 V
Kushuka kwa voltage / RDS(on) / kueneza 0.2 V max
Mipaka ya joto Joto la kufanya kazi: -10°C hadi 60°C
Kifurushi Kasha la plastiki
Vidokezo / lahaja Mini servo, mzunguko wa 180°

 

  • Hakikisha usambazaji sahihi wa voltage kwa servo (4.8 V - 6.0 V).
  • Tumia ardhi ya pamoja kati ya ESP32 na servo.
  • Fuatilia ishara ya PWM ili kuepuka kuzidi mipaka ya servo.
  • Unganisha servo kwa usalama ili kuepuka kukatika wakati wa operesheni.
  • Sasisha maktaba ya Adafruit MQTT ili kuhakikisha utangamano.

Michoro ya MQTT

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

Maagizo ya Wiring

ESP32-17-Sevo_motor-wiring

Ili kuunganisha motor ya servo kwenye ESP32, anza kwa kuunganisha waya wa ardhi wa servo kwenye pini ya ardhi kwenye ESP32. Kisha, unganisha waya wa nguvu (kawaida nyekundu) wa servo kwenye pini ya 5V kwenye ESP32. Hatimaye, unganisha waya wa ishara (mara nyingi njano au nyeupe) kwenye pini ya dijiti 25 kwenye ESP32. Hakikisha miunganisho ni salama ili kuzuia kukatika wakati wa operesheni.

Ikiwa unatumia betri kuwezesha ESP32, hakikisha voltage ya betri iko ndani ya kiwango kinachokubalika kwa ESP32 na servo. Zaidi ya hayo, angalia mara mbili kwamba wiring inalingana na ufafanuzi wa pini unaotumika katika msimbo wako ili kuepuka matatizo yoyote (katika video saa 12:45).

Mifano ya Msimbo & Maelekezo

Katika msimbo uliotolewa, kwanza tunajumuisha maktaba muhimu za ESP32 na MQTT. Tunafafanua kitu cha servo na kubainisha pini ambayo imeunganishwa na const int servoPin = 25;. Pembe ya default pia imewekwa na const int defaultServoAngle = 90;, ambayo itakuwa nafasi ya awali wakati ESP32 inapoanza.


Servo myServo;
const int servoPin = 25;
const int defaultServoAngle = 90;
int servoAngle = defaultServoAngle;

Kipande hiki kinaanzisha servo kwenye pini 25 na kuweka pembe yake ya default kuwa 90°. Kigezo servoAngle kitasasishwa kulingana na ujumbe unaopokelewa kutoka kwa broker ya MQTT.

Katika kazi ya setup(), tunaunganisha kwenye Wi-Fi na kusanidi mteja wa MQTT. Vitambulisho vya Adafruit IO vimefafanuliwa hapa, ikijumuisha jina la mtumiaji na ufunguo:


#define AIO_USERNAME "robojax"
#define AIO_KEY "aio_xmIW58uNNsjJCSOqzZ9QoHyq29wu"

Sehemu hii inaanzisha muunganisho kwenye huduma ya Adafruit IO. Hakikisha unabadilisha maadili haya na vitambulisho vyako vya Adafruit IO wakati wa kutekeleza msimbo.

Hatimaye, kitanzi kikuu kinahakikisha kwamba muunganisho kwenye seva ya MQTT unabaki hai na kuchakata ujumbe unaoingia. Nafasi ya servo inasasishwa kulingana na pembe inayopokelewa:


mqtt.processPackets(500);
int pulseWidth = map(servoAngle, 0, 180, minPulseWidth, maxPulseWidth);
myServo.writeMicroseconds(pulseWidth);

Msimbo huu unachora pembe ya servo kwa upana wa pigo unaolingana na kuutuma kwa motor ya servo. Kazi ya processPackets() inaruhusu ESP32 kushughulikia ujumbe wa MQTT unaoingia, kuhakikisha servo inaitikia maagizo yaliyotumwa kupitia dashibodi ya Adafruit IO.

Maonyesho / Nini cha Kutarajia

Mara tu kila kitu kikiwa kimewekwa, utaweza kudhibiti servo kutoka kwenye dashibodi ya Adafruit IO kwa kutumia kitelezi ulichounda. Unaposogeza kitelezi, servo itarekebisha pembe yake kwa wakati halisi. Hakikisha ESP32 yako imeunganishwa kwenye Wi-Fi, na muunganisho wa MQTT ni thabiti. Ikiwa servo haijibu, angalia wiring na usambazaji wa nguvu kwa servo (katika video saa 20:15).

Jua kuhusu mipaka ya anuwai ya servo; kutuma thamani nje ya 0° hadi 180° kunaweza kusababisha itende kwa njia isiyotarajiwa. Msimbo unajumuisha ukaguzi wa kuzuia matukio kama haya kwa kubana pembe ndani ya anuwai hii.

Vidokezo vya Muda wa Video

  • 00:00 Mwanzo
  • 1:54 Utangulizi wa mradi
  • 2:52 Utangulizi wa MQTT
  • 6:50 Usanidi wa Adafruit IO
  • 9:54 Wiring ya servo
  • 11:07 Msimbo ulioelezwa
  • 18:59 Kuchagua bodi ya ESP32 na bandari ya COM
  • 22:10 Maonyesho ya mradi

Bilder

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
Språk: 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!");
}

Tänker att du kanske behöver

Resurser och referenser

Filer📁

Andra filer