本文講解手機(jī)藍(lán)牙如何遙控小車,如何編寫串口通信指令
第14章-手機(jī)遙控功能
我們要實(shí)現(xiàn)藍(lán)牙遙控功能,藍(lán)牙遙控功能要使用:1.單片機(jī)的串口、2.藍(lán)牙通信模塊
所以我們先調(diào)試好:單片機(jī)的串口->藍(lán)牙模塊->接到一起聯(lián)調(diào)
14.1-電腦控制小車
完成功能:電腦連接單片機(jī)串口三 控制小車前進(jìn)后退
先看原理圖
通過原理圖可以看出這是使用的串口3 在使用的時(shí)候注意把跳線帽,跳線到藍(lán)牙通信位置
打開初始化軟件
生成代碼
在main 定義全局變量
uint8_t g_ucUsart3ReceiveData; //保存串口三接收的數(shù)據(jù)
開啟串口三中斷接收
HAL_UART_Receive_IT(&huart3,&g_ucUsart3ReceiveData,1); //串口三接收數(shù)據(jù)
在usart.c 重新實(shí)現(xiàn)串口中斷回調(diào)函數(shù)
然后我們可以在中斷回調(diào)函數(shù)里面中編寫遙控命令控制邏輯了
//串口接收回調(diào)函數(shù)
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if( huart == &huart3)//判斷中斷源
{
if(g_ucUsart3ReceiveData == 'A') motorPidSetSpeed(1,1);//前運(yùn)動(dòng)
if(g_ucUsart3ReceiveData == 'B') motorPidSetSpeed(-1,-1);//后運(yùn)動(dòng)
if(g_ucUsart3ReceiveData == 'C') motorPidSetSpeed(0,0);//停止
if(g_ucUsart3ReceiveData == 'D') motorPidSetSpeed(1,2);//右邊運(yùn)動(dòng)
if(g_ucUsart3ReceiveData == 'E') motorPidSetSpeed(2,1);//左邊運(yùn)動(dòng)
if(g_ucUsart3ReceiveData == 'F') motorPidSpeedUp();//加速
if(g_ucUsart3ReceiveData == 'G') motorPidSpeedCut();//減速
HAL_UART_Receive_IT( &huart3, &g_ucUsart3ReceiveData, 1);//繼續(xù)進(jìn)行中斷接收
}
}
在usart.c中聲明外部變量
extern uint8_t g_ucUsart3ReceiveData; //保存串口三接收的數(shù)據(jù)
然后我們更改一下 主函數(shù)內(nèi)容,把PID紅外循跡代碼注釋掉,然后我們?cè)黾哟谌妮敵觯员阄覀兒竺嬗^察數(shù)據(jù)。
串口不定長輸出
我們把轉(zhuǎn)速等信息都可以顯示在OLED上,那么如何通過串口輸出那?
sprintf((char )Usart3String,"V1:%.2fV2:%.2frn",Motor1Speed,Motor2Speed);//顯示兩個(gè)電機(jī)轉(zhuǎn)速 單位:轉(zhuǎn)/秒
HAL_UART_Transmit(&huart3,( uint8_t *)Usart3String,strlen(( const char *)Usart3String),50);//阻塞式發(fā)送通過串口三輸出字符 strlen:計(jì)算字符串大小
sprintf((char *)Usart3String,"Mileage%.2frn",Mileage);//計(jì)算小車?yán)锍?單位cm
HAL_UART_Transmit(&huart3,( uint8_t *)Usart3String,strlen(( const char *)Usart3String),50);//阻塞式發(fā)送通過串口三輸出字符 strlen:計(jì)算字符串大小
sprintf((char *)Usart3String,"U:%.2fVrn",adcGetBatteryVoltage());//顯示電池電壓
HAL_UART_Transmit(&huart3,( uint8_t *)Usart3String,strlen(( const char *)Usart3String),50);//阻塞式發(fā)送通過串口三輸出字符 strlen:計(jì)算字符串大小
HAL_Delay(5);
把之前PID初始化時(shí)候速度PID目標(biāo)值改成0
然后我們測(cè)試
硬件連接
我們現(xiàn)在使用USB-TTL連接串口三,單片機(jī)串口三與電腦通信(底板不需要插入藍(lán)牙)
然后打開軟件
發(fā)送指令小車就會(huì)對(duì)應(yīng)運(yùn)動(dòng)
在電腦串口軟件查看輸出信息、發(fā)送 指令控制小車運(yùn)動(dòng)
14.2-手機(jī)藍(lán)牙控制小車
功能:藍(lán)牙遙控小車前進(jìn)、后退、停止、左右轉(zhuǎn)、加速、減速、手機(jī)顯示數(shù)據(jù)
藍(lán)牙模塊和電腦通信
藍(lán)牙模塊-硬件介紹
使用:HC-05 主從機(jī)一體藍(lán)牙串口透傳模塊
注意: 供電3.6V-6V(最好5V)
引腳順序 VCC GND TXD RXD
先調(diào)試藍(lán)牙模塊-設(shè)置波特率
如圖先把藍(lán)牙模塊通過USB-TTL模塊相連接,然后
如果反復(fù)測(cè)試不能進(jìn)入AT模式,可能是新版藍(lán)牙模塊,
- 先連接好藍(lán)牙模塊的幾根線,然后按住藍(lán)牙模塊的按鍵
- 然后連接電腦,然后幾秒后藍(lán)牙小燈慢閃,說明進(jìn)入AT模式
- 然后串口助手通過38400發(fā)送設(shè)置指令:AT+UART=115200,0,0
- 然后收到OK數(shù)據(jù),說明設(shè)置成功。
這個(gè)是設(shè)置波特率截圖
5. 然后重新拔插藍(lán)牙模塊(不用按按鍵)
- 在手機(jī)系統(tǒng)藍(lán)牙配對(duì)HC-50 密碼1234
- 串口助手設(shè)置波特率115200,然后打開手機(jī)APP發(fā)送任意內(nèi)容測(cè)試
這個(gè)是后面通信測(cè)試截圖
8. 設(shè)置按鍵-按照代碼設(shè)置按下發(fā)送的數(shù)據(jù)
9.
藍(lán)牙模塊連接單片機(jī)
把藍(lán)牙插入到底板、跳線帽選擇藍(lán)牙通信
按下不同按鈕小車會(huì)對(duì)應(yīng)控制
聯(lián)系:Q,1930299709