微型四旋翼飛行器設計經驗之瞎扯淡

Rick_Grimes發表於2017-07-19
在正式開始記錄微型四旋翼飛行器設計的學習筆記之前,感覺自己很有必要先給自己一個總結,也希望能夠幫到更多的朋友少走彎路(雖然不知道幫助大不大)。
去年九月下旬開始了微型四旋翼飛行器的學習與設計,在12月底的時候初步實現了穩定的遙控與飛行,後續又增加了一些常規的輔助的功能,失控保護、姿態微調等等,之後又利用OLED螢幕,設計了一個三級選單,把各種引數的設定,飛控鎖定與通訊的狀態等等一些資訊都整合在一起,利用相應的按鍵,可以很方便的檢視、設定。通過一次一次的優化一些細節,飛行器的飛行效果令人滿意。
 
在此真心要感謝喵嗚實驗室的開源四旋翼專案,我最初的學習標杆就是在參考喵嗚實驗室的小四軸。當然,也有很多朋友參考匿名,圓點博士等等,都是可以的,本人也對比參考了一部分。感謝這些團隊的開源精神。


在開始之前,先吐槽!!!!!!!!!!!!!!!


8位機做多旋翼飛控!?
8位機做飛控!?這是我在設計飛行器期間聽到的最多質疑。甚至很多“德高望重”的老古董老師,從頭到尾把你批判一番,理由是什麼8位機的PWM輸出只有256寬度的計數週期,解析度不夠。。。更有甚者直接放話說8位機就是專科生玩的玩意,本科生用8位機做設計簡直就是xxx。。。面對這樣的言論,我只能選擇呵呵一笑,老古董你可知道MWC飛控,APM飛控的主控ATmage328P也是8位的,但是這並不影響人家引領全球DIY多旋翼的熱潮啊,而且誰告訴你當下的8位機就是你那個年代的8051或者8086?講真,做四旋翼的這個過程,讓我認清了很多東西。至少我們院系是這樣的:喜大好功、什麼東西只認準最高階的、功能只看是不是天花亂墜而不管實際的學習成本。一個老師甚至說,做四旋翼,要把DSP、FPGA、ARM、作業系統神馬的全都搞上。。。但是初期學生學習的時候會遇到什麼具體問題?怎麼能讓他們快速上手少走彎路?四旋翼學習的真正核心在哪裡?很少有人真的關心這些實際問題。“你沒有用STM32,那你就是低端的”,這種言論真的是受夠了。。。
個人認為,不管做任何設計,晶片本身沒有高低端之分,只有適用於不適用之別,根據設計需要不同(時間因素,成本因素,開發難度等等)選擇最合適的晶片和方案,就是最好的。如果說只是因為別人的晶片位數不高或者不夠“高大上”就以此去把別人批判一番,我覺得不是真正搞技術的人該有的心態。
對於初學者來說,尤其是像我這種渣渣,大四本身已經沒有多少學習時間了,並且因為種種原因我沒有實驗室可以進,手邊的STM32學習板是借童鞋的不好一直佔為己用(窮),而且自己學習四旋翼的計劃重點在於姿態與控制演算法的學習,因此我必須讓自己在最短的時間內設計出軟硬體,並且能夠掌握理論知識,那麼綜合考量,我自己用8位機可以節省我自己的時間,把更多的經歷放在學習演算法上,這樣豈不是很高效?我不知道自己的這種學習安排有什麼不好,就因為8位機就不高階了、簡直是笑話。什麼叫8位機只是專科生玩的?老古董就會帶著有色眼鏡看人,專科生比本科生強的,一抓一大把。私以為,只要技術強的,都是應該尊敬的,別管人家是專科還是什麼,技術才是硬道理,學歷真的不能說明什麼。
吐槽半天,到底8位機能不能做多旋翼飛控?答案當然是可以的,在此真的感謝喵嗚實驗室!喵嗚團隊的飛行器恰好就是用8位機作為主控的,型號的STC15W4K32S4系列。我用過這個晶片做平衡車,還是很強大的。網上有一段它和ATMage328P的效能對比:現在的51早已不是當年的51,6路15位硬體PWM+2路CCP的16位硬體PWM,相當於是8路15位硬體PWM,mega328都可以直接秒掉,而mega328卻正是市售MWC飛控的主控,mega328速度16MHZ,等效16MIPS,IAP15W4K61S4@28MHZ,等效25MIPS,運算速度也秒了mega328,也就是說,用51微控制器做四軸絕對不成問題。
(來自:http://bbs.mydigit.cn/read.php?tid=1115916)
老古董打臉不?誰告訴你8位機的PWM計數週期只有256?高速八位機PWM不光是15位的,而且還是硬體PWM,非常好用。

不吐槽了,畢竟是負能量,說句公道話。如果是進階的朋友,需要搞更復雜的功能,比如機器視覺啊,更復雜的演算法啊之類的,傻子都知道當然還是選擇ARM核心的啦。對於初學者,想學習基本演算法,實現基本的飛行,不搞那些高階的玩意的盆友,相信我,這款8位機足夠讓你快速開發四旋翼的軟體了,而且能夠節省很多時間用來學習演算法!根據需求不同,大家合理選擇晶片,才是最好的。千萬不要像我們系的老古董一樣,喜大好功。



以下是經驗談!!!!!!!!


一、四旋翼的學習核心在什麼地方?

這個問題我覺得是每一個想學習四旋翼的盆友都要考慮明白的,四旋翼是一個非常綜合的專案,涉及到了很多專業知識,甚至於非電子專業的知識。因此我們在學習之前,必須先搞清楚我們學習的核心在什麼地方?如果學習四旋翼,只是為了學習硬體程式設計,電路設計,配置一些暫存器,除錯一下IIC通訊,無線通訊之類的,那麼我覺得,這些還不足以是四旋翼學習的核心所在。我個人認為,四旋翼學習的前期,是上面說的到那些部分,需要認真對待,好好除錯。但是到了後期,等這一切都完成了,真正的核心應該回歸到演算法上。如果說硬體電路是骨骼,那麼演算法就是是一個控制系統的靈魂所在。
 
以微型四旋翼飛行器來說,核心演算法大概分為兩個部分:姿態解算演算法與控制演算法。其中姿態解算演算法是核心中的核心!它在很大程度上決定了四旋翼飛行的準確性與穩定性!試想,如果飛行器無法正確計算出自己飛傾角,那麼再好的控制演算法也無法使之保持穩定。
 
因此,有很多盆友跟我說,做四旋翼,主要就是調PID,我只能說你們太不踏實了。我參考了好多個團隊程式碼,真正的姿態解算的核心部分大家幾乎都用的是同一個IMU.C檔案,其實這樣也無所謂,問題的關鍵是,不能只是呼叫人家的核心演算法,在調通程式碼的基礎上,一定要深入瞭解這個演算法是如何把姿態正確計算出來的!知其然一定要儘可能的去知其所以然,否則學到頭,自己依然只是會配置個暫存器,控制外設而已,那麼這樣一來,好像做四旋翼與不做四旋翼並沒有本質的提升,因為輸出PWM,配置箇中斷,除錯個通訊協議,開發板就能做到,還需要四旋翼幹什麼?
對於控制部分的演算法來說,用的最廣泛的就是PID控制了,在此我還是很想跟即將開始設計四旋翼的童鞋們來說,PID控制不應該只是會除錯引數。我們應該儘可能的去理解自動控制原理,去理解反饋的感念,去理解為什麼四旋翼上最常用的是串級PID而不是單級PID。這些內容推薦入門的盆友稍微學習一下《自動控制原理》(胡壽鬆)會有很多好處的。上一次的一個文章是以溫度系統為例,利用Simuink來模擬對比一下不同PID的效果,為的就是能夠動手感受一下不同PID不同引數下的響應特點,使學習PID控制有一個感性的認識。
(連結:http://blog.csdn.net/rick_grimes/article/details/75095315)


二、設計製作四旋翼有什麼快速上手的方法?

這個問題應該也是出初學者最頭疼的問題,市面上飛行器一大堆,航模級別的飛控更是一抓一大把。打著開源旗號的飛控也是很多,但是航模級別的飛控只適合玩,真正想學習的話,APM、MWC之類的真心不合適。以我個人設計方案來說,首先我的學習時間短,不允許我有很多時間去浪費,其次我的方案是想選擇8位機。因此我選擇了先軟體,後硬體的學習計劃。也就是說,我先買一套成品小四軸,主控晶片跟我的方案一樣,然後再這個硬體平臺上先除錯自己的軟體程式,等一切調好之後,再著手設計自己的硬體,這樣出現問題,可以更快速的解決。試想如果從一開始就軟硬體自己來,出現問題需要把軟硬體都排查一遍,耽誤時間會很多,也會走很多彎路。
我選擇的喵嗚實驗室的小四軸,硬體設計很完善,前期讓我可以很放心的去除錯軟體而不用擔心硬體問題。當然,也有很多童鞋使用別的晶片例如STM32來設計的,大家也可以選擇別的硬體平臺。道理都是一樣的。學會站在巨人的肩膀上學習!
 


三、新人應該從什麼地方開始學習?

我想,能夠來嘗試四旋翼的盆友,至少都是有軟硬體設計基礎的,排除什麼都不會的真小白,下面我就假設所有的盆友都已經有基礎了,以此來談談我認為應該從什麼地方開始動手。
四旋翼飛行器的核心前面已經說過了,是姿態演算法。所以上手四旋翼的第一步,首先應該明確姿態感測器,我想大家一般都選用的是MPU6050,所以我就用它來說。首先在設計之初,至少需要利用IIC通訊,讀取出6050感測器的資料,並且去學習讀取出的資料如何轉化成我們需要的真實資料單位。這一步我認為是最關鍵的,因為只有感測器的資料讀取準確了,才能使後續演算法的計算有一個穩定的資料來源。因此學習四旋翼的第一步,應該是搞定MPU6050!
搞定6050感測器其實是有很多技巧的,比如最重要的資料手冊,必須要了解其中關鍵的一些部分,比如量程的選擇,精度的選擇,速度的配置等等。IIC通訊也是比較頭疼的比個地方,尤其是在電平時間的控制上,很容易出現問題。因此需要花時間去試錯。調著調著經驗就有了。


四、如何高效設計四旋翼飛行器的軟體程式?

這個問題其實對於任何一個系統來說都是適用的,因為有盆友問過我這個問題,在設計飛行器某一個部分的程式的時候,出現問題無法及時確定出問題所在,或者無法正確排除沒有出問題的部分。所以單獨把這個小問題拿出來說說,本人也是個渣渣半吊子,在這方面沒什麼真正有用的經驗,我的一貫方法是:分模組各個擊破!對,很傳統的方法,但是我覺得比較適合自己。
舉個栗子:比如飛行器的程式,現在需要除錯2.4G無線通訊,那麼我只需要先寫好飛行器接收2.4G訊號的程式在開發板上,然後利用我購買的飛行器的遙控器,給開發板發資料,如果開發板收不到資料但是配套的飛行器可以收到,說明自己的程式有問題啦,對照飛行器的2.4G接收部分,自己程式和人家程式不一樣的地方,很有可能是出現錯誤的地方。這種方法挺笨的,但是我自己一直是在寢室獨自學習,沒裝置、沒老師。所以每次都是這樣一塊一塊自己摸索,因為有可供參考的標準硬體平臺,所以一個部分一個部分的來,還是很高效的!


總結
不一定有用的一些經驗和吐槽,但願能夠幫助到一些朋友吧。後續繼續總結,慢慢更新相關部分的學習筆記。

相關文章