はじめに
Simulink Support Package for Raspberry Pi Hardwareを使用すると、Simulinkを実行しているコンピューターとRaspberry Piとの通信を簡単に行うことができます。
例えば、Raspberry Piボード上のGPIOやI2CをSimuinkから制御することが可能です。
本記事では、Simulink Support Package for Raspberry Pi Hardwareを使用して、Simulinkからロボットカー学習キットのSunFounder(Smart Video Car Kit V2.0 for Raspberry Pi)を動かしてみた例について紹介します。
Qiita記事「MATLAB Support Package for Raspberry PiでSunFounderを動かす」のSimulink版です。
分量が多いので、以下に示すように複数記事に分割して説明していきます。
- Simulinkモデル構造と実行制御部の説明
- 初期化処理サブシステムの説明
- 周期処理(ステアリング制御、前後進制御)サブシステムの説明
- ラズペリーパイへの展開
本記事では、「1. Simulinkモデル構造」について説明します。
想定読者
Simulink初級者から中級者レベルで、Simulink Support Package for Raspberry Pi Hardware の使用に興味のある方を想定しています。
開発環境
- OS: Windows 10
- MATLAB: R2021a Update 5
- Simulink
- ROS Toolbox
- Simulink Support Package for Raspberry Pi Hardware ver.21.1.4
- Board: Raspberry Pi 3B (MathWorks Raspbian Image(mathworks_raspbian_R21.1.0))
- Network Settings: Connect to wireless network
- Controlled Car: SunFounder (Smart Video Car Kit V2.0 for Raspberry Pi)
Simulinkモデル構造の説明
本記事では、「MATLAB Support Package for Raspberry PiでSunFounderを動かす」のSimulink版を作成しますが、次のような構造に分けて作成します。
- 下記2、3の実行制御部
- I2C接続のPWM/サーボドライバーPCA9685の初期設定部
- 操舵と前後進制御の周期駆動部
初期化と周期駆動の実行制御部
初期化と周期駆動の実行制御部のモデルを以下に示します。
初期化処理をInitialize Functionブロックに実装する方法もあると思いますが、本記事では、Switch Caseブロックを使用して、初期化と周期駆動のサブシステムの実行を選択するようにしています。
初期化の実行制御
初期化の実行を制御するサブシステム内を以下に示します。
Function-Call Generatorブロックで、PCA9685の初期設定をするサブシステムの実行イベントを出力します。
また、初期化処理を実行した次のステップ以降、Switch Caseブロックで周期駆動のサブシステムを選択できるように、次状態(Case条件)を設定しています。
周期駆動の実行制御
周期駆動の実行を制御するサブシステム内を以下に示します。
Function-Call Generatorブロックで、操舵と前後進制御の周期駆動をするサブシステムの実行イベントを出力します。
実行制御用の列挙型
Switch CaseブロックのCase条件は、以下のような列挙型定義ファイルで設定しています。
classdef enumMainScheduler < Simulink.IntEnumType
enumeration
Initialize(1),
PeriodicTask(2)
end
methods (Static)
function defaultValue = getDefaultValue()
defaultValue = enumMainScheduler.Initialize;
end
function dScope = getDataScope()
dScope = 'Auto';
end
function desc = getDescription()
desc = 'SunFounder動作確認用Simulinkモデルのスケジューラーで使用する名前';
end
function fileName = getHeaderFile()
fileName = '';
end
function flag = addClassNameToEnumNames()
flag = true;
end
end
end
次の記事に続きます。