はじめに
MATLAB及びSimulinkのとってもいいところとして、arduinoやRaspberry Piと言ったハードウェアとの連携が挙げられます。私はこの機能好きすぎて、qiitaに下記記事を書いたりtwitterに動画投稿したりしています。
arduino(及びraspi) MATLAB連携とSimulink連携の微妙な違い
こうなると、もっと色々なハードウェアと連携したくなってくるのが人のサガです。
そんな時にチェックするといいのが、MATLABのアドオン置き場であるFile Exchangeのハードウェアサポートパッケージのページです。
2020年8月現在、約250ものハードウェア連携用アドオンが掲載されており、正直ここを見ているだけでヨダレが出てきます。ぐへへ。
ある日、上記のページを閲覧しているとそこにはなんと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)
私micro:bit とっても好きなんですよね~。何がいいって、導入障壁がarduinoよりもさらに低い点が。電子工作趣味の布教には大変頼もしい存在です。
そんなmicro:bitがMATLABと連携できるなんて夢のよう…そう思っていたのも束の間。
そんな・・・ あんまりだよ!こんなのってないよ・・・絶対おかしいよ!*
※MATLAB Coder, Simulink Coder:これらのお値段は車が買えるぐらいとなっております。
そんな感じでMathworksさんにがっかりさせられた私ですが、ある日思いもしないところから朗報が入りました。
なんと、MATLABとBLEの連携はすごく簡単というじゃないですか(2019b以降)。ならば、ハードウェアサポートがなくてもとりあえずMATLABでmicro:bitを動かすことは出来るってことね。流石MATLAB、大好き!抱いて!
(とは言いつつも、やっぱりCoder類抜きでの連携は強く要望します。キリッ)
前置きが長くなりましたが、BLEを使ってMATLABとmicro:bitをサクっと連携させていきます。出来上がりとしては下記のような感じになります。
Micro:bitでちょっとしたMATLAB芸できた!
— モータ制御マン (@motorcontrolman) July 25, 2020
MATLABのBLE接続ほんと簡単だな~。以前試したときはPCとの相性の問題かうまく出来なかったが、2019b update5にて出来た。 pic.twitter.com/G0mk1Lcg3J
下記、①micro:bit側の準備 ②MATLABでのコーディング の順に説明を行います。①はMATLAB固有の設定が必要ということではないので、既にmicro:bitのBLEを使っている、という方であれば①は飛ばして頂いてOKです。
①micro:bit側の準備
これに関しては、ここで詳しく書くよりも外部の秀逸な記事がいっぱいあるのでそちらを参照頂ければと思います。
BLEの有効化およびセンサ類の有効化は下記記事のステップ1~ステップ3までを参照。
ステップ2を実施し忘れたり、ステップ3を実施し忘れたりしがちなので注意。
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接続されると、笑顔マークがチェックマークに切り替わるようにしています。
②MATLABでのコーディング
忙しい人向け
micro:bitに文字を表示するだけでよければMATLABのコードは下記です、超簡単。
BBC micro:bit [tuvuv]
の部分は、人によって設定が異なる場合がありますので②を参考に各自修正下さい。
% 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");
上記コードの実行結果が先に紹介した動画となります。
Micro:bitでちょっとしたMATLAB芸できた!
— モータ制御マン (@motorcontrolman) July 25, 2020
MATLABのBLE接続ほんと簡単だな~。以前試したときはPCとの相性の問題かうまく出来なかったが、2019b update5にて出来た。 pic.twitter.com/G0mk1Lcg3J
段取りを知りたい人向け
導入にて紹介済みの記事 MATLABからtoioを動かしてみた を参考に、まずはMATLABがmicro:bitを認識してるかを下記コマンドでチェックしてみます。
blelist
いますね。
MATLABのBLE接続関数は、NameとAdressのどちらでも引数として使えます。今回はNameを使って行きましょう。
ble:Bluetooth Low Energy 周辺デバイスに接続
b = ble("BBC micro:bit [tuvuv]");
micro:bitとMATLABをBLEで繋いだ際の動画。 pic.twitter.com/2Jp2PM0OP8
— モータ制御マン (@motorcontrolman) August 22, 2020
micro:bitに書いてあるプログラムが期待通り動いている事、およびMATLABとの連携が出来たことをこれで確認できます。
下記コマンドを打つことで、接続したmicro:bitで有効となっている機能を確認できます。micro:bitで利用できる機能としては、LEDに文字を表示したり、温度を測定したり、加速度を計測したりできます。
b.Characteristics
…ごめん、どれが文字表示とか温度測定なんですっけ?(怒)
こうなると逐一調べるしかありません。私は下記ページを参照に調べました。
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
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℃。マイコンで計測すると高めに出るのはあるあるかと…)
数値変換を下記参考に実施する必要がありますが、これについては別途。
【BLE初心者必見】obniz BLEでmicro:bitの加速度センサーとボタンの状態を取得する方法
まとめ
micro:bitはもちろんのこと、最近ではM5StackやObnizといったBLEを標準装備したマイコンが数多く見られます。そんなマイコンとMATLABを簡単に繋げられることは夢が広がりますね!どんどん連携して、どんどんMATLAB芸を世に出して行きましょう。