MATLABとmicro:bitをBLEで繋げて遊ぶ

# はじめに
MATLAB及びSimulinkのとってもいいところとして、arduinoやRaspberry Piと言ったハードウェアとの連携が挙げられます。私はこの機能好きすぎて、qiitaに下記記事を書いたりtwitterに動画投稿したりしています。

[arduino(及びraspi) MATLAB連携とSimulink連携の微妙な違い](https://qiita.com/motorcontrolman/items/291955cbc3fb1c7e4d43)

こうなると、もっと色々なハードウェアと連携したくなってくるのが人のサガです。
そんな時にチェックするといいのが、MATLABのアドオン置き場である[File Exchangeのハードウェアサポートパッケージ](https://jp.mathworks.com/matlabcentral/fileexchange/?group=hardware_support)のページです。
2020年8月現在、約250ものハードウェア連携用アドオンが掲載されており、正直ここを見ているだけでヨダレが出てきます。ぐへへ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302506/a4c60f25-cedd-914e-3322-34ebf39a47a6.png)

新しい観点でのハードウェア沼に嵌りそうな気配が…（笑）


ある日、上記のページを閲覧しているとそこにはなんとmicro:bitの名前が！
[https://jp.mathworks.com/matlabcentral/fileexchange/60273-simulink-coder-support-package-for-bbc-micro-bit-board](Simulink Coder Support Package for BBC micro:bit Board)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302506/9d7dd5be-da07-6f02-2ff2-7a81cf3bfea8.png)

私micro:bit とっても好きなんですよね~。何がいいって、導入障壁がarduinoよりもさらに低い点が。電子工作趣味の布教には大変頼もしい存在です。

そんなmicro:bitがMATLABと連携できるなんて夢のよう…そう思っていたのも束の間。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302506/3478e70c-922c-cde7-ae3b-84e49539434d.png)


<b>そんな・・・ あんまりだよ！こんなのってないよ・・・絶対おかしいよ！*</b>

※MATLAB Coder, Simulink Coder：これらのお値段は<b>車が買える</b>ぐらいとなっております。


そんな感じでMathworksさんにがっかりさせられた私ですが、ある日思いもしないところから朗報が入りました。

[MATLABからtoioを動かしてみた](https://qiita.com/henjin01_Fab/items/191a6f76c97591e87be8)

なんと、MATLABとBLEの連携はすごく簡単というじゃないですか(2019b以降)。ならば、ハードウェアサポートがなくてもとりあえずMATLABでmicro:bitを動かすことは出来るってことね。流石MATLAB、大好き！抱いて！
(とは言いつつも、やっぱりCoder類抜きでの連携は強く要望します。ｷﾘｯ)

前置きが長くなりましたが、BLEを使ってMATLABとmicro:bitをサクっと連携させていきます。出来上がりとしては下記のような感じになります。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Micro:bitでちょっとしたMATLAB芸できた！ <br>MATLABのBLE接続ほんと簡単だな～。以前試したときはPCとの相性の問題かうまく出来なかったが、2019b update5にて出来た。 <a href="https://t.co/G0mk1Lcg3J">pic.twitter.com/G0mk1Lcg3J</a></p>&mdash; モータ制御マン (@motorcontrolman) <a href="https://twitter.com/motorcontrolman/status/1287010083226845191?ref_src=twsrc%5Etfw">July 25, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

下記、①micro:bit側の準備　②MATLABでのコーディング　の順に説明を行います。①はMATLAB固有の設定が必要ということではないので、既にmicro:bitのBLEを使っている、という方であれば①は飛ばして頂いてＯＫです。

# ①micro:bit側の準備

これに関しては、ここで詳しく書くよりも外部の秀逸な記事がいっぱいあるのでそちらを参照頂ければと思います。

BLEの有効化およびセンサ類の有効化は下記記事のステップ１~ステップ３までを参照。
ステップ２を実施し忘れたり、ステップ３を実施し忘れたりしがちなので注意。
https://qiita.com/yokmama/items/5522fabfb5b9623278e2


BLEの有効化について、もっと順を追って知りたい！という方は下記記事を参照。
https://sanuki-tech.net/micro-bit/bluetooth/temperature/

ちなみに私はmicro:bitのファームが古くてエディタとの連携が出来なくなっていたので、下記記事を参考にファーム更新を行いました。

ファームの更新
https://sanuki-tech.net/micro-bit/appendix/update-firmware/

また私がmicro:bitに書き込んでいるプログラムは下記になります。
BLE接続されると、笑顔マークがチェックマークに切り替わるようにしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302506/ec5ac0d2-c204-a737-6064-05b134bf4a2e.png)


# ②MATLABでのコーディング
## 忙しい人向け

micro:bitに文字を表示するだけでよければMATLABのコードは下記です、超簡単。
`BBC micro:bit [tuvuv]`の部分は、人によって設定が異なる場合がありますので[②](https://qiita.com/motorcontrolman/items/fa6a2435f6b8dd5d4e64#matlab%E3%81%A7%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0)を参考に各自修正下さい。

```matlab
% BLE接続
b = ble("BBC micro:bit [tuvuv]"); 

% micro:bitに所定の文字を流すためのUUIDを設定
ledTextCharacteristic =  characteristic(b,"E95DD91D-251D-470A-A062-FA1922DFA9A8", "E95D93EE-251D-470A-A062-FA1922DFA9A8");

% 文字を流す
write(ledTextCharacteristic,"MATLAB");
```

上記コードの実行結果が先に紹介した動画となります。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Micro:bitでちょっとしたMATLAB芸できた！ <br>MATLABのBLE接続ほんと簡単だな～。以前試したときはPCとの相性の問題かうまく出来なかったが、2019b update5にて出来た。 <a href="https://t.co/G0mk1Lcg3J">pic.twitter.com/G0mk1Lcg3J</a></p>&mdash; モータ制御マン (@motorcontrolman) <a href="https://twitter.com/motorcontrolman/status/1287010083226845191?ref_src=twsrc%5Etfw">July 25, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## 段取りを知りたい人向け

導入にて紹介済みの記事　[MATLABからtoioを動かしてみた](https://qiita.com/henjin01_Fab/items/191a6f76c97591e87be8)　を参考に、まずはMATLABがmicro:bitを認識してるかを下記コマンドでチェックしてみます。

```matlab

blelist
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302506/77fea76a-1566-cb02-1e3a-0b3c57c86566.png)

いますね。
MATLABのBLE接続関数は、NameとAdressのどちらでも引数として使えます。今回はNameを使って行きましょう。
[ble：Bluetooth Low Energy 周辺デバイスに接続](https://jp.mathworks.com/help/matlab/ref/ble.html)

```matlab

b = ble("BBC micro:bit [tuvuv]");
```

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">micro:bitとMATLABをBLEで繋いだ際の動画。 <a href="https://t.co/2Jp2PM0OP8">pic.twitter.com/2Jp2PM0OP8</a></p>&mdash; モータ制御マン (@motorcontrolman) <a href="https://twitter.com/motorcontrolman/status/1297087102455132160?ref_src=twsrc%5Etfw">August 22, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

micro:bitに書いてあるプログラムが期待通り動いている事、およびMATLABとの連携が出来たことをこれで確認できます。

下記コマンドを打つことで、接続したmicro:bitで有効となっている機能を確認できます。micro:bitで利用できる機能としては、LEDに文字を表示したり、温度を測定したり、加速度を計測したりできます。

```matlab

b.Characteristics
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302506/3dee4d84-a256-3117-2eb9-f8b2ba93a613.png)

<b>…ごめん、どれが文字表示とか温度測定なんですっけ？(怒)</b>

こうなると逐一調べるしかありません。私は下記ページを参照に調べました。
https://lancaster-university.github.io/microbit-docs/resources/bluetooth/bluetooth_profile.html

|サービス名  |ServiceUUID  |CharacteristicUUID  |Attributes |
|---|---|---|---|
Microbit Event	|E95D93AF-251D-470A-A062-FA1922DFA9A8	|E95D9775-251D-470A-A062-FA1922DFA9A8	|1×2　	string
Client Event	|E95D93AF-251D-470A-A062-FA1922DFA9A8	|E95D5404-251D-470A-A062-FA1922DFA9A8	|1×2	string
Client Requirements	|E95D93AF-251D-470A-A062-FA1922DFA9A8	|E95D23C4-251D-470A-A062-FA1922DFA9A8	|"Write"	
MicroBit Requirements	|E95D93AF-251D-470A-A062-FA1922DFA9A8	|E95DB84C-251D-470A-A062-FA1922DFA9A8	|1×2	string
Accelerometer Data	|E95D0753-251D-470A-A062-FA1922DFA9A8	|E95DCA4B-251D-470A-A062-FA1922DFA9A8	|1×2	string
Accelerometer Period	|E95D0753-251D-470A-A062-FA1922DFA9A8	|E95DFB24-251D-470A-A062-FA1922DFA9A8	|1×2	string
LED Matrix State	|E95DD91D-251D-470A-A062-FA1922DFA9A8	|E95D7B77-251D-470A-A062-FA1922DFA9A8	|1×2	string
LED Text	|E95DD91D-251D-470A-A062-FA1922DFA9A8	|E95D93EE-251D-470A-A062-FA1922DFA9A8	|"Write"	
Scrolling Delay	|E95DD91D-251D-470A-A062-FA1922DFA9A8	|E95D0D2D-251D-470A-A062-FA1922DFA9A8	|1×2	string
Temperature	|E95D6100-251D-470A-A062-FA1922DFA9A8	|E95D9250-251D-470A-A062-FA1922DFA9A8	|1×2	string
Temperature Period	|E95D6100-251D-470A-A062-FA1922DFA9A8	|E95D1B25-251D-470A-A062-FA1922DFA9A8	|1×2	string
Button A State	|E95D9882-251D-470A-A062-FA1922DFA9A8	|E95DDA90-251D-470A-A062-FA1922DFA9A8	|1×2	string
Button B State	|E95D9882-251D-470A-A062-FA1922DFA9A8	|E95DDA91-251D-470A-A062-FA1922DFA9A8	|1×2	string

すぐに遊べそうなのは`LED Text` `Accelerometer Data` `Temperature` あたりでしょうか。ちなみに`Accelerometer Period` `Temperature Period`とかは更新周期の設定確認用っぽいです。

上記UUIDリストを参考に、温度・加速度・文字流しをやってみます。
データの読み書きは下記ページを参考にしました。
https://jp.mathworks.com/matlabcentral/answers/481785-matlab-bluetooth-ble

```matlab

tempCharacteristic = characteristic(b,"E95D6100-251D-470A-A062-FA1922DFA9A8","E95D9250-251D-470A-A062-FA1922DFA9A8");
accelCharacteristic = characteristic(b,"E95D0753-251D-470A-A062-FA1922DFA9A8", "E95DCA4B-251D-470A-A062-FA1922DFA9A8");
ledTextCharacteristic =  characteristic(b,"E95DD91D-251D-470A-A062-FA1922DFA9A8", "E95D93EE-251D-470A-A062-FA1922DFA9A8");

Temp = read(tempCharacteristic);
Accel = uint16( read(accelCharacteristic) );
write(ledTextCharacteristic,"MATLAB");
```

文字流しの結果は流石に省略します。
温度は下記結果となりました、だいたいあってそうです。
(ちなみに室温：27℃。マイコンで計測すると高めに出るのはあるあるかと…)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302506/87e9674e-90a0-8f40-76ee-ac4fa02b5d66.png)


加速度はバイナリで帰ってきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302506/156cbea5-810f-34e0-ad4f-d66324d21644.png)

数値変換を下記参考に実施する必要がありますが、これについては別途。
[【BLE初心者必見】obniz BLEでmicro:bitの加速度センサーとボタンの状態を取得する方法](https://qiita.com/Google_Homer/items/7b8ad409d8575c5647d1)

## まとめ
micro:bitはもちろんのこと、最近ではM5StackやObnizといったBLEを標準装備したマイコンが数多く見られます。そんなマイコンとMATLABを簡単に繋げられることは夢が広がりますね！どんどん連携して、どんどんMATLAB芸を世に出して行きましょう。