好久沒寫文章了,忙一些事去啦,最近做了一個小車覺得還挺有意思的,做成教程分享給大家(閑魚奸商原始碼賣88真是不要臉)
首先做我們的遙控小車需要什么呢
材料元件:小車機身(包括4個輪子,4個電機),esp8266nodemcu,l298n(紅板),電源(可以使用充電寶,博主就是用的充電寶)
還需要在手機上下載點燈科技app
編程環境:arduino IDE
如果只是想做出來不需要搞懂原理則不需要看第二和第三點,這兩點屬于控制的原理分析
1、Arduino IDE根據自己的系統安裝合適的版本
我目前用的是1.8.9版本
安裝esp8266拓展,安裝esp8266的拓展小伙伴們自行去百度
這里點燈科技提供了資源,需要的小伙伴去找官方開發檔案
以及下載安裝blinker-Arduino庫:
打開軟體IDE,在專案–》加載庫–》管理庫下搜索blinker進行安裝
還需安裝esp8266的庫,安裝方法是一樣的
2,小車基本動作的實作方法
首先小車的動作無非主要有前進,后退,左轉和右轉
這倆小車是怎么實作前進呢,無疑是四個輪子都向前轉,如下圖所示,后退同理
那么重要的來了,我們小車沒有轉向器,那么如何實作左轉右轉呢,如下圖所示
重點宣告:在這段解釋中證明了同側的輪子得同方向轉動,在小車除錯程序中如果出現同側輪子轉動不一致,請反接其中一個輪子電機的正負極
3,如何控制小車兩側輪子的轉動(L298N模塊的使用)
CSDN上有很多關于L298N模塊的講解,都是千篇一律的嗎,這里搬運博客大佬 Ma Ding對L298N模塊的講解

可以看到有IN1&IN2輸入埠,實際就是用這兩個埠控制輸出OUT1和OUT2的正負位
電源引腳
1, VCC 外接直流電源引腳,電壓范圍在5~35V之間
2,GND GND是接地引腳,連接到電源負極
3,5V 驅動芯片內部邏輯供電引腳,如果安裝了5V跳帽,則此引腳可輸出5V電壓,為微控板或其他電路提供電力供給,如果拔掉5V跳帽,則需要獨立外接5V電源
控制引腳
-
IN1 & IN2 電機驅動器A的輸入引腳,控制電機A轉動及旋轉角度
IN1輸入高電平HIGH,IN2輸入低電平LOW,對應電機A正轉
IN1輸入低電平LOW,IN2輸入高電平HIGH,對應電機A反轉
IN1、IN2同時輸入高電平HIGH或低電平LOW,對應電機A停止轉動
調速就是改變IN1、IN2高電平的占空比(需拔掉ENA處跳帽) -
IN3 & IN4 電機驅動器B的輸入引腳,控制電機B轉動及旋轉角度
IN3輸入高電平HIGH,IN4輸入低電平LOW,對應電機B正轉
IN3輸入低電平LOW,IN4輸入高電平HIGH,對應電機B反轉
IN3、IN4同時輸入高電平HIGH或低電平LOW,對應電機B停止轉動
調速就是改變IN3、IN4高電平的占空比(需拔掉ENB處跳帽)
輸出引腳
- OUT1 & OUT2 電機驅動器A的輸出引腳,接直流電機A或步進電機的A+和A-
- OUT3 & OUT3 電機驅動器B的輸出引腳,接直流電機B或步進電機的B+和B-
調速控制引腳
- ENA 電機A調速開關引腳,拔掉跳帽,使用PWM對電機A調速,插上電機A高速運行
- ENB 電機B調速開關引腳,拔掉跳帽,使用PWM對電機B調速,插上電機B高速運行
OUT1、OUT2和OUT3、OUT4之間分別接兩個直流電機Motor1、Motor2,IN1、IN2、IN3、IN4引腳從單片機接入控制電平,控制電機的正反轉,ENA、ENB接控制使能端,控制電機調速,L298N控制邏輯關系圖如下:

代碼實作:
void forward() //特此說明一下,該函式用于小車向前,若小車并非向前有能力者自行修改代碼,若并未了解代碼則將所有不是向前轉動的電機反接
{
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH); //IN1和IN2控制一端向前轉動
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH); //IN3和IN4控制另外一端向前轉動
delay(100);
}
void back()
{
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
delay(100);
}
void Turnleft()
{
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW); //這里實作左側后退,右側前進以此實作左轉
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
delay(100);
}
void Turnright()
{
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
delay(100);
}
void stop_run()
{
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
delay(100);
}
4,esp8266上云并且配置點燈科技app
首先在點燈科技app上申請密鑰

這樣獲取到secret Key,到時候代碼里要用到
這里放出esp8266的完整代碼(包括小車控制代碼),并且對代碼進行解讀:
#define BLINKER_WIFI
#include <Blinker.h>
BlinkerButton Button1("btn-h"); //這里建立了app內4個按鍵,分別是前后左右
BlinkerButton Button2("btn-q");
BlinkerButton Button3("btn-y");
BlinkerButton Button4("btn-z");
BlinkerText Text1("text_1");
char i;
char auth[] = "設備密鑰"; //點燈科技申請到的設備密鑰
char ssid[] = "wifi名稱";
char pswd[] = "WiFi密碼";
bool oState[5] = { false }; //設定5路開關控制
//下面全是小車控制代碼
void forward()
{
digitalWrite(D1, LOW);
digitalWrite(D2, HIGH);
digitalWrite(D3, LOW);
digitalWrite(D5, HIGH);
delay(100);
}
void back()
{
digitalWrite(D1, HIGH);
digitalWrite(D2, LOW);
digitalWrite(D3, HIGH);
digitalWrite(D5, LOW);
delay(100);
}
void Turnleft()
{
digitalWrite(D1, HIGH);
digitalWrite(D2, LOW);
digitalWrite(D3, LOW);
digitalWrite(D5, HIGH);
delay(100);
}
void Turnright()
{
digitalWrite(D1, LOW);
digitalWrite(D2, HIGH);
digitalWrite(D3, HIGH);
digitalWrite(D5, LOW);
delay(100);
}
void stop_run()
{
digitalWrite(D1, LOW);
digitalWrite(D2, LOW);
digitalWrite(D3, LOW);
digitalWrite(D5, LOW);
delay(100);
}
void dataRead(const String & data)
{
BLINKER_LOG("Blinker readString: ", data);
Blinker.vibrate();
uint32_t BlinkerTime = millis();
Blinker.print("millis", BlinkerTime);
}
//這里是對4個按鍵函式進行設定
void button1_callback(const String & state) //點燈app內控制按鍵觸發
{
BLINKER_LOG("get button state: ", state);
if(state == "press"){ //判斷按鍵是否被按下
forward();
}
else if(state == "pressup"){ //判斷按鍵是否松開
stop_run();
}
}
void button2_callback(const String & state) //點燈app內控制按鍵觸發
{
BLINKER_LOG("get button state: ", state);
if(state == "press"){
back();
}
else if(state == "pressup"){
stop_run();
}
}
void button3_callback(const String & state) //點燈app內控制按鍵觸發
{
BLINKER_LOG("get button state: ", state);
if(state == "press"){
Turnleft();
}
else if(state == "pressup"){
stop_run();
}
}
void button4_callback(const String & state) //點燈app內控制按鍵觸發
{
BLINKER_LOG("get button state: ", state);
if(state == "press"){
Turnright();
}
else if(state == "pressup"){
stop_run();
}
}
void setup()
{
Serial.begin(115200);
BLINKER_DEBUG.stream(Serial);
//這里分別對應esp8266的4個輸出IO口D1,D2,D3,D5
pinMode(D1, OUTPUT);
digitalWrite(D1, LOW);
pinMode(D2, OUTPUT);
digitalWrite(D2, LOW);
pinMode(D3, OUTPUT);
digitalWrite(D3, LOW);
pinMode(D5, OUTPUT);
digitalWrite(D5, LOW);
Blinker.begin(auth, ssid, pswd);
Blinker.attachData(dataRead);
Button1.attach(button1_callback);
Button2.attach(button2_callback);
Button3.attach(button3_callback);
Button4.attach(button4_callback);
}
void loop()
{
Blinker.run();
}
編譯上傳前設定
埠選擇esp8266的埠,這個埠大家應該可以找到,插上esp8266這個埠就會出現(前提是裝好CH340G驅動),然后點擊上傳
我們再配置手機點燈科技app
在界面點擊按鍵新建按鍵
內容設定入下,4個按鈕資料鍵名對應我們程式開始寫的資料鍵名
保存設定
5,硬體接線圖
具體的接線就這個樣子,每個埠都是對應我做的小車,如果看不懂前面的教程,完全仿照也能做出來,如果除錯的時候小車輪子轉向不對,請反接電機
6,除錯小車
打開手機熱點,啟動電源,就可以稍等一會就可以看到有一個設備接入熱點,隨后app上設備也就上線了,長按按鈕小車就動起來啦,
到了這一步,也就基本上完成了,最多的問題可能就是按鍵方向和小車的動作不一樣
現在再說一下解決方法吧
方法一:重要的事情說三邊!!!轉動不對的電機接線反接
方法二:修改資料鍵
BlinkerButton Button1("btn-h"); //這里建立了app內4個按鍵,分別是前后左右
BlinkerButton Button2("btn-q");
BlinkerButton Button3("btn-y");
BlinkerButton Button4("btn-z");
開頭這段代碼,假如你的小車按前進是后退,那么將第二句
BlinkerButton Button1("btn-q");
里的btn-q改成btn-h,其他的同理,這里鍵名后面的字母就是前進q,后退h,左轉z,右轉y
這里有條件的朋友可以買個低價手機,裝個手機卡開個熱點就可以給esp8266供網了,再打個視頻通話就可以開出去玩了
當然也可以買便宜的上網寶以及網路攝像頭轉上去,效果一樣的
目前就是這樣啦,有問題的小伙伴可以留言我
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/278939.html
標籤:其他
下一篇:MCU模擬UART口
