慣性感測器之應用Online

Download Report

Transcript 慣性感測器之應用Online

慣性感測器之應用
WiTilt v3
2010/09/28 陳宗隆
Outline
v3 基本介紹
 感測資料擷取與後處理 | On-line 資料即時處理
 WiTilt
Overview
 WiTilt

玩具機器人的控制器
 WiTilt



v2
兩軸或三軸加速度計結合2.4 GHz Bluetooth
 WiTilt

v1
v3
Freescale MMA7260Q三軸加速計
Melexis MLX90601 E2 的陀螺儀
class 1 的Bluetooth
內部介紹
1. Power開關
 2. UART switch連結模式選擇(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( winXP or win7)
安裝藍芽接收器
 注意事項:



WiTilt v3是免安全認證方式連線
藍芽軟體選擇,需支援免安全認證
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)
按一下空白鍵開始
連線成功!!
PuTTY
Calibrate(sensor校正)
 在我們開始讀值之前,最好都先做校準的動作
(calibrate)
 [3] Calibrate(sensor校正)


三軸加速度計的校正
一軸gyro的校正
WiTilt v3.3 configuration
 [2]



選擇想輸出的值
XYZ:加速度計的X,Y,Z軸的變化值
B:電池(不會顯示)
R:一軸gyro值(Z軸旋轉)
 [4]




Sensor range (range 設定)
Range:+/-1.5g ,+/- 2g , +/-4g , +/-6g
 [5]

Set active channels (XYZBR Active)
Display mode (output mode)
Gravity values
Raw values (ADC value)
Binary Mode
Degree Mode (degree/second)
WiTilt v3.3 configuration
 [6]

設定門檻值,濾掉sensor的小誤差
 [7]





Set output frequency
讀取資料的快慢(100Hz 比較好算角度)
最大50Hz的角度模式
最大135Hz的重力模式
最大220Hz的raw ADC模式
最大610Hz的二進制模式
 [1]

Set/View threshold values
Start Tri-Ax detector (Press any key stop)
輸出使用者想要的輸出值
手動匯入EXCEL
存成文字檔再匯入
EXCEL
Ctrl+c 複製 用
右鍵會當掉!!
操作練習
 各種設定及輸出格式
 將各種資料匯出至excel

加速度計 data 分析
 靜止狀態
 擺動
 實際走路的資料
 Gyro

旋轉
data 分析
1
23
45
67
89
111
133
155
177
199
221
243
265
287
309
331
353
375
397
419
441
463
485
1.2
1
0.6
0.4
0.2
0
-0.2
-0.02
-0.04
1
27
53
79
105
131
157
183
209
235
261
287
313
339
365
391
417
443
469
495
靜態測試 (1/2)
0.12
X
0.1
Y
0.08
0.8
0.06
X 0.04
Y
Z 0.02
0
-2
-8
R
R
4
2
0
-4
0.98
-6
0.97
1
23
45
67
89
111
133
155
177
199
221
243
265
287
309
331
353
375
397
419
441
463
485
6
1
23
45
67
89
111
133
155
177
199
221
243
265
287
309
331
353
375
397
419
441
463
485
靜態測試 (2/2)
|G|
|G|
1.05
1.04
1.03
1.02
1.01
1
0.99
0.96
-0.5
 左右擺動5次
-0.5
-1
-1.5
-2
1
16
31
46
61
76
91
106
121
136
151
166
181
196
211
226
241
256
271
286
301
316
331
346
 上下擺動5次
1
14
27
40
53
66
79
92
105
118
131
144
157
170
183
196
209
222
235
248
261
274
287
擺動
2.5
2
1.5
1
X
0.5
Y
0
Z
-1
-1.5
2.5
2
1.5
1
0.5
X
0
Y
Z
1
12
23
34
45
56
67
78
89
100
111
122
133
144
155
166
177
188
199
210
221
232
243
254
265
276
287
298
309
320
331
擺動
 前後擺動5次
2
1.5
1
0.5
-0.5
-1
-1.5
X
Y
0
Z
旋轉測試
Gyro測量出來的為角速度,將角速度/頻率 or 角速度*週期 再去累加
 右轉90度

 右轉180度
Σ: 9820

R
140
R
120
120
100
100
80
80
60
R 60
40
40
20
R
20
0
-20
1
25
49
73
97
121
145
169
193
217
241
265
289
313
337
361
385
409
433
457
1
19
37
55
73
91
109
127
145
163
181
199
217
235
253
271
289
307
325
343
0
-20
Σ: 19564
1
17
33
49
65
81
97
113
129
145
161
177
193
209
225
241
257
273
289
305
321
337
353
369
385
401
417
433
449
465
481
497
513
529
545
561
577
593
609
625
641
657
673
人走幾步的波動
2
1.5
1
-0.5
Series1
Series2
Series3
0.5
0
Question??
 操作練習10~15分
On-line 資料即時處理
資料即時處理目的
 更改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
程式練習-開啟COM port
DWORD type
WriteFile
ReadFile
程式練習-輸出Witilt V3數值
Windows內建API簡介(3/12)
 <Windows.h>


WinAPI的標頭檔,裡面包含許多函式和型態的
定義
接下來用到的函式及物件的定義都在這裡面
Windows內建API簡介(4/12)
 HANDLE



type (一個用來handle某裝置)
用來控制檔案、裝置讀寫的物件型態
物件裡包含許多裝置的屬性可供設定,但必須透
過其他函式來完成
宣告一個物件:
 HANDLE
 DCB


type
用來儲存HANDLE設定值的物件
宣告一個物件:
 DCB

handle1,handle2,…;
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/enus/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物件
(只是COM port有做好設定 並不是以連線的意思)
由於參數眾多,只介紹接下來會用到的參數(前二個):
 path:要開啟的裝置/檔案的位置
 mode:要開啟的模式,有GENERIC_READ及
GENERIC_WRITE
 ShareMode的選擇 ,設定為0代表互斥存取
 其他參數用途可參考MSDN Library
 http://msdn.microsoft.com/enus/library/aa363858%28VS.85%29.aspx
Windows內建API簡介(7/12)
*path, DWORD mode,DWORD
dwShareMode,NULL,OPEN_EXISTING,FILE_ATTRIBU
TE_NORMAL, NULL);
 CreateFile(char

使用範例:
 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”

通常是連線被佔用(不能開著超級終端機)或路徑錯誤
指定大於 COM9 序列連接埠 (COM40->\\.\COM40)
 note:In C/C++ “\” 是特殊字元
 HOWTO:
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
Question??
The End
 Thank
you