この記事について
Simulinkにはサポートパッケージなるものがあって、"Arduino"や"Raspberry Pi"などの代表的な基板をサポートしています。よくある誤解で"Raspberry PiにSimulinkをインストールするの?"というのがありますが、そうではありません。SimulinkモデルからC/C++コードを生成して、Raspberry Pi上でビルトしてスタンドアローンで動作します。開発環境としてSimulinkがあるのであって、Raspberry Piにデプロイした後はSimulinkはいらない、というわけです。しかもRaspberry PiやArduino向けサポートパッケージに関しては、この実行ファイル生成が無償で利用できて大変お得!(Simulinkは必要)
というわけで、今回はまず手始めに"Lチカ"から初めますが、せっかくのRaspberry PiなのでゆくゆくはホームLEDに発展させたいと思います。
ソフトウエア
・MATLAB/Simulink
・Simulink Support Package for Raspberry Pi Hardware(アドオン、無償)
Simulink Support Package for Raspberry Pi Hardwareのインストールは、MATLABバージョンR2023a以降大きな変更がありました。R2023aより前はMathworksからRaspbian OSイメージが提供されていましたが、R2023a以降は通常のRaspbianをセットアップして、そこにSimulinkと接続したりハードウエア周りのライブラリを追加でインストールする構成に変更されています。
まず普通にRaspbianをインストール。既にbulleseye対応のRaspbianをインストール済みの場合は次の項は飛ばしてください。
Raspberry Piのセットアップ
RaspbianのイメージファイルをダウンロードしてSDカードに起動ディスクを作成しますが、このあたりは多数記事があるので割愛します。今回はbullseye対応の64bit版をインストールしました(32bit版も可)。
https://www.raspberrypi.com/software/operating-systems/#raspberry-pi-os-64-bit
インストール後、Raspberry Piを起動して、コンソールから
$ ip a
でipアドレスを調べておいて(eth0やwlan0)、ホスト(Simulink開発PC)とEtherやWLANで接続できることをpingコマンド等で確認します。
SSH開通
サポートパッケージではssh経由でRaspberry Piを遠隔操作するので、Raspberry Pi側でsshを起動しておきます。
$ sudo service ssh start
開発中、サポートパッケージで接続する際はsshを起動しておく必要があります。Raspberry Pi起動の度に毎回sshを起動させるのは面倒なので、
$ sudo raspi-config
で 3 Interfacing Options を選択し、次の画面でI2 SSHをEnableにしておくとよいでしょう。
サポートパッケージの準備
MATLAB-ホーム-アドオンより以下をダウンロード
"Simulink Support Package for Raspberry Pi Hardware"
続いて”ハードウエアセットアップ”に沿って現れるGUIに従って以下を順に実行します。
(Simulinkとの接続に必要ないくつかのライブラリをRaspberry Piにインストールします)
1.先に調べたRaspberry PiのIPアドレスとユーザー名/パスワードを入力
"Test connection"を実行してMATLABからsshアクセスが可能なことを確認
2.ライブラリのインストール状況を調査 ”Verify Installation”をクリック
続いて必要に応じて以下をインストールします。今回のLチカには不要ですが、今後エッジAIや画像処理関連のアルゴリズムを実装するならGUIの案内に沿ってインストールしておきましょう。
- ARM Compute Library
- OpenCV Library
ハードウエア
・Raspberry Pi本体 各種ラズパイ基板に対応していますが今回は4B+を使用
・ジャンパ、LED(抵抗)、スイッチ LEDは抵抗で電流制限してもよいですが、今回は電流制限素子入りのもので楽をしました
https://akizukidenshi.com/catalog/g/gI-17578/
今後調光や色変更させたいので、3色のLEDを使用します。ちなみに上記のLEDは、3色RGBが一つのLEDに内蔵されていて、3色の明るさを変えることによって自由に色と明度を設定できます。ゆくゆく試していきますが、今回はこのうちRだけを使用します。電流制限素子が内蔵されているので、抵抗も不要です。
またスイッチは、下の回路図で2系統用意していますが、今回は1系統のみ使用します。
SW入力 gpio 23 とLED(R)出力 gpio 17 をラズパイのI/Oポートに結線します。
Simulinkモデル
新規にSimulinkモデルを作成する際、用途に応じたテンプレートを利用できます。
MATLAB - ホーム メニュー右端の"Simulink"ボタンを押すと
以下のようなテンプレートが開くので、"Simulink Support Package for Raspberry Pi Hardware"から用途に応じて空のモデルを作成します。今回はエクスターナルモード(後述)を選択します。
すると空のモデルができますが、テンプレートのおかげで基本的な設定は完了しています。
このモデルのメニューから"ライブラリブラウザ"を開くと、Raspberry Piに関連するブロックを選択できます。
今回は入出力ともにON/OFFの2値なので、gpioですね。さらにSimulinkではシミュレーション用の仮の入力を発生させることができて、gpioなどのハードウエア入力の代わりに使用することができます。今回は"Lチカ"だけなので、シミュレーションで機能確認する必要もなさそうですが、仮の入力として"push botttun"ブロックを配置すると、実機のスイッチを押したのと同じ入力を得ることができます。またその結果をscope画面で確認できます。
シミュレーション用の仮の入力と、結果確認用のScopeを含んだモデルは以下のようになります。
上半分がシミュレーション用、下半分が実機動作用です。もちろん下半分だけで"Lチカ"は実施可能です。一方、このモデルからコード生成する際、実機動作に関係のないシミュレーション入力が邪魔になるのでは?との懸念があるかもしれませんが、シミュレーション入出力はコード生成の際、自動的に無視されます。
GPIO入出力ブロックをクリックすると、接続したピン番号を指定できます。スイッチとLEDを接続したピン番号を指定します。
シミュレーション
"Lチカ"では全くありがたみはありませんが、Simulinkの "シミュレーション"タブの"実行"ボタンを押すとシミュレーションを開始します。ボタンを押すと、Scopeでの波形観察が変化する様子が確認できます。
この際、シミュレーションが一瞬で終わらないよう、終了時間を'=inf'(無限)、シミュレーションペーシングを'=1'(実世界と同じペース)に設定しておきましょう
エクスターナルモード
エクスターナルモードはシミュレーションと実機実装のいいとこどりです。コード生成してターゲット(Raspberry Pi)上で動作しつつも、ターゲットでのハードウエア入力をはじめ、内部変数をモニタできる特殊なモードです。
"ハードウエア"タブの"ハードウエア ボード"タブで、ターゲットとしてRaspberry Piを指定します。また、"ハードウエア設定"のボタンから"コンフィギュレーションパラメーター"を開きます。
"ハードウエア実行"の"Target hardware resources"の中の"Edit"ボタンを押して、
Raspberry PiのIPアドレス、ユーザー名、パスワードを設定します。
以上の設定が終了すると、Raspberry Piと接続できます。"ハードウエア"タブの"監視と調整"ボタンでエクスターナルモードを開始できます。このモードでは実機入力を使いながら、シミュレーション入力やデバッグ用のモニタ機能も活用できます。シミュレーション用のボタンを押すと、LEDが光ります。また、ハードウエアのスイッチ入力の様子をscope画面から確認できます。デバッグやパラメータ調整に非常に便利です。
なお、エクスターナルモード時に生成 & Raspberry Pi上で実行されるコードは、内部の情報を取得してSimulinnkからモニターするために、デプロイ時に最終的に生成されるコードよりも冗長な部分を含みます。若干実効レートも遅くなりますが、Lチカ程度であれば遅延を感じることはないでしょう。
実機実装
エクスターナルモードでデバッグやパラメータ調整が終わったら、"ハードウエア"タブの"ビルド、展開、起動"ボタンで、アルゴリズムをRaspberry Pi上にデプロイします。Raspberry Pi上に実行ファイルが生成され、実行します。デプロイ後は、Simulinkと切り離して、スタンドアローンで動作します。
なお、生成された実行ファイルを、Raspberry Pi起動時に自動的に実行するには、"コンフィギュレーションパラメーター"で"Run on boot"にチェックを入れます。
もちろん一般的に行われるように、Linuxのcrontabコマンド等で実行ファイルを呼びだして、起動時や一定時間間隔で実行させることも可能です。
参考記事
こちらの記事で"Simulink+Arduino+Lチカ"について、
またこちらの記事では"MATLAB+Raspberry Pi+Lチカ"について分かりやすく解説されています。
本記事はそれぞれ、"Arduino"を"Raspberry Pi"に、あるいは"MATLAB"を"Simulink"に置き換えただけで大きな違いはありません。