樹莓派多旋翼無人機製作:航模電池與電機驅動
來自專欄 編程外星人
一、電源與降壓模塊
細心的你可能會發現樹莓派、光耦隔離器、電調、電機都有了,可還是沒有電源。沒電當然不行了,我們的四軸動力靠的就是電池。對於鋰電池的選擇也是多種多樣的,但是我們將在稍後說明。現在我們要說的是樹莓派的供電。我們還要使用一個DCDC降壓模塊來對鋰電池的電源穩壓:
由航模電池的電源引出5條線,其中4條為4個電調供電,另外一條接DCDC降壓模塊的IN端,其OUT端為樹莓派供電。接入時暫時不要接樹莓派,先用萬用表測量OUT端電壓, 用螺絲刀旋轉金屬旋鈕逆時針為減小,順時針為增大(剛開始旋轉時電壓可能不變,要逆時針旋轉七到八圈,電壓才會發生變化)並調整到5V,接入時要注意正負極不能接反。最後再接入樹莓派的5v和GND。 接下來,看看我們的四軸飛機器供電電池,通常我們使用3節鋰電池或4節鋰電池為四軸供電,也有使用更多節的比如6節、8節或更多。電源中有幾節鋰電池,我們就稱這樣的電源為幾S。例如3S表示有3節鋰電池,4S有4節鋰電池等等。每一節鋰電池的電壓為3.7v,3S的電壓就是11.1v;4S的電壓就是14.8;6S的電壓就是22.2v。這樣的鋰電池電源,我們也通常稱作「航模電池」。
另外,對於航模電池還有兩個重要的參數:電量和放電倍率。電量就是我們所常用的3000mah、4000mah、5300mah或10000mah等等。它表示了電源能夠存儲的電能的多少。而放電倍率通常是有15C、20C、25C或30C等等。它的意思是說放電的速率。例如:我們手機有一塊10000mah 20C的電池。 1、按每小時10000毫安的放電速度持續放電1個小時; 2、以5倍速度放電,即以每小時50000毫安的放電速度持續放電12分鐘(60 / 5);3、以10倍速度放電,即以每小時100000毫安的放電速度持續放電6分鐘(60 / 10);
4、以20倍速度放電,即以每小時200000毫安的放電速度持續放電3分鐘(60 / 20)。 至於在實際飛行過程中它按多少的倍率放電,主要取決於電調和電機的功率。關於這些功率計算和放電時間的計算不是我們的討論範疇(如果你有興趣可以自己查閱相關資料)。我們推薦使用2200mah 3S航模電池:值得一提的是,不是電池容量越大就越適合四軸,電池的容量大,重量也就大,四軸飛行時的承重也就大,需要的負載也就大。如果你的電池非常重,那四軸能不能飛起來都是個問題,所以還是選擇一款適合你的航模電池。
二、無刷電機驅動
接下來我們就來一起編寫無刷電機的驅動程序,在前面章節中我們已經學習了如何通過樹莓派產生PWM信號,而在本節中我們就來實際操作一下,將電機接入電調,將電調的信號線接入樹莓派的GPIO引腳上,通過航模電池為電調和樹莓派(加入DCDC降壓模塊輸出5V給樹莓派)供電,在這裡我們使用wiringPi的1號引腳,接線圖如下:
在接線過程中有一處需要注意,電調中的信號線有3根,顏色為紅、黑、白。紅色為信號電源,黒色為地,白色為PWM信號線,我們只需要接電調的信號線(白色)至樹莓派的WiringPi 1號引腳,並將地線(黑色)接入到樹莓派的GND引腳即可,電源(紅色)不需要接入樹莓派。如果你採用了光耦隔離器的話同樣只需要接WiringPi 1和GND即可。
關於無刷電調控制電機時,有兩個地方需要關註:
1.電調最大行程校準。電調在出廠後如果沒有做最大行程校準,我們就需要對其做校準。這樣可以保證我們的四軸中4個電機速基本一致,從最低速度到最大速度的基本相同。做電調的最大行程校準的步驟如下:
- 按上圖接線,注意不要為電調上電(暫時不為電調接入電源)。
- 使用樹莓派生成最大PWM占空比值,即產生100%占空比信號,此時高電平持續2ms,低電平0ms,注意要有高低電平變化,如果電平一直是高則此PWM信號無效。
- 為電調上電,此時電機會發出兩聲短促的「嘀」聲,在3秒之內將PWM信號由100%變為0%,隨後電機會發出一聲長鳴「嘀」。此時電調最大行程校準完成。
2.電調信號初始化。電調信號初始化相對來說比較簡單。為了保證使用安全,電調在上電後是處於保護狀態的,此時如果直接為電調發送100%的信號電機是不會轉動的。在使用電調之前,首先要對其發送超過3秒的0%的PWM信號,電調才會認為使用者初始化了電調,隨後才可以根據PWM信號值來調整電機的轉速。電調初始化的過程如下:
- 按上圖接線,並為電調上電,此時電調先會產生一次「do ra mi」,隨後每兩秒會發出一聲短促的「嘀」聲,表示未收到任何PWM信號。
- 使用樹莓派生成最小的PWM占空比值,即產生0%占空比信號,持續3秒以上,此時電調會產生3短1長的「嘀」聲(3短表示是3S鋰電池),此時電調初始化完成。
最後我們來編寫一個可以對GPIO引腳產生PWM信號的程序:
#include <stdio.h>#include <unistd.h>#include <pthread.h>#include <wiringPi.h>#include <wiringSerial.h>int port = 1;int run = 1;int speed = 0;void motor_run(){ while (run) { digitalWrite(port, HIGH); usleep(1000 + speed); digitalWrite(port, LOW); usleep(1000 - speed); }}void set_speed(){ while (run) { printf("SPEED = %4d, Enter new speed:
", speed); int tmp = 0; scanf("%d", &tmp); if (tmp >= 0 && tmp <= 1000) { speed = tmp; continue; } speed = 0; usleep(10 * 1000); run = 0; }}int main(int argc, char *argv[]){ wiringPiSetup(); pinMode(port, OUTPUT); pthread_t p_run; pthread_t p_set; pthread_create(&p_run, (const pthread_attr_t*) NULL, (void* (*)(void*)) &motor_run, NULL); pthread_create(&p_set, (const pthread_attr_t*) NULL, (void* (*)(void*)) &set_speed, NULL); pthread_join(p_set, NULL); pthread_join(p_run, NULL); return 0;}
注意,這裡我們產生的PMW信號是一個0~1000的數值,其實就是千分比0‰~1000‰。這樣我們就可以用最簡單的0~1000來表示一個比較精確的PWM信號,如果使用百分比來表示的話我們就需要使用浮點數來表示0%、0.10%、12.8%、93.5%這樣的數值,而使用千分比則只需要用整型數值0、10、128、935即可表示。
程序中我們創建了兩個線程,第一個線程motor_run用於產生PWM信號,第二個線程set_speed用於接收用戶輸入的值從而修改PWM的值。
SPEED = 0, Enter new speed: 100SPEED = 100, Enter new speed: 200SPEED = 200, Enter new speed: 400SPEED = 400, Enter new speed: 1000SPEED = 1000, Enter new speed: 0SPEED = 0, Enter new speed:
到這裡,我們的電機驅動部分就完成了,程序非常簡單,在我們使用四軸飛控程序時只需要產生4個線程分別對4個GPIO引腳分別產生4路PWM。
注意,樹莓派供電模塊由原來的7805穩壓器修改為DC-DC電源模塊,使用DC-DC電源模塊效果更好,發熱更小,支持的電壓範圍更大。
使用DC-DC時,輸入端接入充滿電的航模電池,輸出端先不要接線,而需要一邊調整DC-DC的旋鈕,一邊用萬用表測量OUT端電壓,直到OUT端電壓為5V時停止。
歡迎關注公眾號:編譯外星人
推薦閱讀:
TAG:四軸飛行器 | 無人機Drone | 樹莓派RaspberryPi |