د ESP32 ټیوټوریل 49/55 - د اډافروټ IoT په کارولو سره د انټرنیټ له لارې د DC موټر کنټرول | د سن فاونډر ESP32 کټ
په دې ټیوټوریل کې به موږ وپلټو چې څنګه د ESP32 او Adafruit IO MQTT خدمت په کارولو سره د انټرنیټ له لارې د DC موټر کنټرول کړو. د DC موټر سرعت او لوری له لرې څخه تنظیم کیدی شي، چې د انټرنیټ اړیکې سره له هر ځای څخه اغیزمن کنټرول ته اجازه ورکوي. دا پروژه د ESP32 مایکروکنټرولر وړتیاوې ښیي، چې په جوړه شوې Wi-Fi بڼه لري، چې دا د انټرنیټ د شیانو (IoT) غوښتنلیکونو لپاره مثالی کوي.
موږ به یو سیستم پلي کړو چیرې چې موټر پیل، بند، او د هغه سرعت د Adafruit IO سره تړلي ویب انٹرفیس له لارې تنظیم کیدی شي. کاروونکي کولی شي د موټر کنټرول لپاره ځانګړو موضوعاتو کې ګډون وکړي او پیرامیټرې په مطابق تنظیم کړي. د پروسې ښه پوهیدو لپاره، ډاډ ترلاسه کړئ چې د دې ټیوټوریل سره مل ویډیو وګورئ (په ویډیو کې په 00:00).
هارډویر تشریح شوی
د دې پروژې لپاره به موږ د ESP32 مایکروکنټرولر وکاروو، چې زموږ د سیستم زړه دی. ESP32 د Wi-Fi اړیکو اداره کولو وړتیا لري، چې دا زموږ د IoT غوښتنلیک لپاره بشپړ کوي. دا د Adafruit IO پلیټ فارم سره نښلوي، چې موږ ته اجازه راکوي د MQTT پروتوکول له لارې پیغامونه واستوو او ترلاسه کړو.
برسېره پردې، موږ به د L293D موټر ډرایور وکاروو، چې د DC موټر کنټرول لپاره اړین دی. L293D کولی شي دوه DC موټرې وګرځوي او د Pulse Width Modulation (PWM) له لارې د لوري او سرعت دواړو کنټرول ته اجازه ورکوي. دا په اصل کې د ESP32 او موټر ترمنځ د انٹرفیس په توګه کار کوي، د موټر لخوا اړین لوړ جریان اداره کوي پداسې حال کې چې ESP32 د هر ډول احتمالي زیان رسونکي back-emf سیګنالونو څخه جلا کوي.
ډیټاشیټ تفصیلات
| جوړونکی | Texas Instruments |
|---|---|
| د برخې شمېره | L293D |
| منطق/IO ولټاژ | 4.5 - 36 V |
| د برېښنا ولټاژ | 4.5 - 36 V |
| د تولید جریان (په هر چینل) | 600 mA |
| د لوړ جریان (په هر چینل) | 1.2 A |
| د PWM فریکونسي لارښود | 10 kHz (typ.) |
| د ننوتلو منطق حدونه | 0.8 V (لوړ)، 2.0 V (ټیټ) |
| د ولټاژ کمښت / RDS(on) / سنتریت | 1.5 V اعظمي |
| حرارتي حدونه | 150 °C |
| بسته | DIP-16 |
| یادښتونه / ډولونه | څلور ګونی لوړ جریان نیم-H ډرایور |
- د دوامداره عملیاتو لپاره د مناسب تودوخې ضایع کول ډاډمن کړئ.
- د موټر سرعت په اغیزمنه توګه کنټرولولو لپاره PWM وکاروئ.
- د زیان مخنیوي لپاره د ننوتلو ولټاژ حدونه وګورئ.
- د ټولو برخو ترمنځ د مناسب ځمکني اړیکو لپاره وګورئ.
- د back-emf څخه محتاط اوسئ؛ که اړتیا وي ډایوډونه وکاروئ.
- وایرینګ دوه ځله وګورئ ځکه چې قطبي کول کولی شي د موټر لوري اغیزمن کړي.
- د بشپړ عملیاتو دمخه په ټیټ ولټاژ سره ازموینه وکړئ.
- د اوږدې کارونې پرمهال د ډیر تودوخې لپاره وګورئ.
- که میخانیکي سویچونه وکارول شي ډاډ ترلاسه کړئ چې debounce کړئ.
- ډاډ ترلاسه کړئ چې ESP32 د موټر د جریان له امله ډیر بار نه وي.
وایرینګ لارښوونې
د برېښنا رسولو سره نښلولو سره پیل وکړئ. د خپل بهرني برېښنا سرچینې مثبت ترمینل د L293D د VCC پن (پن 8) سره او ځمکه د GND پن (پن 4) سره وصل کړئ. ډاډ ترلاسه کړئ چې ESP32 په جلا توګه برېښنا کیږي که اړتیا وي، معمولا د مایکرو USB اړیکې له لارې.
بیا، موټر د L293D سره وصل کړئ. د موټر یو ترمینل باید د تولید پن 3 (د L293D پن 2) سره او بل ترمینل د تولید پن 6 (د L293D پن 7) سره وصل شي. د کنټرول سیګنالونو لپاره، د ESP32 پن 13 د ننوتلو پن 2 (د L293D پن 1) سره او پن 14 د ننوتلو پن 7 (د L293D پن 2) سره وصل کړئ. د فعالولو پن (پن 1) باید د ډرایور فعالولو لپاره د 5V برېښنا سره هم وصل شي. په پای کې، ډاډ ترلاسه کړئ چې د ESP32 ځمکه د عام حوالې لپاره د L293D ځمکې سره وصل ده.
د کوډ مثالونه او واک ترو
چمتو شوی کوډ اړین کتابتونونه پیل کوي او د Wi-Fi او MQTT کلاینټ تنظیموي. کلیدي پیژندونکي شامل دي motorSpeed، motorDirection، او motorStart، کوم چې د Adafruit IO څخه ترلاسه شوي حکمونو پر بنسټ د موټر عملیات اداره کوي.
bool debug = false;
#define motor1A 13
#define motor2A 14
int motorSpeed = 0;
int motorDirection = 1;
int motorStart = 1;
په دې اقتباس کې، د موټر پنونه د سرعت، لوري، او د موټر د پیل/بند حالت کنټرول لپاره د لومړنیو متغیرونو سره تعریف شوي. متغیر motorSpeed به د Adafruit IO څخه د ننوتلو پر بنسټ تنظیم شي.
void setup() {
Serial.begin(115200);
WiFi.begin(WLAN_SSID, WLAN_PASS);
delay(2000);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}
}
په setup فنکشن کې، سریال اړیکه پیل کیږي، او ESP32 مشخص شوي Wi-Fi شبکې سره نښلوي. دا اړیکه د MQTT اړیکې فعالولو لپاره خورا مهمه ده.
void loop() {
MQTT_connect();
mqtt.processPackets(500);
runMotor();
}
دا لوپ فنکشن د MQTT اړیکه رامینځته کوي او د ترلاسه شوي وروستي حکمونو پر بنسټ د موټر کنټرول لپاره راتلونکي پاکټونه پروسس کوي. فنکشن runMotor() د اوسني ترتیباتو موټر ته پلي کولو لپاره بلل کیږي.
مظاهره / څه تمه وکړو
کله چې تنظیم بشپړ شي او کوډ اپلوډ شي، تاسو باید وکولای شئ چې موټور د Adafruit IO ډشبورډ له لارې کنټرول کړئ. تاسو کولای شئ د موټور سرعت د سلایډر په مرسته تنظیم کړئ او د هغه لوري د ټوګل سویچ سره بدل کړئ. که هر څه په سمه توګه تار شوي وي، موټور به دې حکمونو ته په ریښتیني وخت کې ځواب ووايي، چې د سیسټم ټیټ ځنډ ښکاره کوي (په ویډیو کې په 00:00 کې).
عامې ستونزې کې د موټور د لوري برعکس کېدل د ناسم تار کولو له امله شامل دي، نو که موټور د تمې سره سم چلند ونه کړي، اړیکې دوه ځله وګورئ. سربېره پردې، ډاډ ترلاسه کړئ چې ستاسو د MQTT موضوعات په Adafruit IO کې په سمه توګه تنظیم شوي دي ترڅو له کوډ سره سمون ولري.
د ویډیو وخت نښې
- 00:00 پیل
- 2:21 د پروژې پېژندنه
- 4:20 د DC موټور کنټرول څنګه کیږي
- 6:39 L293D موټور ډرایور
- 11:42 MQTT څه شی دی؟
- 15:03 د Adafruit IO تنظیم
- 19:17 د تار کولو تشریح
- 22:42 د کوډ تشریح
- 35:28 د پروژې ننداره
/***********************************************************************
This is Arduino sketch for ESP32 to DC Motor using MQTT service of Adafruit
Watch video instruction https://youtu.be/OUgyPXNYg3g
📚⬇️ Download and resource page https://robojax.com/RJT673
Written By Ahamd Shamshiri
on Feb 18, 2024
Adafruit MQTT Library ESP32 Adafruit IO SSL/TLS example
/// ref: https://www.electronicwings.com/esp32/esp32-mqtt-client
*/
bool debug = false;
#define motor1A 13
#define motor2A 14
// PWM settings
const int freq = 500; // PWM frequency: 500 Hz
const int resolution = 8; // PWM resolution: 8 bits
const int channelA = 0; // PWM channel for motor1A: 0
const int channelB = 1; // PWM channel for motor2A: 1
char* dir[]={"CCW", "CW"};
int motorSpeed =0;
int motorDirection =1;
int motorStart = 1;
int dutyCycle =0;
#include <WiFi.h>
#include "WiFiClientSecure.h"
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"
/************************* WiFi Access Point *********************************/
#define WLAN_SSID "Book"
#define WLAN_PASS "88888888"
/************************* 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_jHpm60SEsWUdU5x472FViZjWzsY9"
/************ 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 MOTOR_SPEED = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/motor.speed");
Adafruit_MQTT_Subscribe MOTOR_DIRECTION = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/motor.direction");
Adafruit_MQTT_Subscribe MOTOR_START = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/motor.start");
/*************************** Sketch Code ************************************/
void setup() {
// Set up PWM
ledcSetup(channelA, freq, resolution);
ledcSetup(channelB, freq, resolution);
// Attach PWM channels to GPIO pins
ledcAttachPin(motor1A, channelA);
ledcAttachPin(motor2A, channelB);
Serial.begin(115200);
delay(10);
Serial.println(F("DC Motor over MQTT 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
MOTOR_SPEED.setCallback(MOTOR_SPEED_Callback);
// Setup MQTT subscription for time feed.
mqtt.subscribe(&MOTOR_SPEED);
// register callback for feed
MOTOR_DIRECTION.setCallback(MOTOR_DIRECTION_Callback);
// Setup MQTT subscription for time feed.
mqtt.subscribe(&MOTOR_DIRECTION);
// register callback for feed
MOTOR_START.setCallback(MOTOR_START_Callback);
// Setup MQTT subscription for time feed.
mqtt.subscribe(&MOTOR_START);
}
// 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("Speed: ");
// Serial.print (motorSpeed);
// Serial.print(" Dir: ");
// Serial.print (dir[motorDirection]);
// Serial.print(" Sart: ");
// Serial.println(motorStart);
// Serial.print("DutyCycle: ");
// Serial.println(dutyCycle);
// wait 0.5 seconds for subscription messages
mqtt.processPackets(500);
runMotor();//very important
// wait a couple seconds to avoid rate limit
//delay(2000);
}
void MOTOR_SPEED_Callback(char* message, uint16_t len) {
char messageBuffer[40];
//snprintf(messageBuffer, sizeof(messageBuffer), "Color status is :: %s, len :: %u", message, len);
//Serial.println(messageBuffer);
Serial.println(message);
String inString = message;//sotre the message to String
motorSpeed = inString.toInt();//convert the message to Integer
if(motorSpeed >100 || motorSpeed < 0)
{
motorSpeed = 0;
}
dutyCycle = map (motorSpeed, 0, 100, 0, 255);
}
void MOTOR_DIRECTION_Callback(char* message, uint16_t len) {
char messageBuffer[40];
//snprintf(messageBuffer, sizeof(messageBuffer), "Color status is :: %s, len :: %u", message, len);
//Serial.println(messageBuffer);
Serial.println(message);
String inString = message;//sotre the message to String
motorDirection = inString.toInt();//convert the message to Integer
}
void MOTOR_START_Callback(char* message, uint16_t len) {
char messageBuffer[40];
//snprintf(messageBuffer, sizeof(messageBuffer), "Color status is :: %s, len :: %u", message, len);
//Serial.println(messageBuffer);
Serial.println(message);
String inString = message;//sotre the message to String
motorStart = inString.toInt();//convert the message to Integer
}
void runMotor()
{
if(motorStart ==1)
{
if(debug)
{
Serial.print("Motor running:");
Serial.print(dir[motorDirection]);
Serial.print(" at ");
Serial.print(motorSpeed);
Serial.println("%");
}
if(motorDirection)
{
ledcWrite(channelA, dutyCycle);
ledcWrite(channelB, 0);
delay(50);
}else{
ledcWrite(channelA, 0);
ledcWrite(channelB, dutyCycle);
delay(50);
}
}else{
if(debug)
{
Serial.println("***Motor Stopped***");
}
ledcWrite(channelA, 0);
ledcWrite(channelB, 0);
}
}//runMotor() end
// 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
سرچینې او حوالې
تر اوسه هیڅ سرچینې نشته.
فایلونه📁
هیڅ فایل شتون نلري.