2015年9月28日 星期一

[QCopter] 從零開始做四軸 (二) - 相關資訊


在說原理之前,要先了解知道四個螺旋槳的飛行器的中文、英文名稱,有助於找資料或文獻,中文說法大致有這些,四旋翼、四旋翼飛行器、四軸飛行器甚至是四軸,英文的話則是 Quadcopter、Quadrotor、Quadrocopter、Quadrotor Helicopter ...等等,可以 Vertical Take-Off and Landing(VTOL)的旋翼飛行器,其實就只是在強調有四個螺旋槳的直升機而已。

Wikipedia - Quadcopter 上看到,最初的四軸飛行器是在 1907 由 Louis Breguet 設計的(天知道是真是假,有興趣自己去考證吧),假設訊息無誤的話,到現在也有百年的歷史了。

近十年的四軸飛行器發展迅速成長,個人認為很大部分都歸功於微機電(MEMS)與積體電路製程技術的提升,從原本高成本、大體積的感測器變成幾微米、低成本的 IC,使得飛行器體積縮小、造價降低,才得以廣泛研究。(此部分為個人想法,若有誤可以提出來)

第一次看到四軸相關的研究是 2012 年 Vijay Kumar 教授在 TED 上的演說,也是我開始做四軸的時候,Vijay Kumar 教授任教於美國的賓州大學,他的實驗室也做了很多有趣的東西。


Vijay Kumar 教授:http://www.kumarrobotics.org/
GRASP 實驗室:https://www.grasp.upenn.edu/




與 Lexus 合作的影片
Amazing in Motion - 'Swarm' https://www.youtube.com/watch?v=5ofbd05pKuA

幕後花絮
Swarm : 'Crafting Motion' https://www.youtube.com/watch?v=noyXqbqYyJo



之後也有另一位教授在 TED 上演講四軸飛行器,任職於瑞士蘇黎世聯邦理工的 Raffaello D'Andrea 教授,不過知名度似乎是這位教授較高,可能觀眾靠的比較近印象比較深刻吧... 哈哈。





也有與太陽馬戲團合作的影片,感覺這種合作方式頗不錯的,可以增加資金、增加研究內容、同時也增加知名度。

SPARKED: A Live Interaction Between Humans and Quadcopters

幕後花絮 SPARKED: Behind the Technology


Raffaello D'Andrea 教授也做了很多有趣的專案,其中印象最深刻的是叫 Cubli 的專案,透過角動量平衡,這種技術在很多機器人平衡上都會用到。


還有很多影片沒有放上來,因為真的是太多了,只放舊一點的影片,有興趣可以自己找找,最後,看了這麼多,其實只是想說明,四軸不是只能拿來空拍而已...,兩間頂級大學的研究室研究的東西真的很好,值得學習,想研究相關方向的人,可以多看兩間實驗室所發表的學術論文,畢竟已經累積了幾十年的成果。


"從零開始做四軸"除了是記錄自己的過程,方便自己再查閱,同時也提供分享給想研究四軸的人、想自己做一台而不是裝一台四軸的 Maker,這裡的 Maker 指的是了解電路、焊接、寫微控制器等多領域的人,畢竟一台四軸飛行器是跨了許多領域的結晶,像是控制、電子電路、數位邏輯、程式語言、機構、數學、物理、運動學 ... 等等,已經數不勝數了,還有最重要的"藝術"!沒錯,就是藝術!


以下有幾個 Github 上不錯的開源專案:

使用空心杯馬達(微型四軸)

使用無刷馬達

值得參考的資訊:
Build A Quadcopter From Scratch – Hardware Overview

2015年9月26日 星期六

[QCopter] 從零開始做四軸 (一) - 構想


說是從零開始做四軸其實也不太算,因為之前已經做過,

很久了,對四軸的最初印象是在寶萊塢電影"三個傻瓜"裡,但有想做的想法應該是2011年(大二下)時,在自控社辦跟其他朋友討論比賽可以拿甚麼作品參加,當時打算做一個可以作室內規劃路徑與空間定位的四軸,不過說歸說,比賽也沒參加,最後自己也跑去玩 FPGA、學計組,忘記甚麼原因,2012年(大三下)打算跨系參加電機系的專題競賽,就把這個想法再搬出來,最後實作一年的結果離一開始預期的功能相當遙遠,但在物理系背景下,看了不少書與不斷 try & error 的調 PID,一年內還是可以做出一台免強平衡的四軸,

之前做的四軸,詳細可以參考下面連結
GitHub Quadcopter
[QCopter] 自製四軸飛行器

從陽春的洞洞板做起,自己設計電路、焊接、驅動、通訊、姿態算法、平衡控制,到之後把洞洞版本的飛控板、遙控器設計成 PCB 版本送廠打樣,不斷的改版,不斷的更新,當時就有想做一台全部自己設計的四軸飛行器,從最基本的機構、算法到電調、飛控、遙控器等(馬達、電池、螺旋槳就算了),一台全部開源、適合做研究、學習、實現演算法的四軸飛行器 QCopter

最初的構想是以小型四軸加上無刷馬達為主,而且馬達、螺旋槳需要取得容易,所以設計了一台 160mm 軸距的四軸,雖然設計圖畫好,但口袋一直空空,一直沒有試過... 畢竟買一個商品價格跟開發一個的成本是天差地遠。



雖然到現在已經過了快兩年了,不過一個人要做完全部還是需要不少時間的,可能幾年後才有機會面市吧... 哈哈,反正先把之前與現在的構想紀錄下來,一步一步的實現。

以研究與學習方面,以下幾點是設計的考量:
  • 硬體、軟體、基本演算法必須開源,方便模仿、學習、修改、重製。
  • 製作成本與門檻盡量低,以具備基本手做能力與開發能力的對象為主。
  • 一個高效能、資源豐富的控制器對實現演算法的可能性與種類有很大的幫助。
  • 飛行器先以小型、室內為主,減少危險以及增加開發、實驗方便性(坐著也可以開發)。
  • 容易擴充、新增硬體、應用,畢竟研究、學習也是要跟上時代的。
  • 演算法相關的有數學流程與軟體模擬更好。

下面是 QCopter 預計要實現的部分,目前先以飛行器和遙控器這兩部分為主。



飛行器部分:
打算以 200mm 軸距與 5-inch 的槳為主,與之前設計大了些,但相對的負載也增加了,在飛行器底下預留相機腳架的接口,方便連接攝影用萬向雲台,使在調整參數與測試時的難度減少、便利性增加,另外會設計一個 2 維的雲台來固定 QCopterMV。

飛控板 QCopterFC
實現運動、平衡方面的演算法,最重要的核心裝置,上面裝載 SmartIMU 與 SmartBLE,SmartBLE 尚未設計,天線與功率放大部分尚在實驗,預計以 nRF51 或 nRF52 系列做為主控器,主要用來做 BLE 或 2.4G 傳輸,目前預計透過 CAN Bus 來做為 QCopterESC 與 QCopterPM 之間的溝通方法,但沒用過 CAN Bus 所以可行性還未知。

電子調速器 QCopterESC
驅動無刷馬達的裝置,預計採用 Field Oriented Control (FOC) 技術,透過採樣電流來找出轉子位置做控制,並且可以回授轉速、電流、溫度等資訊到 QCopterFC 和 QCopterPM 上面,基本功能都有完成的話,再加入自適應控制,可以自動補償電機參數。

電源管理 QCopterPM
飛行器的電源管理裝置,除了管理、監控與檢測飛行器上的電池電量、用量、電流與狀況外,也打算具備無線充電的功能。

機械視覺 QCopterMV
實現影像處理的裝置,預計採用 MT9V034 攝像頭,具有灰階與彩色兩種版本,可以針對不同的處理需求做替換,實現光流、特徵辨識等演算法。


遙控器部分:

遙控器 QCopterRC
遙控飛行器的裝置,最重要的是具有螢幕,可以直接將飛行器上回傳的資料顯示出來,遙控器上打算加入加速度計與陀螺儀,用來實現體感控制。


地面站:

地面站 QCopterGS
這部分偏向室外的應用,室內的部分預計以矩陣燈搭配影像處理為主(如下述的應用),其實在想室內的部分要不要分出來,畢竟不太像地面站。



目前有幾個想實現的四軸應用:

空間定位
這是最一開始想做的,可靠的實現方法都是加載高速攝影機,但這缺點就是照價高,自己打算以低成本的 IMU / RSSI 方案來實現飛行器的空間定位,因為室內定位也是自己的研究的題目,所以這部分已算是進行中了,整個最大的難點應該是飛行器產生的噪音與干擾,誤差若可以在限制在 30cm 內覺得就很不錯了。

飛行器間通訊
之前過一篇透過聲波傳遞訊息的病毒 badBIOS (詳細文章),除了RF,聲波確實是一個非常有效的交換訊息方法,每天都在說話,每天都在用嘴巴和耳朵傳遞與接收訊息,但在飛行器上自己卻常常忽略,若是飛行器有聽與說的能力,那在協同合作方面的肯定會有許多應用。

最直覺的想法是喇叭和麥克風,喇叭依照想傳遞的範圍傳出不同頻率與振幅的訊號來夾帶資料,若只要濾除螺旋槳聲,整體難度應該不大,但真的想做看看的是自己的指導教授隨口講的一個想法,透過螺旋槳或馬達轉速來發出不同頻率的聲音,跟電調讓無刷發聲的概念類似,若資訊量不大應該是不會影響到平衡和飛行,而且也可以有效的減少成本。

飛行器導引
這是之前參加比賽所想的一個慨念,最初的想法是結合GPS在不同的塔台間自動的移動與起降,主要是為了降低和解決飛行器續航力不足的問題,塔台透過矩陣燈與飛行器上的機械視覺來實現起降定位的功能,不過之後想到了一個延伸的有趣應用,一組矩陣燈可以用來傳遞訊息給飛行器,實現上下運動甚至空翻的指令,若多組的矩陣燈,就可以讓飛行器前後左右移動,或許意義不大,但在室內展示上卻有不錯的視覺效果,藉由電腦來控制矩陣燈圖案,就可以讓飛行器依自己想走的路徑運動或是做出特定動作。


下一篇→從零開始做四軸 (二) - 相關資訊

2015年9月3日 星期四

[C語言] 在 Windows 上透過 C 語言實現 RS232 接收和發射

最近單晶片需要用到 IAP 的功能(可以參考基於 STM32 的 IAP 程式更新),不過之前電腦端是透過自己寫 Python 實現 .bin 檔案的傳輸,有時候重灌電腦後 Python 就被刪掉了,之後後還要再找符合相對應版本的 pySerial,蠻麻煩的,所以就想說直接用 C 語言來取代之前寫的 Python 功能。

STEP 1
先下載 RS232 for Windows Librery → http://www.teuniz.net/RS-232/
將 RS-232.tar.gz 解壓縮,只需要 rs232.c 和 rs232.h 即可。


STEP 2
建立一個 C 語言的專案,來撰寫程式,個人是使用 Code::Blocks



選擇 Empty project 即可




新增一個 .c 檔,存在專案目錄下,
我是命名成 main.c,然後加入 main.c, rs232.c rs232.h 到專案。





在 main 裡面加入 #include "rs232.h" 後,就可以使用 rs232 library 的功能了

STEP 3
下面程式是 main.c 裡面寫的內容,做簡單的字串接收並顯示出來,
另一端用自己設計的開發板 RedBeanSprout 實現,一直發送 5 個不同的字串到電腦。

#include "rs232.h"

#define RECV_BUF_SIZE 5

int main()
{
    int state = 0;

    int com_port = 6;       /* COM7 */
    int baudrate = 115200;  /* 115200 */
    char mode[]  = {'8', 'N', '1', 0};

    int i = 0, n = 0;
    unsigned long count = 2000000;

    unsigned char recv_buf[RECV_BUF_SIZE + 1] = {0};

    /* Open COM Port */
    state = RS232_OpenComport(com_port, baudrate, mode);
    if(!state)
        printf("Open COM Port Success\n\n");

    /* Recv Data */
    do {
        n = RS232_PollComport(com_port, recv_buf, RECV_BUF_SIZE);
        if(n == RECV_BUF_SIZE) {
            printf("count = %7i, n = %i, recv data = ", count, n);
            recv_buf[n] = '\0';
            printf("%s", (char *)recv_buf);
        }
        else if(n > 0) {
            printf("count = %7i, n = %i, recv data = ", count, n);
            printf("*****\n");
        }
       Sleep(1);
    } while(--count);

    /* Close COM Port */
    RS232_CloseComport(com_port);
    printf("\nClose COM Port\n");

    return(0);
}

發射部分使用 RS232_SendByte 或 RS232_SendBuf 就可以了,
這邊沒有放上來測試,主要是因為官網都已經解釋得很詳細了。

使用 C 語言來做 RS232 的好處主要在於可以有更多的變化,像是傳檔案、模擬部分 UART 裝置等,不像終端機只能做字串或字元的傳輸。

最後完整的專案可以在 github 上下載
https://github.com/Hom-Wang/C-Language/tree/master/serial