關(guān)鍵詞:遙控小車;Arduino;直流電機巧颈;L298N電機驅(qū)動板;串口藍牙模塊
一袖扛、簡介
本項目使用Arduino實現(xiàn)了一個最小功能的藍牙遙控小車
制作流程主要分為四個部分:1.組裝小車砸泛;2.燒寫代碼;3.調(diào)試藍牙蛆封;4.整車測試
其中唇礁,前三個部分的耦合性很低,每個部分可以獨立操作和調(diào)試
二惨篱、實現(xiàn)過程
1. 組裝小車
所需環(huán)境:十字螺絲刀×1
車身零件全家福
1.1 電機繞線及固定
直流電機
本項目使用直流電機(即常見的玩具四驅(qū)車的馬達)作為小車的驅(qū)動裝置盏筐,直流電機的特點是:只要電機的兩極有電勢差,電機就可以運轉(zhuǎn)砸讳,反接則逆轉(zhuǎn)琢融,兩極電勢差為零時停止運轉(zhuǎn)。
電極繞線
這款直流電機沒有預(yù)先引出導(dǎo)線簿寂,所以需要我們手工連接導(dǎo)線:
首先漾抬,把杜邦線裸露出銅線的一段塞入電機銅電極的小孔中;
然后把探出的那部分銅線彎折一下常遂,用指尖壓住彎折處兩段的銅線奋蔚,旋轉(zhuǎn)幾圈,讓兩段銅線纏繞在一起;
這樣保證了銅線和電極的充分接觸泊碑,省去了焊接的麻煩坤按。
注:沒有要求電極和不同顏色導(dǎo)線的對應(yīng)關(guān)系,可以隨意連接馒过。
測試電機
把兩個電機和4根杜邦線連接完畢之后就可以對電機進行簡單的測試:只要把杜邦線的兩頭接觸18650鋰電池的兩極即可臭脓,可以觀察到電機開始快速轉(zhuǎn)動,如果調(diào)換電池的電極腹忽,會發(fā)現(xiàn)電機發(fā)生反轉(zhuǎn)来累。
固定電機
把兩個固定電機用的插銷插到車底盤上對應(yīng)的空槽中,然后將長螺絲穿過窘奏,用手輕輕旋上螺母
1.2 固定驅(qū)動板和萬向輪
L298N工作原理
由上文的內(nèi)容可知嘹锁,直流電機只要一極接高電平,一極接低電平即可轉(zhuǎn)動着裹,大家也知道Arduino的數(shù)字輸出引腳可以直接輸出高電平或低電平领猾,但我們一般不直接將Arduino連接到直流電機上,因為Arduino板的電流負載是有限的骇扇,直接連接電極容易引發(fā)電流過載摔竿,導(dǎo)致Arduino板被燒壞,所以我們選用L298N這塊轉(zhuǎn)接驅(qū)動板少孝,作為Arduino和電機之間的橋梁
針腳對應(yīng)關(guān)系如下圖继低,其中in1 ~ in4對應(yīng)OUT1~OUT4,我們將Arduino的數(shù)字輸出針腳接到in1 ~ in4上稍走,即可將對應(yīng)的高低電平信號映射到OUT1~OUT4的接線柱上袁翁,從而控制電機
L298N除了有轉(zhuǎn)換信號的功能外,內(nèi)部還有穩(wěn)壓模塊婿脸,可以接受7 ~ 12V的輸入梦裂,然后轉(zhuǎn)換出一個5V的輸出,分別對應(yīng)這下部的3個接線柱盖淡,我們之后會將18650電池組的正極接到 7 ~ 12V輸入
的接線柱上年柠,負極接地
,然后用L298N提供的5V輸出
和接地
作為正負極來為Arduino板供電
L298N針腳對應(yīng)關(guān)系圖
固定驅(qū)動板和接線
固定驅(qū)動板的方法很簡單褪迟,我們只用兩組螺絲螺母冗恨,固定到下圖所示的位置,注意螺絲不要扭太緊
把杜邦線固定到接線柱上
使用螺母固定好L298N之后味赃,需要將電極引出的杜邦線的針腳固定到L298N的接線柱上掀抹,方法是先用螺絲刀松開接線柱內(nèi)的螺絲,然后塞入杜邦線的針腳心俗,最后再用螺絲上緊傲武,如下圖
這部分完成
1.3 裝配18650電池盒和電源開關(guān)
18650鋰電池
18650型鋰電是電子產(chǎn)品中比較常用的可充電鋰電池蓉驹,單節(jié)電壓一般為3.7V,常在充電寶或筆記本電腦的電池中作為電芯使用揪利。其型號的定義法則為:如18650型态兴,即指電池的直徑為18mm,長度為65mm疟位,0代表是圓柱體型的電池瞻润。*
選用原因
由于Arduino UNO的標準輸入電壓為5 ~ 9V,L298N驅(qū)動板的輸入電壓為7 ~ 12V甜刻,所以本項目選用了兩節(jié)18650鋰電池串聯(lián)(串聯(lián)后總電壓為7.4V)的方式作為小車的電源绍撞,同時給Arduino和電機驅(qū)動板供電
安裝電池盒,連接開關(guān)
給船型開關(guān)的兩個引腳纏線得院,這部分需要耐心些傻铣,注意兩個引腳的導(dǎo)線不要接觸到一起,否則開關(guān)就會失效
最后用一個螺絲螺母的組合穿過底板(注意穿過的孔的位置)固定電池盒和用于支撐Arduino的銅柱(用螺母固定)祥绞,還要在L298N的接線柱上增添兩條用于給Arduino供電的杜邦線非洲,安裝的時候注意牢固
1.4 固定Arduino,連接剩余杜邦線
固定Arduino就谜,根據(jù)原理圖連線
然后可以用一個螺絲固定Arduino到車身上,并根據(jù)電路原理圖連接從L298N給Arduino供電的杜邦線
1.5 通電調(diào)試
無程序測試電機方法
可以用Arduino板上固定的3.3V和GND輸出測試L298N
2. 燒寫代碼
2.1 使用Arduino IDE向開發(fā)板上傳代碼
連接Arduino和PC機里覆,使用Arduino IDE打開本項目的代碼文件丧荐,在【工具】菜單中選擇所需要上傳的端口,然后點擊上傳
2.2 使用Arduino IDE串口工具進行調(diào)試
底部狀態(tài)欄顯示上傳成功后喧枷,保持Arduino和PC機連接的狀態(tài)虹统,點擊右上角的串口監(jiān)視器,出現(xiàn)一個小程序框
串口監(jiān)視器程序框的頂部是一個輸入欄车荔,在這里我們可可以對上傳到板上的程序進行測試,在輸入欄輸入“w”后戚扳,點擊【發(fā)送】按鈕忧便,會發(fā)現(xiàn)文本框里可以從Arduino得到相應(yīng)的反饋(這是在源代碼中設(shè)置的),然后還可以依次測試發(fā)送“a”帽借、“d”珠增、“s”、“x”這幾種消息砍艾,如均正常蒂教,則程序無誤。
使用了鍵盤的W脆荷、A凝垛、S懊悯、D、X鍵位的布局來與前進梦皮、左轉(zhuǎn)炭分、右轉(zhuǎn)、停止和后退這幾個概念做對應(yīng)
2.3 連接車身調(diào)試
如果小車車身安裝好了届氢,這時可以把Arduino和小車車上的引腳按照原理圖連接好欠窒,然后還通過上一個步驟的方法,在PC機上用串口監(jiān)視器給Arduino發(fā)送消息退子,觀察輪胎的運轉(zhuǎn)情況岖妄,看是否按照程序的描述運轉(zhuǎn),如果不能寂祥,可能是在電機的引腳或者連線的時候出現(xiàn)偏差荐虐,解決方法有三種:
- 修改源代碼中控制輪的變量與數(shù)字引腳的對應(yīng)關(guān)系
- 修改Arduino到L298N信號線的連線
- 修改L298N和電機之間的連線
每種方法都可以解決小車不能按照規(guī)定接受消息的方式運轉(zhuǎn)的問題,請同學(xué)們自由選擇
校正輪胎轉(zhuǎn)動方向
3. 調(diào)試藍牙
關(guān)于HC-05和調(diào)試
HC-05是一個串口藍牙通信模塊丸凭,內(nèi)部的芯片上封裝了藍牙通信協(xié)議以及用于調(diào)試的AT指令集福扬,功能是:可以通過藍牙接受數(shù)據(jù),再從串口通信協(xié)議從針腳發(fā)送出去惜犀,也可以從串口接受消息铛碑,再經(jīng)過芯片用藍牙發(fā)送出去,相當于通信無線到有線通信的一個橋梁虽界。
AT指令是應(yīng)用于終端設(shè)備與PC應(yīng)用之間的連接與通信的指令汽烦。AT即Attention。每個AT命令行中只能包含一條AT指令莉御;對于AT指令的發(fā)送撇吞,除AT兩個字符外,最多可以接收1056個字符的長度(包括最后的空字符)
我們將藍牙模塊(HC-05)通過轉(zhuǎn)換器(TTL轉(zhuǎn)USB)連接到電腦上礁叔, 在電腦上使用串口調(diào)試軟件(CoolTerm)向藍牙模塊發(fā)送特定的AT指令來對藍牙模塊的一些參數(shù)牍颈,比如設(shè)備名稱、配對碼琅关、主從角色等等煮岁。
3.1 將 串口藍牙模塊(HC-05) 與PC相連接
使用 USB轉(zhuǎn)TTL模塊 連接 HC-05,連線如下圖
要按住RST鍵連接USB都毒,才能進入AT調(diào)試模式
- 按住藍牙模塊上的RST鍵色罚,插入PC機的USB口,松開RST鍵账劲,進入AT指令調(diào)試模式戳护,標志是藍牙模塊上的紅色指示燈慢速閃爍
- 如果不按住RST鍵直接連接USB口的話金抡,紅色指示燈會快速閃爍,標志進入藍牙連接模式
3.2 打開CoolTerm腌且,建立串口通信連接
將藍牙模塊連接到PC上后梗肝,查看設(shè)備管理器,打開CoolTerm軟件铺董,點擊【Options】圖標進入選項設(shè)置巫击,【Port】選項選擇設(shè)備管理器中CH340對應(yīng)的端口(根據(jù)電腦的不同,不一定是COM5)精续,【Baudrate】修改為 38400坝锰,然后點擊底部的【OK】確定
設(shè)置完成后重付,點擊軟件上方的【Connect】圖標
3.3 使用AT指令調(diào)整藍牙模塊的參數(shù)
【Connect】成功后顷级,依次點選菜單欄上的【Connection】→【Send String】,會出現(xiàn)一個消息發(fā)送框确垫,通過這個可以向藍牙模塊發(fā)送AT指令弓颈,如下圖:
注意,使用AT指令的時候一定要回車到第二行再點擊【Send】發(fā)送
AT指令集
分別輸入如下指令删掀,查看設(shè)備的當前狀況
“AT”:回復(fù)“OK”翔冀,說明設(shè)備正常。
“AT+UART”:查看設(shè)備的串口通信參數(shù)披泪,本實驗?zāi)K藍牙模式的波特率為9600
“AT+ADDR”:查看設(shè)備的藍牙地址
“AT+ROLE”:查看設(shè)備的主從轉(zhuǎn)臺纤子,“0”為從模式,“1”為主模式
“AT+PSWD”:查看設(shè)備當前的配對碼付呕,默認是1234
“AT+NAME”:查看設(shè)備當前的名稱计福,默認是 HC-05
“AT+RESET”:重啟設(shè)備
用AT指令配置設(shè)備
發(fā)送完上述AT指令查看完設(shè)備信息后跌捆,需要根據(jù)你的情況修改一些設(shè)備信息徽职,方法是,在相應(yīng)的AT指令后加“=”號佩厚,輸入要修改的信息即可姆钉,本項目主要修改信息如下例
- “AT+ROLE=0”:設(shè)置藍牙設(shè)備為從模式
- “AT+PSWD=123456”:修改配對碼為123456,用戶自定義
- “AT+NAME=Carduino”:修改名稱為Carduino抄瓦,用戶自定義
- “AT+UART=9600,0,0”:修改藍牙工作狀態(tài)波特率為9600潮瓶,無停止位和校驗位
由于硬件存在一定的缺陷钙姊,HC-05藍牙模塊在設(shè)置【NAME】參數(shù)時會有些問題毯辅,可能需要多設(shè)置幾次
如果改名不成功,請使用“AT+ADDR”查詢藍牙設(shè)備地址煞额,在手機上根據(jù)搜索到的設(shè)備地址來連接藍牙模塊
3.4 下載安裝BlueSPP軟件思恐,設(shè)置按鍵消息
BlueSPP是一個手機端的藍牙串口通訊通信工具沾谜,可以連接藍牙設(shè)備,通過串行通訊協(xié)議發(fā)送消息
-
打開APP
進入BlueSPP -
連接設(shè)備
點右上角圖標搜索設(shè)備 -
連接
輸入事先配置的配對碼 -
APP首頁可以在聊天窗口中向設(shè)備發(fā)送消息
可以發(fā)送消息 -
右滑胀莹,進入自定義鍵盤頁面基跑,每個按鈕的“名稱”可定義,按鈕對應(yīng)的“按下”描焰,“松開”事件都可配置成發(fā)送特定消息
配置按鈕“前進”
配置按鈕“左轉(zhuǎn)”
配置按鈕“后退”
配置結(jié)束
按鍵名稱 | 按下發(fā)送 | 松開發(fā)送 |
---|---|---|
前進 | w | |
后退 | x | s |
左轉(zhuǎn) | a | w |
右轉(zhuǎn) | d | w |
停止 | s |
上表為筆者的配置媳否,大家可以根據(jù)自己的控制習(xí)慣進行設(shè)置
4. 整車測試
終于到激動人心的最終環(huán)節(jié)了
4.1 給Arduino連接藍牙模塊
4.2 使用獨立電源測試
打開開關(guān),L298N荆秦、Arduino篱竭、和HC-05藍牙模塊上的能正常閃爍,就可以在手機端用BlueSPP連接藍牙萄凤,讓小車下地開始真正的遙控測試了
三室抽、參考代碼
char serial_data; // 將從串口讀入的消息存儲在該變量中
int wheel_R_1 = 5; // 右輪in1對應(yīng)Arduino 5號引腳
int wheel_R_2 = 6; // 右輪in2對應(yīng)Arduino 6號引腳
int wheel_L_1 = 9; // 左輪in1對應(yīng)Arduino 9號引腳
int wheel_L_2 = 10; // 左輪in2對應(yīng)Arduino 10號引腳
void setup(){
// 配置所有控制輪的引腳為輸出
pinMode(wheel_L_1, OUTPUT);
pinMode(wheel_L_2, OUTPUT);
pinMode(wheel_R_1, OUTPUT);
pinMode(wheel_R_2, OUTPUT);
// 配置串口波特率
Serial.begin(9600);
}
void loop(){
if(Serial.available()){
// 將從串口讀入的消息存儲在該變量中
serial_data = Serial.read();
// 按照 w a s d x 在鍵盤上的布局來控制車
// 如果接收到 w ,直行
if( serial_data == 'w' ){
move_ahead( );
Serial.println("The car is moving ahead!");
}
// 如果接收到 x 靡努,后退
else if( serial_data == 'x'){
move_backwards( );
Serial.println("The car is moving backwards!");
}
// 如果接收到 a 坪圾,左轉(zhuǎn)
else if( serial_data == 'a'){
turn_left( );
Serial.println("The car is turning left!");
}
// 如果接收到 d ,右轉(zhuǎn)
else if( serial_data == 'd'){
turn_right( );
Serial.println("The car is turning right!");
}
// 如果接收到 s 惑朦,停止
else if( serial_data == 's'){
stop();
Serial.println("The car is stopping!");
}
}
}
// 定義直行函數(shù)
void move_ahead(){
digitalWrite( wheel_L_1, HIGH);
digitalWrite( wheel_L_2, LOW);
digitalWrite( wheel_R_1, HIGH);
digitalWrite( wheel_R_2, LOW);
}
// 定義后退函數(shù)
void move_backwards(){
digitalWrite( wheel_L_1, LOW);
digitalWrite( wheel_L_2, HIGH);
digitalWrite( wheel_R_1, LOW);
digitalWrite( wheel_R_2, HIGH);
}
// 定義左轉(zhuǎn)函數(shù)
void turn_left(){
digitalWrite( wheel_L_1, LOW);
digitalWrite( wheel_L_2, LOW);
digitalWrite( wheel_R_1, HIGH);
digitalWrite( wheel_R_2, LOW);
}
// 定義右轉(zhuǎn)函數(shù)
void turn_right(){
digitalWrite( wheel_L_1, HIGH);
digitalWrite( wheel_L_2, LOW);
digitalWrite( wheel_R_1, LOW);
digitalWrite( wheel_R_2, LOW);
}
void stop(){
digitalWrite( wheel_L_1, LOW);
digitalWrite( wheel_L_2, LOW);
digitalWrite( wheel_R_1, LOW);
digitalWrite( wheel_R_2, LOW);
}