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