一直以來就有想法自己做一個小車玩玩,但是一直沒提上日程,這次寒假是個很好的機會,在這里把程序中的一些心得和資源分享給大家,源程式將在文末貼出來供大家參考
目錄
- 硬體部分
- 底盤
- 麥克納母輪
- 減速電機
- 主控模塊
- 電源模塊
- 驅動模塊
- 藍牙模塊
- 舵機
- 軟體部分
- 軟體以及串口驅動
- 源程式
- 總結
- 成果展示
- 心得體會
硬體部分
底盤
底盤用的是某寶現成的底盤,之前在學校比賽用的是亞克力板,這次選用的是鋁合金材料的,怎么造也不會壞,也不貴,一二十塊錢吧

麥克納母輪
在選輪子的時候首先想到的就是麥輪,不僅可以實作全向移動,看起來逼格也更高,選購的時候一定要分清楚左輪和右輪,因為左輪和右輪在旋轉時產生的分力是不一樣的,想要小車向某一個方向移動,必須抵消掉其他方向的力,否則小車將不受控制我采用的是ABAB式安裝,這也是常用的組裝方法

減速電機
減速電機種類和樣式簡直是五花八門,價格也是參差不齊,有高標準的小伙伴們建議多了解一下這里面的套路,我用的是最最最普通的TT電機,速度不是很快,加5V電壓的話轉速在190r/min左右,主要是性價比讓我動心,尤其是對于經濟困難的我來說,這種幾塊錢一個的電機再合適不過了,另外一個要注意的是電機和輪子連接著一塊要著重看看

主控模塊
原本是準備用stm32的板子的,但是還沒學完,就先用51單片機湊合用,其實對于玩玩來說51就夠了,編程也簡單,這次不是用的傳統的帶底座的單片機,而是選擇了一款新的貼片封裝的,看起來要輕巧一些,其實功能都一樣,只是這款的TXD和RXD沒有標注出來,學過的朋友應該知道其實就是P30和P31兩個IO口,關于單片機的知識我不多說,不會的朋友請先簡單學習學習,另外,這款板子容易自鎖,導致stc一直檢測不到單片機,這時候只需要把P10和P11兩個IO口同時接地即可,源程式將在文末貼出來

電源模塊
電源標稱電壓5V就夠了,重點是要容量大,我用的是4000mAh的,容量太小跑一會兒就沒電了影響體驗

驅動模塊
我選擇的是一個集成的四路驅動,其他都挺好,可能散熱差一點,有條件的可以選其他帶散熱片的驅動,驅動的選擇不會影響程式的撰寫

藍牙模塊
藍牙模塊也有很多種,我用的是藍牙2.0的HC-06主從一體模塊,某寶上價格不一,推薦在經常去的店買,有保障,相對于HC-05來說這款更簡便,上電就是AT模式,AT指令集我放在下面的鏈接里了,自取,手機端用的是SPP藍牙助手


鏈接:https://pan.baidu.com/s/1RxVXp85P2vCJ9Oy9LTLdzA
提取碼:YYDS
舵機
SG90舵機,需要給定持續輸出的占空比0.5MS~2.5MS、周期20MS的方波才能轉動,0.5MS對應-90°,2.5MS對應90°,SG90舵機角度極限是180°

軟體部分
軟體以及串口驅動
編譯軟體:Keil4
燒錄軟體:stc-isp
串口驅動:CH340
源程式
/**************************************************************
***名稱: 藍牙遙控小車
***作者: ZhangGe0404
***創作日期: 2021.1.19
***晶振: 12M
/*************************************************************/
#include<reg52.h>
#include<intrins.h>
sbit In1=P2^0; //左前電機
sbit In2=P2^1;
sbit In3=P2^2; //右前電機
sbit In4=P2^3;
sbit In5=P2^4; //左后電機
sbit In6=P2^5;
sbit In7=P2^6; //右后電機
sbit In8=P2^7;
sbit SG_PWM=P1^5;//舵機控制端
#define uchar unsigned char //宏定義
/*****************************
***定義全域變數
/****************************/
uchar count=0; //計數變數
uchar PWM_count=15; //預設變數
uchar a=0;
/**************************************************
***初始化定時器函式
/*************************************************/
void Timer_Init()
{
TMOD=0x01; //設定定時器模式為1
TH0=0xfe;
TL0=0xa4; //設定定時器初值為0.1MS
ET0=1; //打開定時器0中斷
TR0=1; //定時器0開始計時
EA=1; //開總中斷
}
/*************************************************
***定時器0中斷處理函式
/************************************************/
void Timer() interrupt 1
{
TR0=0; //停止計時
TH0=0xfe;
TL0=0xa4; //重裝初值
if(count <= PWM_count)
{
SG_PWM=1; //舵機控制端給高電平
}
else
{
SG_PWM=0; //低電平
}
count++;
if(count >= 200) //周期20MS
{
count=0;
a++;
}
TR0=1;
}
/************************************************
***前進
/***********************************************/
void forward()
{
In1=1;
In2=0;
In3=1;
In4=0;
In5=1;
In6=0;
In7=1;
In8=0;
}
/************************************************
***整體左行
/***********************************************/
void left()
{
In1=0;
In2=1;
In3=1;
In4=0;
In5=1;
In6=0;
In7=0;
In8=1;
}
/************************************************
***整體右行
/***********************************************/
void right()
{
In1=1;
In2=0;
In3=0;
In4=1;
In5=0;
In6=1;
In7=1;
In8=0;
}
/************************************************
***后退
/***********************************************/
void back()
{
In1=0;
In2=1;
In3=0;
In4=1;
In5=0;
In6=1;
In7=0;
In8=1;
}
/************************************************
***整體左旋
/***********************************************/
void tleft()
{
In1=0;
In2=1;
In3=0;
In4=1;
In5=1;
In6=0;
In7=1;
In8=0;
}
/************************************************
***整體右旋
/***********************************************/
void tright()
{
In1=1;
In2=0;
In3=1;
In4=0;
In5=0;
In6=1;
In7=0;
In8=1;
}
/************************************************
***向左前方
/***********************************************/
void lefor()
{
In1=1;
In2=0;
In3=0;
In4=0;
In5=0;
In6=0;
In7=1;
In8=0;
}
/************************************************
***向右前方
/***********************************************/
void rifor()
{
In1=0;
In2=0;
In3=1;
In4=0;
In5=1;
In6=0;
In7=0;
In8=0;
}
/************************************************
***向左后方
/***********************************************/
void leback()
{
In1=0;
In2=1;
In3=0;
In4=0;
In5=0;
In6=0;
In7=0;
In8=1;
}
/************************************************
***向右后方
/***********************************************/
void riback()
{
In1=0;
In2=0;
In3=0;
In4=1;
In5=0;
In6=1;
In7=0;
In8=0;
}
/************************************************
***停止
/***********************************************/
void ting()
{
In1=0;
In2=0;
In3=0;
In4=0;
In5=0;
In6=0;
In7=0;
In8=0;
}
/************************************************
***串口中斷初始化
/***********************************************/
void UsartConfiguration()
{
SCON=0x50; //設定作業方式1 開啟接受允許
TMOD=0x20; //設定T1作業方式為2
PCON=0x00; //波特率不倍增
TH1=0xfd; //設定計數器1初值,決定波特率
TL1=0xfd;
TR1=1; //打開計數器1
ES=1; //打開串口接收中斷
EA=1; //開總中斷
}
/************************************************
***串口中斷處理函式
/***********************************************/
void Com_Int(void) interrupt 4
{
uchar receive_data; //定義資料接收存盤變數
EA=0; //關總中斷
if(RI == 1) //是否接受到資料
{
RI=0; //標志位清零
receive_data=SBUF; //資料暫存
if(receive_data == '1')
{
forward();
}
else if(receive_data == '2')
{
back();
}
else if(receive_data == '3')
{
left();
}
else if(receive_data == '4')
{
right();
}
else if(receive_data == '5')
{
tleft();
}
else if(receive_data == '6')
{
tright();
}
else if(receive_data == '7')
{
lefor();
}
else if(receive_data == '8')
{
rifor();
}
else if(receive_data == '9')
{
leback();
}
else if(receive_data == 'a')
{
riback();
}
else if(receive_data == '0')
{
ting();
}
else if(receive_data == 'c')
{
PWM_count=5;
}
else if(receive_data == 'd')
{
PWM_count=25;
}
}
EA=1; //重新打開總中斷
}
/************************************************
***主函式
/***********************************************/
void main(void)
{
Timer_Init();
UsartConfiguration();
while(1);
}
總結
成果展示

心得體會
在整個搭車程序中還是遇到了很多困難,比如藍牙模塊的除錯,最初經常意外斷開連接,檢查才發現是供電電壓太高,除此之外,單片機的自鎖也很頭疼,商家解決不了,通過不斷的搜索才找到解決方案,做一輛車的程序其實也是一個鍛煉心智的程序,不斷的試錯,不斷的更新換代,這一切光靠一腔熱血是換不來的,還要有扎實的技識訓礎和敏捷的思維,看著自己一點一點做出來的車正常跑的時候,心里是甜的,希望這篇文章能給志同道合的朋友提供一點參考,少走彎路,
#####部分圖片來源于網路,如有侵權,聯系洗掉#####
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/253004.html
標籤:其他
