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

很久了,對四軸的最初印象是在寶萊塢電影"三個傻瓜"裡,但有想做的想法應該是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在不同的塔台間自動的移動與起降,主要是為了降低和解決飛行器續航力不足的問題,塔台透過矩陣燈與飛行器上的機械視覺來實現起降定位的功能,不過之後想到了一個延伸的有趣應用,一組矩陣燈可以用來傳遞訊息給飛行器,實現上下運動甚至空翻的指令,若多組的矩陣燈,就可以讓飛行器前後左右移動,或許意義不大,但在室內展示上卻有不錯的視覺效果,藉由電腦來控制矩陣燈圖案,就可以讓飛行器依自己想走的路徑運動或是做出特定動作。

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

github https://github.com/KitSprout/kSerial

[2015/12/04] 在 MATLAB 上實現一個 UART 數位波型顯示器
http://kitsprout.logdown.com/posts/335401

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

[2019/01/01]
封包格式小改版

  1. 調整通訊封包格式,去除尾端 '\n' 字元,改為 checksum 功能。

[2019/12/18]
最近在 Windows 上實現一個 UART to i2c 功能的小工具,使用了之前設計的封包格式,因為之前的格式只能支援到 255-byte,所以就針對封包格式做調整。

  1. 壓縮 type 訊息,擴展 length 大小。
  2. 新增 MATLAB kTwi class,在 MATLAB 實現 i2c 讀取功能。

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

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

YOUTUBE DEMO 影片

傳輸的封包格式定義如下

  • kSerial packet format
byte 1 byte 2 byte 3 byte 4 byte 5 byte 6 byte 7 ...   byte L + 8
  HK     HS     L     T       P1     P2     CK     DN     ER
name information
HK header 'K' (75)
HS header 'S' (83)
L   data length (12-bit, 0~4095)
T   data type (4-bit)
P1 parameter 1
P2 parameter 2
CK checksum
... ...
DN data
ER finish '\r' (13)
type binrary
uint8 0x0, 4'b0000
uint16  0x1, 4'b0001
uint32 0x2, 4'b0010
uint64 0x3, 4'b0011
int8 0x4, 4'b0100
int16   0x5, 4'b0101
int32 0x6, 4'b0110
int64 0x7, 4'b0111
half   0x9, 4'b1001
float 0xA, 4'b1010
double 0xB, 4'b1011
R0 0x8, 4'b1000
R1 0xC, 4'b1100
R2 0xD, 4'b1101
R3 0xE, 4'b1110
R4 0xF, 4'b1111

下面說明為 [2019/01/01] 改版之前範例

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
bytes = s.packetSend(command);              ->  only send parameter
bytes = s.packetSend(command, data);        ->  automatic detect data type
bytes = s.packetSend(command, data, type);  ->  user define 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 印表機,讓能做的事變得更多更豐富!

↑ 隔熱墊

↑ 元件盒

↑ 擦拭紙