STM32平衡小車大家應(yīng)該見到過很多了,作為學(xué)生或者DIY愛好者做一輛小型的mini平衡小車還是可以實(shí)現(xiàn)的。給大家?guī)聿┲骼夏咧谱鞯拿阅愕钠胶庾孕熊図?xiàng)目,相信我們能從中學(xué)到一些新東西。在本文將會介紹平衡自行車的具體制作過程,包括機(jī)械、電路和代碼。
本項(xiàng)目要說的簡易mini版平衡小車。
自行車平衡理論
模型分析
1 倒立擺
很顯然我們知道自行車在左右方向上不穩(wěn)定,這是一個很常見的物理模型——倒立擺。
顧名思義,倒立擺的意思就是倒著的擺,比如一個倒著的桿,
倒立擺的特性:不穩(wěn)定,只要偏離平衡位置,就會有一個力(重力的分力)使系統(tǒng)更加偏離平衡位置,這樣偏差就會越來越大。
一般倒立的桿在前后左右方向都有可能倒下,在二維的平面上不穩(wěn)定;而自行車僅在左右方向上可能倒下,是一維的倒立擺,這要簡單一些。
2 自行車的平衡控制
自行車屬于倒立擺模型,倒立擺是不穩(wěn)定的,那么倒立擺應(yīng)該如何控制才能平衡呢?
我們把問題拆分一下:
怎樣的狀態(tài)才叫平衡?
我們能控制的是什么?
如何控制才能穩(wěn)定平衡?
2.1 怎樣的狀態(tài)才叫平衡
我們要對”平衡”進(jìn)行數(shù)學(xué)描述,所謂的平衡其實(shí)就是倒立擺的傾角穩(wěn)定在一個我們想要的值。
通常我們想要平衡在θ = 0處。
2.2 我們能控制的是什么
對于倒立擺模型,通常我們能控制的是底端的力或速度或位置,不同的控制量對應(yīng)的控制方法不同。
對于自行車來說,它的控制方式不像通常的倒立擺那樣直接控制底部,而是間接地通過轉(zhuǎn)向來控制,當(dāng)自行車以一個固定的速度前進(jìn)時,自行車把手以一定角度進(jìn)行轉(zhuǎn)向(設(shè)為α),自行車會做相應(yīng)半徑的圓周運(yùn)動,產(chǎn)生相應(yīng)大小的”離心力”。
在自行車這個費(fèi)慣性系里看來,只要對把手進(jìn)行一定角度的轉(zhuǎn)向(α),就會產(chǎn)生一個相應(yīng)大小的橫向力:
這就是我們進(jìn)行平衡控制時的實(shí)際控制量——把手轉(zhuǎn)角α,只要控制它就能控制回復(fù)力。
2.3 如何控制才能平衡
上面我們已經(jīng)能夠通過轉(zhuǎn)向產(chǎn)生回復(fù)力,這個回復(fù)力可以把倒立擺”掰回”平衡位置,有往回掰的回復(fù)力就能穩(wěn)定平衡了嗎?
并不是這樣,我們再來回顧一下中學(xué)物理:
“
過阻尼狀態(tài)的擺會以較慢的速度回到平衡位置;欠阻尼狀態(tài)的擺會很快回到平衡位置,但會在平衡位置來回?cái)[動;臨界阻尼狀態(tài)的擺會以最快的速度穩(wěn)定在平衡位置。
”
結(jié)合到實(shí)際的自行車平衡中就是:
“
如果恢復(fù)力不夠大,就無法矯正,或者矯正速度很慢,這會導(dǎo)致系統(tǒng)不穩(wěn)定;如果回復(fù)力過大,就會導(dǎo)致矯正過度,這也會導(dǎo)致系統(tǒng)不穩(wěn)定;我們最希望的狀態(tài)就是回復(fù)力剛剛好,剛好使倒立擺快速回到平衡位置,又不至于矯正過度。
”
這是一個復(fù)雜的數(shù)學(xué)計(jì)算過程,回復(fù)力大小會在系統(tǒng)運(yùn)行時不斷地計(jì)算(本平衡自行車是20ms計(jì)算一次),用到的是PID算法,會在后面詳細(xì)介紹。
3 自行車平衡需要解決的基本問題
獲取左右方向傾角θ
以合適的算法控制轉(zhuǎn)角α使系統(tǒng)穩(wěn)定平衡
這將會在下面詳細(xì)討論。
姿態(tài)檢測
1 檢測的是什么
檢測的是自行車左右傾斜的角度。
2 怎么檢測
用一個叫g(shù)y521的模塊,里面用的是mpu6050芯片,帶有陀螺儀和加速度傳感器。
gy521的具體使用會在第三篇-實(shí)踐篇介紹,這里我們知道通過這個模塊我們可以得到自行車各個方向的加速度和角速度。注意哦,我們不能直接得到傾斜角度,我們的到的是各個方向的加速度和角速度,需要進(jìn)行一些復(fù)雜的計(jì)算才能得到正確的傾斜角度。
常用的算法有互補(bǔ)平衡濾波、卡爾曼濾波。
PID算法
前面已經(jīng)分析了,我們通過控制把手轉(zhuǎn)角來控制回復(fù)力,我們需要實(shí)時計(jì)算一個合適的回復(fù)力使系統(tǒng)穩(wěn)定平衡。
有一個小球在光滑球面上,小球的位置是x,光滑球面頂端在L處,我們可以控制小球水平方向力F,現(xiàn)在要求讓小球穩(wěn)定平衡在x0處。
先看簡單情況x0=L,此時偏差為L-x,
我們給出一個比例項(xiàng)(P) F = kp*(L-x),這樣就會有一個回復(fù)力,當(dāng)偏差存在時就會有一個力把小球拉回L處。
這存在的問題是,小球接近L時是會有一定速度的,小球越來越接近L,此時的力仍然是在把小球往L處拉,這會導(dǎo)致小球到達(dá)L時(我們想要的位置)速度很大,小球無法立刻停下來,而是會沖過去。
這樣小球就會在L附近來回?cái)[動,這是不穩(wěn)定的狀態(tài),屬于欠阻尼狀態(tài)。
為了解決上述問題需要加一個微分項(xiàng)(D) F = kd*dx/dt = kd*v,所謂”微分”指的是位置x對時間的微分,說白了就是速度。
意思就是當(dāng)速度越大,就產(chǎn)生一個反向的力使速度減小,這樣就可以防止出現(xiàn)上面小球沖過去的。
可以認(rèn)為這一項(xiàng)具有”預(yù)測”功能,預(yù)測小球下一時刻的狀態(tài)從而提前做出反應(yīng),預(yù)測小球?qū)⒁竭_(dá)L處,提前減速。
也可以認(rèn)為這一項(xiàng)具有阻尼作用,相當(dāng)于系統(tǒng)中有一個和速度成比例的阻尼力。
這個”阻尼力”調(diào)得過小會導(dǎo)致欠阻尼狀態(tài),調(diào)得過大會導(dǎo)致過阻尼狀態(tài)。
積分項(xiàng)此時可以不用,積分項(xiàng)是當(dāng)平衡位置x0不等于L時使用的,
當(dāng)平衡位置不是L處,那么當(dāng)小球靜止在平衡位置x0時,由于在坡道上會有一個恒定的橫向偏移力,此時比例調(diào)節(jié)作用為0(Δx=0),微分調(diào)節(jié)作用也是0(v=0),所以小球在該處無法平衡,會在更遠(yuǎn)離平衡位置處達(dá)到平衡,那么就會有一個長時間存在的偏差。
積分作用就是檢測偏差進(jìn)行累積,對于上面這個長時間存在的偏差進(jìn)行積分(累積疊加),使系統(tǒng)在長時間范圍可以穩(wěn)定在要求的平衡位置。
平衡自行車-實(shí)踐篇
在本文將會介紹平衡自行車的具體制作過程,包括機(jī)械、電路和代碼。
材料
機(jī)械
電路
動力部分
傳動方式
如圖,我用的是皮帶或者齒輪傳送的方式,因?yàn)楸容^好實(shí)現(xiàn)。
電機(jī)選擇
這個DIY是不考慮變速情況的,平衡的參數(shù)都是按照一個固定速度調(diào)的。
所以動力部分的作用就是提供一個恒定的速度,并且這個速度盡可能穩(wěn)定,盡可能不受外部影響。
電機(jī)應(yīng)選擇扭力大一些、轉(zhuǎn)速穩(wěn)定的減速電機(jī)。
電機(jī)供電
電機(jī)是直接供電還是使用升壓模塊供電要根據(jù)電機(jī)特性,有些電機(jī)用升壓模塊可以提高功率,有些大電流電機(jī)用升壓模塊反而可能限制了電流。
我這里用升壓模塊升到12v給N20電機(jī)供電的。
另外,電機(jī)通過三極管受stm32控制,通過控制占空比也可以限制電機(jī)輸出的功率。
轉(zhuǎn)向部分
轉(zhuǎn)向部分用一個舵機(jī)帶動把手轉(zhuǎn)動即可。
電路
在GitHub工程里有詳細(xì)的引腳連接表
https://github.com/nicekwell/balance_bike
供電
用3.3v穩(wěn)壓芯片給整個控制系統(tǒng)供電,包括單片機(jī)、GY521模塊、藍(lán)牙模塊。
用5v穩(wěn)壓芯片給舵機(jī)供電。
用12v升壓模塊給電機(jī)供電。
我是用串口給stm32下載程序的。
GY521
3.3v
GND
PB0 GY521 I2C SCL
PB1 GY521 I2C SDA (用的是IO模擬i2c)
電機(jī)
點(diǎn)擊用12v升壓模塊供電,由于不需要反轉(zhuǎn),用三極管即可直接驅(qū)動,電路圖如下:
加三極管的目的是為了可以通過調(diào)節(jié)PWM占空比來限制輸出功率,但我的實(shí)際情況是100%輸出時動力才勉強(qiáng)足夠。相關(guān)推薦:STM32中PWM的配置與應(yīng)用詳解。所以如果你不需要限制電機(jī)輸出功率,或者通過其他方式限制輸出功率,也可以不要三極管,不通過單片機(jī)控制。
舵機(jī)
舵機(jī)是用5v供電的,而單片機(jī)是3.3v電平,對于PWM控制腳可以通過2個三極管實(shí)現(xiàn)同相的電平轉(zhuǎn)換:
藍(lán)牙模塊
下圖是我使用的藍(lán)牙串口模塊,可以實(shí)現(xiàn)串口透傳,只需要4根線連接:vcc、gnd、txd、rxd。
藍(lán)牙模塊是用來調(diào)試和遙控的,沒有它也能跑。建議還是加上這個模塊,在調(diào)試PID擦數(shù)時會非常方便。相關(guān)文章:PID算法原理介紹。
代碼結(jié)構(gòu)
代碼提交在GitHub,點(diǎn)擊閱讀原文直達(dá)。
主要分為3個部分:
基礎(chǔ)的驅(qū)動程序,實(shí)現(xiàn)電機(jī)、舵機(jī)、gy521數(shù)據(jù)讀取;
平衡控制系統(tǒng),核心是一個20ms定時器,每20ms進(jìn)行一次數(shù)據(jù)采集、計(jì)算和響應(yīng);
遙控和調(diào)試系統(tǒng),實(shí)現(xiàn)log輸出、接收遙控信息。
平衡控制
main函數(shù)會初始化一個定時器20ms中斷一次,調(diào)用 main/balance.c 里的 balance_tick 函數(shù),平衡算法在 main/balance.c 實(shí)現(xiàn)。
每20ms到來會執(zhí)行一次:
讀取傳感器加速度和角速度信息。
互補(bǔ)平衡濾波計(jì)算當(dāng)前姿態(tài)。
用PID算法計(jì)算出前輪轉(zhuǎn)角。
遙控和調(diào)試
兩部分:狀態(tài)輸出和指令接收。
狀態(tài)輸出
在main函數(shù)的while循環(huán)里,利用串口中斷構(gòu)建一個簡單的界面顯示狀態(tài)。
指令接收
串口接收到的數(shù)據(jù)會傳給main/control.c,該文件分析串口數(shù)據(jù),解釋成相應(yīng)的操作。主要是PID參數(shù)調(diào)節(jié)。
點(diǎn)擊閱讀原文,可以獲取平衡自行車完整的代碼
老倪
http://nicekwell.net/blog/20180123/ping-heng-zi-xing-che-shi-jian-pian.html
審核編輯 :李倩
-
模型
+關(guān)注
關(guān)注
1文章
3117瀏覽量
48663 -
平衡小車
+關(guān)注
關(guān)注
1文章
39瀏覽量
12485
原文標(biāo)題:STM32平衡自行車項(xiàng)目,你也可以試試!文末附代碼
文章出處:【微信號:c-stm32,微信公眾號:STM32嵌入式開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論