Koyarwar ESP32 49/55 - Sarrafa Motar DC Akan Intanet ta amfani da Adafruit IoT | Kunshin ESP32 na SunFounder
A cikin wannan koyawa, za mu bincika yadda ake sarrafa motar DC ta hanyar intanet ta amfani da ESP32 da sabis na Adafruit IO MQTT. Za a iya sarrafa saurin motar DC da alkiblarsa daga nesa, wanda ke ba da damar sarrafawa mai inganci daga ko'ina tare da haɗin intanet. Wannan aikin yana nuna iyawar microcontroller na ESP32, wanda ke da Wi-Fi mai ginannu, wanda ya sa ya dace da aikace-aikacen Intanet na Abubuwa (IoT).
Za mu aiwatar da tsarin da za a iya fara motar, dakatar da ita, da kuma daidaita saurinta ta hanyar yanar gizo da ke haɗe da Adafruit IO. Masu amfani za su iya yin rajista zuwa takamaiman batutuwa don sarrafa motar da daidaita sigogi daidai. Don fahimtar tsarin sosai, tabbatar da duba bidiyon da ke tare da wannan koyawa (a cikin bidiyo a 00:00).
Bayanin Kayan Aiki
Don wannan aikin, za mu yi amfani da microcontroller na ESP32, wanda shine zuciyar tsarinmu. ESP32 yana iya sarrafa sadarwar Wi-Fi, wanda ya sa ya dace da aikace-aikacenmu na IoT. Yana haɗawa da dandalin Adafruit IO, wanda ke ba mu damar aika da karɓar saƙonni ta hanyar ka'idar MQTT.
Bugu da ƙari, za mu yi amfani da direban motar L293D, wanda ke da mahimmanci don sarrafa motar DC. L293D na iya tuka motocin DC guda biyu kuma yana ba da damar sarrafa duka alkibla da sauri ta hanyar Pulse Width Modulation (PWM). Yana aiki a matsayin hanyar haɗi tsakanin ESP32 da motar, yana sarrafa mafi girman halin yanzu da motar ke buƙata yayin da yake ware ESP32 daga duk wani siginar back-emf mai lahani.
Cikakkun Bayanai na Datasheet
| Mai ƙera | Texas Instruments |
|---|---|
| Lambar sashi | L293D |
| Wutar Logic/IO | 4.5 - 36 V |
| Wutar samarwa | 4.5 - 36 V |
| Halittar fitarwa (kowane tashar) | 600 mA |
| Matsakaicin halittar (kowane tashar) | 1.2 A |
| Jagorar mitar PWM | 10 kHz (na yau da kullun) |
| Ƙofofin shigarwa na ma'ana | 0.8 V (babba), 2.0 V (ƙasa) |
| Ragewar wutar / RDS(on) / cikar | 1.5 V max |
| Iyakokin zafi | 150 °C |
| Kunshin | DIP-16 |
| Bayanan kula / bambance-bambance | Quadruple high-current half-H driver |
- Tabbatar da ingantaccen zubar da zafi don ci gaba da aiki.
- Yi amfani da PWM don sarrafa saurin motar yadda ya kamata.
- Kula da iyakokin wutar shigarwa don hana lalacewa.
- Duba ingantattun haɗin ƙasa tsakanin duk abubuwan.
- Yi hattara da back-emf; yi amfani da diodes idan ya cancanta.
- Sake duba wayoyi saboda polarity na iya shafar alkiblar motar.
- Gwada da ƙaramin wutar kafin cikakken aiki.
- Kula da zafi mai yawa yayin amfani mai tsawo.
- Tabbatar da cire maɓallan inji idan an yi amfani da su.
- Tabbatar da cewa ESP32 ba a ɗora masa nauyi da halittar motar ba.
Umarnin Wayoyi
Fara da haɗa wutar samarwa. Haɗa madaidaicin tashar tushen wutar waje zuwa fil ɗin VCC na L293D (fil 8) da ƙasa zuwa fil ɗin GND (fil 4). Tabbatar da cewa an kunna ESP32 daban idan an buƙata, yawanci ta hanyar haɗin micro USB.
Na gaba, haɗa motar zuwa L293D. Ɗaya daga cikin tashoshin motar ya kamata a haɗa shi zuwa fil ɗin fitarwa 3 (fil 2 na L293D) da ɗayan tashar zuwa fil ɗin fitarwa 6 (fil 7 na L293D). Don siginonin sarrafawa, haɗa fil 13 na ESP32 zuwa fil ɗin shigarwa 2 (fil 1 na L293D) da fil 14 zuwa fil ɗin shigarwa 7 (fil 2 na L293D). Fil ɗin kunna (fil 1) kuma ya kamata a haɗa shi zuwa wutar 5V don kunna direban. A ƙarshe, tabbatar da cewa ƙasan ESP32 an haɗa shi da ƙasan L293D don samun ma'anar gama gari.
Misalan Lamba & Bayani
Lambar da aka bayar tana fara ɗakunan karatu da suka dace kuma tana saita abokin Wi-Fi da MQTT. Maɓallan ganowa sun haɗa da motorSpeed, motorDirection, da motorStart, waɗanda ke sarrafa aikin motar bisa umarnin da aka karɓa daga Adafruit IO.
bool debug = false;
#define motor1A 13
#define motor2A 14
int motorSpeed = 0;
int motorDirection = 1;
int motorStart = 1;
A cikin wannan ɓangaren, an ayyana fil ɗin motar tare da masu canji na farko don sarrafa sauri, alkibla, da yanayin farawa/tsayawa na motar. Masu canji motorSpeed za a daidaita shi bisa shigarwa daga Adafruit IO.
void setup() {
Serial.begin(115200);
WiFi.begin(WLAN_SSID, WLAN_PASS);
delay(2000);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}
}
A cikin aikin setup, an fara sadarwar serial, kuma ESP32 yana haɗawa da cibiyar sadarwar Wi-Fi da aka ayyana. Wannan haɗin yana da mahimmanci don kunna sadarwar MQTT.
void loop() {
MQTT_connect();
mqtt.processPackets(500);
runMotor();
}
Wannan aikin loop yana kafa haɗin MQTT kuma yana sarrafa fakitin da ke shigowa don sarrafa motar bisa sabbin umarnin da aka karɓa. Ana kiran aikin runMotor() don amfani da saitunan yanzu ga motar.
Nuni / Abin da za a Yi Tsammani
Lokacin da aka gama saitin kuma aka ɗora lambar, ya kamata ka iya sarrafa motar ta hanyar dashboard na Adafruit IO. Kana iya daidaita saurin motar ta amfani da slider kuma ka canza alkiblarsa da maɓallin kunnawa/kashewa. Idan an haɗa komai daidai, motar za ta amsa waɗannan umarnin nan take, yana nuna ƙarancin latency na tsarin (a cikin bidiyo a 00:00).
Matsalolin gama-gari sun haɗa da juyar da alkiblar motar saboda rashin daidaiton wayoyi, don haka ka sake duba haɗin wayoyi idan motar ba ta yi yadda ake tsammani ba. Bugu da ƙari, ka tabbatar an saita batutuwan MQTT daidai a Adafruit IO don su dace da lambar.
Lokutan Bidiyo
- 00:00 Farko
- 2:21 Gabatarwa ga aikin
- 4:20 Yadda ake sarrafa Motar DC
- 6:39 L293D Motor Driver
- 11:42 Menene MQTT?
- 15:03 Saitin Adafruit IO
- 19:17 Bayanin Wayoyi
- 22:42 Bayanin Lambar
- 35:28 Nunin Aikin
/***********************************************************************
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
Albarkatun da kuma shafukan da za a duba
Babu kayan aiki tukuna.
Fayiloli📁
Babu fayiloli da ake da su.