Кодты іздеу

ESP32 оқулығы 30/55 - Adafruit IO қызметін пайдаланып MQTT арқылы веб-те сервоны басқару | SunFounder ESP32 IoT оқу жиынтығы

ESP32 оқулығы 30/55 - Adafruit IO қызметін пайдаланып MQTT арқылы веб-те сервоны басқару | SunFounder ESP32 IoT оқу жиынтығы

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

ESP32-30_MQTT_diagram-0

Бұл жобада біз 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-30_MQTT_diagram-2
ESP32-30_MQTT_diagram
ESP32-28_dht_temperature-sensor-main

Сымды қосу нұсқаулары

ESP32-17-Sevo_motor-wiring

Серво қозғалтқышын 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 Жоба демонстрациясы

Суреттер

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
Тіл: 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!");
}

Сізге қажет болуы мүмкін нәрселер

Ресурстар мен сілтемелер

Файлдар📁

Басқа файлдар