500 likes | 625 Views
慣性感測器之應用 Wi T i lt v3. 2010/09/28 陳宗隆. Outline. WiTilt v3 基本介紹 感測資料擷å–èˆ‡å¾Œè™•ç† | On-line 資料å³æ™‚處ç†. Overview. WiTilt v1 玩具機器人的控制器 WiTilt v2 å…©è»¸æˆ–ä¸‰è»¸åŠ é€Ÿåº¦è¨ˆçµåˆ 2.4 GHz Bluetooth WiTilt v3 Freescale MMA7260Q ä¸‰è»¸åŠ é€Ÿè¨ˆ Melexis MLX90601 E2 的陀螺儀 class 1 çš„ Bluetooth. 內部介紹. 1. Power é–‹é—œ
E N D
慣性感測器之應用WiTilt v3 2010/09/28 陳宗隆
Outline • WiTilt v3 基本介紹 • 感測資料擷取與後處理|On-line 資料即時處理
Overview • WiTilt v1 • 玩具機器人的控制器 • WiTilt v2 • 兩軸或三軸加速度計結合2.4 GHz Bluetooth • WiTilt v3 • Freescale MMA7260Q三軸加速計 • Melexis MLX90601 E2 的陀螺儀 • class 1 的Bluetooth
內部介紹 • 1. Power開關 • 2. UARTswitch連結模式選擇(W:bluetooth D:hardware) 3. Debug header • 4. 充電頭 (可充電的 LiPo 電池) 5. Restart button • 6. 顯示狀態和充電的LED 7. 電池連接器 8. AVR Programming Support 9. Bluetooth的連接指示器
建構環境 • 設備和所需軟體: • EPC(or Notebook)一台 • WiTilt v3 sensor 一個 • 藍芽接收器一個 • 藍芽軟體安裝 • 超級終端機(winXP) or PuTTY(winXPor win7)
安裝藍芽接收器 • 注意事項: • WiTiltv3是免安全認證方式連線 • 藍芽軟體選擇,需支援免安全認證 • MicroSoftware XP內建的驅動,不支援 • 先安裝光碟(舊版32bit.64bit) • TOSHIBA Bluetooth Stack • 新版32bit.64bit • http://aps2.toshiba-tro.de/bluetooth/?page=download • 30天限制(破)延用 • 舊版裡面的TosBtChk.dll覆蓋到新版的資料夾
藍芽軟體設定 記得開啟感測器電源 可以改COM PORT
超級終端機設定(1/3) 1 3 2 4
超級終端機設定(2/3) 5 6 8 7
超級終端機設定(3/3) 按一下空白鍵開始 連線成功!!
Calibrate(sensor校正) • 在我們開始讀值之前,最好都先做校準的動作(calibrate) • [3] Calibrate(sensor校正) • 三軸加速度計的校正 • 一軸gyro的校正
WiTilt v3.3configuration • [2]Set active channels (XYZBR Active) • 選擇想輸出的值 • XYZ:加速度計的X,Y,Z軸的變化值 • B:電池(不會顯示) R:一軸gyro值(Z軸旋轉) • [4]Sensor range (range 設定) • Range:+/-1.5g ,+/- 2g , +/-4g , +/-6g • [5] Display mode (output mode) • Gravity values • Raw values(ADCvalue) • Binary Mode • Degree Mode (degree/second)
WiTilt v3.3configuration • [6]Set/View threshold values • 設定門檻值,濾掉sensor的小誤差 • [7] Set output frequency • 讀取資料的快慢(100Hz 比較好算角度) • 最大50Hz的角度模式 • 最大135Hz的重力模式 • 最大220Hz的raw ADC模式 • 最大610Hz的二進制模式 • [1] Start Tri-Ax detector (Press any key stop) • 輸出使用者想要的輸出值
手動匯入EXCEL 存成文字檔再匯入EXCEL Ctrl+c 複製 用右鍵會當掉!!
操作練習 • 各種設定及輸出格式 • 將各種資料匯出至excel • 加速度計 data 分析 • 靜止狀態 • 擺動 • 實際走路的資料 • Gyro data 分析 • 旋轉
擺動 • 上下擺動5次 • 左右擺動5次
擺動 • 前後擺動5次
旋轉測試 Gyro測量出來的為角速度,將角速度/頻率 or 角速度*週期 再去累加 • 右轉90度 • Σ: 9820 • 右轉180度 • Σ: 19564
Question?? • 操作練習10~15分
資料即時處理目的 • 更改Sensor資料顯示的格式 • 想隨時隨地觀察Sensor動向 • 節省資料事後處理程序(直接存成excel) • 最終做出pseudo driver (i.e.更大型的API) • 模擬超級終端機讀值前的一些動作
資料即時處理 • 安裝C++編譯器-Dev C++(沒有強制) • Windows內建API簡介 • Signal信號控制 • 封裝程式碼
安裝C++編譯器-Dev C++ • http://www.bloodshed.net/dev/devcpp.html
Windows內建API簡介(1/12) • 目的 • Windows本身就有提供大量的函式庫,希望藉由這個API能讓大家了解感測器如何透過一些通訊口傳入電腦,能更即時動態的擷取資料並加以處理,讓感測器傳到電腦的數據能更迅速的呈現出來 • 參考資料: • MSDN Library • http://msdn.microsoft.com/en-us/library/default.aspx
Windows內建API簡介(2/12) • Windows.h • HANDLE type • DCB type and set/get state • CreateFile • CloseHandle • 程式練習-開啟COMport • DWORD type • WriteFile • ReadFile • 程式練習-輸出Witilt V3數值
Windows內建API簡介(3/12) • <Windows.h> • WinAPI的標頭檔,裡面包含許多函式和型態的定義 • 接下來用到的函式及物件的定義都在這裡面
Windows內建API簡介(4/12) • HANDLE type(一個用來handle某裝置) • 用來控制檔案、裝置讀寫的物件型態 • 物件裡包含許多裝置的屬性可供設定,但必須透過其他函式來完成 • 宣告一個物件: • HANDLE handle1,handle2,…; • DCB type • 用來儲存HANDLE設定值的物件 • 宣告一個物件: • DCB dcb1,dcb2,…; • 更改baudrate的設定值: • dcb1.BaudRate=115200; • Witilt V3的baudrate必須設為115200才能使用
Windows內建API簡介(5/12) • GetCommState(HANDLE,DCB *) • 將HANDLE的設定存到DCB裡(設定方向→) • SetCommState(HANDLE,DCB *); • 將HANDLE改為DCB的設定(設定方向:←) • 使用範例 • GetCommState(handle_com,&dcb); • dcb.BaudRate=115200; • SetCommState(handle_com,&dcb); • Dcb structure • http://msdn.microsoft.com/en-us/library/aa363214%28VS.85%29.aspx
Windows內建API簡介(6/12) • CreateFile(char *path, DWORD mode, DWORD dwShareMode,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL); • 開啟一個裝置或檔案的函式 • 函式傳回值為開啟的HANDLE物件 • (只是COMport有做好設定 並不是以連線的意思) • 由於參數眾多,只介紹接下來會用到的參數(前二個): • path:要開啟的裝置/檔案的位置 • mode:要開啟的模式,有GENERIC_READ及GENERIC_WRITE • ShareMode的選擇 ,設定為0代表互斥存取 • 其他參數用途可參考MSDN Library • http://msdn.microsoft.com/en-us/library/aa363858%28VS.85%29.aspx
Windows內建API簡介(7/12) • CreateFile(char *path, DWORD mode,DWORD dwShareMode,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL); • 使用範例: • HANDLE handle_com = CreateFile(“COMx”,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); • 其中”COMx”請改成自己的com port • 如果要讀和寫,就寫成GENERIC_READ|GENERIC_WRITE • 若開啟檔案失敗,函式會回傳” INVALID_HANDLE_VALUE” • 通常是連線被佔用(不能開著超級終端機)或路徑錯誤 • HOWTO: 指定大於 COM9 序列連接埠 (COM40->\\.\COM40) • note:In C/C++ “\” 是特殊字元
Windows內建API簡介(8/12) • CloseHandle(HANDLE) • 關閉一個開啟的HANDLE • 若一HANDLE不關閉,作業系統會認為此裝置或檔案一直被佔用 • 使用範例: • CloseHandle(variable); • 程式練習-開啟Witilt V3 (file.cpp參考架構) • 利用HANDLE開啟Witilt V3並且設定baudrate • 盡量利用投影片的函式樣板撰寫 • 參考程式碼請看com_file.cpp • demo
Windows內建API簡介(9/12) • DWORD type • winAPI自己的整數型態 • 此型態不管在任何一個平台,大小都是4Bytes、32Bits • 使用方法(宣告): • DWORD dword1,dword2,…; • Ex. DWORD real;
Windows內建API簡介(10/12) • WriteFile (HANDLE com, char *buffer, DWORD towrite, DWORD *written, LPOVERLAPPED overlapped ); • 將buffer裡的towrite個字元寫到com裡面去 • 實際寫入幾個BYTEs會藉由written傳回來 • Overlapped為進階選項,在此使用NULL即可 • 使用範例: • WriteFile(handle_com," ",1,&real,NULL);
Windows內建API簡介(11/12) • ReadFile (HANDLE com, char *buffer, DWORD towrite, DWORD *written, LPOVERLAPPED overlapped ); • 用法和WriteFile類似 • 從com裡讀出towrite個字元並寫到buffer裡去 • 實際讀到幾個BYTEs會藉由written傳回來 • Overlapped為進階選項,在此使用NULL即可 • 使用範例: • ReadFile(handle_com,buf,(DWORD)SIZE,&real,NULL);
Windows內建API簡介(12/12) • 程式練習-輸出Witilt V3數值(readwrite.cpp參考架構) • 利用開啟好的HANDLE讀取Witilt V3的訊息 • 寫入和讀出的資料如同使用超級終端機,使用前請先reset,並且在使用前超級終端機先校正及設定好頻率、輸出模式…等參數 • 為了讀資料,請在一開始先寫入一個空白,使其menu出來。之後再寫入一個”1”,讓他開始產生資料。待結束時再寫一個空白使程式暫定輸出並關閉 • 參考程式碼請看readwrite.cpp • demo • ->期望讓使用者去控制何時停止.停止之後還可以繼續讀 • 可以用for loop控制 or signal
Signal信號控制(1/4) • 在剛剛的程式(readwrite.cpp),如果要用for控制擷取信號的長短相當的不方便,資料太短,就沒有完整的資料,像你可以固定一段時間讓for停止讓使用者選擇,但是還是不夠動態 • 解決這個的最好方法就是讓使用者隨時控制程式何時停止,所以我們使用signal來停止我們的程式
Signal信號控制(2/4) • Signal的東西非常簡單,只要引入標頭檔,用一個函式設定就行了 • <signal.h> • Signal控制的標頭檔 • signal(int SIG, void (*f)(int) ) • 啟動signal的函式,當觸動了SIG的信號,系統會產生一個執行緒呼叫f這個函式,其參數為SIG的值 • SIG信號的意義(每個系統的值都不一樣): • SIGINT:在程式中按下ctrl+c • 21:按下視窗右上角的x按鈕
Signal信號控制(3/4) • signal(int SIG, void (*f)(int) ) • 範例: • void hello(int) { printf(“hi!!\n”); return; } int main(void) { signal(SIGINT,hello); while(true); return 0; }
Signal信號控制(4/4) • 程式練習-信號停止裝置(signal.cpp參考架構) • 用一個signal的函式,當按下ctrl+c或是視窗右上角的x時,可以讓Witilt V3停止讀取,並結束程式(系統預設中斷不正常關閉,改成我們想做的控制) • 參考程式碼請看com_signal.cpp • demo
封裝程式碼(1/3) • 剛剛的程式中,其實HANDLE的控制並不算難,但是如果今天我們的程式要一次控制四五個感應器,這樣程式一定到處都是HANDLE,很難了解。 • 在資訊科學裡,為了解決類似的問題,就用物件來將程式包裝起來,增加程式的可讀性,讓使用者管理方便,也減少不預期的錯誤
封裝程式碼(2/3) • 基本語法 • class witilt // a object for witilt • { • public: // can use by others • inline witilt(char const *); • inline ~witilt(); • int read(char *,size_t =1); • int write(char const *,size_t =1); • protected: // only witilt itself can use • HANDLE handle_com; • private: // they are settings for C++ object • witilt(witilt const &); • void operator=(witilt const &); • };
封裝程式碼(3/3) • 程式練習-物件封裝(object.cpp) • 將witilt的constructor和destructor完成 • Constructor裡需要初使化handle_com(已完成),和測試com是否開啟,以及設定baudrate • Destructor要將裝置關閉 • 最後請看一下main裡使用的方法,比較裝置有無封裝的簡潔度和可讀性(與com_signal.cpp相比) • 跟signal_comport.cpp功能是一樣的 • 參考程式碼請看com_object.cpp
The End • Thank you