Matlab/SimulinkとArduino連携の隠しメニュー「Arduino IO」

# はじめに
先日、[arduino(及びraspi) MATLAB連携とSimulink連携の微妙な違い](https://qiita.com/motorcontrolman/items/291955cbc3fb1c7e4d43)の記事を投稿しました。紛らわしい２手法を整理して、これで見通しが良くなったな！と思ったのも束の間。<b>隠しメニュー</b>があることが判明しました。しかもこの隠しメニュー、<b>中々魅力的だったりする</b>のでタチが悪い。(誉め言葉)

隠しメニューについて既存の記事に追加で書いてもよいのですが、混乱を招きそうなので本記事にてその特徴および利用上の注意点を紹介するものとします。

#隠しメニュー「Arduino IO」とは
現行のMATLABおよびSimulink連携の前身に当たる存在であり、現在も[Legacy MATLAB and Simulink Support for Arduino](https://jp.mathworks.com/matlabcentral/fileexchange/32374-legacy-matlab-and-simulink-support-for-arduino)よりダウンロード可能です。インストール方法は下記を参照。

[Arduino IOのインストール](http://hinf.ee.utsunomiya-u.ac.jp/~hirata/pukiwiki/index.php?plugin=attach&refer=ArduinoBook&openfile=Install_R2014b.pdf) (宇都宮大学 平田先生の[pukiwiki](http://hinf.ee.utsunomiya-u.ac.jp/~hirata/pukiwiki/)より)

Arduino IOは既に<b>サポート停止</b>されており、基本的には現行の連携方法を利用することが推奨されています。

しかしながらこのArduino IO、既存の連携方法とはまた違ったメリットがあります。参考までに、現行の連携方法との差異を下記示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302506/98c0d9e4-2d63-d229-766e-9fd9361ccf71.png)


最大の特徴は「<b>SimulinkでArduinoをストレスなく動かせる</b>」ことで、これは現行の連携方法にはない特徴です。

この特徴はブロック図をあれこれ変更したい場合に効果を発揮します。
これは制御研究者にとっては非常にありがたいことであり、このため前述の[平田先生](http://hinf.ee.utsunomiya-u.ac.jp/)は実験用に愛用されているとのこと。著書である[ArduinoとMATLABで制御系設計をはじめよう！](https://www.amazon.co.jp/dp/B01CNSJTX0)　でもArduino IOが大活躍しています。

また最近におけるArduino IOの注目ユーザーである @manao さんは、DCモータを題材にシステム同定＆制御系設計についての記事を投稿されています。これを読むことでArduino IO利用の実際のイメージが湧くかと思います。
[ArduinoとMATLAB/Simulinkを用いたDCモータのシステム同定](https://qiita.com/Manao/items/ed383a30bbe0c7b9534a)
[ArduinoとMATLAB/Simulinkを用いたDCモータの制御系設計](https://qiita.com/Manao/items/7590c20ab4fb51717923)

# Arduino IO利用上の注意点

同じく平田先生の[ArduinoによるBall & Beam実験装置](https://www.jstage.jst.go.jp/article/sicejl/54/3/54_188/_article/-char/ja/)に、Arduino IO利用上の注意点が一通り書いてあるのでまずはこれを読みましょう。
下記は著者が読んだ上で感じた追加の注意点を書くものとします。

## ①COMポート設定が必要
現行のSimulink連携はCOMポートを自動検出してくれましたが、Arduino IOではやってくれません。
[デバイスマネージャ](http://qa.elecom.co.jp/faq_detail.html?id=6505)からArduinoが接続されているCOMポートを調べましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302506/ae2f4a84-074d-f44f-83cf-4196ae4c8e13.png)

調べたCOM番号をSimulinkモデルに置いたIO Setupブロックに設定します。『COM』の部分も必要なので注意しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302506/8fdddc4f-cef0-d7ca-4319-60f1d09e57fa.png)

## ②実時間での実行設定が必要
Arduino IOは「Simulinkでのシミュレーション中にArduinoに信号を送受信する」ので、シミュレーション速度と実時間が一致していない場合は所望の結果が得られなくなります。不一致の場合の具体的な問題として、積分ブロックの挙動が設計通りにならなくなります。

この現象を回避するための手段として、１つはArduino IOにて用意されているPacerブロックを使用する方法がありますが、<b>このブロックは厳密な実時間実行が出来ない問題がある</b>ことが[ArduinoによるBall & Beam実験装置](https://www.jstage.jst.go.jp/article/sicejl/54/3/54_188/_article/-char/ja/)にも記されています。

じゃあ厳密な実時間実行を行う手段はないのかというと、<b>Simulinkの[ペーシングオプション](https://jp.mathworks.com/help/simulink/ug/simulation-pacing.html)を使えばOK</b>です。(2017bにて導入。参考：[MATLAB Answer：Simulinkモデ​ルを実時間シミュレー​ションするにはどうす​ればよいですか？](https://jp.mathworks.com/matlabcentral/answers/367375-simulink))

特に理由のない限り、ペーシングオプションを使いましょう。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302506/33a33462-fee5-0700-bf28-30079fbd6481.png)


## ③MATLAB連携と競合する
Arduino IOのインストールフォルダには「arduino.m」なるファイルが含まれています。[MATLAB連携](https://jp.mathworks.com/matlabcentral/fileexchange/47522-matlab-support-package-for-arduino-hardware)にてArduinoと接続するための関数は[arduino](https://jp.mathworks.com/help/supportpkg/arduinoio/ug/connect-to-arduino-hardware.html)であったため、Arduino IOを導入するとMATLAB連携におけるArduinoとの接続が出来なくなります。

これを回避する方法は無くはないのですが、色々と面倒なので<b>Arduino IOを利用するMATLABとMATLAB連携を利用するMATLABでバージョンを分ける</b>こと、さらには<b>Arduino IO専用のArduinoを決めておく</b>ことを推奨します。

### なぜそうするか
[Arduino IOのインストール](http://hinf.ee.utsunomiya-u.ac.jp/~hirata/pukiwiki/index.php?plugin=attach&refer=ArduinoBook&openfile=Install_R2014b.pdf) に書いてあるように、Arduino IOは[Arduino IDE](https://www.arduino.cc/en/main/software)を利用した接続用ソフトの書き込みが必要です。

これに対し、MATLAB連携およびSimulink連携はMATLABからArduinoに対しソフトを「<b>半自動的に</b>」書き込みます。自動であるが故にArduino IO用ソフトが意図せず消されてしまうことが起こりえます。

別に消されたらまた書けばいいとは思うのですが、Arduino IOのためだけにIDEを立ち上げるのは面倒です。なのでArduino IO専用のArduinoを決めてしまうほうが楽です。

そしてこの「<b>半自動的に</b>」書き込むためのMATLAB関数がMATLAB連携用の[arduino](https://jp.mathworks.com/help/supportpkg/arduinoio/ug/connect-to-arduino-hardware.html)です。なのでArduino IO専用のArduinoと、Arduino IO専用のMATLABバージョンを決めておくほうがスムーズだと思われるのです。

## ④利用できるArduinoが限定される
現行のMATLAB連携は、かなり幅広いArduinoの種類に対応しています。
[Arduino Support from MATLAB](https://jp.mathworks.com/hardware-support/arduino-matlab.html)

これに対しArduino IOは、2013年にサポート停止しているためこれほど広くのArduinoに対応しません。前述の平田先生の文献を見るに、UnoとMegaを使うのが基本でそれ以外は対応していないと考えるのがよいでしょう。(間違ってたらごめんなさい)

## ⑤MATLABのバージョンによってはインストールが上手くいかない？
著者はこの原稿を書きながら2018b、2019aにそれぞれインストールを試みましたが2018bはうまくインストールできませんでした。

解決する方法は多分あるのでしょうが、初心者にはつらいことも多いので個人的にはインストールできるバージョンを使えばよいものと思います。どうしてもこのバージョンじゃなきゃダメ！という場合は頑張りましょう。

参考までに、うまくインストール出来なかったときのメッセージは下記。(2018b)
ディレクトリに問題があるような雰囲気ですね。
>＞＞ install_arduino
警告:  There is at least another arduino.m file in the path, the installation will go on but it is
strongly suggested to delete any other version before using this one 
＞ In install_arduino (line 15) 
警告: メソッド ディレクトリは MATLAB パスでは許可されていません:
C:\ProgramData\MATLAB\SupportPackages\R2018b\toolbox\matlab\hardware\supportpackages\arduinoio\@arduino 
＞ In path (line 109)
  In addpath (line 86)
  In install_arduino (line 22) 
警告: 名前が存在しないか、ディレクトリではありません
C:\ProgramData\MATLAB\SupportPackages\R2018b\toolbox\matlab\hardware\supportpackages\arduinoio\@arduino\simulink 
＞ In path (line 109)
  In addpath (line 86)
  In install_arduino (line 23) 
警告: 名前が存在しないか、ディレクトリではありません
C:\ProgramData\MATLAB\SupportPackages\R2018b\toolbox\matlab\hardware\supportpackages\arduinoio\@arduino\examples 
＞ In path (line 109)
  In addpath (line 86)
  In install_arduino (line 24) 


一方でうまくインストールできた場合は下記。(2019a)
変化点はバージョンだけであり、MATLABおよびArduino IOの設置フォルダは変えていません。
>
＞＞ install_arduino
警告:  There is at least another arduino.m file in the path, the installation will go on but it
is strongly suggested to delete any other version before using this one 
＞ In install_arduino (line 15) 
 Arduino folders added to the path
 Saved updated MATLAB path

# おわりに
上記を読むと「なんだ、色々クセがあるから使うのやめようかな~」と思われるかも知れませんが、私的には<b>クセを加味した上でも使う価値のある連携方法</b>であることを強調したいです。

マイコンへのデプロイが要らない & MATLABにしかない機能を使わないならArduino IOが一番いいんじゃね？　と思ってるぐらいで、今後しばらくMATLAB芸はこれでやっていく可能性が高いです。サポート止まってるのがリスクですが、しょせん趣味なので・・・。

１事例ではありますが、センサ信号の動作検証が下記ブロックを組むだけで実現できるのは少し感動しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302506/4b9d89cd-4419-31f1-0520-68b962300b02.png)

ちなみにこれは取得した私の心拍データ（笑）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302506/df892bc5-ff64-8876-dbcb-0d051ae412de.png)

MATLAB連携だと一定時間ごとにデータを取るのには[timerオブジェクト](https://jp.mathworks.com/help/matlab/matlab_prog/use-a-matlab-timer-object.html)を使う必要がありますが、Arduino IOではAnalog Read内に設定があるのでその手間を省けるのも素晴らしい。時系列解析が簡単に出来ますね。これでMATLAB芸が捗りそうです。