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

# はじめに
Simulink Support Package for Raspberry PiでSunFounderを動かす(1)の続き記事です。
[前の記事](https://qiita.com/nrykot/items/ece75417703b90ae2b4c "Simulink Support Package for Raspberry PiでSunFounderを動かす(1)")では、Simulinkモデルの構造と実行制御部の説明をしました。
本記事では、初期化処理サブシステムについて説明します。
開発環境と想定読者については、[前の記事](https://qiita.com/nrykot/items/ece75417703b90ae2b4c "Simulink Support Package for Raspberry PiでSunFounderを動かす(1)")をご確認ください。

# PCA9685の初期化処理サブシステム
PCA9685の初期化を行うサブシステムを下図に示します。
各種レジスタ設定と待機処理をFunction-Call Subsystemで実行するようにモデリングしています。
「[MATLAB Support Package for Raspberry PiでSunFounderを動かす](https://qiita.com/nrykot/items/243359681d0b9fa7d86f "MATLAB Support Package for Raspberry PiでSunFounderを動かす")」の記事で書いたMATLABプログラムと同等の処理をSimulinkでモデリングしています。
それぞれのFunction-Call Subsystemの内容について、順番に説明していきます。
![Initialize_Subsystem.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1400007/e274c020-8ddb-040c-9c4b-52418b49d618.png)

## ALL_LED_ON/OFFレジスタ設定
以下の4つのレジスタを順番に設定するため、本例ではFunction-Call Generatorブロックの反復回数を4に設定して、それぞれのレジスタを設定するFunction-Call Subsystemを実行しています。
* ALL_LED_ON_L_REG
* ALL_LED_ON_H_REG
* ALL_LED_OFF_L_REG
* ALL_LED_OFF_H_REG
![ClearAllLED_Subsystem.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1400007/1108162e-6bb7-6789-be44-f1a9cf58d36c.png)

レジスタを設定するFunction-Call Subsystem内では、Simulink Support Package for Raspberry Pi Hardwareの[I2C Master Writeブロック](https://jp.mathworks.com/help/releases/R2021a/supportpkg/raspberrypi/ref/i2cmasterwrite.html "I2C Master Writeブロック")を使用し、I2C通信でPCA9685のレジスタを設定するようにしています。
![setRegister_ALL_LED_ON_L_REG.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1400007/e62ca673-3cb3-c587-00a8-6a589133da26.png)

I2C Master Writeブロックのパラメーター設定例を示します。
![I2C_Master_Write_ALL_LED_ON_L_REG.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1400007/ee9d5071-219b-8e04-6ffe-e6e50340a1ec.png)

レジスタアドレスの値は、モデルワークスペースにMATLAB変数として定義しています。
![ModelWorkspace.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1400007/7bf2901b-0a5e-64e3-b948-52276bcb731d.png)

## MODE1とMODE2レジスタの設定
MODE1とMODE2のレジスタを設定するFunction-Call Subsystem内を以下に示します。
I2C通信で送信するデータ（OUTDRV、ALLCALL）は、モデルワークスペースに定義しています。
![ResetMode1Mode2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1400007/8321d679-f013-910c-d2c1-5b398bc32ed3.png)

## 500ms待機処理
レジスタ設定を確定させるための待機処理を下図のようにモデリングしています。
時刻取得には、ROS Toolboxの[Current Timeブロック](https://jp.mathworks.com/help/releases/R2021a/ros/ref/currenttime.html "Current Timeブロック")を使用しています。
本記事内では行いませんが、ホストPCとRaspberry PiをROSネットワークに接続して、ホストPCからRaspberry Piを制御することも考えていたため、ROS Toolboxを使用しています。
![WaitForSetting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1400007/3af67067-b826-b59c-d531-6bed6457ebd4.png)

![WhileIteratorSubsystem_500ms_Wait.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1400007/94ee012c-2858-e5b2-9620-160d56463931.png)

## Sleepモード設定
Sleepモードのレジスタを設定するFunction-Call Subsystemを以下に示します。
Mode1レジスタの値を[I2C Master Readブロック](https://jp.mathworks.com/help/releases/R2021a/supportpkg/raspberrypi/ref/i2cmasterread.html "I2C Master Readブロック")で読み取り、ビット演算をした後、MODE1レジスタを更新しています。
![SetSleepMode.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1400007/ba6f3303-7c01-7995-8aec-e5b228a822a4.png)

I2C Master Readブロックの設定を示します。
![I2C_Master_Read_BlockParameter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1400007/ff360094-8c4f-bedc-2d61-479ba992d28a.png)

## プレスケール値の書き込み
プレスケールの設定部を以下に示します。
![WritePreScale.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1400007/81d0fce0-97bc-95f6-752a-456c572e370f.png)

## Sleepモード解除
Sleepモード解除部を以下に示します。
![SleepModeOff.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1400007/daf2f87c-0e1a-ccac-59b1-96500f3a8137.png)

## リスタート
リスタート部を以下に示します。
MATLAB変数RESTARTは、モデルワークスペースに定義しています。
![Restart.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1400007/88031772-1abb-9a6f-005a-8f3d752c8804.png)

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

# 参考
1. [SunFounder_PiCar-V](https://github.com/sunfounder/SunFounder_PiCar-V "SunFounder_PiCar-V")
1. [SunFounder_PCA9685](https://github.com/sunfounder/SunFounder_PCA9685 "SunFounder_PCA9685")
1. [TB6612 DC Motor Driver Module](http://wiki.sunfounder.cc/index.php?title=TB6612_DC_Motor_Driver_Module "TB6612 DC Motor Driver Module")