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

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

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

從陽春的洞洞板做起,自己設計電路、焊接、驅動、通訊、姿態算法、平衡控制,到之後把洞洞版本的飛控板、遙控器設計成 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在不同的塔台間自動的移動與起降,主要是為了降低和解決飛行器續航力不足的問題,塔台透過矩陣燈與飛行器上的機械視覺來實現起降定位的功能,不過之後想到了一個延伸的有趣應用,一組矩陣燈可以用來傳遞訊息給飛行器,實現上下運動甚至空翻的指令,若多組的矩陣燈,就可以讓飛行器前後左右移動,或許意義不大,但在室內展示上卻有不錯的視覺效果,藉由電腦來控制矩陣燈圖案,就可以讓飛行器依自己想走的路徑運動或是做出特定動作。

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

之前寫的介紹
http://kitsprout.logdown.com/posts/335401

github https://github.com/Hom-Wang/MATLAB/tree/master/kSerial

[2016/09/17] MATLAB 新版本 Serial 示波器
最近一直在寫 MATLAB,用越久 MATLAB 越了解 MATLAB 的方便與強大,上研究所前對 MATLAB 的熟悉就只是高級工程計算機的概念,反而是 MATHEMATICA 還比較常用,在符號的運算與公式的推導上非常有優勢,但到了研究所後,很多的東西都要做模擬與驗證,不知不覺接觸 MATLAB 的時間就越來越多,以微控制器開發為主的我,熟悉了即時繪圖與 serial 之後更是變成一個不可或缺的工具,在電腦與微控制器之間的通訊非常簡單,後續的資料處理與分析也非常的便利

近幾個禮拜接觸了 MATLAB 上的 classdef 後,就把之前寫的 serialOscilloscope 改版了,並請重新改寫 serial 的接收封包格式,目前沒有沒有丟包的問題,更新頻率測試過鮑率 256000 下 400Hz 都沒有問題,主要受限於 MATLAB 的鮑率與微控制器的傳輸速度。

在波型顯示的部分則改用 object 與 delete 的方法,目前不會依運行時間長而導致延遲的情況,之後會嘗試加入 GUI 功能,這樣對於切換不同的資料顯示上也會方便許多

[2017/04/16]
kSerial 的設計最主要就是在 MATLAB 與微控制器之間建立一個傳輸的連結,讓微控制器可以透過 kSerial 將資料傳到 MATLAB 上做顯示與分析,並且在此基礎上可以擴充不同的應用像是波形顯示、分析等等。使用自己寫的 kSerial 也有好幾個月的時間了,中間有過不少大大小小的修改,這幾天對 kSerial 做了一些整理,之後打算再實現雙向通訊的部分以及 GUI 的介面。

[2017/06/20]
這次改版內容比較大,距離第一個雛形版本也有 2 年了,第一次維護與改進一個小程式這麼久,覺得很特別。

  1. 調整通訊封包格式,去除 sequence number 功能,改為 command 功能,最小長度 8-byte,最大長度 256-byte。
  2. 重新改善接收封包方法,比起改版前約增加 10% 速度,最快約 3KHz 的最小封包。
  3. MATLAB 端簡化設定,自動判別封包的資料長度與種類。
  4. 加入雙向通訊功能,已與微控制器相互驗證。
  5. 完善封包更新頻率估算功能,原本必須要傳時間資訊至電腦,目前亦可以僅透過系統時間做估算。

現階段實現了幾種應用功能:

  1. serialPacket, 基本的資料顯示
  2. serialOscilloscope, 類示波器的資料顯示
  3. serialFFT, 頻域顯示(尚未完善)
  4. serialCube, 配合四元數的姿態顯示

YOUTUBE DEMO 影片

傳輸的封包格式定義如下

  • serial format
    byte[ 1 : 2 ] - "KS"
    byte[ 3 : 3 ] - total length (256-byte)
    byte[ 4 : 5 ] - command (2-byte)
    byte[ 6 : 6 ] - data type
    byte[ ~ : ~ ] - data (0 ~ L - 8-byte)
    byte[ L-1 : L ] - "\r\n"
classdef kSerial.m link
% 幾種建立與初始化 kSerial 方法,port = 'COMx', 'auto', 'select', max baudRate is 256000

s = kSerial()                               -> port = 'auto', baudRate = 115200, no delete instrfindall
s = kSerial(baudRate)                       -> port = 'auto', set baudRate, no delete instrfindall
s = kSerial(port, baudRate)                 -> set port, set baudRate, no delete instrfindall
s = kSerial(baudRate, 'clear')              -> port = 'auto', delete instrfindall
s = kSerial(port, baudRate, 'clear')        -> set port, set baudRate, delete instrfindall

% 開啟與關閉 kSerial 功能

s.open()
s.close()

% 讀寫 kSerial 功能

data = s.read( bytes, type )
bytes = s.write( data, type )

% 延遲功能

s.delay( delay )

% 簡單的設定 kSerial 的鮑率與輸入暫存器大小

s.setBaudRate( baudRate )
s.setInputBufferSize( bufferSize )
s.setRecordBufferSize( bufferSize )

% 設定解算封包之接收閥值,threshold 表示收到該數目資資料才會解封包

s.setRecvThreshold( threshold )

% 依自訂定封包接收,封包資料與封包數目

[packetData, packetInfo, packetLens] = s.packetRecv()

% 依自訂定封包發送

bytes = s.packetSend();                     ->  null command
bytes = s.packetSend(command);              ->  only send command
bytes = s.packetSend(command, data);        ->  use input data type
bytes = s.packetSend(command, data, type);  ->  

% 獲取資料更新頻率,分成用系統時間計算與接收時間資訊計算

freq = s.getFreq(unit);                     ->  use system clock to calculate freq
freq = s.getFreq(index, lengrh, unit);      ->  use packet sec/msc to calculate freq

% 獲取時間,目前必須要傳送時間資訊才可以使用

time = s.getTime(index, type, unit);        ->  type ~= 0 : return total seconds
                                            ->  type  = 0 : return [min, sec, msc]

% 獲取內部暫存器接收資料與資訊

data = s.getRecordData()
data = s.getRecordInfo()

% 儲存接收資料,檔案名稱 'NAME'_TIME

s.save2mat( name, index )

kSerialOscilloscope.m link
% 建立 kSerialOscilloscope

osc = kSerialOscilloscope()

% 設定示波器 X, Y 顯示刻度

setWindow( ymax, ymin, width )

% 設定畫板,並初始化 kSerialOscilloscope

initOscilloscope( fig )

% 顯示波形

updateOscilloscope( s )

kSerialCube.m link
% 建立 kSerialCube

cube = kSerialCube( origin, scale, window )

% 設定畫板與視角,並初始化 kSerialCube

initCube( fig, v )

% 顯示姿態

plotCube( p, q )

% 獲取尤拉角

att = getAttitude( cube, q )

這篇主要介紹自己接觸 PCB 設計的過程以及簡短的設計 PCB 時用到的工具和送廠製作的流程。

自己在大一第一次接觸 DIP 封裝的電路板焊接的時後覺得很新鮮,雖然當時會焊接,但不會單晶片也不會電路設計,所以其實用處不大,之後在大一暑假接觸 SMD、Layout 以及簡易的洗板方法,才第一次注意到洗板出來的電路板居然跟常見的顏色不同,那時對電路板設計才有些概念,雖然在大一就接觸過 layout 和洗板,但實際真的有在應用時已經是做完四軸飛行器之後了,因為之前洞洞板都可以搞定,頂多是 IC 洗轉板焊在洞洞板上,像下面一樣,中間的慣孔用導電銀漆導通

more photo...

不過隨著電路越做越大,焊接的時間就越多,焊的越辛苦... 所以在大四那年就打算開始嘗試送廠製作,一開始找了不少送廠打樣的資訊,最後人生的第一片送廠打樣 PCB 就是一片在台灣生產的黑色沉金 STM32 核心板,價格實在貴得嚇人,不過當時有 3 ~ 4 人一起分攤所以還好,自從開始送廠洗板後,洞洞板一直都是收藏的狀況... 頂多比較急才會拿出來用

more photo...

送廠打樣 PCB 的好處,自己想到的有下面幾點

  1. 比較漂亮,可以加絲印與阻焊層(雖然自己做也可以,但就是很麻煩)
  2. 容易複製,同樣的電路重新製作速度快,不需要像洞洞板慢慢拉線焊接
  3. 元件密度較高、面積較小,送廠打樣都可以做成多層板,走線可以在不同層上佈線
  4. 線寬可以做得更小,放置腳距密度較高之元件,自己洗板大概洗到 8mil 就是極限了
  5. 其他像是舖銅、阻抗、軟板等等的設計,也是直接焊洞洞板是難以實現的。

電路設計軟體都可以完成從原理圖設計到布線的工作,大一開始是學習 Protel,之後換成 Altium Designer 一直用到現在,聽說 Cadence Allegro 適合做多層板的布線,業界比較多人使用,另外還有像是 KiCadEAGLE 這種免費又跨平台的軟體,也是常見的軟體。

在熟悉電路設計軟體後,再來就是要送廠去製作 PCB,自己總共送過 6 ~ 7 間不同的 PCB 打樣廠,在台灣打樣的價格平均大概都是高 500 ~ 1000 以上,做了幾次就做不下去,二層板品質其實也看不太出來,除非有請款報帳的需求,不然現在都是直接送到對岸打樣再寄回來,目前對岸的打樣平均 2 Layer 10x10cm 10pcs 約 50 人民幣,折合約 250 台幣,送到台灣運費大概 25 ~ 35 人民幣,做下來一片大概 50 台幣成本,可以在淘寶上自己評估看看,現在自己都是送華強 PCB,有免費加急的活動,快的話大概 3 ~ 4 天就可以拿到 PCB 了,相當迅速阿,服務也不錯,有幾次接到對岸打來的電話問板子哪邊要怎麼做之類的,覺得很特別。

最後,如果你也想要自己畫電路板,送廠製作

  1. 先找個適合自己的電路設計軟體,現在軟體基本上從原理圖設計到布線的工作都可以完成,前面有推薦四套軟體
  2. 使用該軟體設計你自己的電路
  3. 將設計檔案生成實際打樣需要的 Gerber 檔,應該軟體都會提供這功能,也有廠商可以接受原始設計檔案
  4. 找一間 PCB 打樣廠線上或 email 報價、付款、製作
  5. 等著拿 PCB 吧 :)

這篇本來是 2016 年 6 月就想要完成的,但後半段的問題部份一直懶的完善... 直到最近覺得很久沒有寫些東西,所以打算先發這篇,後半段的問題再慢慢補上。

話說離自己開始自製四軸已經快五年了,從 2012 的 5 月開始到 2013 年 5 月,這一年中,從零開始學習到完成基本的四軸飛行器平衡、飛行,再從之後的一年,將洞洞板版本的飛控和遙控更新到 PCB 打樣版本,以及嘗試實現一台小四軸,那後面的兩年在做甚麼?在讀研究所... 研究室內定位,沒甚麼再弄四軸了... 當然還是有再更新,只是沒這麼勤... 恩...現在定位的研究也算告一段落,所以心血來潮打算重新完善之前小四軸。

重點是在第一年的期間,受了很多的幫助,到處的詢問那個這個的,當時只是物理系的我,控制甚麼的怎麼會懂?只能不斷的問,不斷的 Google 來解決問題,最後讓我能完成這四軸除了是自己花了不少時間外,也是因為網路上的資源、各地的人,其中以對岸的 amobbs - 四轴飞行版 幫助最為多,主要都是在這做交流,在台灣這種技術論壇實在少之又少,真的覺得很可惜... 之前論壇註冊是不用收費的,現在似乎要 60~80 人民幣,雖然四軸版討論的熱烈程度不如從前,但認為這註冊費還算划算,畢竟也累積了不少的資源與討論,因為受惠於網路,所以完成後也將自己的製作公開放在網路上,第二年開始到現在可能也有不少的人看到這些自製的東西來 Email 詢問或是留言,從簡單如何作一台四軸的問題到深入的演算法探討等,基本上個人都很樂意回答,幫忙這些對四軸抱有熱情的人,這也是我認為給予幫助過我的人最好的回饋,但有不少問題像是如何入門... 等等的,不斷重複出現,所以打算把這些包含自己遇到的或回答的問題做整理,給想自己做一台四軸的人參考參考,之後有想到的也會再補充上去,有想了解的部分也可以跟我說:)

首先先說明一下自己在做四軸前的能力狀況大概如何?

大概是從物理系大三開始做四軸,在之前參加過中原大學的自動控制社(這很重要!大一參加過寒暑訓後頭腦就變得壯壯XD),在做四軸前已經使用 8051 大概有 2 年左右,沒有學過組合語言,期間都是以 C 語言做開發,對 C 語言的熟悉程度大概就是會用指標、結構等,有做過機械手臂六足機器人這兩個比較大的作品,還有用過一些像是攝像頭、TFT 螢幕以及 I2C/SPI 等介面的模組,主要都是移植別人的程式,然後自學 FPGA/Verilog 大約半年,對一些邏輯電路與計算機架構稍微了解,可以看說明手冊直接對 STM32 直接操作暫存器和寫類似官方的標準庫(像 GPIO 和 EXTI 簡單的功能而已,寫到 TIM 就寫不下去了...),焊接電路和洗板大概有 2~3 年(當時不會焊 QFN 封裝的元件,頂多 QFP 和 0603),會透過 Protel/Atium Designer 畫簡單的電路(只會自動佈線)... 能力大概就是這樣,基本上東西都是從大學才開始自學的。另外就是對於四軸的認知就只有四個馬達、四個螺旋槳、中間應該有控制器的概念,再來就是"三個傻瓜"裡會飛的那台而已,沒有甚麼其他的相關航模概念,有買過一台百元遙控直昇機改裝的衝動,但最後放棄。

下面是回想起之前在製作四軸最一開始遇到的幾個問題

"Q1、多旋翼飛行器是甚麼?"

多旋翼飛行器依螺旋槳數目可以分成很多種,而其中擁有四螺旋槳的四軸飛行器則是最常見的,關於四軸的簡單介紹可以參考 wikipedia,四軸的尺寸從小到掌心大到可以載人都有,大小對四軸最主要影響就是載重量、續航力與靈敏度,通常越大的四軸載重量大、續航力高,但靈敏度低於小型四軸。

"Q2、四軸飛行器的飛行原理?"

可以參考這篇 從零開始做四軸 (三) - 運動原理

"Q3、要怎麼組裝一台四軸?"

一開始這應該是最先會遇到的問題,大部分的資料都可以在網路上查到,不清楚的也可以參考這篇"從零開始做四軸 (四) - 飛行器組成",因為打算從零做起並且可以方便之後的開發,所以最後的打算是飛控板和遙控器部分都自己來實現,其他則是購買現成的東西,像是馬達、電調、機架以及電池... 等,基本組裝起來大概幾千元,比較需要注意的是鋰電池和螺旋槳這兩個消耗品,電池部分,之前對於這種鋰聚電池沒有甚麼了解,遇到電池膨脹以及不小心短路到等問題(在麵包板上短路到真的是嚇死我了... 麵包板和手瞬間變黑,幸好沒有受傷),在使用上需要非常注意,買個好點的充電器也可以讓電池用久一些也安全一些,另外是螺旋槳的部分,如果是自己寫的飛控,一開始大概都不容易平衡,很容易摔機,螺旋槳也很容易斷掉,可以多買一些備用。

"Q4、使用控制器"

關於飛控板上的微控制器選擇基本上沒有甚麼限制,能夠完成姿態的計算,並可以控制馬達就可以了,若是對於微控制器不熟的可以考慮使用看看 Arduino,較好上手,而且目前市面上也有不少基於 Arduino 的飛控。因為自製之前就已經大概了解 STM32 了,加上當時前幾個月 ST 宣布推出 Cortex-M4 系列的 STM32 系列 (Sep. 2011),具有浮點數運算硬體、較高的運算效能... 等等,所以就果斷選擇了 STM32F4 系列的微控制器。

"Q5、控制馬達"

>市售電調控制訊號
詳細有空補上...

"Q6、姿態解算"

>加速度計、陀螺儀、磁力計等感測器的基本原理及其應用 ... 從零開始做四軸 (五) - 感測器原理
>感測器的校正 ... 從零開始做四軸 (六) - 感測器校正
>透過感測器計算飛行器的姿態演算法 ... 從零開始做四軸 (七) - 姿態計算
詳細有空補上...

"Q7、平衡控制器"

>PID 控制器的了解與參數的調整,
詳細有空補上...

"Q8、實際測試"

>實驗設計
詳細有空補上...

最後,"從零開始做四軸"是打算針對想研究四軸的人,想動手做一台四軸並了解詳細運作原理的人,部分章節則是需要有一定的數學、物理、軟硬體的能力要求,就自己的經驗。

從零開始做四軸 (一) - 構想
從零開始做四軸 (二) - 相關資訊
從零開始做四軸 (三) - 運動原理
從零開始做四軸 (四) - 飛行器組成
從零開始做四軸 (五) - 感測器原理
從零開始做四軸 (六) - 感測器校正
從零開始做四軸 (七) - 姿態計算
從零開始做四軸 (八) - 四軸運動模型
從零開始做四軸 (九) - 控制器
從零開始做四軸 (十) -

[實作篇]
從零開始做四軸 (十一) - 飛控板與遙控器設計

[實驗篇]
從零開始做四軸 (十二) - 平衡實驗設計與控制器參數調整

之前寫的基於 C 語言矩陣運算實際在微控制器上做 kalman 有些問題,不知道是因為 malloc 用太多或是反矩陣求解問題,目前打算先用 CMSIS 提供的矩陣運算替代,之後在繼續找問題,如果 CMSIS DSP 庫效能好的話,或許就直接繼續使用了。

目前 CMSIS MatrixFunctions 只有提供下面幾種運算 ( 複數矩陣因為用不到所以沒有放入 )

arm_mat_init_f32      /* 初始化 */
arm_mat_add_f32       /* 加法 */
arm_mat_sub_f32       /* 減法 */
arm_mat_trans_f32     /* 轉置 */
arm_mat_scale_f32     /* 乘常數 */
arm_mat_mult_f32      /* 乘法 */
arm_mat_inverse_f32   /* 反矩陣(flaot) */
arm_mat_inverse_f64   /* 反矩陣(double) */

上面函數除了加減法和乘常數可以存回自己外,其他都無法存回自己,像是

status = arm_mat_init_f32(matrixA1, matrixA2, matrixA1);  /* matrixA1 = matrixA1 + matrixA2 ... OK */
status = arm_mat_inverse_f32(matrixI, matrixI);           /* matrixI = inv(matrixI) ... ERROR */

以及為了加入之前多寫的一些功能,diag、取部分矩陣等功能,所以就把原本 CMSIS 做擴增,並且實現乘法、反矩陣等函數可以存回原矩陣的功能。新的矩陣函數庫重新定義原本的矩陣型態

...\algorithms\matrix_arm.h
...
typedef arm_matrix_instance_f32 matrix_t;
typedef arm_matrix_instance_f64 matrix64_t;
...

並為了實現存回原本矩陣的功能,加入的預先分配的空間,空間大小以 float64 為主,並定義為最大可以運算的反矩陣維度兩倍,預設是最大可以運算 12x12 的反矩陣,所以如果是計算 flaot32 反矩陣,則可以最大實現 24x24 的反矩陣運算,依微控制器的狀況作調整。

...\algorithms\matrix_arm.c
#ifdef USE_MATRIX_BUFFER
#define MATRIX_MAX_DIMENSION  ((uint32_t)12)
#define MATRIX_MAX_SIZE       ((uint32_t)144)   /* MATRIX_MAX_DIMENSION ^ 2 */
#define MATRIX_BUF_SIZE       ((uint32_t)MATRIX_MAX_SIZE << 1)

static float64_t matrixBuf[MATRIX_BUF_SIZE] = {0};
#endif

目前實現了下面這些功能

void       Matrix_Clear( matrix_t *pMatrix );
void       Matrix_Init( matrix_t *pMatrix, float32_t *pArray, uint16_t rows, uint16_t cols );
arm_status Matrix_Copy( matrix_t *pMatrix, const matrix_t *pMatrixC );
arm_status Matrix_SetData( matrix_t *pMatrix, uint16_t rows, uint16_t cols, float32_t data );
arm_status Matrix_GetData( const matrix_t *pMatrix, uint16_t rows, uint16_t cols, float32_t *data );
arm_status Matrix_SetDiag( matrix_t *pMatrix, float32_t data );
arm_status Matrix_GetDiag( matrix_t *pMatrix, matrix_t *pMatrixD );
arm_status Matrix_SetMatrix( matrix_t *pMatrix, matrix_t *pMatrixS, uint16_t rows_pos, uint16_t cols_pos );
arm_status Matrix_GetMatrix( matrix_t *pMatrixG, matrix_t *pMatrix, uint16_t rows_pos, uint16_t cols_pos );
arm_status Matrix_Add( matrix_t *pMatrix, const matrix_t *pMatrixA1, const matrix_t *pMatrixA2 );
arm_status Matrix_Sub( matrix_t *pMatrix, const matrix_t *pMatrixS1, const matrix_t *pMatrixS2 );
arm_status Matrix_Mult( matrix_t *pMatrix, const matrix_t *pMatrixM1, const matrix_t *pMatrixM2 );
arm_status Matrix_MultScale( matrix_t *pMatrix, const matrix_t *pMatrixM, float32_t scale );
arm_status Matrix_Trans( matrix_t *pMatrix, const matrix_t *pMatrixT );
arm_status Matrix_Inv( matrix_t *pMatrix, const matrix_t *pMatrixI );
arm_status Matrix_Inv64( matrix_t *pMatrix, const matrix_t *pMatrixI );
void Matrix_Print( matrix_t *pMatrix );
void Matrix_Print64( matrix64_t *pMatrix );
void Matrix_PrintInfo( matrix_t *pMatrix );

之後有空再補上行列式以及完善乘法

詳細的程式可以參考下面,使用 CMSIS 做擴增,在其他不同型號或廠家的微控制器上應該都可以很容易做移植,且不失效能。
https://github.com/KitSprout/KDWM1000/tree/master/Software/KDWM_ApplicationSTD_matrixOperation/Program

 
這週拿到之前新設計的 QCopterMV PCB,花了不少的時間來測試,測試到現在為止都尚如預期,唯有 SDRAM 的讀寫感很不穩定,但因為手邊沒有相關的板子可以方便確定問題所在,所以等之後購買 F429discovery 再來詳細確定這部份的問題。

Github : https://github.com/QCopter/QCopterMachineVision

 

 
這次新設計的 QCopterMV 另外製作了兩個擴充板和兩個攝像頭板子,第一個擴充板是為結合 TFT 螢幕開發而設計的,將讀取到的影像經過擴充板輸出到螢幕上,不需要再跳線連接,並可以直接看到結果

 
另一個擴充板則是結合麵包板來作實驗,把擴充埠的 I/O 都拉出來,可以直接插在麵包板上,並將開發板與攝像頭立起來,覺得實際安裝的效果很不錯,如果值之後實現將影像傳到電腦上的部份的話,整體的開發應該會變得方便許多

 
再來是攝像頭的部份,這部份設計了兩種版本,第一種版本是直接透過 1.27 mm 的排針來連接自己設計的攝像頭模組,目前只有 MT9V034 的版本,並且還在測試中,另一個版本則是為了相容市面上的攝像頭模組的 2.54 mm 連接腳位而設計的,可以讓開發者自行選擇攝像頭來做連接與開發

 
整體來說對新版本 QCopterMV 的實體還蠻滿意的,功能都還算齊全,體積也不大,加上擴充板也讓開發變的更便利,目前會優先完善將影像傳至電腦的部份以及影像結合 IMU 感測器的部份!

近期新設計了一款 Local Positioning System(LPS) 的定位開發模組,這款模組主要結合了自己之前做的 SmartIMU 與現成的 DWM1000 模組,目前版本 v1.4,大致的功能都驗證過沒問題。

github link → https://github.com/KitSprout/KDWM1000

Ultra-wideband(UWB) 是一種無載波通信技術,採用 nanosecond(ns) 至 picosecond(ps) 級的極短脈衝信號來傳遞數據,耗電量低,因為脈衝極短(光速大約30cm/ns),所以對於繞射、反射干擾影響較小,電波訊號穿透性較佳,理論上可以實現較精確的定位。

KDWM1000 UWB 部分使用的是 Decawave 開發的 DWM1000 模組,實體圖片↓


 

DWM1000 模組基本簡介

  • 符合 IEEE802.15.4-2011 UWB 規範
  • 在實時的定位系統中,可以達到室內 10cm 的精度
  • 資料傳輸速度高達 6.8 Mb/s
  • 通訊距離達 300m
  • 支持高密度 tag,20m 半徑內可達 11,000
  • 對多路徑與衰減具有高抗干擾能力,使其在高衰減環境亦可進行可靠的通訊
  • 功耗低,可以使用電池工作在長時間下
  • 體積小,容易結合至其他 RTLS 與 WSN 系統
  • 集成天線的一款模組

更詳細的說明與功能可以參考官方的相關資料
http://www.decawave.com/products/dwm1000-module
 

KDWM1000 模組基本簡介

KDWM1000 是一款 LPS 的開發模組,集成了 MPU9250(加速度計、陀螺儀、磁力計)、LPS25HB(氣壓計) 10DOF 的感測器,並採用 ARM CortexM4F STM32F411CE 來控制,除了感測器與 DWM1000 模組外,還有可控制的三個 RGB LED、一個電源開關、按鍵與一個 MicroUSB 接口,此外將其他沒有使用到的腳位都拉到 2.54mm 的排針上面,可以直接插在麵包版上做開發,預計之後要透過 IMU 與 UWB 來實現空間中的定位,並嘗試將其結合至飛行器上,實現成另一款飛控板。

這周末在士林的科教館舉辦了 Maker Faire Taipei 2016,因為離家不遠,所以下午就去逛逛看,有什麼特別的東西或是不錯的想法,或許可以給之後設計的東西做些參考。這次辦在士林科教館感覺比之前華山還來的空曠,雖然有是有些擠,但相較於之前感覺有改善。展場內的作品種類很多,從水裡游到天上飛,從小孩玩到工程師用,能"動手"的東西都在這,但個人比較沒甚麼偏好機構設計相關以及太簡單的東西...所以就不打算多說...
 

↓ 首先是 B1 的這兩個作品

兩個都是說透過不同波長的光來讓生物的生長速度改變,可以調溫溼度、自動餵食等功能,前一段時間本來也有打算要做一個類似這些功能的魚菜共生養殖箱,上面種植物,下面養魚,大致就像 Water Garden 一樣,上下互利,但不加些東西來增加又覺的無趣,所以就加了像是可調光波長、光照度、溫濕度...等的功能,之後就變成像是 Biopod 的養殖箱,為了有區別又特別去思考,最後的就變成了神奇的天氣箱,如果可以模擬天氣,那肯定魚和植物生長肯定不會是問題,製造出來的生態系應該會更豐富,雖然還沒看過整套一樣的,但目前也是已經有簡單的天氣箱 Tempescope 就是了。
 
 

↓ 同樣也是 B1 的 ROV 潛水挺

這是之前 Maker Faire 就展過的潛水艇,小台的似乎是目前在嘗試的,比較特別的是之前一直都沒有去注意它的照明色光,這次小台的 ROV 前面很明顯裝了 RGB LED,詢問下才發現原來需要補不同的色光,因為不同的波長的光對水的穿透力不一樣,雖然早知道,但還真沒想到...
 
 

↓ 還是 B1 的指力復健用的醫療儀器

這個還蠻有趣的,用來復健指力,而且可以結合手機,整體設計都不困難,透過壓感來取得五指指力,並用 LED 顯示出來,至於手機可以做甚麼我就沒仔細聽了... 另外還有第一張圖上的藍點是他們自己設計的,記得是要減少指力...好像...沒甚麼認真聽,一時被我無名指的指力給嚇到了 XD
 
 

↓ 仍是 B1 的... 拳擊對打練習機? 原諒我沒有認真注意作品名稱

這個作品與上面指力復健是我覺得原創程度都較高的,之前都沒有過類似的作品,覺得很特別,剛到這個攤位的時候,正好遇到這位終結者(圖一左)... 只見此人不斷閃躲練習機的揮拳,連頭也不打的只選擇攻擊胸口... 即便是練習機張開了雙臂,終結者仍不斷的猛烈攻擊... 在一旁的裁判也替練習機捏一把冷汗,最後時間到裁判叫停後,練習機已是一動也不動... 似乎是癱瘓了... 終結者在助手幫忙脫掉手套後就瀟灑離去... 只見教練與助手趕緊幫忙練習機恢復... 能看到練習機奮戰的最後一幕算是蠻特別的(誤),只可惜沒能等到與他的對決就先回家了...

其實這種較大型的互動電子作品通常都撐不了多久... 覺得這作品是今天看到最好的,但出拳的種類略顯單調,他們的FB粉絲專頁-集匠工坊
 
 

↓ F1 的一個套件,應該是用在入門學習的,感覺很方便,想法也很好,但我應該是用不到...


 

↓ 往 F8 看到的空中腳踏車... 蠻吸引眼球的


 
 

↓ F8 F9 沒有甚麼印像比較深刻的,只有樂高比較吸引我

恩,大概就是這樣...收穫還算頗多的:)
more photo...

Github Link:https://github.com/KitSprout/IMUCube

IMUCube 是一個 IMU / LED 的開發套件,由 STM32F103T8(微控制器)、MPU6500(三軸加速度計、三軸陀螺儀)、WS2812B(One-Wire RGB888 LED) 組成,內部裝有鋰電池與開關,可以獨立供電,並預留了一個 ADC 來檢測電池電壓,另外引出 UART 與 SWD,方便針對 IMU 與 STM32 做開發、除錯,整體體積為 25.4 * 25.4 * 25.4 mm,上面共有 54 顆 LED,每個 LED 都是獨立可控的。

經過這幾天的測試實驗、有幾個部分打算在下次送廠修改

  • 整體大小,將再嘗試縮小,增加 LED 密度。
  • 目前板厚採用 1.6mm,將試用 1.0mm 效果。
  • 調整 SWD/UART 接口,嘗試使用 FFC 母座替代。
  • 考慮充電方法,製作接口插線充電或是設計充電底座。

↑ IMUCube 硬體部分單純由六片 PCB 組成,PCB 間透過焊錫連接,沒有加入其他機構,六片中只有一片具有微控制器、感測器與開關等元件,其餘五片皆僅由 WS2812B 組成。

↑ 第一次組裝的立體 PCB,構想的樣子、組裝方法大致都沒有問題,比較出乎預料的是 WS2812B 的焊接,排得有些密集... 導致需要有焊接順序才會比較不容易燙到其他 LED。

↑ 預留出來的 SWD 與 UART 功能,1.27mm 母座,左到右分別是 3V3、SWDIO、SWCLK、GND、RX、TX。

下面影片中的 DEMO 程式透過三軸加速度直接映射到 R, G, B 三個像素上,所以旋轉 IMUCube 就會讓 LED 產生不同的顏色,若當特定軸加速度大於一定數值時,就會進入 rainbow 模式,演示 RGB LED 自動變化。

最近新添購的工具:隔熱墊、清潔 PCB 用的擦拭紙以及元件盒.隔熱墊規格上是說耐熱 500 度、耐腐蝕、防滑,一片大小大概350 x 250 mm,售價約 NTD250 左右,實際使用 PCB 可以"黏"在上面,不容易滑動,也有設置一些洞放元件與工具用,使用熱風槍加熱桌子也沒甚麼問題,感覺划算,不過像沒有防靜電,這點比較擔心,不知道容不容易產生靜電...

看來東西越來越齊全,再來目標就是回流焊烤箱、雷射雕刻機與 3D 印表機,讓能做的事變得更多更豐富!

↑ 隔熱墊

↑ 元件盒

↑ 擦拭紙