總網頁瀏覽量

顯示具有 穿戴式裝置 標籤的文章。 顯示所有文章
顯示具有 穿戴式裝置 標籤的文章。 顯示所有文章

2021年1月19日 星期二

【8051 MCU】關於外部中斷旗標(IEx)被觸發的條件探討──Intel MCS-51官方手冊、Bible原文書與AT89S51/AT89S52實際狀況之差異

歡迎透過合法的方式分享此文內容,若要轉載/轉貼,請明確貼出此原始連結並標示作者基本資訊請勿抄襲及非法轉貼(例如擷取內文但並未註明出處)

不論是Intel早期的MCS-51 PROGRAMMER'S GUIDE AND INSTRUCTION SET(如下圖),或者8051界的Bible原文書: The 8051 Microcontroller and Embedded Systems (2nd Edition)原文課本(作者為Mazidi, Muhammad Ali, Mazidi, Janice G., McKinlay, Rolin D.)內容中的P.326的Figure 11-4.及P.329的Figure 11-6.內文敘述都表示外部中斷旗標(flag)也就是IEx(x是0或1)是在偵測到外部輸入falling edge signal trigger 的時候才被set(設為1)。

(註: x為0或1)

Intel的MCS-51 PROGRAMMER'S GUIDE AND INSTRUCTION SET之對應內容


也就是如下圖狀況所示(按其原意並自行繪製):

Intel MCS-51手冊與8051原文書所述之中斷旗標觸發方式/機制


但是,從近代實際在課堂上常使用的8051 MCU款式AT89S51/AT89S52的Atmel AT89S51/AT89S52 datasheet裡面可看到,無論是選擇falling edge trigger或者low level trigger(藉由對ITx暫存器位元的寫入設定值來選擇)觸發,當這兩種條件之中的任一種條件達成時,都會使得外部中斷旗標(Flag)也就是IEx(x是0或1)被set(設為1),如下圖(圖片來源為Atmel AT89S51/AT89S52 datasheet)。


AT89S51/AT89S52的Atmel AT89S51/AT89S52 datasheet之對應內容


(註: 當然了,這幾年在許多大學的MCU或名稱為微處理機系統及介面技術的相關課程上,其教材都被改為Arduino的淺層使用,但是卻沒深入MCU的細節原理了,故相對沒辦法太紮實)


由上述內容可看出差異,或許是後來的8051(AT89S51/AT89S52等款式)被改良了。因為如果按照早期那樣的方式/機制(官方手冊與原文書所示),在希望使用low level trigger方式的情況下就只能使用中斷而無法藉由去輪詢(polling)旗標狀態的方式去偵測外部輸入到INTx腳位的low level signal,在開發使用上相對就沒有那麼的自由。


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

孫文良 (阿良的嵌入式系統技術學習區)

【若需要嵌入式系統技術輔導課程 可來信洽談合作方式: iws6645@gmail.com,亦可先點擊參考這篇介紹文章

2020年3月18日 星期三

【C# 應用程式】透過WMI API偵測COM Port裝置插拔狀態及取得裝置名稱的重點程式筆記(參考國外網路上網友分享的程式碼)


以下C# WMI範例程式code為參考自下方網路論壇資料並進行相關實作實驗,並加上自己的備忘註解: 
(1) https://hant-kb.kutu66.com/windows/post_650386 
(2) https://stackoverflow.com/questions/17563969/wmi-usb-monitor-multiple-events-fired?rq=1
(3) https://social.msdn.microsoft.com/Forums/zh-TW/c236cac4-a954-4a70-882d-bc20e2cc6e81/getting-more-information-about-a-serial-port-in-c?forum=winformsdesigner
(4) https://stackoverflow.com/questions/2837985/getting-serial-port-information/59508646#59508646
(5) https://cyfangnotepad.blogspot.com/2015/01/cnet-usb.html


個人本身不是什麼純軟體物件導向語言高手,只是過去有一些短暫的相關開發經驗,分享出來讓大家作個參考

程式執行(實驗)環境為Visual Studio IDE, 平台為.NET Framework
.

- 第一部分:主要是記錄如何用C#語言撰寫偵測USB裝置的insert/remove狀態事件

using System.Management;
//...
ManagementEventWatcher watcher = new ManagementEventWatcher();
WqlEventQuery query = new WqlEventQuery("SELECT * FROM Win32_DeviceChangeEvent WHERE EventType = 1");
//EventType = 1是對insert和remove都有反應; 
//EventType = 2是只有對insert有反應; 
//EventType = 3是只有對remove有反應
//以上可以視情況宣告為全域instances 方便一些應用

watcher.EventArrived += new EventArrivedEventHandler(watcher_EventArrived);
watcher.Query = query;
watcher.Start(); 
//如果要停掉watcher就呼叫watcher.Stop(); 不用時可以dispose()掉
//注意上述這些初始動作要在serial port init之前

static void watcher_EventArrived(object sender, EventArrivedEventArgs e)

{ 
  ... //看你想在EventHandler函式裡面做什麼應用
}



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


- 第二部分:主要是記錄如何用C#語言撰寫取得裝置管理員內的COM PORT裝置名稱,這邊以Prolific的PL2303 UART轉USB晶片的裝置為例合基本邏輯撰寫(這是許多人玩Raspberry pi或Arduino常會用到的UART/USB轉換的線材內的常見晶片,另外幾款這類用途的常見晶片就是CP210x、CH340、FT232R,不清楚這方面的朋友可參考小弟過去寫的這兩篇文章: USB_to_Serial轉換器或轉換線或轉換板  和  安裝PL2303 USB to Serial轉換線之驅動程式)

using System.Management;

//...

public string GetFullComputerDevices()

  ManagementClass processClass = new ManagementClass("Win32_PnPEntity");
  ManagementObjectCollection Ports = processClass.GetInstances();
  string ComPort_number = "No COM Port device recognized";

  foreach(ManagementObject property in Ports)
  {
       if (property.GetPropertyValue("Name").ToString().Contains("Prolific USB-to-Serial Comm Port");  //以顯示名稱為Prolific USB-to-Serial Comm Port的UART轉USB晶片PL2303為基底的裝置為例
   {
     ComPort_number = property.GetPropertyValue("Name").ToString(); 
     ComPort_number = ComPort_number.Substring(ComPort_number.IndexOf("COM")).TrimEnd(')'); //取得COMx的字串並將其放置到ComPort_number這個string變數
     
//微軟的String.Substring方法教學
//微軟的String.TrimEnd方法教學:
 
   }
  }    
  
  return ComPort_number; //回傳字串,如果都沒有就會回傳預設的"No COM Port device recognized"字串
}
   
注意! 除了在程式裡面using System.Management之外,還有一個步驟要做,否則會有錯誤: 專案 -> 加入參考參考管理員 -> 組件 -> 右上角搜尋: management -> 勾選System.Management -> 按下確定
(如果Visual Studio是英文版: project ->  Add Reference -> Reference Manager -> Assemblies -> search: System.Management -> choose(tick): System.Management -> press Enter)


最後,簡單利用上述重點,並搭配C#的一些基礎

整合實作一個簡單的PL2303的USB轉UART線裝置的插拔偵測與取得裝置名稱的應用程式

Demo影片如下:
(註解: GUI視窗程式下方淺藍色圖案只是一個測試效果)
程式背景圖片就用張西子灣照吧!



【若需要家教模式之技術輔導 可來信洽談合作方式: iws6645@gmail.com】
 

2020年3月11日 星期三

【UART應用】國外STM32臉書facebok社團討論小PO文之記錄整理:用UART傳送浮點數的方式



無意間在臉書上看到外國人的臉書社團STM32 ARM Cortex-M上面的這則老外們在討論的討論PO文(可能要加入該臉書社團才能看到)有點意思,是針對用UART傳送浮點數的方式的這個簡單但實用的議題,幾分鐘就能看完下面的留言討論,但是因為是簡單實用的討論所以就想說在此記錄一下。對於此層面的軟體程式邏輯來說,UART只是以byte為單位(Data framing中主要的資料部分)將資料送出的單元(當然如果要針對UART硬體更精確地來說,其實是將資料一個一個位元的進行串列傳送),所以這裡跟UART的關係並不算很直接,其實這議題算是有點偏向C語言的基礎

如果有嵌入式系統的C語言韌體開發背景的讀者,可以簡單看出該PO文的下面留言者(很多都是外國工程師)提出的留言建議的方式多數屬於下列兩種(也都是很直覺的方式),這邊將其整理並作一些解說:


1. 直接傳送浮點數值:使用union,讓浮點數值與uint8型態的資料作對應(casting/mapping), 然後一個一個byte透過UART送出

/* 將浮點數值與uint8型態的資料透過union在其內宣告,使它們共用一塊記憶體空間 */
typedef union{
float f_val;
uint8_t  uint_val[4];
} float_u; 

float_u value;
value.f_val =6.66; //6.66只是隨便舉個小數值的例子

/* Send Data via UART*/
UART_Transmit(value.uint_val);  /*此處的UART_Transmit函式也是類似pseudo code的簡單示意的範例,實際上就看你的嵌入式系統軟韌體開發環境的UART API函式是怎樣的狀況(實際形式),而此處的目的簡單來說就是用UART將浮點數值一個byte一個byte的方式送出去*/



2. 將浮點數值轉成字串並傳送這個字串:透過sprintf函式將浮點數值轉為字串,例如:
char buffer[4];
sprintf(buffer, "%.2f", 3.14);
然後再透過UART將資料傳送出去。接收端如果需要此值去做後續的運算,當然就需要再把字串轉變回數值之後再作運算
(如果相應的嵌入式系統軟韌體開發環境的printf若已直接串通UART, 就可直接用printf函式就好。這邊的討論應該是針對STM32的HAL_UART_Transmit函式來說,用sprintf將浮點數值轉換為字串並放置到某一段連續的buffer(或陣列),然後再透過此位址搭配HAL_UART_Transmit函式將該字串一個一個byte傳送出去)

【若需要家教模式之嵌入式系統技術輔導 可來信洽談合作方式: iws6645@gmail.com,亦可先點擊參考這篇介紹文章

2019年11月22日 星期五

現代計算機系統核心硬體常見平台的分類與簡介概述


歡迎透過合法的方式分享此文內容,若要轉載/轉貼,請明確貼出此原始連結並標示作者基本資訊請勿抄襲及非法轉貼(例如擷取內文但並未註明出處)

之前有寫過之前兩篇關於MCU觀念的介紹文章:
(1) 8051 MCU好教材分享 & 錯誤觀念闢除
(2) Arduino到底是什麼? MCU又是什麼?

這邊延續相關的方向,按照目前個人長年觀察現代常見的計算機平台做一些分類,並進行簡單描述介紹:

1. 微控制器MCU(又稱單晶片微電腦),例如8051、Arduino uno/nano/fio上面的Atmage328 或STM32等等,通常用在控制和裝置應用類的產品,通常負責硬體控制和少量資料運算的處理任務,但現在也有處理較多資料的MCU出現(例如適合做有GUI的裝置產品的MCU)

2. 小SoC,類似MCU但是外加了針對應用而需要俱備的硬體單元,例如TI公司的低功耗藍芽晶片CC2540或Zigbee WSN晶片CC2530

3.大SoC,又稱應用處理器,大型系統晶片,通常用在網路多媒體應用類產品,現代許多SoC會有多核心的主CPU、GPU、多媒體編解碼器和基本周邊硬體單元,軟體方面通常會跑一個大OS的嵌入式版本做為主要系統軟體。像是開發板類的樹莓派、Pandaboard、Beaglebone black,或已經是完整產品類的智慧型手機、數位電視或機上盒上面的主晶片即為此類
這邊舉些實例(包含上面說的一些常見板子上面的主晶片)來看,全志科技Allwinner H6就算一顆這裡所指的大SoC,或者像是Beaglebone black上面的TI AMS335X或Pandaboard上面的OMAP4460或者Raspberry Pi上面的BCM283X這些SoC都屬於這類

4. PC常用的MPU(當然也不一定只有用在PC),早期的晶片例如x86指令集架構的8086/286/386等。近代的i5、i7 這種晶片(也不一定是只有純CPU, 或許有加入一些額外的硬體單元,但主要大多的內容就是CPU單元的內容,周邊裝置的數量基本上不會像是MCU或SoC那樣有一堆周邊)

5.其他交叉於上述介紹類別的性質或者上述沒很完整描述到的種類,例如一些含有CPU的可程式化的控制器(如觸控控制器、馬達控制器,其實類似上述小SoC或者可說是特定應用所設計的MCU擴增版)


而這些平台中的CPU的種類部分(類別4本身性質就是CPU所以就不說了)

也要注意一下: MCU與SoC這類的平台有時也被稱之為「嵌入式微處理器」(Embedded Microprocessor),例如Atmel/Microchip公司的SAM9G20或者ST公司的STM32MP1(ST的MPU系列是屬於這裡所說的Embedded Microprocessor),但這些並不是傳統的「微處理器」或「微處理機」。因為時代的演進促進平台的多元化,容易使人混淆,導致這些名詞之間不論是在許多書籍或網路資料中都常被混淆解釋,當然這些名詞的定義也有過少數爭議)。

2和3和5類的平台通常是based on 8051的CPU core(8 bits)或ARM Cortex-Mx(32bits)系列的CPU做為其主要CPU(當然也有其他額外的,例如AVR),這類CPU很多都不具有MMU(記憶體管理單元),當然也有極少數是具備MMU的。以頻率來說這類平台通常在數MHz到數十MHz等級(也有上百的)

而4的平台, 近年來多數通常是based on ARM Cortex-Ax系列的CPU做為其主要CPU,當然也有其他類別的CPU(例如MIPS),這類CPU很多都具有MMU。頻率通常在數百MHz到GHz等級


那以運行於這些平台上的軟韌體來說

例如1、2及5的範例類的平台很常只有Non-OS SW/FW或者只有RTOS或者跑小SoC常是跑網路協定堆疊軟體(也會有類似小OS的框架,例如TI出的for ZigBee WSN的Z-Stack)

第4類如果用在PC上就不用說了。而種類3的平台在產品用途上通常會跑Embedded Linux/Android,也可能跑RTOS

【若需要嵌入式系統技術輔導課程 可來信洽談合作方式: iws6645@gmail.com,亦可先點擊參考這篇介紹文章

2019年3月4日 星期一

【你所不知道的Arduino】強大的Arduino嵌入式平台與硬體電路模擬軟體: Autodesk Tinkercad (123D circuit )



享介紹一款幾年前看過的很讚的基本電路和Arduino線上免費模擬軟體: 123D circuit

現在好像改名為Autodesk Tinkercad了 : https://www.tinkercad.com/circuits

身為一個嵌入式系統韌體及硬體技術的愛好者,數年前看到這軟體時很驚訝(其實現在還是很驚訝),覺得實在太強大了

除了有各式嵌入式系統常用的基本電子元件(還有些已經是成品類的),像是二極體、電晶體、電阻、電容、電感、按鈕、LCD模組、可變電阻、各種電池、各種馬達、sensors、各種常用IC(OPA、邏輯閘、穩壓IC、馬達驅動IC、555...等)、Relay、鍵盤、開關、馬達控制模組(這也能模擬!?)、紅外線遙控器(這也能模擬!?)...(太多了,若有遺漏請見諒),可以讓使用者去動態模擬體驗這些電子元件之功能之外。

還有各式常見儀器(萬用電表、示波器、訊號產生器...),以及WIFI模組(這也能模擬...太強了)




而且還有Arduino板子...甚至可以直接在上面編寫Arduino code(可以選擇文字式或圖片式或混和式的Programming方式),而模擬IDE的部分感覺幾乎是模擬出整個Arduino IDE的重點功能)並動態模擬執行整個系統....



只能說超佩服做出這些模擬軟體的工程師們...這模擬軟體實在太強大了


【若需要嵌入式系統技術輔導課程 可來信洽談合作方式: iws6645@gmail.com,亦可先點擊參考這篇介紹文章

2019年1月21日 星期一

HC藍牙模組基本設定



這篇分享一下HC系列的藍牙模組設定方式


首先要先確認您的HC藍牙模組是HC05還是HC06

如果是HC05 可設定為主(Master)和從(Slave)模式

而若是HC06 則只能設定為從(Slave)模式 (但根據熱心網友的分享,似乎也看過HC06但可以設定為主模式的狀況...大家可仔細確認一下手上的模組,感覺就算同樣是HC模組,還是可能都有差異...可能還是要以手上模組的實際狀況為主...進一步的細節待研究)

設定方式通常是透過之前介紹過的文章: USB_to_Serial轉換器或轉換線或轉換板

經由UART去下AT command來進行設定

另外,按照我本身的經驗,不同地方所買到的HC模組,其實在AT command的部分也會有些微的差異

這邊我們以透過PL2303 USB to Serial轉換線以及我手上的HC藍牙模組來說明其設定方式

安裝USB to Serial轉換線之驅動程式 之後(可參考連結文章)

將轉換線上之杜邦線端按照顏色接至藍牙模組

綠色(TX端): 接至藍牙模組之RX端
白色(RX端): 接至藍牙模組之TX端
黑色(接地): 接至藍牙模組之GND端
紅色(Vcc): 接至藍牙模組之+5V端


AT設定模式:先壓著藍芽模組上的按鈕,再接電 (按鈕標示如下圖紅色圓框圈起之部分)



前面提到,我們可以透過傳送UART資料的方式來傳送AT command到HC藍牙模組,以進行設定

我們可在PC端透過COM Port應用軟體下這些AT command到HC藍牙模組

COM Port應用軟體種類繁多,讀者們可自行線上google搜尋

這邊我是透過Arduino IDE內建的COM Port軟體來進行示範

首先在Arduino 選定PL2303 USB to Serial轉換線所對應的COM Port




然後打開"序列埠監控視窗"



接下來進行設定HC藍牙模組的配對密碼、名稱及Baudrate Rate(位元傳輸速度)設定示範

設定密碼指令:
AT+PSWD=xxxx     (xxxx為自己想設定的密碼)

名稱設定指令:
AT+NAME=xxxx    (xxxx為自己想設定的藍牙名稱)


Baudrate Rate設定指令:
AT+UART=9600,0,0   (設定為9600 bps, 後面第一個0代表設定為1 stop bit, 後面第二個0代表設定為None parity bit 也就不要同位元檢查.  若不清楚我在說什麼的讀者可Google搜尋一下UART基本協議)


主從模式設定指令:
可透過AT+ROLE?查詢目前模組是處於主(Master)還是從(Slave)狀態,預設通常都是從狀態
設定為模式: AT+ROLE=0
設定為模式: AT+ROLE=1


若設定指令輸入到HC藍芽模組成功, 則會如下圖所示



設定完成之後,為了離開AT模式,須重新上電給HC藍牙模組(這次不用按著按鈕),這時就是一般模式

後續測試步驟,原則上只要開啟手機藍牙,應該就會在掃描清單上看到我們所設定的HC藍牙模組了,首次連線會要求輸入上面我們設定的配對密碼(PSWD)進行配對,而第二次開始就可以在點擊該HC藍芽模組後直接連線

之後應該會再出一篇透過APP Inventor撰寫簡易與HC藍牙模組連線的Android APP文章


【若需要基礎C語言 與 嵌入式系統技術輔導課程 可來信洽談合作方式: iws6645@gmail.com,亦可先點擊參考這篇介紹文章






2019年1月20日 星期日

應用慣性感測之電子筆記系統



分享一個一年多前帶朋友們參加比賽的作品(本身也有參與一些開發)

功能上來說就是一枝筆,在平板上的APP可顯示使用者握住筆在的揮動軌跡

透過慣性來達成類似電子白板功能(過去在網路上看過紅外線方式的)





Demo影片:



架構簡單來說就是LinkIt7697板子 + 藍牙2.0模組 + 慣性感測器 + Android App

方法主要是Software RC filter做簡易的雜訊濾除 + Android App Inventor 球形精靈

此作品中的LinkIt7697上面的軟韌體的開發是採用Arduino IDE加上LinkIt 7697 的 board support package(BSP)進行(步驟可參考: Mediatek Labs說明網站),透過此方式即可使用Arduino 基礎API來進行LinkIt7697的應用軟體開發。




可能會有朋友感到好奇,LinkIt7697自己本身有內建BLE,為何還要外加藍牙2.0模組呢

原因是當時我們的Android App是使用App Inventor來撰寫,而當時(2017年)App Inventor在BLE 支援的部分似乎有點問題,所以才會自行外加藍芽模組。




【若需要嵌入式系統技術輔導課程 可來信洽談合作方式: iws6645@gmail.com,亦可先點擊參考這篇介紹文章

2019年1月14日 星期一

用於頸部姿態辨識的慣性感測訊號處理方法


這次要來分享自己於三年多前的碩士論文研究內容了

會想要分享出來主要是因為覺得其內容好像也是和maker們蠻有關的東西(其實當初寫的比較像技術報告, 想要把技術細節盡量完整交代)


因為當時實驗室的一些特殊狀況,所以當時從規劃題目、相關文獻及前人研究成果survey、設計及開發實作、找一堆人來實際測試實驗以及論文撰寫,全部共只花了2個月左右...雖不是什麼很厲害的東西, 但也是心血之作(在做碩論之前並沒有玩過慣性感測), 每字每句完全誠實寫出所有研究過程和細節

而這個東西是做什麼呢? 當初的主要研究動機又為何呢?

簡單來說, 當時有一個在網路上募資的新創公司提出了一個將慣性感測裝置放在後頸部的項鍊式穿戴裝置產品(Fineck). 當然了, 如何處理這慣性感測訊號的方法是他們家的Knowhow, 是不會公開的.

而我的論文就是基於將慣性裝置放在相同身體部位,  去研究並提出一個自己整合設計的用於頸部姿態辨識慣性感測方法,  並將其實作驗證,  看看自己提出(當然也是站在巨人肩膀上, 整合偉大先進的方法後加以延伸組合應用)並實作的方法是否也可以像他們新創公司產品影片呈現的那樣準確.

下方列出有Demo影片和口試的投影片

細節部分請大家可直接參考我的論文全文內容: 全文下載網址連結(NCKU)


方法部分, 簡單來說就是應用了: 位準和振幅的調整 + Software RC filter(也稱是指數平滑法) + 透過經驗法則訂出的姿態訊號擷取門檻機制 + Dynamic Time Warping(動態時間校正) + 簡單的1-NN分類

實作平台的部分就是Arduino Fio + 六軸慣性感測器 + 藍牙模組 + Android APP

相信這方法應也可用於其他類似情境下的訊號辨識分類

請大家盡量參考, 但若是想做成論文或文章也請勿抄襲, 並請注意合法引用  ^.<   (之前真的看過很誇張的案例...身為原作者真的會不太開心), 感謝大家了!


Demo影片(這影片是畢業之後把東西又架起來拍的,  影片有點長...):





口試投影片 (若因上傳導致部分格式稍微跑掉請見諒):

 

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

2021/05/10更新:

很多人看我常講台灣學術界的問題,可能會以為我這個人只會一昧覺得產業相關的實作技術才有價值,而以為忽略學術研究,其實我認為什麼學術研究(或理論)和實作是兩回事的這種觀念其實是假議題(專業就是專業、學問就是學問、工程就是工程,特別是在應用科學領域,哪裡有什麼理論實作之分,也沒有什麼學術研究和產業技術之分,只有嚴謹和不嚴謹、熱愛不熱愛、掌握程度深淺、是否具備遠見之分,很多人總是很喜歡拿 理論和實作是兩回事 或者說 學術和產業是兩回事 來當作不用重視實作/懶得去碰實作的藉口),

而且我個人相當熱愛真正紮實的工程領域學術研究,正因為如此所以我個人認為台灣學術界整體風氣實在沒有很踏實(國外聽說也開始有這些現象,我不清楚),因為真正熱愛專業領域和研究的人相對實在比較少,多數人在意的是現實面而不是熱愛研究。

以前曾經分享過,自己的碩士論文當年從頭到尾共做了不到2個月(因為在這之前在忙著舉辦教育部競賽的計劃,在此之前幾乎沒時間想碩士論文的事,所以短時間內將碩士論文完成其實是真的非常累,在拚碩士論文內容的期間幾乎每天只睡三到四小時,而且還好在之前就已經有許多嵌入式系統應用設計的基礎和經驗,以及在大學時期已有累積不少與訊號處理演算相關的數學觀念),內容絕對紮實嚴謹,而在碩士班畢業離校當天(2015/8/26)就完全公開。而其中的程式原始碼和頸部姿態穿戴偵測裝置還保留至今,去年指導成大碩士生學弟們將此程式碼拿出來提供給學弟們整合後續應用程式之後去參加競賽得獎(經濟部與教育部合辦的2021第26屆大專校院資訊應用服務創新競賽[4],請看該網頁第2頁的資訊應用組九的第二名)。

台灣人很愛拿學術這兩字出來講,所以今天提一下我的碩士論文[5][6][7]當時在學術的方面的狀況(絕對不是什麼偉大成果,畢竟只是我自己1人做了共2個月不到,但當時也是做得相當用心而且絕對有考慮學術貢獻的方面),當時比較了一些論文文獻,最相關相似的文獻是和美國名校大學University of Washington(華盛頓大學)當時的Ke-yu Chen博士研究生 等人的研究團隊(共五人)在2014年的一項class project專案成果NecX [1][2]進行比較。我覺得NecX是一項很棒的專案(雖是class project,但是內行人都知道,許多歐美名校頂尖大學的class project就已經很有程度,且這是五人的共同研究成果),也很感謝他們願意公開這些研究成果資訊。

University of Washington(華盛頓大學)這間學校出過15位諾貝爾獎得主,在電腦科學和醫學領域的學術名望是世界頂尖。

NecX論文的第一作者Ke-yu Chen博士[3]畢業於東吳大學、台灣大學資訊工程碩士班 與 美國University of Florida(佛羅里達大學)電機與電腦碩士班,並且在2016年獲得美國University of Washington(華盛頓大學)的電機工程博士學位,他後來在Intel擔任過研究員和Google當過研究工程師,目前任職於Apple公司擔任研究員[3]。

他們當時就讀於University of Washington的這項NecX專案,有寫成一篇論文[1][2](這篇paper[1]有五位作者: Ke-Yu Chen, Aniket Handa, Chaoyu Yang, Shuowei Li, Shwetak Patel),也有專案網站,主要是透過EMG sensors貼在人體頸部的兩側,並進行後續的演算處理辨識,主要辨識2位受測者的5種頸部動作,並且他們的實驗數據主要是離線運算分析(offline analysis)的方式輸入WEKA資料探勘軟體以訓練出model並對其動作進行分類(所以應該是在電腦上分析),準確度是94.1%(但是是離線運算分析,他們的論文中有提到他們在做即時辨識時有遭遇到一些困難,後來他們也有做即時辨識但似乎沒有提出實驗數據,只有提到如Demo影片的效果)。

而我的碩士論文研究內容[5][6][7]是我一人自行完成,沒有共同作者,在sensor種類(選擇IMU感測器)和穿戴/放置部位是參考一項當時在網路上募資專案Fineck,而這碩士論文的核心在於自行整合應用設計一套演算法機制來做訊號處理辨識以辨識頸部動作,最後成果是做到online即時(Real time)分析演算辨識(辨識演算法的主要部分實作自行整合撰寫的手機APP應用程式達進行即時辨識運算)辨識18種頸部姿態動作(整合應用了一些open source 專案的source code加以修改整合設計),實驗的受測者人數為10位,實驗辨識率每次都在九成多以上(大約都在92%~96%),後來覺得我這樣一人獨力在2個月內所完成的成果應該明顯不輸給University of Washington的NecX專案成果,和其他文獻相比也有獨特性,所以認為這應該可算是令自己滿意的成果。當時因為已在前一年和產業公司簽約媒合(同時服研發替代役的工程師職務合約),一心想在碩士畢業後趕快去聯發科集團(晨星)上班(而工作內容性質其實和我碩士論文方向性質差異很大),而且也認為有用的研究成果最主要就是要能貢獻台灣社會(所以論文完全公開且寫出很多實作和實驗方面的細節以及演算法選擇/應用/搭配/整合的原則及整合方面的細節),所以從來就沒有想將此成果發表去什麼學術期刊(個人當時也已開始不太認同台灣學術界的某些文化),但畢業後一直覺得這東西沒用到很可惜,所以就把東西拿出來再次實驗並且拍攝Demo影片放在Youtube上面並且寫成blog文章分享,並且在離開產業界回成大協助指導碩士生時又將成果拿出來讓學弟們延伸應用參加競賽。

  
感謝我碩士班的指導教授讓我在挑選題目和研究方面有極大的自由和發揮空間,指導教授對於許多事情的務實看法,我至今仍非常認同和敬佩,也給了我不少認知和啟發,也很高興畢業後都有在和黃教授維持聯繫交流。

現在回頭想想,碩士論文口試也已經是好幾年前的事了,時間過得真快。



當年口試(學位考試)成績: 94.25 (共四位口試委員,其中一位委員打95分 而另外三位委員打94分)


【若需要嵌入式系統技術輔導課程 可來信洽談合作方式: iws6645@gmail.com,亦可先點擊參考這篇介紹文章