はじめに
先日、arduino(及びraspi) MATLAB連携とSimulink連携の微妙な違いの記事を投稿しました。紛らわしい2手法を整理して、これで見通しが良くなったな!と思ったのも束の間。隠しメニューがあることが判明しました。しかもこの隠しメニュー、中々魅力的だったりするのでタチが悪い。(誉め言葉)
隠しメニューについて既存の記事に追加で書いてもよいのですが、混乱を招きそうなので本記事にてその特徴および利用上の注意点を紹介するものとします。
#隠しメニュー「Arduino IO」とは
現行のMATLABおよびSimulink連携の前身に当たる存在であり、現在もLegacy MATLAB and Simulink Support for Arduinoよりダウンロード可能です。インストール方法は下記を参照。
Arduino IOのインストール (宇都宮大学 平田先生のpukiwikiより)
Arduino IOは既にサポート停止されており、基本的には現行の連携方法を利用することが推奨されています。
しかしながらこのArduino IO、既存の連携方法とはまた違ったメリットがあります。参考までに、現行の連携方法との差異を下記示します。
最大の特徴は「SimulinkでArduinoをストレスなく動かせる」ことで、これは現行の連携方法にはない特徴です。
この特徴はブロック図をあれこれ変更したい場合に効果を発揮します。
これは制御研究者にとっては非常にありがたいことであり、このため前述の平田先生は実験用に愛用されているとのこと。著書であるArduinoとMATLABで制御系設計をはじめよう! でもArduino IOが大活躍しています。
また最近におけるArduino IOの注目ユーザーである @manao さんは、DCモータを題材にシステム同定&制御系設計についての記事を投稿されています。これを読むことでArduino IO利用の実際のイメージが湧くかと思います。
ArduinoとMATLAB/Simulinkを用いたDCモータのシステム同定
ArduinoとMATLAB/Simulinkを用いたDCモータの制御系設計
Arduino IO利用上の注意点
同じく平田先生のArduinoによるBall & Beam実験装置に、Arduino IO利用上の注意点が一通り書いてあるのでまずはこれを読みましょう。
下記は著者が読んだ上で感じた追加の注意点を書くものとします。
①COMポート設定が必要
現行のSimulink連携はCOMポートを自動検出してくれましたが、Arduino IOではやってくれません。
デバイスマネージャからArduinoが接続されているCOMポートを調べましょう。
調べたCOM番号をSimulinkモデルに置いたIO Setupブロックに設定します。『COM』の部分も必要なので注意しましょう。
②実時間での実行設定が必要
Arduino IOは「Simulinkでのシミュレーション中にArduinoに信号を送受信する」ので、シミュレーション速度と実時間が一致していない場合は所望の結果が得られなくなります。不一致の場合の具体的な問題として、積分ブロックの挙動が設計通りにならなくなります。
この現象を回避するための手段として、1つはArduino IOにて用意されているPacerブロックを使用する方法がありますが、このブロックは厳密な実時間実行が出来ない問題があることがArduinoによるBall & Beam実験装置にも記されています。
じゃあ厳密な実時間実行を行う手段はないのかというと、Simulinkのペーシングオプションを使えばOKです。(2017bにて導入。参考:MATLAB Answer:Simulinkモデルを実時間シミュレーションするにはどうすればよいですか?)
特に理由のない限り、ペーシングオプションを使いましょう。
③MATLAB連携と競合する
Arduino IOのインストールフォルダには「arduino.m」なるファイルが含まれています。MATLAB連携にてArduinoと接続するための関数はarduinoであったため、Arduino IOを導入するとMATLAB連携におけるArduinoとの接続が出来なくなります。
これを回避する方法は無くはないのですが、色々と面倒なのでArduino IOを利用するMATLABとMATLAB連携を利用するMATLABでバージョンを分けること、さらにはArduino IO専用のArduinoを決めておくことを推奨します。
なぜそうするか
Arduino IOのインストール に書いてあるように、Arduino IOはArduino IDEを利用した接続用ソフトの書き込みが必要です。
これに対し、MATLAB連携およびSimulink連携はMATLABからArduinoに対しソフトを「半自動的に」書き込みます。自動であるが故にArduino IO用ソフトが意図せず消されてしまうことが起こりえます。
別に消されたらまた書けばいいとは思うのですが、Arduino IOのためだけにIDEを立ち上げるのは面倒です。なのでArduino IO専用のArduinoを決めてしまうほうが楽です。
そしてこの「半自動的に」書き込むためのMATLAB関数がMATLAB連携用のarduinoです。なのでArduino IO専用のArduinoと、Arduino IO専用のMATLABバージョンを決めておくほうがスムーズだと思われるのです。
④利用できるArduinoが限定される
現行のMATLAB連携は、かなり幅広いArduinoの種類に対応しています。
Arduino Support from MATLAB
これに対し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
おわりに
上記を読むと「なんだ、色々クセがあるから使うのやめようかな~」と思われるかも知れませんが、私的にはクセを加味した上でも使う価値のある連携方法であることを強調したいです。
マイコンへのデプロイが要らない & MATLABにしかない機能を使わないならArduino IOが一番いいんじゃね? と思ってるぐらいで、今後しばらくMATLAB芸はこれでやっていく可能性が高いです。サポート止まってるのがリスクですが、しょせん趣味なので・・・。
1事例ではありますが、センサ信号の動作検証が下記ブロックを組むだけで実現できるのは少し感動しました。
ちなみにこれは取得した私の心拍データ(笑)
MATLAB連携だと一定時間ごとにデータを取るのにはtimerオブジェクトを使う必要がありますが、Arduino IOではAnalog Read内に設定があるのでその手間を省けるのも素晴らしい。時系列解析が簡単に出来ますね。これでMATLAB芸が捗りそうです。