MATLAB連携とSimulink連携の微妙な違いArduinomatlabRaspberryPiはじめにMATLAB/SimulinkはarduinoやRaspberryPiといった、ハードウェアと連携することが可能です。連携方法としてはMATLABと連携する方法、Simulinkと連携する方法が準備されています。MATLAB/Simulinkなんだから、どっちと連携させても大体同じでしょ!と思いきや連携のさせ方や使い勝手が結構違います。本記事においては、どこがどう違うのかを述べることで用途ごとの適切な連携方法の選択、および素早い技術開発の実現を目指すものとします。Hardwareインストールはアドオンからが楽です。IO」についてはこちら。https://qiita.com/motorcontrolman/items/bd962021be8c5fdcc48b先に結論を述べるとarduinoを例に取ると下記の表のようになります。RaspberryPiの場合でもだいたい同じです。(あえて違いを挙げるなら設定の容易性。MATLAB連携でIPの設定が必要になる)以降では上記の項目それぞれについての説明を行います。1.主従関係MATLAB/SimulinkのインストールされたPCと、マイコンの一種であるarduinoを連携させる際には2機間に主従関係が発生します。分かり易さ優先で主従関係と書きましたが、正しくは「どちらがプログラムを実行するのか」が連携方法によって変わります。MATLAB連携の場合プログラムを実行するのはMATLABの入ったPCで、arduinoは命令通り動くだけです。これを実現するため、arduinoのマイコンにはMATLABの命令を受け取るためのプログラムが書き込まれます。プログラムの書き込みは、下記に示すMATLAB・arduino接続コマンドを打った際に自動で行われます。arduino();プログラムが書き込まれる際のみ下記の文字列がMATLAB画面に表示され、数分間待つことになります。逆に言うと、既にプログラムが書き込まれていれば待ち時間なしです。表に示した「実行までの待ち時間0」はこの特徴に起因します。Simulink連携の場合プログラムを実行するのはarduinoで、Simulinkの入ったPCは信号を送受信するだけです。SimulinkとMATLABを連携させる場合、プログラムを実行させる方法として『エクスターナルモードでの実行』と『ハードウェアでの実行』の2パターンが存在します。このうちPCとの送受信を行うのはエクスターナルモードのみで、ハードウェア実行は完全スタンドアロンです。エクスターナルモードでの実行では、Simulink画面上で信号をON/OFFできたり、ゲインを変更できたりするのでプログラムがPC側で実行されているような気持ちになりますが、やっているのはあくまで信号送受信だけです。arduinoに書き込まれるプログラムは、Simulink画面上にてエクスターナルモード実行またはハードウェア実行を行った際にSimulinkブロックから自動コード生成・ビルドされてarduinoへと書き込まれます。この手続きには数分かかります。表に示した「実行までの待ち時間数分」はこの特徴に起因します。ちなみにこの待ち時間、Simulinkモデルを変更⇒arduinoにて実行する際には毎回発生するもので、Simulinkブロックの規模が小さくても数分かかります。変更の規模がわずかでも一律に同じ待ち時間が発生します。このため、頻繁な調整を要するような作業(例えば、センサやモータの動検)をSimulink連携でやるのにはかなりストレスがあります。MATLAB連携の場合は待ち時間が0なので、こうした作業には適しています。追記・備考:2019bからエクスターナル/ハードウェア実行の呼び出し画面が変わりました。Simulink連携のブロックを配置するとメニューに「ハードウェア」が表示され、「監視および調整」でエクスターナル実行が、「ビルド、配布および開始」でハードウェア実行が呼び出されるようになりました。arduinoのスタンドアロン化1.の説明から想像がつくかとは思いますが、一応説明しておきます。MATLAB連携の場合プログラムがMATLAB側で実行されるため、スタンドアロン化は不可です。Simulink連携の場合プログラムがarduino側で実行されるため、スタンドアロン化が可能です。ちなみに、エクスターナルモードでの実行中にPCとarduinoの接続をぶった切ってもarduinoのプログラムは動き続けます(要外部電源供給)。arduinoのリセットを押すことでプログラムを最初から実行することが出来ます。実行までの待ち時間の文中にて説明しているのでここでの説明は割愛します。設定自体がそもそも不要です、超らくちん。打てばarduinoの種類を自動検出してプログラムを流し込んでくれます。Simulink連携の場合コンフィグレーションパラメータにて接続するarduinoの種類を設定する必要があります。慣れればなんてことないですが、Simulink初心者にはちょっとつらいと思います。慣れている人であっても、開発途中でarduinoの種類を変更した際にエラーが出て嫌な気持ちになることはままあります(エラー出るまでに数分かかるため)。参考までにコンフィグレーションパラメータの起動方法は下記。arduino種類の設定画面は下記。Designerでアプリ作成する必要があります。慣れればなんということはないですが、Simulinkほど楽ちんではないという観点から△にしています。Simulink連携の場合(エクスターナルモードでの実行)Simulinkブロックを使うことができるため、わざわざ準備する必要がありません。Scopeブロックが利用できるのはもちろんのこと、dashbordを利用することで幅広いGUIが使えます。下記の動画は、最終的にはSimulink連携(エクスターナルモード実行)を行っていますが、その開発初期はステッピングモータの動作検証を短時間で行う目的でMATLAB連携を使いました。2019参考まで動作検証用のコードは下記。このコードはSimulink連携時には使っていません、というか使えません。Simulink連携の場合、LEDの点滅にはSimulinkブロックを使う必要があります。1);pause(0.01);end[MATLAB]MATLAB関数でarduinoをリアルタイムに動かす下記の動画では、wiiヌンチャクのジョイスティック値をarduino経由でリアルタイムにMATLABに表示させています。動画ではやっていませんが、ジョイスティックと連動させてサーボモータを動かしたりも簡単に出来ます。AIや最適化など、高度なMATLAB関数と組み合わせることで色々なことが出来そうです。MATLAB芸、動画にしたら微妙な感じになった・・・wiiヌンチャクでfigureにお絵描き、Zでリセット。元ネタはarduinoのライブラリで、mファイルへの書き換えを手動で実施。2019ところでGUIはというと、whileループ内で既存データに新データを結合⇒axisを指定してplotしています。これも参考までにコードを下記貼りますが、動かなかったらすいません。pause(5e-3);end[Simulink]arduinoに組み込む制御を短時間で設計・実装する詳しくは下記の記事を閲覧下さい。制御するには、同時に実行されるプロセス(いわゆる「マルチタスキング」)が必要です。EXPO2019のLTにて、ご本人が仰っていたのですが「三角波やのこぎり波をCで書くのは面倒だがSimulinkはライブラリ使うだけだから時短になる」というのは目から鱗でした。レートリミットなんかもそうですが、Simulinkは「機能は単純だがCでの実装は手間」なものとの相性がよいですよね。[MATLAB]手の込んだGUIでarduinoを動かすこれも同様の記事が具体例となります。色や明るいさを調節したり、サーボモータを動かしたりすることができますAppDesignerはMATLAB用のGUIアプリケーション開発環境です。MATLABにある程度慣れた人であれば、容易にGUIを作ることが出来ます。MBD)を適用してみたモデルベース開発(MBD)は自動車業界にて主に導入されている手法です。詳しいことはここでは説明しませんが、要するに「実機を使った技術検証は極力抑えて、シミュレーション主体で技術検証しようぜ!」「そのために、実機の振る舞いを模擬したモデルを使おうぜ!」という開発手法です。振る舞いの例としては、ノイズや遅延を含むセンサ出力や、モータの動的特性等が挙げられます。振る舞いが素直なものであれば実機だけの技術検証でなんとかなりますが、癖のあるものであれば苦労することになります。MBDは後者に対する効果的手法であり、MATLAB/SimulinkはMBDのための代表的なツールとして挙げられます。Simulink連携では、シミュレーション用のモデルをそのままセンサやモータと接続したarduinoへと書き込むことが可能なためMBDを非常に簡単に導入することが出来ます。arduinoなので複雑な処理・速度を必要とする処理は実装できませんが、おそらく最もお金をかけずにMBDを実現する方法と考えられるのでぜひお試し下さい。一例として下記に、心拍センサー値をもとにLEDを点滅させるプログラムのモデルを示します。シミュレーション用のブロックとarduino用のブロックが同居しているのが分かると思います。Sinkで、無効側のポートに接続されたブロックをコメントアウトする機能があります。シミュレーションにて検証する場合は、arduino用のブロックを無効化した上でシミュレーションのモードを「ノーマル」に設定、モデルの作りこみを行います。「シミュレーションの速度早すぎ、実時間にして!」という場合はペーシングオプションが有効です。ある程度作りこみが終わったら、シミュレーション用のブロックを無効化した上でシミュレーションのモードを「エクスターナル」に設定してarduinoへの書き込み・実行を行います。おわりに事例をもとに、似たように見える2つの連携方法の違いを示しました。どちらか片方の連携だけでも強力ですが、違いを分かった上で使い分けることでその本領が発揮されるものと思います。本記事がそのための助けになれれば幸いです。upLoginユーザーは見つかりませんでした。