最近很多人問我有關藍牙遙控車的事情,就在這里統一寫一個日志詳細說說怎么做吧。采用模塊搭建的方法比較簡單。不費事兒~
材料清單:
普通遙控車一輛 30元 (遙控壞不壞的都行只要電機沒問題)
藍牙串口模塊一個 25元 (淘寶有賣)
電烙鐵一把 價格略,買一把夠用好多年(焊錫、松香少量)
STC的單片機一個 4元 (推薦用個STC89C52RC,雖然大點)
安卓手機一臺帶藍牙 價格略
L298N電機驅動模塊 14元(淘寶有賣)
18650鋰電池2節 15元(淘寶,最好連電池盒也一起買了。當然買14500電池更好,跟5號電池一樣大,直接放在車子的電池盒。注意電壓是3.7V的)
TTL下載線 15元(用來下載程序到單片機中,算是很常見的一個東西了,沒有的話就淘寶吧)
電阻電容之類的若干 (主要是給單片機做最小系統,不想費勁的話就買個STC89C52RC的最小系統板10元)
導線若干
動力比較足,用電池壓住后輪,不然打滑嚴重。
思路:
手機發送控制指令
經藍牙發送至藍牙串口模塊
串口模塊把數據通過單片機串口送入單片機
單片機處理數據,作出反應,是該前進還是后退
介紹下電機驅動模塊
我們使用的是AB/CD兩組直流電機驅動口。無視圖上的步進電機。
在本次制作中AB口驅動后輪的電機,控制小車前后動作;
CD口驅動前輪方向電機,控制小車左右動作。
信號輸入端口inA/inB/inC/inD,給一個高電平+5,就可以驅動相應的電機正反轉
稍微介紹下STC89C52RC
P1.4接inA,P1.5接inB,P1.6接inC,P1.7接inD。單片機最小系統要么買個小板子,要么找STC官網的PDF看,這里就不貼了。
P3.0和P3.1作為下載口與藍牙串口的通訊口。
單片機晶振使用11. 0592M的。
P3.2接LED正極,LED負極接地,這個LED的作用是判斷單片機是否正常運行,在程序里設定LED一亮一滅,正常運行的話,LED會一亮一滅。
程序結構如下 :
drive.c
#include "drive.h"
void Wleft()
{
W_1 = 1;
B_1 = 0;
L_1 = 1;
R_1 = 0;
}
void Wright()
{
W_1 = 1;
B_1 = 0;
L_1 = 0;
R_1 = 1;
}
void Bleft()
{
W_1 = 0;
B_1 = 1;
L_1 = 1;
R_1 = 0;
}
void Bright()
{
W_1 = 0;
B_1 = 1;
L_1 = 0;
R_1 = 1;
}
void Forward()
{
W_1 = 1;
B_1 = 0;
L_1 = 0;
R_1 = 0;
}
void Backward()
{
W_1 = 0;
B_1 = 1;
L_1 = 0;
R_1 = 0;
}
void Stop()
{
W_1 = 0;
B_1 = 0;
L_1 = 0;
R_1 = 0;
}
main.c
#include<reg52.h>
#include "drive.h"
#define uchar unsigned char
sbit led_pin = P3^2; //定義led所接的引腳
uchar k;
uchar rxcode[1];
void led() interrupt 1 //led閃爍函數,由定時器T0產生中斷,大約1.5秒閃爍一下
{
uchar i;
i++;
if(i==15)
{
led_pin = !led_pin;
i=0;
}
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
}
void com() interrupt 4 //串口中斷函數,當藍牙傳命令過來的時候執行
{
RI = 0;
rxcode[k]=SBUF; //把收到的命令放到全局變量里面
k++;
if(k==1)
k=0;
}
void com_init() //串口初始化函數,波特率9600bps
{
TMOD = 0x21;
TH1 = 0xfd;
TL1 = 0xfd;
TR1 = 1;
REN = 1;
SM0 = 0;
SM1 = 1;
ES = 1;
EA = 1;
}
void led_init() //定時器0初始化函數,用于led閃爍
{
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
ET0 = 1;
TR0 = 1;
}
void main() //主函數
{
Stop();
com_init(); //串口初始化
led_init(); //led閃爍定時器初始化
while(1) //死循環,等待藍牙傳命令過來
{
switch(rxcode[0]) //判斷收到的命令是干嘛的
{
case 2:Forward();break; //前進
case 1:Backward();break; //后退
case 4:Wright();break; //前右
case 3:Wleft();break; //前左
case 5:Bright();break; //后右
case 6:Bleft();break; // 后左
case 0:Stop();break; //停止
}
}
}
drive.h
#ifndef __DRIVE_H__
#define __DRIVE_H__
#include <reg52.h>
//定義L298N所接的引腳
sbit R_1 = P1^7;
sbit L_1 = P1^6;
sbit B_1 = P1^5;
sbit W_1 = P1^4;
void Wleft();
void Wright();
void Bleft();
void Bright();
void Forward();
void Backward();
void Stop();
#endif
編譯生成HEX文件
打開 STC-ISP,準備把程序寫入到單片機
+5接在單片機供電,gnd接地,RX,TX對應P3.0 P3.1
TTL下載器就是這個
選擇好固件,串口號,點擊下載,再給單片機上電
如果用最小系統板的話 大概是這個樣子
如果沒有錯誤的話會出現這個
Chinese:正在嘗試與 MCU/單片機 握手連接 ...
MCU Type is: STC89C52RC
MCU Firmware Version: 4.3C
Chinese:MCU 固件版本號: 4.3C
Double speed / 雙倍速: 12T/單倍速
振蕩放大器增益: full gain
下次下載時 P1.0/P1.1 與下載無關
內部擴展AUX-RAM: 允許訪問(強烈推薦)
下次下載用戶應用程序時將數據Flash區擦除: NO
用戶軟件啟動內部看門狗后: 復位關看門狗
ALE pin 仍為 ALE
內部時鐘頻率:11.049428M.
外部時鐘頻率:11.049428M.
Chinese:正在重新連接 ...
Current Baud is: / 當前波特率為: 19200 bps.
We are erasing MCU flash...
正在擦除應用程序區... ( 00:01 )
正在下載... ( 開始時間: 14:40:06 )
Program OK / 下載 OK
Verify OK / 校驗 OK
erase times/擦除時間 : 00:01
program times/下載時間: 00:01
Encrypt OK/ 已加密
這樣就OK了。只要使用藍牙串口發送1就可以前進,2就可以后退。3、4、5、6.安卓的程序需要的話可以喊我,這里傳不上來。
大體上就是這樣的思路。具體做的話,元件的安裝、電路板的安放都需要根據小車的實際情況來。