【MATLAB】Simulink連携の新顔「入力/出力モード」って何者？

# はじめに
MATLAB/SimulinkはarduinoやRaspberryPiといった、ハードウェアと連携することが可能です。連携方法としてはMATLABと連携する方法、Simulinkと連携する方法が準備されています。

…と[2019年のアドベントカレンダー](https://qiita.com/motorcontrolman/items/291955cbc3fb1c7e4d43)と全く同じ序文から始めさせて頂いております。3年経ってもやれMATLABだ、やれArduinoだで記事を書いているだなんて
成長のないやつですね
語る事に尽きないものですね。

前置きはさておき。
Simulink-Arduino連携機能の歴史は気が付くと結構長く、登場した2014年からはや8年が経過しています。

https://jp.mathworks.com/matlabcentral/fileexchange/40312-simulink-support-package-for-arduino-hardware

8年の間に、ライブラリがどんどん拡充していったり、サポートするArduinoの種類が増えたりと着実に進化を遂げています。この機能の愛好家である私は、MATLABのバージョン更新の度に何か新しいことはないか？ と逐次チェックしています。

タイトルに記載した<b>「入力/出力モード」</b>ですが、2022aぐらいから追加された機能と思います。正直なところ、その名前だけではこれまでのエクスターナルモードとの違いがよく分からなかったためこれまでスルーしてきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302506/8aeae697-af91-2814-8ca4-cdff465d5a35.png)

今回、何が違うかについて改めて確認してみたところ、<b>想定外に便利な機能</b>であることが分かったため紹介させて頂く事にします。

下記に本記事の構成を示します。
各自、不要と思う箇所は飛ばして読んで頂いて構いません。

[1. 入力/出力モードの特徴](https://qiita.com/motorcontrolman/private/19cd1f935b2addd79a43#1-%E5%85%A5%E5%8A%9B%E5%87%BA%E5%8A%9B%E3%83%A2%E3%83%BC%E3%83%89%E3%81%AE%E7%89%B9%E5%BE%B4)
[2. 使用方法](https://qiita.com/motorcontrolman/private/19cd1f935b2addd79a43#2-%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95)
[3. 活用事例-MBD開発環境の効率化-](https://qiita.com/motorcontrolman/private/19cd1f935b2addd79a43#3-%E6%B4%BB%E7%94%A8%E4%BA%8B%E4%BE%8B-mbd%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E3%81%AE%E5%8A%B9%E7%8E%87%E5%8C%96-)
[4. マニア必読　Arduino IOとの関係](https://qiita.com/motorcontrolman/private/19cd1f935b2addd79a43#4-%E3%83%9E%E3%83%8B%E3%82%A2%E5%BF%85%E8%AA%ADarduino-io%E3%81%A8%E3%81%AE%E9%96%A2%E4%BF%82)

なお、本記事はMATLAB2022bを前提として記載しています。
「入力/出力モード」自体は2022aでも使用可能とは思いますが、未確認のためご注意下さい。

# 1. 入力/出力モードの特徴
## 1.1 結論
複数あるMATLAB/Simulinkとarduino連携機能の対比表(2022年ver)を下記に示します。
中央が今回紹介する「入力/出力モード」ですが、ご覧の通り<b>MATLAB連携とエクスターナルモードの良いとこどりであり、弱点(×)が殆どない</b>という素晴らしい機能となっております。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302506/2d1376d0-a6bc-2f55-1142-56137289f5f6.png)


なぜこのような特徴を実現できているのか？　を下記にて解説します。
詳しいことはいいから使い方だけを知りたい！　という方は＊＊まで飛ばして下さい。


## 1.2 主従関係

Simulink連携(入力/出力モード)の主従関係は下記になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302506/843f085a-8019-82a0-1643-b1e2f8945f68.png)

PCが主である特徴はMATLAB連携と共通していますが、<b>プログラムを実行しているアプリケーションがSimulinkなのかMATLABなのか</b>の違いがあります。ある意味、これこそが「入力/出力モード」の一番大きい特徴と言えます。

これまでは、PCを主としてarduino連携させるための機能がMATLAB連携しかなく、PCを主として使いたい場合はMATLABコードを作成する必要がありましたが、「入力/出力モード」によってMATLABコードの作成ではなく、Simulinkモデルの作成によっても同等のことが出来るようになりました。

（なお、MATLAB連携、Simulink連携(エクスターナルモード)の主従関係については[2019のアドベントカレンダー記事](https://qiita.com/motorcontrolman/items/291955cbc3fb1c7e4d43)にて記載させて頂いたため今回説明を省略します）

## 1.3 arduinoのスタンドアロン化
MATLAB連携は×でしたが、「入力/出力モード」は△*になっています。
どういうことか少し詳しく説明します。

### (a)MATLAB連携の場合
MATLAB連携で作成したプログラムをマイコン単独で動作させようとした場合、Simulinkモデルに翻訳する必要がありました。できなくはないですが、正直手間ですよね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302506/9697b66a-ee5c-a048-22d4-801536224d94.png)



### (b)Simulink 入力/出力モードの場合
PCが主となるプログラムをSimulinkモデルとして作成しているため、マイコン単独で動作させたようとした場合は<b>入力/出力モードからエクスターナルモードに変更するだけでOK</b>です。MATLAB連携で必要だった翻訳作業が不要になっている点が素晴らしい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302506/f129fb33-d68f-34de-3ad3-1cc275652b66.png)

簡単な設定変更だけで可能なので、〇評価でも良いとは思いましたがエクスターナルモードを間借りしている点で△*評価としました。


## 1.4 実行までの待ち時間
MATLAB連携と同様、プログラムをPCで実行しているため待ち時間は非常に短くて済みます。ただし、下記に示す通り若干の違いはあります。

### (a)MATLAB連携の場合
インタプリタ言語のため、実行ボタンを押してすぐにプログラムが実行されます。

### (b)Simulink 入力/出力モードの場合
待ち時間に下記２つの種類があります。

①汎用プログラム書き込み時間
マイコンに対し入力/出力モードを初めて使用する場合、または何かしらの要因により１度書き込んだ汎用プログラムを消してしまった場合に発生する待ち時間で、時間としては１~２分程度となります。

②Simulinkモデルコンパイル時間
作成したSimulinkモデルをPC内にてコンパイルする待ち時間で、時間の長さはモデルの複雑さに応じてまちまちです。

一例として、下記に示すモデルで<b>7秒</b>を要しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302506/3a275c1d-4e00-1c72-aab3-6e2c334761c3.png)

### (c)Simulink エクスターナルモードの場合
Simulinkをコンパイルする時間に加え、コード生成にかかる時間、生成されたコードをコンパイル・ビルドする時間がかかります。
上記と同様のモデルにて<b>1~2分程度</b>を要しました。入力/出力モードであれば、初回以降は実行時間を大幅に短縮できる点が優れています。


## 1.5 設定の容易性
エクスターナルモードと同様、モデルにてハードウェアの設定が必要になります。
(MATLAB連携の場合、全てを自動検出するため設定自体が不要)
ただし、設定と言ってもarduinoのボード設定を行う程度なのでそれほど難しくないはず…ということで〇としておきました。
詳しい設定方法については[２章](https://qiita.com/motorcontrolman/private/19cd1f935b2addd79a43#2-%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95)を参照。

## 1.6 GUI
プログラムの実行をSimulinkで行うため、Scopeをそのまま使ったり[dashboad](https://jp.mathworks.com/help/simulink/ug/tune-and-visualize-your-model-with-dashboard-blocks.html)を使ったりすることでGUIが簡単に準備できます。

dashboad機能も、MATLABバージョンが上がる度に
芸人度に磨きがかかる
どんどん便利になっていくので、Arduino連携にてGUIとして使えるのは非常にありがたい事です。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ちなみに顔アイコンもあるので、これだけでMATLAB芸できそうです。 <a href="https://t.co/FhGRvXQixP">pic.twitter.com/FhGRvXQixP</a></p>&mdash; モータ制御マン (@motorcontrolman) <a href="https://twitter.com/motorcontrolman/status/1569336998611255296?ref_src=twsrc%5Etfw">September 12, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## その他注意事項
「適した用途」の「MATLAB関数でarduinoを動かす」を△*評価にしているのは、Simulink上にてMATLAB関数を使う場合は`coder.extrinsic`など<b>魔法の言葉</b>を駆使する必要があるからで、MATLAB連携においてMATLAB関数を使うことと比べるとそれなりにハードルがあるためです。

詳しくは下記のプレゼン資料を参照下さい。
[SimulinkとMATLABをつなぐ魔法の言葉](https://speakerdeck.com/motorcontrolman/magical-word-to-submit-matlab-to-simulink)


# 2. 使用方法
わざわざ説明するまでもないかもですが、念のため。

## 2.1 Simulink Support Packageのインストール
MATLABを起動、アドオンから追加を行います。

https://jp.mathworks.com/matlabcentral/fileexchange/40312-simulink-support-package-for-arduino-hardware

## 2.2 Simulinkを起動、対象ボードを選択
Simulinkを起動、メニューの「モデル化」欄からモデル設定をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302506/ec3ce328-5d60-96d6-509e-11c1b4d80c56.png)

「ハードウェア実行」を選択、ハードウェアボードにPCと接続しているArduinoの種類を設定します。
他設定はデフォルトでも動くはずですが、動かない場合はCOMポートの設定や通信速度の設定を見直してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302506/c98737e2-f70c-e0e8-8955-81a0419a66fe.png)

上記設定を行う事で、Simulinkのメニューに「ハードウェア」が追加されます。
ハードウェアボードはこちかから変更を行うことも可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302506/d1e0d11a-e522-f17f-7bd3-31d062bd6174.png)

## 2.3 入力/出力モードを選択
「ハードウェア」メニューの「モード」欄の▼をクリックすると、「接続されたIO(入力/出力モード)」が出てくるのでクリックして選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302506/65ddf30d-d5ed-4d11-3262-681eed3571a0.png)

## 2.4 実行
「IOを使って実行」をクリックすることでプログラムが実行されます。
このとき、終了時間をInfに設定しておくことでプログラムを実行し続けることが出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302506/ea5db962-766f-7e28-fa2e-5206edcfb4a5.png)

入力/出力モード自体の使用方法の説明は上記のみです。
ね、簡単でしょう？

# 3. 活用事例-MBD開発環境の効率化-
正直なところ、今回の記事で著者が最も読んでほしい(ドヤァしたい)のはこの章です。下記に入力/出力モードを活用したMBD開発プロセス概要を示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302506/4ab55112-57de-a0e8-8ff0-28512c05a8c5.png)



### MBD開発の題材
説明を分かり易くする目的で題材を具体的に設定します。
ユーザーとセンサとの距離が近い場合に、LEDが激しく点灯することでユーザーに伝達する製品を開発するものとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302506/0c79fb69-c6f8-9991-2611-c48787c2f2ad.png)

距離の検知は何を使っても良いですが、
著者の部屋に転がっている
感光センサを用いるものとします。

### ①制御ソフトの机上検討
何かしらの入力に応じてLEDの点灯周波数が変更される制御ソフトを作成するものとします。これには純粋にSimulinkモデルを用いて行います。

Dashboard機能を用いて面白おかしくやりましょう。
下記では超・便利機能である Dashboard Scope を使うことで、Simulink上にダイレクトに計測波形を表示させています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302506/7f21e862-bbc7-5abe-8b12-815c73eec7e0.png)


### ②ハードウェアの動作確認
②、③ではシミュレーションモードを入力/出力モードに変更しハードウェアと連携させた開発を行います。ここではまず、上記と同じモデルの一部を間借りしてセンサおよびLEDの動作確認を行います。

下記はセンサの動作確認をしている様子。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Simulink-Arduino連携(入力/出力モード)を用いた感光センサの動作確認。Simulinkを簡易オシロとして使えて便利なのだ。 <a href="https://t.co/SDpwrUpfJL">pic.twitter.com/SDpwrUpfJL</a></p>&mdash; モータ制御マン (@motorcontrolman) <a href="https://twitter.com/motorcontrolman/status/1597600926181003266?ref_src=twsrc%5Etfw">November 29, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

### ③制御ソフトとハードウェアの結合、およびパラメータ調整
①で作成した制御ソフトと②で動作確認したハードウェアを結合(連結)、その上で制御パラメータの微調整を行います。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">同じくSimulink-Arduino連携(入力/出力モード)を用いた制御パラメータ調整。Dashboardをフル活用。 <a href="https://t.co/svoaYi5SyD">pic.twitter.com/svoaYi5SyD</a></p>&mdash; モータ制御マン (@motorcontrolman) <a href="https://twitter.com/motorcontrolman/status/1597601516051128321?ref_src=twsrc%5Etfw">November 29, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

制御ソフト自体を修正したい場合は実行を一旦停止し、モデルに修正を加えます。
入力/出力モードの場合、Arduinoに汎用プログラムが書き込まれている状態であればモデル修正を行っても待ち時間は非常に短くて済みます。

パラメータ調整自体は、「ボード上で実行」モードの「監視と調整」でも同様のことは出来ますがこちらの待ち時間は停止→実行の度に１~２分発生するため、繰り返すと結構なストレスになります。これと比較すると、入力/出力モードは非常に快適です。

### ④制御ソフトのマイコン実装
シミュレーションモードを「ボード上で実行」に変更した上で、「ビルド・展開・起動」をクリックしてマイコン実装を行います。
<b>「監視と調整」は使う必要ありません</b>、ここ重要。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302506/5bedefbb-5444-b428-18f4-abe25aa10f02.png)

マイコン実装した結果は下記。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">パラメータ調整したSimulinkモデルをArduinoに実装。入力/出力モードからボード上で実行モードに変更しただけで、モデルは変更一切なし。マイコンリセットしてもプログラムは消えません。 <a href="https://t.co/0tIzvZQyQ7">pic.twitter.com/0tIzvZQyQ7</a></p>&mdash; モータ制御マン (@motorcontrolman) <a href="https://twitter.com/motorcontrolman/status/1597603111941509120?ref_src=twsrc%5Etfw">November 29, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

「入力/出力モード」の活用によって、上記一連の開発プロセスを非常にスムーズに進めることが出来ます。


# 4. マニア必読　Arduino IOとの関係
MATLAB/Simulink連携マニアの方であれば既にお気づきと思いますが、この「入力/出力モード」は要するところ、2013年に
サ終
サポート停止され、その後も一部の愛好家の間にて使用されていた<b>Arduio IOの進化版</b>であると著者は考えています。

Arduino IOについては下記を参照。
[Matlab/SimulinkとArduino連携の隠しメニュー「Arduino IO」](https://qiita.com/motorcontrolman/items/bd962021be8c5fdcc48b)

著者個人としては、入力/出力モードの登場によってArduino IOを使う必要はほとんど無くなったものと考えています。なぜかというと、下記の対比表にて説明できます。(入力/出力モードの記載内容は1章に示したものと同じです)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302506/d63a4120-d863-4196-1cd0-848e972c8593.png)

今更Arduino IOを使おうという人はほぼいないとは思いますが、念のため理由を説明。

### Arduinoのスタンドアロン化
入力/出力モードだと設定変更だけで済みましたがArduino IOからスタンドアロンに持っていく場合はマイコン入出力ブロックをArduino IO用から通常のSimulink連携用のブロックに置き換える必要があり手間を要します。

### 設定の容易性
入力/出力モードだとCOMポートは自動検出してくれましたが、Arduino IOは手動設定が必要です。本記事では説明を省略していますが、ペーシングオプションも入力/出力モードは特に指定なければ実時間で実行してくれています(のはず)。Arduino IOは手動でチェックを入れる必要があったものと思います。

### モデルベース開発への適用性
Arduinoのスタンドアロン化が出来ないので、PCから切り離してマイコン単独で動作させることが出来ません。



# おわりに
MATLAB/Simulink-Arduino連携ですが、高機能化されすぎていて初めて使う人からするとどこから手を付けたらよいか？　が分かりにくくなっているように思えます。

著者としては、初学者こそぜひ「入力/出力モード」を使ってみて頂きたいと考えています。というか、マイコンのレジスタ叩いたりと通好みの事をしない限りは「入力/出力モード」でだいたい事足りると思いますので、まずはこいつを使い倒してみましょう。