繼電路城之前上傳的2篇手機(jī)遙控藍(lán)牙小車資料:
手機(jī)遙控藍(lán)牙平衡小車V1資料全部開源,https://www.cirmall.com/circuit/6201/detail?3
手機(jī)遙控藍(lán)牙平衡小車V1.1資料開源,https://www.cirmall.com/circuit/6202/detail?3
現(xiàn)在介紹該手機(jī)遙控十分mimi藍(lán)牙小車V2版本設(shè)計(jì),https://www.cirmall.com/circuit/6204/detail?3
CannonRobot將會(huì)擁有的功能如下:
- 1. 手機(jī)遙控小車兩輪行走
- 2. 包括兩個(gè)手臂,一個(gè)頭部,共5個(gè)舵機(jī)
- 3. 手臂可以接取東西,可以在地上自動(dòng)爬起來(lái)
- 4. 可以反饋電池電量到手機(jī)
- 5. MP3播放,錄音
- 6. 手機(jī)調(diào)參軟件
- 7. 支持無(wú)頭模式、方向盤模式、重力感應(yīng)模式
- 8. 運(yùn)行微型操作系統(tǒng)
- 9. 慣性導(dǎo)航(待定)
- 10. 智能語(yǔ)音(待定)
- 11. 智能避障(待定)
- 12. 物聯(lián)網(wǎng)智能家居功能(待定)
硬件組成:
這次的小車將會(huì)十分mini,主控芯片采用小鋼炮開發(fā)板,上面集成了stm32f401,BlueNRG,陀螺儀,加速度計(jì),磁力計(jì),溫度計(jì),濕度計(jì),壓強(qiáng)計(jì),TF卡槽。電機(jī)驅(qū)動(dòng)是TB6612,語(yǔ)音芯片采用WM8978,測(cè)距我想采用VL53L0,目前這款芯片現(xiàn)在還未量產(chǎn)。
小車主要是由一塊小鋼炮開發(fā)板、一塊PCB板、一塊STA350BW語(yǔ)音板、三個(gè)舵機(jī)、小車支架組成,相關(guān)物料見“相關(guān)文件”下載。舵機(jī)粘在了面板上,將語(yǔ)音板粘在舵機(jī)上,喇叭粘在語(yǔ)音板上,所有的接線全是用細(xì)線焊接出來(lái)的,實(shí)在是不好看呢。其中還需要將LED燈拆下,因?yàn)檎Z(yǔ)音的IIC使用的是PB3與PB10,并沒有使用板子留出的IIC,PB3正好是LED燈的接口,IIC這里需要注意加一個(gè)上拉電阻,不加也可以,不過(guò)偶爾會(huì)出現(xiàn)干擾的情況。
注意:上面的電源模塊需要先調(diào)好5V電壓然后才焊接上去。如果沒有使用舵機(jī)和語(yǔ)音那么下面的6V電壓模塊就可以不焊接了。
視頻演示:
主要文件:
STM32端源碼使用KEIL5打開,主要文件及功能如下:
代碼運(yùn)行流程:
整個(gè)代碼分為兩個(gè)部分,一個(gè)是被操作系統(tǒng)接管的部分,一個(gè)是獨(dú)立與操作系統(tǒng)的部分。獨(dú)立于操作系統(tǒng)的部分主要是用來(lái)控制小車直立,主要是出于實(shí)時(shí)性的考慮。被操作系統(tǒng)接管的部分,主要是為了享受操作系統(tǒng)帶來(lái)的便利。
先來(lái)看看獨(dú)立于操作系統(tǒng)的部分,這里主要是由兩個(gè)中斷驅(qū)動(dòng)的,IMU配置為fifo模式,閾值設(shè)為6,開啟中斷,IIC使用DMA傳輸,開啟中斷。因此流程為IMU的fifo充滿6個(gè)12位數(shù)據(jù)觸發(fā)外部引腳中斷,在中斷函數(shù)中利用IIC的DMA讀取,讀取完進(jìn)入IIC中斷,中斷函數(shù)中處理數(shù)據(jù),并進(jìn)行小車控制。這里的中斷不想讓操作系統(tǒng)接管,主要原因是為了增強(qiáng)實(shí)時(shí)性,同時(shí)也使得系統(tǒng)變得簡(jiǎn)單。
(Tips:IMU的IIC頻率可以設(shè)置為1MHz,IMU的pulling模式讀取數(shù)據(jù)需要將CTRL3_C寄存器中的BDU位置1,不然會(huì)有小概率出現(xiàn)錯(cuò)值)
操作系統(tǒng)部分,初始化函數(shù)在on_ready();都是直接初始化,藍(lán)牙的初始化在有專門在初始化任務(wù)執(zhí)行,這是因?yàn)樗{(lán)牙的初始化會(huì)有SPI引腳中斷,而由于SPI是非可重入函數(shù),這里做了互斥量所以這里SPI中斷被操作系統(tǒng)接管了。任務(wù)包括:藍(lán)牙接收任務(wù),藍(lán)牙發(fā)送任務(wù),音樂播放任務(wù)(當(dāng)無(wú)TF不會(huì)初始化),音樂播放控制任務(wù)(當(dāng)無(wú)TF不會(huì)初始化),LED閃爍任務(wù)(當(dāng)有TF時(shí)時(shí)不會(huì)初始化),電壓發(fā)送函數(shù),主函數(shù)任務(wù),SPI中斷任務(wù),藍(lán)牙初始化任務(wù),任務(wù)的初始化后都有注釋。以后也許還會(huì)有更多的任務(wù)。
藍(lán)牙數(shù)據(jù)協(xié)議:
JUMA的藍(lán)牙包將原本20字節(jié)的數(shù)據(jù)變成了1字節(jié)的type,1字節(jié)長(zhǎng)度,18字節(jié)的數(shù)據(jù)。本協(xié)議中type發(fā)送與接收永遠(yuǎn)都是1,這里可以理解為數(shù)據(jù)幀頭吧,然后長(zhǎng)度的這一字節(jié)沒有用到,怕不準(zhǔn),因?yàn)锳ndroidSDK發(fā)送是1字節(jié)type,后面接著數(shù)據(jù),長(zhǎng)度自動(dòng)計(jì)算出來(lái)的,這個(gè)并不可靠。然后后面18個(gè)字節(jié)的數(shù)據(jù),第一個(gè)字節(jié)是數(shù)據(jù)的ID,因?yàn)閺腁PP發(fā)送過(guò)來(lái)的數(shù)據(jù)類型相當(dāng)多(目前有7個(gè)),所以需要將數(shù)據(jù)都一一編號(hào),這就是ID的作用了,除了數(shù)據(jù)ID有宏定義,還有數(shù)據(jù)的長(zhǎng)度,這個(gè)主要是用來(lái)更加準(zhǔn)確解碼數(shù)據(jù),中間的數(shù)據(jù)因?yàn)轭愋筒煌獯a方式也不同,在宏定義處有解釋,數(shù)據(jù)最后一位是CkeckSum。
小車控制:
控制采用的傳統(tǒng)的PID控制,直立采用PD控制,解算出來(lái)的角度乘以P,然后直接用陀螺儀的值乘以D,速度采用PI控制,速度差乘以D,速度的積分乘以I,這里需要將積分限幅限得相當(dāng)?shù)男?,不然前進(jìn)時(shí)需要小車停止,小車會(huì)向前運(yùn)行一段距離然后退回到之前需要停止的點(diǎn)。轉(zhuǎn)向就是其中一個(gè)電機(jī)加上一定的PWM值,另一個(gè)電機(jī)減去相同量的PWM值。APP的轉(zhuǎn)向控制分兩種情況,一種是普通模式的轉(zhuǎn)向控制,一種是朝向模式的轉(zhuǎn)向,朝向模式就是APP虛擬搖桿的方向或者手機(jī)的姿態(tài)就是小車運(yùn)行的方向,普通模式就是給定一個(gè)轉(zhuǎn)向的速度一直不停的旋轉(zhuǎn)。操作模式也分為兩種,一種是使用搖桿,一種是使用手機(jī)的姿態(tài),所以兩兩相乘就產(chǎn)生了四種控制模式。三個(gè)控制直接線性融合,其中速度和直立控制的周期不同,速度控制為50ms,其實(shí)速度是對(duì)直立控制的一種干擾,所以周期需要設(shè)置的長(zhǎng)一些。
小車姿態(tài)解算:
小車使用了兩個(gè)姿態(tài)解算,一個(gè)是使用6軸Mahony算法解算出Pitch,一個(gè)是9軸Mahony用來(lái)解算Yaw,這也就是為啥我會(huì)覺得小車沒用啥高深的技術(shù)和算法的主要原因了,等小車硬件穩(wěn)定后,會(huì)仔細(xì)研究姿態(tài)解算算法和控制算法。
總結(jié):
小車沒有用到什么高深的技術(shù)和算法,全部開源,包括PCB源文件,STM32源文件,Android端源文件,物料采購(gòu)?fù)扑],所有文件都在“相關(guān)文件”下載。大家只需要購(gòu)買好相關(guān)的物料,打板焊接好燒錄程序即可,好像小鋼炮淘寶網(wǎng)站中也有整車購(gòu)買,建了個(gè)QQ群:187045895,歡迎加入。