matlabで9軸IMUのWT901のオイラー角を得る

　アマゾンで購入できる9軸IMUのWT901ボードをPCにつないで、オイラー角を得ます。
　　[データシート](https://github.com/WITMOTION/WT901/blob/1cffe5ad1c50a18e636cb29d80e39f3745d4626d/BWT901CL%20Datasheet.pdf)


### UART接続のIMU WT901
　IMUボードは、アマゾンで入手しました。

　　[WITMOTION WT901 高精度 9 アクシス AHRS MPU9250 TTL 加速度 センサー、ジャイロ + 加速度計 + 磁力計（最大 200HZ）電子 コンパス 振動 傾斜計 モジュール Arduino とプロジェクト など 用](https://www.amazon.co.jp/gp/product/B07S21VG3G/ref=ppx_yo_dt_b_asin_title_o02_s00?ie=UTF8&psc=1)

　PCとCOMポートで接続するためにUSB-シリアル変換ボードもアマゾンで入手しました。

　　[HiLetgo 2個セット CP2102 マイクロ USB転UART TTL モジュール 6ピン シリアル コンバーター STC FT232を置換でき 並行輸入品](https://www.amazon.co.jp/gp/product/B01LXHQIF0/ref=ppx_yo_dt_b_asin_title_o01_s00?ie=UTF8&psc=1)

### 接続
　上記のボードを接続します。UART信号のTXとRXはクロスします。電源電圧は3.3～5Vで、5Vにつなぎました。
![wt901.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/64bfd264-636b-f013-66ca-d7c7ae7f0ee0.png)

### ユーティリティを使ってオイラー角の出力を有効にする
　デフォルトでは、ACCELERATION、MAGNETIC FILED(uT)、PRESSURE（Temprature）、Angleの値が送られています。Windowsのソフト「Standard Software for Windows PC」をダウンロードし、設定を変更します。

　　GitHub　https://github.com/WITMOTION/WT901
　　Googleドライブ　https://drive.google.com/drive/folders/1dWvJU2Ug7MpcwTPWoARw2KJI8oYbuVEW


　Contentの設定で、全部のチェックを外し、Angleだけにチェックを入れます。
　下の画面ではUARTと通信速度が115200ですが、実験なので、9600bpsに変更しました。
　Angleがオイラー角であるとはどこにも書かれていないのですが、ユーティリティをうごかしてRoll、Pitch、Yawが得られるので、たぶんあっていると思います。
　真ん中の図の動きを見ても、それっぽいです。

![w101.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/08e5a99f-a072-9755-57cd-59b61b92f93d.png)

### matlabで接続
　Angleのデータ/・フォーマットは、データシートから、次の形式になっています。
　0x55がデータの始まりを表し、次の0x53でAngleのデータが送られてきたことを判別できます。

| 0x55| 0x53 | RollL | RollH | PitchL | PitchH | YawL | YawH |
|:-----------:|:------------:|:------------:|:------------:|:------------:|:------------:|:------------:|:------------:|


　matlabはR2022b update5です。Windows10 Pro 22H2の環境です。

```matlab
clear
close all;
wt901 = serialport('COM3', 9600) ; %115200);

Angle=[0 0 0 0 0 0];

while (1)
    Head = read(wt901,2,'uint8');
    if (Head(1)~=uint8(0x55))
        continue;
    end 
    if (Head(2) == uint8(0x53))
        Angle = (read(wt901,6,'uint8'))
        Roll  = (Angle(2)*256 +Angle(1)) / 32768*180
        Pitch = (Angle(4)*256 +Angle(3)) / 32768*180
        Yaw   = (Angle(6)*256 +Angle(5)) / 32768*180

        pause(0.1);  
    end
end
```

　実行例です。
![w102.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/b01c40f5-8619-a7d3-20bf-d33c70d49039.png)

### simulinkで接続
　 Instrument Control ToolBoxを使っています。
　全体です。真ん中の六つのデータが、読み込んだ生データです。
　右下が、オイラー角のデータ出力です。

![w103.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/dda751a6-26e6-413a-aa96-62936685100a.png)
　それぞれのプロパティです。

![w104.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/c673b784-0687-a7d9-2d4e-f83365c5f519.png)

![w105.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/0cd26cdf-e3e7-c857-b03c-c62b3f20345f.png)

![w106.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/c39ec42f-0824-ac1e-539b-7936a21859c1.png)









　Functionの内容です。

```matlab
function Angle = fcn(data)
Angle = zeros(1,3);
Roll = (data(2)*256 +data(1)) / 32768*180;
Pitch = (data(4)*256 +data(3)) / 32768*180;
Yaw  = (data(6)*256 +data(5)) / 32768*180;

Angle = [Roll,Pitch,Yaw]
```