Search Code

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 மற்றும் புளூடூத் ஆகியவை அடங்கும், இது IoT பயன்பாடுகளுக்கு ஒரு சக்திவாய்ந்த கருவியாக அமைகிறது.

ESP32-30_MQTT_diagram-0

இந்த திட்டத்தில், Adafruit IO ஐப் பயன்படுத்தி ஒரு MQTT ப்ரோக்கரை அமைப்போம், சர்வோவைக் கட்டுப்படுத்த ஒரு டாஷ்போர்டை உருவாக்குவோம், மேலும் ESP32 ஐ அதனுடன் இணைப்போம். டாஷ்போர்டில் உள்ள ஒரு ஸ்லைடர் மூலம் சர்வோ நிலை சரிசெய்யக்கூடியதாக இருக்கும், இது எந்த இணையம் இயக்கப்பட்ட சாதனத்திலிருந்தும் நிகழ்நேர கட்டுப்பாட்டை அனுமதிக்கிறது (வீடியோவில் 5:30 இல்).

வன்பொருள் விளக்கம்

இந்த திட்டத்தின் முதன்மை கூறுகளில் ESP32 மைக்ரோகண்ட்ரோலர் மற்றும் சர்வோ மோட்டார் அடங்கும். ESP32 என்பது ஒருங்கிணைந்த Wi-Fi மற்றும் புளூடூத் திறன்களைக் கொண்ட ஒரு பல்துறை மைக்ரோகண்ட்ரோலர் ஆகும், இது IoT பயன்பாடுகளுக்கு ஏற்றதாக அமைகிறது. இது MQTT நெறிமுறையைப் பயன்படுத்தி Adafruit IO சேவையுடன் தொடர்பு கொள்கிறது, இது இணையத்தில் செய்திகளை அனுப்புவதற்கு இலகுவான மற்றும் திறமையானது.

சர்வோ மோட்டார் என்பது ஒரு சுழற்சி இயக்கி ஆகும், இது கோண நிலையின் துல்லியமான கட்டுப்பாட்டை அனுமதிக்கிறது. இது அதன் நிலையைக் குறிக்கும் பல்ஸ்-அகல பண்பேற்றம் (PWM) சிக்னலைப் பெறுவதன் மூலம் செயல்படுகிறது. இந்த திட்டத்தில், சர்வோவை ESP32 இல் உள்ள டிஜிட்டல் பின்களில் ஒன்றுடன் இணைப்போம், இதன் மூலம் அதன் கோணத்தை தொலைவிலிருந்து கட்டுப்படுத்த முடியும்.

டேட்டாஷீட் விவரங்கள்

உற்பத்தியாளர் Parallax
பகுதி எண் SG90
லாஜிக்/IO மின்னழுத்தம் 3.3 V - 5 V
வழங்கல் மின்னழுத்தம் 4.8 V - 6.0 V
வெளியீட்டு மின்னோட்டம் (ஒரு சேனலுக்கு) 1 A அதிகபட்சம்
PWM அதிர்வெண் வழிகாட்டுதல் 50 Hz
உள்ளீட்டு லாஜிக் வரம்புகள் 0.3 V - 0.7 V
மின்னழுத்த வீழ்ச்சி / RDS(on) / செறிவு 0.2 V அதிகபட்சம்
வெப்ப வரம்புகள் இயக்க வெப்பநிலை: -10°C முதல் 60°C வரை
பேக்கேஜ் பிளாஸ்டிக் கேஸ்
குறிப்புகள் / மாறுபாடுகள் மினி சர்வோ, 180° சுழற்சி

 

  • சர்வோவிற்கு சரியான மின்னழுத்த வழங்கலை உறுதி செய்யவும் (4.8 V - 6.0 V).
  • 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 இல் உள்ள 5V பின்னுடன் இணைக்கவும். இறுதியாக, சிக்னல் கம்பியை (பெரும்பாலும் மஞ்சள் அல்லது வெள்ளை) 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!");
}

நீங்கள் தேவைப்படும் எண்ணங்கள்

வளங்கள் மற்றும் மேற்கோள்கள்

கோப்புகள்📁

மற்ற கோப்புகள்