ESP32 оқулығы 49/55 - Adafruit IoT арқылы интернетте тұрақты ток қозғалтқышын басқару | SunFounder ESP32 жиынтығы
Бұл оқулықта біз ESP32 және Adafruit IO MQTT қызметін пайдаланып, тұрақты ток қозғалтқышын интернет арқылы қалай басқаруға болатынын қарастырамыз. Тұрақты ток қозғалтқышының жылдамдығы мен бағытын қашықтан өзгертуге болады, бұл интернетке қосылған кез келген жерден тиімді басқаруға мүмкіндік береді. Бұл жоба ESP32 микроконтроллерінің мүмкіндіктерін көрсетеді, оның кіріктірілген Wi-Fi бар, бұл оны Интернет заттары (IoT) қолданбалары үшін өте қолайлы етеді.
Біз Adafruit IO-ға қосылған веб-интерфейс арқылы қозғалтқышты іске қосуға, тоқтатуға және оның жылдамдығын реттеуге болатын жүйені енгіземіз. Пайдаланушылар қозғалтқышты басқару үшін нақты тақырыптарға жазыла алады және параметрлерді сәйкесінше реттей алады. Процесті жақсырақ түсіну үшін осы оқулықпен бірге берілген бейнені міндетті түрде қараңыз (бейнеде 00:00).
Аппараттық құрал түсіндірмесі
Бұл жоба үшін біз жүйеміздің жүрегі болып табылатын ESP32 микроконтроллерін қолданамыз. ESP32 Wi-Fi байланысын өңдеуге қабілетті, бұл оны IoT қолданбамыз үшін өте қолайлы етеді. Ол Adafruit IO платформасына қосылып, MQTT протоколы арқылы хабарламаларды жіберуге және қабылдауға мүмкіндік береді.
Сонымен қатар, біз тұрақты ток қозғалтқышын басқару үшін қажетті L293D қозғалтқыш драйверін қолданамыз. L293D екі тұрақты ток қозғалтқышын басқара алады және импульстік ені модуляциясы (PWM) арқылы бағыт пен жылдамдықты басқаруға мүмкіндік береді. Ол негізінен ESP32 мен қозғалтқыш арасындағы интерфейс ретінде әрекет етеді, қозғалтқышқа қажетті жоғары токты басқарады, сонымен бірге ESP32-ні кері ЭҚК сигналдарының ықтимал зақымдануынан қорғайды.
Деректер парағының мәліметтері
| Өндіруші | Texas Instruments |
|---|---|
| Бөлшек нөмірі | L293D |
| Логика/IO кернеуі | 4.5 - 36 В |
| Қоректендіру кернеуі | 4.5 - 36 В |
| Шығыс тогы (арнаға) | 600 мА |
| Ең жоғары ток (арнаға) | 1.2 А |
| PWM жиілігі бойынша нұсқау | 10 кГц (әдеттегі) |
| Кіріс логикалық шектері | 0.8 В (жоғары), 2.0 В (төмен) |
| Кернеудің төмендеуі / RDS(on) / қанығу | 1.5 В макс. |
| Жылулық шектер | 150 °C |
| Қаптама | DIP-16 |
| Ескертулер / нұсқалар | Төрт еселенген жоғары токты жартылай H драйвері |
- Үздіксіз жұмыс үшін дұрыс жылуды таратуды қамтамасыз етіңіз.
- Қозғалтқыш жылдамдығын тиімді басқару үшін PWM қолданыңыз.
- Зақымдануды болдырмау үшін кіріс кернеуінің шектерін сақтаңыз.
- Барлық компоненттер арасындағы жерге қосылымдардың дұрыстығын тексеріңіз.
- Кері ЭҚК-ге абай болыңыз; қажет болса диодтарды қолданыңыз.
- Полярлық қозғалтқыш бағытына әсер етуі мүмкін болғандықтан, сымдарды қосуды екі рет тексеріңіз.
- Толық жұмыс алдында төмен кернеумен сынаңыз.
- Ұзақ пайдалану кезінде қызып кетуді бақылаңыз.
- Механикалық қосқыштар қолданылса, олардың дірілден қорғанысын қамтамасыз етіңіз.
- 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-ші түйреуіш) драйверді іске қосу үшін 5В қоректендіруге қосылуы керек. Соңында, ортақ анықтама үшін 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);
}
}
Орнату функциясында сериялық байланыс іске қосылады және ESP32 көрсетілген Wi-Fi желісіне қосылады. Бұл қосылым MQTT байланысын қосу үшін өте маңызды.
void loop() {
MQTT_connect();
mqtt.processPackets(500);
runMotor();
}
Бұл цикл функциясы MQTT қосылымын орнатады және алынған соңғы пәрмендерге негізделген қозғалтқышты басқару үшін кіріс пакеттерді өңдейді. Ағымдағы параметрлерді қозғалтқышқа қолдану үшін runMotor() функциясы шақырылады.
Демонстрация / Не күтуге болады
Орнату аяқталғаннан кейін және код жүктелгеннен кейін, сіз моторды Adafruit IO бақылау тақтасы арқылы басқара алуыңыз керек. Слайдерді пайдаланып мотор жылдамдығын реттей аласыз және қосқыш арқылы оның бағытын өзгерте аласыз. Егер бәрі дұрыс жалғанған болса, мотор бұл командаларға нақты уақыт режимінде жауап береді, бұл жүйенің төмен кідірісін көрсетеді (00:00 бейнеде).
Жиі кездесетін мәселелерге қате жалғау салдарынан мотор бағытының кері болуы жатады, сондықтан мотор күтілгендей жұмыс істемесе, қосылымдарды қайта тексеріңіз. Сонымен қатар, Adafruit IO-дағы MQTT тақырыптарыңыздың кодқа сәйкес дұрыс орнатылғанына көз жеткізіңіз.
Бейне уақыт белгілері
- 00:00 Басталуы
- 2:21 Жобаға кіріспе
- 4:20 Тұрақты ток моторы қалай басқарылады
- 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
Ресурстар мен сілтемелер
Әлі ресурстар жоқ.
Файлдар📁
Файлдар жоқ.