2018年1月31日 星期三

技術筆記 STM32 memory usage

STM32F100的電路圖,裡面包含著16k的flash memory

印表玩具

   STM32技術

自從使用C#或JAVA後,就不再關心記憶體配置了(這所謂的記憶體,不是pointer和leak的問題)。為了製作印表玩具使用的STM32,遇到許多記憶體操作問題。分別整理如下。

FLASH RAM原理


【動態記憶體(RAM)】與【唯讀記憶體(ROM or Flash)】是截然不同的。彼此關係,包括STACK和HEAP資料如下。



FLASH:
特性是拔電時,資料還存在著。資料也是區塊寫入讀出。
以前PC程式有硬碟可以存放程式,Keil編譯好的程式,就是直接放在這區。這裡面包括程式本體、resource、變數的宣告值等。資料讀出很方便,但是寫入很"麻煩"。
討論變數與flash的關係
1. int i = 100;  後面的100是要寫在 flash 中。程式啟動後會在RAM中設定 i ,然後從flash中拿出100放在一起。是compiler根據整個程式大小、最佳化等,東算西算決定放在這個位置。
2. const int i = 100; compiler就會將這個變數也會放在flash中(而不是RAM)

RAM:
特性是拔電時,資料就消失。資料可以某個位置直接寫入讀出。
這裡區分成三種資料,是程式運作中需要的項目,可以讀也可以寫。
1. global 變數
2. function 中宣告的變數,這會放在stack中
3. new malloc 的變數,這會放在heap中

這篇文章對記憶體使用有很清楚介紹。下面內容大多是從連結取得,當成筆記。

CODE、RO、RW、ZI Data域及堆棧空間
在工程的編譯提示輸出信息中有一個語句"Program Size:Code=xx RO-data=xx RW-data=xx ZI-data=xx",它說明了程序各個域的大小,編譯後,應用程序中所有具有同一性質的數據(包括代碼)被歸到一個域,程序在存儲或運行的時候,不同的域會呈現不同的狀態,這些域的意義如下:

    Code:即代碼域,它指的是編譯器生成的機器指令,這些內容被存儲到ROM區。

    RO-data:Read Only data,即只讀數據域,它指程序中用到的只讀數據,這些數據被存儲在ROM區,因而程序不能修改其內容。例如C語言中const關鍵字定義的變數就是典型的RO-data。

    RW-data:Read Write data,即可讀寫數據域,它指初始化為"非0值"的可讀寫數據,程序剛運行時,這些數據具有非0的初始值,且運行的時候它們會常駐在RAM區,因而應用程序可以修改其內容。例如C語言中使用定義的全局變數,且定義時賦予"非0值"給該變數進行初始化。

    ZI-data:Zero Initialie data,即0初始化數據,它指初始化為"0值"的可讀寫數據域,它與RW-data的區別是程序剛運行時這些數據初始值全都為0,而後續運行過程與RW-data的性質一樣,它們也常駐在RAM區,因而應用程序可以更改其內容。例如C語言中使用定義的全局變數,且定義時賦予"0值"給該變數進行初始化(若定義該變數時沒有賦予初始值,編譯器會把它當ZI-data來對待,初始化為0);

    ZI-data的棧空間(Stack)及堆空間(Heap):在C語言中,函數內部定義的局部變數屬於棧空間,進入函數的時候從向棧空間申請內存給局部變數,退出時釋放局部變數,歸還內存空間。而使用malloc動態分配的變數屬於堆空間。在程序中的棧空間和堆空間都是屬於ZI-data區域的,這些空間都會被初始值化為0值。編譯器給出的ZI-data占用的空間值中包含了堆棧的大小(經實際測試,若程序中完全沒有使用malloc動態申請堆空間,編譯器會優化,不把堆空間計算在內)。這裡提到如何看編譯後的檔案大小

FLASH RAM起動過程


程式起動後的動作如下

以int i = 100;這個例子來說,i是RAM,但是100是FLASH。此時又有一個問題出現了,上面的描述在使用時,100早就已經放在var裡面了,很明顯的,一定有一個東西把100放進去var那個RAM的位置。C-Language程式的進入點是main(),所以在main()之前,一定有一個東西做了很多事,讓C的程式能夠從main()開始順利運行,那個東西,叫做boot loader,換句話說,因為刻意的安排,CPU會先執行boot loader,等所有環境建立完成後,再進入main()。

當CPU通電開始執行時,依照CPU不同種類,一定固定由某個位置開始抓第一行指令開始執行,boot loader的第一行就放在這裡。依據CPU的複雜度,如ARM7,9就有專門的boot loader,可以做出很複雜的功能,例如可以用TFTP載入,單純的如8051的compiler:IAR51,因為事情很固定,它會自動幫你加上已經寫好的boot loader。

RW-data和ZI-data它們僅僅是初始值不一樣而已,為什麼編譯器非要把它們區分開?這就涉及到程序的存儲狀態了,應用程序具有靜止狀態和運行狀態。靜止態的程序被存儲在非易失存儲器中,如STM32的內部FLASH,因而系統掉電後也能正常保存。但是當程序在運行狀態的時候,程序常常需要修改一些暫存數據,由於運行速度的要求,這些數據往往存放在內存中(RAM),掉電後這些數據會丟失。因此,程序在靜止與運行的時候它在存儲器中的表現是不一樣的



圖中的左側是應用程序的存儲狀態,右側是運行狀態,而上方是RAM存儲器區域,下方是ROM存儲器區域。

程序在存儲狀態時,RO節(RO section)及RW節都被保存在ROM區。當程序開始運行時,內核直接從ROM中讀取代碼,並且在執行主體代碼前,會先執行一段加載代碼,它把RW節數據從ROM複製到RAM,並且在RAM加入ZI節,ZI節的數據都被初始化為0。加載完後RAM區準備完畢,正式開始執行主體程序。

編譯生成的RW-data的數據屬於圖中的RW節,ZI-data的數據屬於圖中的ZI節。是否需要掉電保存,這就是把RW-data與ZI-data區別開來的原因,因為在RAM創建數據的時候,默認值為0,但如果有的數據要求初值非0,那就需要使用ROM記錄該初始值,運行時再複製到RAM。

STM32的RO區域不需要加載到SRAM,內核直接從FLASH讀取指令運行。計算機系統的應用程序運行過程很類似,不過計算機系統的程序在存儲狀態時位於硬盤,執行的時候甚至會把上述的RO區域(代碼、只讀數據)加載到內存,加快運行速度,還有虛擬內存管理單元(MMU)輔助加載數據,使得可以運行比物理內存還大的應用程序。而STM32沒有MMU,所以無法支持Linux和Windows系統。

當程序存儲到STM32晶片的內部FLASH時(即ROM區),它占用的空間是Code、RO-data及RW-data的總和,所以如果這些內容比STM32晶片的FLASH空間大,程序就無法被正常保存了。當程序在執行的時候,需要占用內部SRAM空間(即RAM區),占用的空間包括RW-data和ZI-data。應用程序在各個狀態時各區域的組成見表 482。

宣告的變數太大無法編譯


在MDK中,我們建立的工程一般會選擇晶片型號,選擇後就有確定的FLASH及SRAM大小,若代碼超出了晶片的存儲器的極限,編譯器會提示錯誤,這時就需要裁剪程序了,裁剪時可針對超出的區域來優化。

如果宣告變數太大,編譯時就會有錯誤,
.\Targets\STM32F429_Discovery\project.axf: Error: L6406E: No space in execution regions with .ANY selector matching xxx.o(.bss).
.\Targets\STM32F429_Discovery\project.axf: Error: L6407E: Sections of aggregate size 0x98fa8 bytes could not fit into .ANY selector(s).
換成const有幫助,但這樣一來原本能動的程式就無法執行。

HEAP設定方式



能通過編譯,不代表程式運作時不會有問題。在SD CARD的範例中就會發現,malloc記憶體時會有錯誤。在網頁中提到,Dynamic allocation is used when new file should be created. You need at least 512 bytes of free memory in HEAP region for malloc to allocate data, otherwise, f_open function will return FR_NOT_ENOUGH_CORE result.

default Keil uVision project, HEAP memory is by default set to 0x200 Bytes = 512kB which can be quite small for something like strings can be in size. open .s (startup file) inside your project and edit variable “Heap_Size” to a value you want to reserve for HEAP

這個網頁中,提到如何設定HEAP SIZE,Heap_Size可以從200改成800。檔案位置在D:\stmlib\git\trunk\00-STM32F4xx_STANDARD_PERIPHERAL_DRIVERS\CMSIS\Device\ST\STM32F4xx\Source\Templates\arm\startup_stm32f429_439xx.s。

TM範例  STACKOVERFLOW討論

外部SD RAM原理


STM32控制器芯片內部有一定大小的SRAM及FLASH作為內存和程序存儲空間,但當程序較大,內存和程序空間不足時,就需要在STM32芯片的外部擴展存儲器了。

STM32F429 Discovery board has external 64Mbits or 8MBytes SDRAM chip ISSI IS42S16400. It has a FMC (Flexible Memory Control) peripheral to driving external SDRAM with hardware. 

FMC hardware is able to store up to 32bits variables at same time.
STM32F429使用FMC外設來管理擴展的存儲器,FMC是Flexible Memory Controller的縮寫,譯為可變存儲控制器。它可以用於驅動包括SRAM、SDRAM、NOR FLASH以及NAND FLSAH類型的存儲器。STM32F429的FMC外設才支持該功能,且只支持普通的SDRAM,不支持DDR類型的SDRAM。FMC是如何運作,這篇有非常非常非常深刻的說明。

外部SD RAM:簡單操作


包括TM方式和SPORTS方式,容易瞭解但沒有實用性。
TM的範例
透過API呼叫 FMC Flexible Memory Control (只有429之後才有 407沒有 )
包成 宣告 例如 TM_SDRAM_Write8(location, 8bitvalue); 8bitvalue = TM_SDRAM_Read8(location); 可以動態在SDRAM某個位置進行讀取。
SPORTS範例
取用記憶體,還是使用FMC的指令

外部SD RAM:整合入malloc


讀寫SDRAM存儲的內容時,需要使用指針或者__attribute__((at(具體地址)))來指定變數的位置,修改sct文件,讓連結器自動分配全局變數到SDRAM的地址併進行管理,使得利用SDRAM的空間就跟內部SRAM一樣簡單。

摘要內容,連結


人體自動化 字型文章

網路上找到一些連結似乎有更簡單方法。OPTREC似乎也有使用這個技巧。

連結1
連結2
連結3

2018年1月19日 星期五

[小說集]被埋葬的記憶


讀過石黑一雄長日將盡、別讓我走兩部作品後,繼續閱讀其2015年最新作品【被埋葬的記憶】THE BURIED GIANT。相較以往幾部作品,被埋葬的記憶,無論是在故事設定或風格或探討議題上,都與長日將盡、別讓我走有很大不同。

以故事設定來說,以往擅長書寫小範圍空間如深宅大院(長日將盡)或寄宿學校(別讓我走)的石黑一雄。搖身一變,成為奇幻故事作家。出場人物有騎士、僧侶和惡龍。時間地點也從現代跳轉回亞瑟王時代的英國大陸。

當時不列顛人和撒克遜人正結束一場血腥爭戰。不列顛人雖獲得勝利,戰敗的撒克遜人卻誓言要復仇。為了避免戰爭,亞瑟王指派魔法師梅林利用巨龍神奇煙霧的力量,讓雙方人民忘記這曾經發生過的慘事。

預期中,這代人都將在苟且的假象中,過著渾渾噩噩生活,直到這一代人都死去,傷痕都被撫平,事過境遷,新時代來臨,即使沒有巨龍的煙霧,人民也只會將過往這段殺戮視為歷史,成為和諧共存的雙方。不過,故事結局卻是巨龍終究在計劃完成前被斬殺,沒有了煙霧,人們都將清醒。報仇的心若再加上有心政客操弄,將會引發更大的戰爭。

故事發展過程中,每個參與者都不斷被質問,"是否需要屠龍"。這也是在詢問,對於過往的錯誤,是要強悍面對,揪出施暴者給予逞罰並且修正錯誤,還是該放下仇恨,專注向前?書中蓋文爵士和威斯登戰士的決定,象徵了群體面對這抉擇時的心情,而老夫妻則是代表了家庭和個人的決定會影響家庭是否破裂或和諧。

對於國族、社會、個人,面對沉重不堪的過往,何時該記憶,又何時該遺忘,當然沒有標準答案。若是認為,人是健忘的動物,終究會遺忘。那麼以色列和巴基斯坦兩國的紛爭,早就該結束,為何還是衝突不斷?若是認為,傷痛的記憶很難抹滅。但看看鄰國日本,二戰尾聲日本受到美國原子彈轟炸造成二十萬平民的傷亡,如此慘痛的經驗,為何現在卻無人聞問?

所以,石黑一雄這個問題,是會隨著時間、環境、不同的人而有不同答案。這完全反映吳乃德一篇文章中引述的「不要對揭露真相的後果太樂觀,因為『記憶常帶來和解,也同樣地常帶來報復,而希望透過解放的記憶帶來罪行的洗濯和救贖,結果將只是一個幻影。』因此,在受害者的個人層次上,有些例子支持揭露真相的和解效果,有例子則對這樣的期待加以否定。」(連結)

所以,相信人權價值和正義者,就勇敢面對過去的陰暗,去挑戰和修復創傷吧。若是以目前的人的和諧幸福為優先考量者,為了解決目前的問題,過去的負擔可以拋開。

而我從來就是渾渾噩噩且敏感度極低的人,很少受到記憶的困擾,真要選擇也應該會類似蓋文爵士,非常功利的為了可見的明確而選擇遺忘。

若從文學角度看這本書,原本以細膩筆觸刻劃人物心緒轉折見長的石黑一雄,在本書中比較沒有發揮的餘地。討論主題也從反映時代和人性幽微關連,進化為探討記憶與遺忘。若說這就代表了作者近十年來思考的轉變,我個人反而喜愛以往著作的氛圍。

2018年1月17日 星期三

[小說集]那時候,我只剩下勇敢

作者丟下僅剩一隻登山鞋的意象非常深刻

原文書名 Wild: From Lost to Found on the Pacific Crest Trail。 作者:雪兒 史翠德(Cheryl Strayed)。本書是作者親身經歷,描述她為何踏上PCT,以及步道上的點點滴滴。

PCT,為Pacific Crest Trail縮寫。中文名稱是太平洋屋脊步道。起點為墨西哥邊界,終點是加拿大,全長4256公里。這有多長呢?提供個具體數字,步行環台灣島約1100公里,換算下來PCT約環繞台灣四次,考慮山地路徑難走,難度只會倍增。

途中會經歷沙漠的酷熱嚴寒、高山地區的冰雪難行與上下陡坡、雨林的潮濕悶熱,是美國境內最知名長距離步道。一般健行者是三月由墨西哥端出發,以五個月完成整段旅程。根據統計,每年約有三、四百人挑戰這段行程,完成者約半數。華人中,首推張諾婭在2014年完成此路程,兩年後,2016年終於也有台灣團體踏上PCT山脊。

我因為喜愛徒步旅行,平日就持續關注PCT相關訊息。舉凡YouTube上影片、雜誌或書籍以及實體的分享會,都認真參與研讀。累積知識的同時,也會發現PCT資訊雖多,卻都是冷冰冰數據,缺少能打動人心的故事。所以發現「那時候,我只剩下勇敢」竟能以文學形式切入和推廣荒野步道,更甚者,還登上New York Times Best Seller list排行榜。心中之好奇,不可言喻。

探究其背景。作者雪兒是在1995年,芳齡27歲荳蔻年華時,背著暱稱為猛獸的大背包,踏上這個旅程。二十多年前的PCT並不像現在這麼有名,年輕女性更是步道上的稀有動物。雪兒以無比毅力度過旅程後,再回到社會,時隔17年才動筆出版這本半自傳式回憶錄。

故事開始,作者就毫不保留的,將她在踏上PCT前荒誕生活經歷,攤開讓讀者瞭解。她原本擁有正常人生,直到二十多歲的母喪徹底擾亂其生活,迷失了自己。生活成為荒亂性關係和海洛因毒品的反覆循環,最後更讓婚姻破裂,眼看著她就要被生活所吞噬。但求生的本能,讓她抓住PCT機會,奮力讓自己投入步道中。

初踏上PCT時,雪兒沒有錢,沒有朋友、更沒有未來。身邊僅有的是從未背起的背包和茫然未知。我們可以想像,起初幾天,每個當下的決定都是巨大挑戰。例如爐頭損壞、找不到水源、身體受傷、野生動物襲擊(熊、響尾蛇),還有獨身女子帶來的危險,樣樣都得在驚恐中耗費巨大精力才能解決。所幸在山中,人要的其實不多,只要有勇氣就能活下去。何況PCT有志工、天使和眾多同行伙伴彼此加油打氣,讓她順利走下去。

故事最後在雪兒抵達奧勒岡和華盛頓州邊界就停止,雖然並沒走完全程,不過這並不影響她冒險犯難的經歷。因為我們都相信,她已經蛻變成獨立且堅強的人,足以應付未來所有的挑戰。

怎麼看,這都是個魯蛇變成溫拿的故事,也難怪會進入暢銷排行榜。畢竟,每個人都喜歡弱女子從生命谷底向上奮鬥成功的情節啊。

屏除上述熱血的部分,雪兒 史翠德在文字上的功力,更讓我驚嘆。她對徒步過程詳實記載,例如睡在天地帷幕之下的感覺,漫長上坡和下坡經驗,雪地旅行,幾天看不到一個人的孤獨等,都非常貼切,入木三分。我想,即使自己和雪兒站在相同的大景前,且擁有同樣感動。形之於文字大概也就是,好美啊,這類單薄字眼。若說寫作是一種技藝。但有的人特別在行,雪兒就是最好範例。

最後,我也想藉著這本小說,討論為何要進行長距離步道這個問題。

曾有人問雪兒 What did this hike teach you? 你從這段旅程中學得了什麼? 雪兒回答說Acceptance. "接受". I had to accept the fact of the hour. The fact of the mile. The fact of the summer. The facts of my life. Over and over again, I found that if I could accept those difficult things, everything else sort of gave way. Each step led me to the next step, the next truth that was going to reveal itself. We all suffer. We all have heartbreak. We all have difficult things. They're part of life. Realizing that was very profound for me. The PCT gave me a really grand sense of humility, which is what you need so you can keep walking in ways both literal and metaphorical.

整段大意是,步道教會我凡事要抱著"接受"的心。步道和人生都一樣,困頓是常態。認清這事實後,期望自然會降低,遇事就不容易怨天尤人。安心致力於每個能力所及的微小改變,或許能累積成改變的力量。

多麼富有禪意且正面積極的人生啊,對比1995年的雪兒,我在YouTube、雜誌或分享會上認識的每個thru hike,動機有千百種(充實經歷、探奇、挑戰、欣賞美景、健身,休憩或自我實現),不變的是,我們都被灌輸步道很艱苦、漫長,有許多艱險要"挑戰"這個預設立場。或許,雪兒這單純"接受"的想法,能提供給追求效率的長徒步行者,發掘更不同的視野。

除小說外,WILD還被搬上了大螢幕,基本上都是照原著進行,幾個重要段落如開頭丟鞋子、響尾蛇、性愛場面、眾神之橋都表現得很好。相比小說,導演更強調女主角生命谷底的經歷,還將回憶切割成許多小單元,嵌入整段影片中,增添許多詩意。而全片最重要的女主角雪兒,是由曾獲得奧斯卡最佳女主角的Reese Witherspoon飾演。原本甜心造型的她在片中幾乎素顏上場,演技也是可圈可點。

-------------------

後面是PCT相關整理

參加過三場分享會資料。
活動一  阿泰:楊世泰 呆呆:戴翊庭 (2016年夏天) 夫妻檔,平時就參與許多戶外活動(新竹SOFA)
活動二 Pedro (2016年夏天)  起初與呆呆阿泰同一團體,之後各自行動 (新竹SOFA)
活動三 Bun  (2017年夏天) 獨自完成 (台北岳人戶外用品)。其中Bun給我的印象最深刻,外表機靈的他。旅行只是為了看風景,對日復一日的步道旅行,感覺像是在上班,基本都是獨行,語言能力和我類似。完成旅程後,說沒感覺人生有什麼改變。

JMT行程:PCT全長約160天,實在抽不出身,若真要成行,也可以考慮JMT。

----------------

目標似乎越來越明確,2021年又整理內容如(連結)。

2018年1月15日 星期一

[小說集]素食者


素食者,是本份量輕,文筆簡潔流暢,翻譯品質佳,容易閱讀的好書。

故事描寫看似正常的三十多歲人妻(英惠),因某個突然的轉折(雖然說突然,實際卻是從孩提起就深埋心中的想法),開始拒絕葷食,之後更隨著自己將變成植物的想像,連素食都開始捨棄,成為厭食者的故事。題材類似精神病驚悚小說。但若僅止於此,就只是觀察記錄,而不會是文學作品了。

作者韓江雖然交待了英惠病況進程,但沒有醫學報告式的心理分析。我們對英惠的瞭解僅止於她的夢境和部分兒時回憶以及壓力和恐懼對她的侵蝕,但都不是決定性因素。相較於精神病患英惠,作者反而將重點放在正常人,也就是英惠身邊人物對她厭食的反應,編織出故事主題。也就是暴力、慾望、責任與人的關係。

首先登場是英惠的先生,是位有點功利傾向卻不至於做惡,平凡到不能再平凡上班族。他對妻子成為精神病的真正原因不是那麼在乎,只是想快快解決這個"問題",讓生活回到原本正軌,當情況變得無法收拾時,則以離婚收場。看似鄉愿,卻也反映了大多數人(包括我)對生命的看法和遇到變化的標準回應。

第二位是英惠的姊夫,一位困頓的藝術工作者,對這件事則有完全不同態度。他將女主角的精神疾病,解釋為某種神祕的召喚,並將自身追求瘋狂的心,投射在女主角身上。怪誕的劇情,襯托出姊夫對慾望無止境追求,作者透過這位藝術家的手,將濃烈且鮮豔但無法持久的花朵封印在人體上。與英惠特有的冷靜、沉穩,營造出夢幻、柔美、華麗但又若有似無的陰柔特質。

第三位是女主角的姊姊(仁惠),她與女主角同樣活在父親家暴的陰影下,卻因為意識到自己長女的身分,幼時起就背負了許多責任感。成長過程也是兢兢業業,認為唯有努力才能維繫週遭世界的平順進行。所以即使遭遇先生和妹妹的瘋狂行徑帶來的人生失敗,或是妹妹瘋狂後她還得負責照顧的種種痛苦,都還是壓抑忍受著。而故事最後是在仁惠是否真的能救贖妹妹不得而知的狀況下突然結束,留下開放式結局。

------

我認為,人,本就是充滿矛困與衝突的,尤其當下社會日益複雜,人要融入其中,更是艱難的任務。會壓垮精神病患的原因,其實也始終存在於我們生活週遭。如果常常都想著生命意義或恐懼和威脅,人生真的很難過下去。適度的遺忘、妥協與不經心,反而是活下去必要的能力,類似英惠先生的反應,應該是"正常人"的反應。

英惠和姊夫,則是精神衝突的犧牲品。英惠因為無法調解衝突選擇退縮,期望自己變成不需要反抗任何事物的植物。姊夫則是不甘於平凡刻意追求激烈衝突證明自己,結果卻是讓生命像狂風暴雨,轉瞬即逝。

全書行文輕快且緊湊,特別是對餐桌上食物、身上鮮艷畫作、樹林間植物的描寫都栩栩如生,冷靜中卻帶著強大的力量。讀來精彩,放下後卻又覺得異常沉重。

[小百岳]視野絕佳的加里山

加里山

寒流來襲的清晨,若不是躲在棉被中,就該是前往高山的路上。今天要衝的加里山,位於苗栗南庄,標高2220公尺,為知名小百岳。登山口有兩處,一是東河鹿場部落,二是大坪林道。前者安全設施多,後者較幽靜。考量同行大C少登郊山,選擇較安全的鹿場登山口。

我們從新竹出發循頭份、三灣、南庄、東河,約八點抵達鹿場部落。過部落後,再沿水泥產業道路前行十分鐘抵達加里山登山口,此處有私人停車場每次收費一百元。

八點三十分起登,一進入登山口就是成片柳杉林,不久就抵達第一個叉路口。此時注意直行是哈勘尼山,不取。選擇右下,八點四十五分抵達風美溪。溪寬約十公尺,河水冰冷且湍急,原本舊竹橋已沖毀不堪使用,須改由河口處數條拉繩協助通過。



十五分鐘後抵達風美溪,寬約十公尺

由此溪至加里山頂約3.2km,高低落差九百公尺,就是一路向上爬。原本預計會汗流浹背、氣喘吁吁的,所幸今日寒流來襲,低溫反而有助我們緩步上升。環顧四望,都是在人造柳杉林間前進。萬籟俱寂中,只有登山鞋踩踏在細樹枝上發出的聲響,歲月在其中,剎那也像是永恆。

沿途每隔百公尺就有明顯路牌 幫助救難引導


色色的樹
植栽密度高,灑下的光影不多 杉林間 蕨類滋生

一小時後抵達海拔一千六百公尺處。步道旁有鐵軌遺跡。事後查詢,加里山區以往盛產檜木,日據時代,為伐木沿此海拔線修築山地鐵道通行五分車,方便木材輸送。隨著伐木業消逝,鐵道也隱沒在荒煙漫草間,僅部分段落和步道重疊,供山友們發思古之憂懷。

山地鐵路

九點五十分抵達山屋,由此向前行可接大坪林道,不取。左轉上山,仍是杉木林,距山頂0.6公里處,有分叉可切回先前直行路,日後再探查。此時越來越多巨石阻擋在前,根據資料,巨石岩壁潮濕陰暗角落最適合一葉蘭生長,可惜得等三或四月,才有機會見其芳蹤。

 
林間巨石當中剖開 難不成孫猴子要出世?
過九號標示牌後,林相有了巨大改變,柳杉林被杜鵑和山毛櫸雜林取代,路邊也開始有箭竹蹤影。原本盤根錯節步道變成樹根及岩石交錯的陡上路段,需手腳併用並藉助繩梯攀爬而上。

盤根錯節的天梯

約十二點整,登上加里山頂。舉目四望,翠綠的樂山(鹿場大山)橫更在前,襯托出其後連綿不斷的雪山諸峰,今日天清氣朗,數十公里外的聖稜線和大雪山,超乎想像的近在眼前,連日寒流發威下,雪山主峰已經白頭。馬拉邦山和獅頭山系則是以此為中心向南北前後延伸,構成一堅實屏障,鳥瞰新竹和苗栗地區。

登頂途中

山頂人聲鼎沸 仔細看雪山已白頭

登頂照 大C還笑得出來
有人背四軸上山玩空拍

回程是原路折返,返抵登山口時三點二十分,全程約七小時。短短行程有渡河、森林浴、拉繩攀岩和絕佳展望,沿途安全又舒適,若想多變化,也可考慮從大坪林道進入體驗杜鵑嶺景緻,或是依照此部落客推薦安排鐵道行。加里山雖然是中級山,卻是都市人親近大自然的好所在。

2018年1月12日 星期五

微流體晶片Microfluidic chip



摘錄自網路論文

近年來,拜微型系統發展之賜,微流體晶片研究益發蓬勃發展。與以往大型離心機、篩選機相比,微流體成本低,且能有效觀測和計數微型世界的變動,影響範圍正逐漸擴大,幾年內應會進入我們的生活。

近看微流體晶片,小小一塊其實內部是別有洞天。最引人注目的是像是外星麥田文字的管道結構。經過精心設計的管狀螺紋,可以控制其內介質流速,有利於物質反應和觀察。而隨著不同需求,最近管道設計更從2D平面往3D立體發展,就像是大型游泳池的瘋狂滑水道一般。

這些管道又是怎麼製造出來的呢?基質幾乎都是PDMS(類似果凍膠,常見藝術材料)的透明可塑材料,有興趣可以參考網路PDMS管道DIY影片,可在網路購買PDMS,基本約二百元(連結)。管道本身可藉雷射或曝光或3D列印ABS再用丙酮清洗,甚至還有使用小朋友熱縮膠加熱而成。

管道完成後,接著就是研究如何將介質注入管道中。專業方式為微型馬達micro pump,若要減省成本,也可以用兩層PDMS製作出一個小型空氣泡,透過壓力推動液體流動。

流動的介質究竟能做什麼呢?最常見的就是影像辨識(如opencv),有時還會利用螢光標記提升辨識率。辨識結果可以更進一步做分選動作,這個模組可利用雷射光或微型機電驅動空氣泡影響路徑,讓物質流入不同管道。目前最常見應用都是生醫檢測,如在血液中挑選和蒐集癌症細胞,或是小範圍化學反應研究。

下面小顆粒是塑膠微粒(模擬血球)

整個過程,其實很像是吸管喝珍珠奶茶手搖杯中小小珍珠的縮小版本。和許多科學發展進程相同,顯微鏡發明後,開啟了生物科學進展。微流體或許也是以不同觀看方式,檢視相同反應過程,得到更多數據。學術上,因為幫浦和分選都需要微電機,多是機械或電機學系在研究,這個糖化血色素的例子很直觀,商業化好像有上準微流體(代理國外產品)或光合聲(學術研究多)有這方面研究。LEGO的例子,詳細1 詳細2 詳細3

另外,穩定注射也是控制微流體的重要部分,例如用這種雙針筒注射泵浦,在PCHOME都有得賣。實際組合套件可以參考連結DIY。還有球珠(連結),真正實驗是另外物品。

正式點的注射器

筆記同樣有管線感覺的 化學管道  還有拍張沒侵犯機密的血糖試紙(電化學).


2018年1月7日 星期日

小四軸的FPV(First Person View)

FPV(First Person View),可藉著無線電波,將機上鏡頭所見,傳送到操縱者眼前,讓人有身歷其境感受。也是四軸飛行最特別部分。FPV需要的鏡頭、訊號處理和和傳送系統都與四軸飛控有區隔,兩者僅使用相同電路。所以電池接上後,不需要任何開關和設定,機上所見影像就會傳送到數十公尺外的接收器中。下面是取自268的影片檔,片中還能看到戴著眼鏡在操作WHOOP95的268本人。希望我們家飛行技術也能達到如此水準。


268提供的圖傳,應是使用VM275T 5.8GHz 25mW 48CH NTSC/PAL Mini VTX 600TVL,重量僅3.4g。訊號透過5.8G頻段傳出,目前為第八頻道(可在PCB上找到按鈕按下修改)。想想自己工作上,有段時間和網路影像有關,系統能做到這個程度,真是太令人吃驚。


機上鏡頭

接收端樣式如下,捨棄蘑菇天線,由鞭狀天線接收訊號,傳入螢幕,立刻就會有類似VR感受元件如下,零件價格約二千元。目前電池是外掛,充電方式是DC JACK  5.5mm,因為沒有現成品,可能要找T插母頭銲接。或是用充電的鱷魚夾,夾上面T插的鱷魚夾,紅黑相對。方式是0.5A 12V 非平衡充。

DIY FPV眼鏡 前視( 268出借 )

反面照( 長按啟動,短按選擇 )

市面上完成度較高產品分類
1.成品1成品2
2.上萬DJI的goggles
3.市佔率最高是Fat Shark肥鯊,268有專文介紹

如果有錄製影像的需求,首先可以考慮使用新一代產品,有內建SD卡型式。當然也可以參考行車記錄器概念,加裝MINI DVRHMDVR進行測錄,前面提到更先進眼鏡,也都可以直接插入SD卡錄影

以上接收方式外,還有一種選擇是利用手機OTG圖傳接收機,搭配手機使用(必須有OTG功能),價格約三千,解決方案另外方案。軟體部份POCKXX。許多人會將這種裝置放入類似google cardboard的盒子中,看起來和各種眼鏡的型式,相差不遠了,

-------------------

除了5.8G外,市面上還有WIFI的選擇,例如在ArkLab購買過wifi camera零件技術資料如連結,0.8W,工作電壓3.7-5V,硬體有對應APP可下載。看資料,這個APP還可以順便驅動四軸運作,感覺是很詭異和沒效率的功能,而且ArkLab似乎自己也沒成功。


優點是,一般手機就可以接收,解析度會比較好,缺點是會有延遲、距離較短、可能干擾2.4G遙控器等等。用於短距離空拍及慢速飛行是沒問題,不適合高速飛行。

----------------------

看著FPV影片,會有些想法。

最直覺想法是,這樣不會頭暈嗎的疑問,這個問題在DJI Goggles特別明顯,根據報導,DJI擁有配合體感互動功能(需搭配自家Mavic Pro),當使用者左右轉頭時,四軸也會相對應的向左向右轉向,概念很像熱追蹤飛彈。這在視野空曠處還好,但如果是小範圍內那就是視覺上的災難。因為那違反一般人在筆直前進時,頭可以左右擺的常識。解決方式,可能要將鏡頭方向和機身運動方向區分開,以獨立伺服組控制鏡頭方向。

另外就是影像的處理方法,記得在2014年看過flynixiedemo。手背上的機架、人臉辨識、自動控制飛行。真是異常興奮。

nixie 網路照片

過了三年,產品化的可能性當然更高。最近還看到四軸人臉辨識文章,簡單摘要結論如下。
1.The small-sized facial images taken by drones from long distances do cause trouble to both face detection and recognition. 距離太遠
2.The pose variances introduced by large angles of depression dramatically weaken the capability of both face detection and recognition. 飛行時與人臉角度造成誤差
不過,我認為最大問題應該還是電池吧。如果這東西只能飛出去五次就沒電,實用性有多少呢?

另一種有趣的飛行器是Flyability(先前名子是gimball),理論類似直升機,控制性差,但結構單純且安全性高,很適合居家照護需求。

不平凡的視角:空拍機智能飛行與影片編輯(連結
不平凡的視角:空拍機的拍與被拍(連結
大疆MAVIC 2 PRO使用記錄(連結
小四軸的FPV(First Person View)(連結
第三款小四軸 Tiny QX80(連結
飛翔吧 WHOOP95(連結
飛不起來的小四軸(連結

2018年1月6日 星期六

第三款小四軸 Tiny QX80


Tiny QX80是台重量不到六十公克,長寬不到十公分的秀珍小機。基本架構是SP RACING F3_EVO,動力則是常見的820有刷馬達,飛起來平穩,最重要是殺傷力又低,最適合我們這類新手,好操縱且容易培養信心。


同前面WHOOP95,這台機器也是268割愛而來,詳細資料(缺圖傳)。入手後,首先就得面對遙控器設定和操作問題。目前手邊這台DX6I,始終停留在只會玩,不會設定的階段,心想也可趁此機會確實瞭解它,日後也好接觸更多四軸機型。

DX6I是spektrum六動控制入門機種,可記憶十台飛行設備。除非進入選單更新,開機預設就是啟用第一組設定。

menu map

設定程序是..
1.短按鈕進入adjust選單,最上面選單是MAIN,最下面是SETUP
2.新將原本WHOOP95資料拷貝成新MODEL
3.進入選單設定此為預設飛行器
4.更新名稱為QX80
5.關閉遙控器(因為目前選擇項目就會是後續bind的項目,bind前要多確認,以免覆蓋其他MODEL資料)。
6.此時需暫停,將注意力切換到電腦上的操縱軟體,將四軸設定為BIND模式。
7.關機狀態下,將對頻拉桿拉向自己。打開電源,螢幕出現BIND字樣,放開拉桿,看到四軸上LED燈恆亮,表示BIND成功。此步驟容易錯誤,可能要多嘗試幾次。
8.其他,進入SETUP選單
    開機後長按 或是由adjust最下面選入
    最上面選單是MAIN,最下面是adjust
日本手--右手為油門  美國手--左手為油門(目前這台)

再來看遙控器的理論基礎。
ArkLab是以藍芽和手機進行溝通,但一般較正式飛行都是透過2.4GHz頻道遙控。四軸上需要友發射器,同時也要有必須安裝相對應接收機。
通訊設備之間的協定,可以區分為四種,這篇文章有詳細說明,概念類似同樣是網路通訊,但以不同方式創造和解釋封包,就會有2G、3G、4G等等不同機制。由簡單到複雜依次為
1.PWM
2.PPM(CPPM)
3.S.BUS(S-BUS/SBUS)
4.DSM2(同類協定包括DSM、DSM2、DSMX)。目前WHOOP95、TINY QX80和大四軸都是使用dsm2,不過體積不同,設備大小和設定方式也各異orangerx。原本ArkLab也有專文介紹,如何在ARDUINO上,改變為DSM2版本。這篇文章提到兩種小型接收機比較

飛控軟體..
四軸飛行機三大元件是馬達、感測器和控制系統,控制系統依據MCU不同可區分成ARDUINO和STM32兩大種類。而STM32這個龐大產品鏈下,可再細分成下列幾種。

  1. F1飛控首次出現是在2012,也是最早為四軸無人機使用的32字節飛控,在這四者中速度最慢。其典型代表有Naze32和CC3D。
  2. F3飛控板於2014年引入,現階段F3飛控主要有X-Racer, Betaflight F3, LUX V2和KISS FC。目前測試對像是Betaflight。
    1. QX80(有刷),使用STM32F303CCT6:SP RACING F3 EVO(QX80 包含碳刷電變介紹  產品  說明1  說明2
    2. WHOOP95(無刷),也是F3為基礎。PIKO BLX EVO。產品詳細資料如下(PIKO除F3也有F4板)。
  3. F4 主要有Raceflight Revolt, BrainFPV RE1和DemonRC Soul. STM32F405RG/STM32F411CE:中原KitSprout的計畫QCopterFlightControl
  4. F7  BG F7飛控

就像電腦可選擇不同OS如Windows或Linux,QX80硬體架構STM32F3也可以安裝不同飛控系統,QX80是沿用了268建議的betaflight。betaflight和cleanflight系出同門,不同處是加入了電調可經飛控連接電腦,還有更容易上手的pid預設值,較適合新手。詳細資料可參考GitHub

以我身為資訊工程師的眼光來看,這個軟體非常優秀,首先,軟體依附在Google Chrome內安裝和操作,可避免Windows或Linux或Mac的問題,操作界面也可以簡化成一般網路分享器般簡單好開發和使用。安裝後啟動畫面如下圖。


啟動畫面

這時就提到betaflight第二個聰明處,就是控制STM32系統的方法。以往我在開發類似程式時,都是透過Dev PORT進行更新。雖然知道傳統USB PORT,可以更新FW,但都沒深究。betaflight非常聰明的利用這裡進行軟體交流和版本更新。更新時,PC上的軟體會透過USB將firmware放在STM32內固定區域,然後boot mode則會接手更新和啟動作業。如此高超的技巧是我在開發stm32f4程式時,無法想像的事。同時也完成了商用化目的。

首次USB連接四軸時,自動安裝stm driver

點選右上方connect後,出現選單畫面。可以參考,網路介紹

SETUP



Modes選單
最重要事 ARM 馬達鎖定/解鎖功能: 用來控制馬達鎖定或啟動。


CLI視窗



教學1
教學2

更新四軸飛控系統
以cleanflight說明,按左邊的firmware flasher。用usb線接上飛控和電腦
在這裡選好FW,例如用f3的話這裡最新是版本是1.11.0 spracing f3.
對應自己飛控的類型來選擇(例如naze 32的請選擇 1.11.0的naze)。選好固件後按右下角的load firmwater (online),等一會load完後有提示, 再按旁邊的flash firmware就可以。
Betaflight的方式相同,FW要另外下載,各stm32家族型號控制板軟體列表
下載完成後按load firmware (local), 這裡用的是 sp racing f3 的2.16版本.
再次確認固件版本後, 按flash firmware
manual baud rate 勾上, sp racing f3 需選256000
提示 programming: successful 完成

設定方式
教學1

BIND方式
網路上,提到有個按鈕可以按下,不過,實際上是以CLI為主

觀察和調整CHANNEL,包括兩個不同的頁面
recv
models

進階調整方式
修改成1024,而不是2048
教學1


不平凡的視角:空拍機智能飛行與影片編輯(連結
不平凡的視角:空拍機的拍與被拍(連結
大疆MAVIC 2 PRO使用記錄(連結
小四軸的FPV(First Person View)(連結
第三款小四軸 Tiny QX80(連結
飛翔吧 WHOOP95(連結
飛不起來的小四軸(連結