【Simulink】Simulink Support Package for Raspberry PiでSunFounderを動かす(1)

# はじめに
[Simulink Support Package for Raspberry Pi Hardware](https://jp.mathworks.com/matlabcentral/fileexchange/40313-simulink-support-package-for-raspberry-pi-hardware "Simulink Support Package for Raspberry Pi Hardware")を使用すると、Simulinkを実行しているコンピューターとRaspberry Piとの通信を簡単に行うことができます。
例えば、Raspberry Piボード上のGPIOやI2CをSimuinkから制御することが可能です。
本記事では、[Simulink Support Package for Raspberry Pi Hardware](https://jp.mathworks.com/matlabcentral/fileexchange/40313-simulink-support-package-for-raspberry-pi-hardware "Simulink Support Package for Raspberry Pi Hardware")を使用して、Simulinkからロボットカー学習キットの[SunFounder](https://www.sunfounder.com/products/smart-video-car "SunFounder")(Smart Video Car Kit V2.0 for Raspberry Pi)を動かしてみた例について紹介します。
Qiita記事「[MATLAB Support Package for Raspberry PiでSunFounderを動かす](https://qiita.com/nrykot/items/243359681d0b9fa7d86f "MATLAB Support Package for Raspberry PiでSunFounderを動かす")」のSimulink版です。
分量が多いので、以下に示すように複数記事に分割して説明していきます。
1. Simulinkモデル構造と実行制御部の説明
1. [初期化処理サブシステムの説明](https://qiita.com/nrykot/items/ae3c6dd8b08b3e1a1938)
1. [周期処理（ステアリング制御、前後進制御）サブシステムの説明](https://qiita.com/nrykot/items/b3c0d140564043c91ae3)
1. [ラズペリーパイへの展開](https://qiita.com/nrykot/items/8f1569fe1235f261b60e)

本記事では、「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](https://jp.mathworks.com/matlabcentral/fileexchange/40313-simulink-support-package-for-raspberry-pi-hardware "Simulink Support Package for Raspberry Pi Hardware") ver.21.1.4
* Board: Raspberry Pi 3B (MathWorks Raspbian Image([mathworks_raspbian_R21.1.0](https://github.com/mathworks/Raspbian_OS_Setup/releases/tag/R21.1.0 "mathworks_raspbian_R21.1.0")))
* Network Settings: Connect to wireless network
* Controlled Car: [SunFounder](https://www.sunfounder.com/products/smart-video-car "") (Smart Video Car Kit V2.0 for Raspberry Pi)

# Simulinkモデル構造の説明
本記事では、「[MATLAB Support Package for Raspberry PiでSunFounderを動かす](https://qiita.com/nrykot/items/243359681d0b9fa7d86f "MATLAB Support Package for Raspberry PiでSunFounderを動かす")」のSimulink版を作成しますが、次のような構造に分けて作成します。
1. 下記2、3の実行制御部
2. I2C接続のPWM/サーボドライバーPCA9685の初期設定部
3. 操舵と前後進制御の周期駆動部

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1400007/ed5a3482-025b-f66c-fe7b-b11bbcbb8282.png)

# 初期化と周期駆動の実行制御部
初期化と周期駆動の実行制御部のモデルを以下に示します。
初期化処理をInitialize Functionブロックに実装する方法もあると思いますが、本記事では、Switch Caseブロックを使用して、初期化と周期駆動のサブシステムの実行を選択するようにしています。
![MainScheduler.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1400007/334467d0-2e6f-b6ac-9e44-71f6f3652a7e.png)

## 初期化の実行制御
初期化の実行を制御するサブシステム内を以下に示します。
Function-Call Generatorブロックで、PCA9685の初期設定をするサブシステムの実行イベントを出力します。
また、初期化処理を実行した次のステップ以降、Switch Caseブロックで周期駆動のサブシステムを選択できるように、次状態（Case条件）を設定しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1400007/dffca923-78a9-14b4-f0d8-3bf960d7e477.png)

## 周期駆動の実行制御
周期駆動の実行を制御するサブシステム内を以下に示します。
Function-Call Generatorブロックで、操舵と前後進制御の周期駆動をするサブシステムの実行イベントを出力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1400007/57e2d47b-dc7e-0657-33d1-c20ca4a38698.png)

## 実行制御用の列挙型
Switch CaseブロックのCase条件は、以下のような列挙型定義ファイルで設定しています。
```matlab:enumMainScheduler.m
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
```

[次の記事](https://qiita.com/nrykot/items/ae3c6dd8b08b3e1a1938 "次の記事")に続きます。