LoginSignup
28
19

Simulink と Arduino Mega で『制御工学』を学ぶ、はじめの一歩

Last updated at Posted at 2023-12-22

1. はじめに

 電子工作好きの方々は Arduino を動かすのに Sketch とかを利用しているんでしょうね.でも

image.png

のお勉強で Arduino を動かすのであれば,日頃から使い慣れた Simulink を利用したいですよね!

 本記事では,Simulink Support Package for Arduino Hardware(以下,Simulink Support Package と略記)を利用して Arduino Mega 2560 R3(以下,Arduino Mega と略記)でエンコーダ付きの DC モータの角度制御を行う方法について説明します.

 I2C 通信が必要な 6 軸センサ MPU6050 の利用方法についても説明する!って思っていたのですが,間に合いませんでした.接続方法は記述しており,書く気でいたんですが... 後日,機会があれば...

 なお,今回もグダグダの記述になってしまいましたが,ご容赦ください.

 Simulink モデルは GitHub で公開しています(R2023b ~ R2021b 用).

2. Simulink Support Package for Arduino Hardware

2.1 インストール

 今回使用するのは,

  • MATLAB
  • Simulink
  • Control System Toolbox

および無償で提供されている

  • Simulink Support Package for Arduino Hardware

です.執筆時点の最新バージョン R2023b で説明しますが,R2021b 以降のバージョンなら問題ないかと思います.

 Simulink Support Package for Arduino Hardware のインストール手順については,たとえば,Qiita の記事

の 3 章を参照してください.

2.2 ライブラリに含まれるブロック群

 私のパソコンにはいくつかの MATLAB のバージョンがインストールされていますが,最も古いバージョンは R2015aSP1 です(Windows11 では挙動が…ですが).R2015aSP1

で提供されているブロック群は

image.png

とわずかでした.それに対し,本記事の執筆時点での最新バージョンである R2023b では随分とブロックの数が増えました!

image.png

2.3 動作確認:Simulink モデルの設定

 まずは MATLAB を起動してください(今回は R2023b を使用しています).私のパソコンには,

  • MATLAB Support Package for Arduino Hardware
  • Simulink Support Package for Arduino Hardware

がインストールされています(MATLAB Support Package for Arduino Hardware はインストールされていなくても良いです).そして,Arduino Mega を USB ケーブルでパソコンと接続すると,MATLAB コマンドウィンドウに以下のメッセージが表示されます.

Arduino Mega を接続したときのメッセージ
 >> 
Arduino Mega 2560 detected.
This device is ready for use with MATLAB Support Package for Arduino Hardware. Get started with examples and other documentation.
This device is ready for use with Simulink Support Package for Arduino Hardware. Get started with examples and other documentation.

Arduino Mega 互換ボードはこのメッセージが表示されなかったり(自動認識されなかったり),使用できなかったりすることがあるので,お高いですが,まずは,純正ボードを使用することをお勧めします

 それでは,配布する Simulink モデル "$\tt sample\verb+_+mega.slx$" を利用して,Simulink Support Package for Arduino Hardware の動作確認をしましょう.

image.png
Simulink モデル "$\tt sample\verb+_+mega.slx$"

この Simulink モデルは,コンフィギュレーションパラメータが以下のように設定されています(Simulink モデルの空白部分を右クリックすると,コンフィギュレーションパラメータが表示されます).

コンフィギュレーションパラメータの設定

image.png

image.png

image.png

image.png

Simulink モデル "$\tt sample\verb+_+mega.slx$" のタグを「ハードウェア」にして「監視と調整」をクリックすると,実行が開始されますので,Simulink ブロック "$\tt Scope$" により信号を観測してみてください.環境が整っていれば,10 秒周期のデューティ比 10% の ON/OFF 信号がリアルタイムで観測されるはずです.実験の様子は,以下の動画で確認してください.

3. とりあえず,接続!

3.1 部品

 今回は,MinSeg 社MinSegShield M2V5 を模擬することを目指して,環境を整えます.

 使用した部品は以下のとおりです.

image.png

型番 メーカー 購入先 価格
マイコンボード Arduino Mega 2560 R3 Arduino https://jp.rs-online.com/web/p/arduino/7154084 7,035 円
モータドライバ
(はんだ付けオプション)
DRV8833 - https://electronicwork.shop/items/633fb0a5f3de5c361ebadc45 150 円
(+500 円)
6 軸センサ
(はんだ付けオプション)
MPU6050 (GY-521) - https://electronicwork.shop/items/6262bf96be482f6d864f08c9 360 円
(+500 円)
ミニブレッドボード BB-601 - https://akizukidenshi.com/catalog/g/gP-05158/ 150 円
基板用端子台
(2.54mm ピッチ 1 列 3 極)
790-1092 RS PRO https://jp.rs-online.com/web/p/pcb-terminal-blocks/7901092 144 円
プロトタイプ開発用シールド DFR0131 DFRobot https://www.digikey.jp/ja/products/detail/dfrobot/DFR0131/6588456 2,049 円
エンコーダ付ギヤード DC モータ
(減速比 50:1,エンコーダ分解能 7PPR)
FIT0482 DFRobot https://www.digikey.jp/ja/products/detail/dfrobot/FIT0482/7087159 1,883 円
AC アダプタ
(9V/1.3A,内径 2.1mm,外径 5.5mm,センタープラス)
SSCI-017954 スイッチサイエンス https://www.switch-science.com/products/1795 1,463円

これらに加えて,適当なブレッドボード用のジャンパ線も使用しています(下の接続例ではジャンパワイヤを使用しました).

image.png

3.2 Arduino Mega とエンコーダ,DC モータの接続

 接続の説明は後述しますので,まずは,接続図を示します.

3.2.1 シールドを利用する場合

 2 個のエンコーダ付ギヤード DC モータを使用する場合の接続例を以下に示します.

image.png

3.2.2 シールドを利用しない場合

 プロトタイプ開発用シールドを使用しない場合は,以下のように接続してください.

image.png

3.3 Arduino Mega と 6 軸センサの接続

 6 軸センサの接続例を以下に示します.

image.png

4. Arduino Mega とエンコーダ

4.1 接続例

 R2021a までは,Simulink Support Package for Arduino Hardware ではエンコーダのカウント数を取得する Simulink ブロックが提供されていませんでした.そのため,上記の Qiita の記事の 4 章で説明したように,MinSeg.com さんが提供している無償の Simulink ライブラリ

をインストールし,それに含まれているエンコーダ入力の Simulink ブロックを利用していました.

 一方で,Simulink Support Package においても,R2021b から各種の Arduino や ESP32 で利用可能な Simulink ブロック "$\tt Encoder$"

image.png

が追加されました.Simulink ブロック "$\tt Encoder$" では,インクリメンタル型のエンコーダのカウント数を,4 逓倍(ていばい)で取得することができます.

今回使用するエンコーダは DC モータの後部に取り付けられており,エンコーダの分解能が 7PPR,モータのギヤ比が 50:1 なので,モータ軸が 1 回転すると,

\begin{align}
   7 \times 4 \times 50 = \mbox{1,400}\ {\rm [カウント/回転]}
\end{align}

が得られます.

 Arduino Mega + Simulink Support Package で使用できるエンコーダ入力のピンは

  • $\tt 2$, $\tt 3$, $\tt 18$, $\tt 19$, $\tt 20$, $\tt 21$ 番ピン

ですので,A, B 信号を合計で 6 本,入力できます.たとえば,以下のように Arduino Mega とエンコーダを接続し,Simulink ブロック "$\tt Encoder$" のパラメータを設定します.

image.png
エンコーダの接続例 1($\tt 2$, $\tt 3$ 番ピンを使用)
image.png
エンコーダの接続例 2($\tt 18$, $\tt 19$ 番ピンを使用)
image.png
エンコーダの接続例 3($\tt 20$, $\tt 21$ 番ピンを使用)

Arduino Mega + Simulink Support Package では,3 個のエンコーダを同時に使用可能です.

5.3 接続例」(エンコーダ付き DC モータ,モータドライバとの接続)では,エンコーダの接続用

  • $\tt 2$, $\tt 3$ 番ピン
  • $\tt 18$, $\tt 19$ 番ピン

を使用しています.

4.2 Simulink モデルの実行例

4.2.1 カウント数を確認!

 Simulink モデル "$\tt sample\verb+_+encoder1.slx$" を実行すると,Simulink ブロック "$\tt Display$" にカウント数が 4 逓倍で表示されます.

image.png
Simulink モデル "$\tt sample\verb+_+encoder1.slx$"

先に説明したように,使用するギヤード DC モータは,モータ軸が 1 回転すると,

\begin{align}
   7 \times 4 \times 50 = \mbox{1,400}\ {\rm [カウント/回転]}
\end{align}

が得られるはずです.Simulink モデル "$\tt sample\verb+_+encoder1.slx$" を実行すると,

のようになり,モータ軸を正面にして,モータ軸を回転させると,

  • 時計回りに 1 回転させると $-1,400$ カウント
  • 反時計回りに 1 回転させると $+1,400$ カウント

となることが確認できます.

4.2.2 エンコーダから出力される信号の型や配列を確認!

 Simulink モデル "$\tt sample\verb+_+encoder2.slx$" を作成します.

image.png
Simulink モデル "$\tt sample\verb+_+encoder2.slx$"

Simulink モデル "$\tt sample\verb+_+encoder2.slx$" は 10 秒間で実行が終了するように設定されているので,実行が開始してから 10 秒以内に手でエンコーダの軸を適当に回転させてください.

image.png

その結果,Simulink ブロック "$\tt Scope$" では上図のように,リアルタイムで $\tt double\verb+_+data$ がグラフに表示されます.そして,

Simulink モデル "$\tt sample\verb+_+encoder2.slx$" の実行結果の保存
>> save('encoder_data.mat', 'raw_data', 'reshape_data', 'double_data')

と入力すると,ワークスペースにある取得されたデータ

  • $\tt raw\verb+_+data$
  • $\tt reshape\verb+_+data$
  • $\tt double\verb+_+data$

が $\tt encoder\verb+_+data.mat$ という名前の mat ファイルで保存されます.それでは,これらデータを順番に確認してみましょう.

 まず,コマンドウィンドウで以下のように入力し,関数 $\tt class$ によりデータの型を確認します.

Simulink モデル "$\tt sample\verb+_+encoder2.slx$" の実行結果の確認
>> class(raw_data)
ans =
    'int32'
>> class(reshape_data)
ans =
    'int32'
>> class(double_data)
ans =
    'double'

これより,Simulink ブロック "$\tt Encoder$" からは $\tt int32$ 型(32 ビット符号付き整数)のカウント数が出力されていることが確認できます.Simulink モデルのなかで数値積分や数値微分を行うためには,データを $\tt double$ 型に変換する必要があります(いわゆる,キャスト).そこで,配布する Simulink モデル "$\tt sample\verb+_+encoder2.slx$" では,Simulink ブロック "$\tt Data\ Type\ Conversion$" を利用して,$\tt double$ 型に変換しています.

 つぎに,Simulink ブロック "$\tt Reshape$" の役割について説明します.コマンドウィンドウで以下のように入力し,関数 $\tt size$ によりデータのサイズを確認してみましょう.

Simulink モデル "$\tt sample\verb+_+encoder2.slx$" の実行結果の確認
>> size(raw_data)
ans =
           1           1        2001
>> size(reshape_data)
ans =
        2001           1
>> size(double_data)
ans =
        2001           1

これより,Simulink ブロック "$\tt Encoder$" からは $1 \times 1 \times 2001$ の 3 次元配列としてデータが出力されていることがわかります(2001 なのは,サンプリング周期 0.005 秒で 10 秒間,実行したからです).通常,スカラのデータは 1 次元配列で取り扱いますので,Simulink ブロック "$\tt Reshape$" を利用して 3 次元配列を 1 次元配列に変換しているのです.つまり,

  • $\tt raw\verb+_+data$:$\tt int32$ 型の $1 \times 1 \times 2001$ の 3 次元配列
  • $\tt reshape\verb+_+data$:$\tt int32$ 型の $2001 \times 1$ の 1 次元配列
  • $\tt double\verb+_+data$:$\tt double$ 型の $2001 \times 1$ の 1 次元配列

となっています.

 最後に,以下のように入力して,501 番目から 505 番目までのデータを確認します.

Simulink モデル "$\tt sample\verb+_+encoder2.slx$" の実行結果の確認
>> raw_data(501:505)
  1×1×5  int32 配列
ans(:,:,1) =
   -334
ans(:,:,2) =
   -336
ans(:,:,3) =
   -338
ans(:,:,4) =
   -340
ans(:,:,5) =
   -342
>> reshape_data(501:505)
ans =
  5×1  int32 列ベクトル
   -334
   -336
   -338
   -340
   -342
>> double_data(501:505)
ans =
  -334
  -336
  -338
  -340
  -342

 以上のように,Simulink ブロック "$\tt Encoder$" を利用してエンコーダのカウント数を取得した場合,Simulink ブロック "$\tt Reshape$" および "$\tt Data\ Type\ Conversion$" を利用して,データを変換するようにしましょう.

4.2.3 カウント数から角度を算出!

 Simulink モデル "$\tt sample\verb+_+encoder1.slx$" の実行結果からわかるように,使用しているモータ軸を時計回りに 1 回転させると,$- 1,400$ カウントとなりました $(7 \times 4 \times 50 = 1,400)$.時計回りを正にしたいので,極性を変更する必要があります.また,モータ角を制御したいのであれば,エンコーダのカウント数 ${\tt cnt}$ を角度 ${\tt ang}$ (rad) に変換する必要があります.そこで,Simulink ブロック "${\tt Gain}$" を利用して,

\begin{align}
  &{\tt ang} = {\tt Gain2} \times {\tt Gain1} \times {\tt cnt}
  \\
  &\quad
  {\tt Gain1} = \dfrac{2\pi}{7 \times 4 \times 50},\ 
  {\tt Gain2} = -1
\end{align}

という演算を行います.MATLAB/Simulink では,円周率 $\pi$ は $\tt pi$ であることに注意してください.このことを考慮して,Simulink モデル "$\tt sample\verb+_+encoder3.slx$" を作成します.

image.png
Simulink モデル "$\tt sample\verb+_+encoder3.slx$"

Simulink モデル "$\tt sample\verb+_+encoder3.slx$" を実行すると,

  • 時計回りに 1 回転させると $+360\ {\rm [deg]}\ (= +2\pi\ {\rm [rad]})$
  • 反時計回りに 1 回転させると $-360\ {\rm [deg]}\ (= -2\pi\ {\rm [rad]})$

となることが確認できます.

5. Arduino Mega とモータドライバ,DC モータ

5.1 モータドライバ

5.1.1 動作モード

 今回使用するモータドライバは,

image.png

です.DRV8833 は 2 個の DC モータを動作させることができます.以下では,モータドライバの入力ピン $\tt IN1$, $\tt IN2$ と出力ピン $\tt OUT1$, $\tt OUT2$ を使用するとして説明していますが,入力ピン $\tt IN3$, $\tt IN4$ と出力ピン $\tt OUT3$, $\tt OUT4$ を使用する場合も同様です.

 モータドライバの入力ピン $\tt IN1$, $\tt IN2$ に $\tt H$, $\tt L$ のいずれかを与えるかによって,DC モータは

image.png

のように動作します.

5.1.2 正転と逆転

 正転,逆転は以下のように動作させます.

モータドライバに $\tt IN1 = H$$\tt IN2 = L$ を加えると,モータドライバの出力は $\tt OUT1 = H$, $\tt OUT2 = L$ となり,DC モータには ${\tt M+ = VCC}\ [\rm V]$, $\tt M- = 0\ [\rm V]$ が加わります.その結果,DC モータは一定の角速度で正方向に回転(正転)します.

image.png

モータドライバに $\tt IN1 = L$$\tt IN2 = H$ を加えると,モータドライバの出力は $\tt OUT1 = L$, $\tt OUT2 = H$ となり,DC モータには ${\tt M+ = 0}\ [\rm V]$, $\tt M- = VCC\ [\rm V]$ が加わります.その結果,DC モータは一定の角速度で逆方向に回転(逆転)します.

image.png

しかし,「駆動(正転・逆転)」の動作だけでは,回転速度を思うように変化させることができません.そこで,「駆動」「惰性」「ブレーキ」の動作を組み合わせます.以下では,「駆動」「ブレーキ」を組み合わせた方法について簡単に説明します.

5.1.3 正転/ブレーキの切り替え

 「ブレーキ」では,切り替わる前の動作を維持しようとします(回生ブレーキ).そのため,「正転」から「ブレーキ」に切り替えると,じわっと減速します.また,「ブレーキ」から「正転」に切り替えると,再び,力強く回転します.この「ブレーキ」「正転」の切り替えの割合(デューティ比)を設定し,短時間(サンプリング周期 $h$)で切り替えを行うことにより,回転速度を変化させることができます.

image.png

 具体的には,以下に示すように,$\tt IN1 = H$ としたまま,サンプリング周期 $h$ の間,設定したデュ―ティ比$\tt IN2 = L$正転)と $\tt IN2 = H$ブレーキ)を切り替えます.つまり,

  • $\tt IN2$ のデュ―ティ比が 0% に近いほど高速で正転する
  • $\tt IN2$ のデュ―ティ比が 100% に近いほど低速で正転する

ことになります.

image.png

 以上をまとめると,$\tt IN1 = H$ としたまま,周期 $h$ ごとにデュ―ティ比が設定された PWM (Pulse Width Modulation:パルス幅変調) 信号$\tt IN2$ に加えると,正転の回転速度を変化させることができます.

5.1.4 逆転/ブレーキの切り替え

 同様に,逆転の回転速度を変化させることができます.

image.png

 具体的には,以下に示すように,$\tt IN2 = H$ としたまま,サンプリング周期 $h$ の間,設定したデュ―ティ比$\tt IN1 = L$逆転)と $\tt IN1 = H$ブレーキ)を切り替えます.つまり,

  • $\tt IN1$ のデュ―ティ比が 0% に近いほど高速で逆転する
  • $\tt IN1$ のデュ―ティ比が 100% に近いほど低速で逆転する

ことになります.

image.png

 以上をまとめると,$\tt IN2 = H$ としたまま,周期 $h$ ごとにデュ―ティ比が設定された PWM 信号$\tt IN1$ に加えると,逆転の回転速度を変化させることができます.

5.2 Arduino Mega の PWM 出力ピン

 このように,DC モータの回転速度を変化させるためには,モータドライバ DRV8833 の入力ピン $\tt IN1$, $\tt IN2$(あるいは入力ピン $\tt IN3$, $\tt IN4$)に PWM 信号を加える必要があります.つまり, Arduino Mega の PWM 出力ピンとモータドライバ DRV8833 の入力ピンを接続します.

 Simulink Support Package では,PWM 出力を行うための Simulink ブロックとして,"$\tt PWM$"

image.png

が提供されています.ここで,以下のことに注意してください.

Simulink ブロック "$\tt PWM$" に入力する値は出力したい PWM 信号のデューティ比です.デューティ比 (0~100%) は整数値(0~255)で指定しますので,たとえば,デューティ比を 20% としたいのであれば ${\tt 51}\ (= {\tt 255} \times 0.2)$ を,デューティ比を 80% としたいのであれば ${\tt 204}\ (= {\tt 255} \times 0.8)$ を入力します.

Simulink ブロック "$\tt PWM$" に入力できるデータの型は $\tt uint8$ 型(符号なし 8 ビット整数型)です.そのため,Simulink ブロック "$\tt Data\ Type\ Conversion$" により $\tt uint8$ 型に変換した後,Simulink ブロック "$\tt PWM$" に入力する必要があります.

 Arduino Mega では $\tt 2$〜$\tt 13$ 番ピンと $\tt 44$〜$\tt 46$ 番ピンを PWM 出力用のピンとして使用できます.とみっくすさんのブログ

に詳しく書かれています.簡単にまとめると,下表のようになります.

タイマー ピン
Timer0 (8bit timer) $\tt 4$, $\tt 13$
Timer1 (16bit timer) $\tt 11$, $\tt 12$
Timer2 (8bit timer) $\tt 9$, $\tt 10$
Timer3 (16bit timer) $\tt 2$, $\tt 3$, $\tt 5$
Timer4 (16bit timer) $\tt 6$, $\tt 7$, $\tt 8$
Timer5 (16bit timer) $\tt 44$, $\tt 45$, $\tt 46$

 なお,Arduino Mega の PWM 出力として割当可能な $\tt 2$〜$\tt 13$ 番ピンと $\tt 44$〜$\tt 46$ 番ピンについて,以下のことに注意してください.

タイマーカウンタと同期して PWM 信号を生成しているので,同一のタイマーに接続されているピンを利用するようにしましょう.

Simulink ブロック "$\tt Encoder$" では,エンコーダ入力として $\tt 2$, $\tt 3$ 番ピンを使用します.そのため,$\tt 2$, $\tt 3$ 番ピンを PWM 出力用に割り当てないようにしましょう.

5.3 接続例

 たとえば,以下のように Arduino Mega とモータドライバ DRV8833 および DC モータを接続し,Simulink ブロック "$\tt PWM$" のパラメータを設定します.

image.png
モータドライバ,DC モータの接続例 1($\tt 6$, $\tt 7$ ピンを使用)
image.png
モータドライバ,DC モータの接続例 2($\tt 9$, $\tt 10$ ピンを使用)

3.2 Arduino Mega とエンコーダ,DC モータの接続」では,DC モータの接続用(PWM 出力用)

  • $\tt 6$, $\tt 7$ 番ピン
  • $\tt 9$, $\tt 10$ 番ピン

を使用しています.

5.4 Simulink モデルの実行例

5.4.1 正転/ブレーキの切り替えを行う!

 「5.1.3 正転/ブレーキの切り替え」で説明した動作を実現する Simulink モデル "$\tt sample\verb+_+motor1.slx$" は以下のようになります.

image.png
Simulink モデル "$\tt sample\verb+_+motor1.slx$"

Simulink モデル "$\tt sample\verb+_+motor1.slx$" を「監視と調整」で実行すると,"$\tt PWM\ (IN2)$" ($\tt 7$ 番ピン)"$\tt PWM\ (IN4)$" ($\tt 10$ 番ピン) への入力が小さな値 ($\tt 51$) なので,低速で正転します.そして,"$\tt Manual\ Switch$" をダブルクリックすると,入力が大きな値 ($\tt 204$) に切り替わるので,高速で正転することが確認できます.

5.4.2 逆転/ブレーキの切り替えを行う!

 「5.1.4 逆転/ブレーキの切り替え」で説明した動作を実現する Simulink モデル "$\tt sample\verb+_+motor2.slx$" は以下のようになります.

image.png
Simulink モデル "$\tt sample\verb+_+motor2.slx$"

Simulink モデル "$\tt sample\verb+_+motor2.slx$" を「監視と調整」で実行すると,"$\tt PWM\ (IN1)$" ($\tt 6$ 番ピン)"$\tt PWM\ (IN3)$" ($\tt 9$ 番ピン) への入力が小さな値 ($\tt 51$) なので,低速で逆転します.そして,"$\tt Manual\ Switch$" をダブルクリックすると,入力が大きな値 ($\tt 204$) に切り替わるので,高速で逆転することが確認できます.

5.4.3 正負の指令電圧により回転方向と速さを切り替える!

 以下のように,正負の指令電圧(整数値)を与えて,正転と逆転を切り替えた方が使いやすいです.

image.png

 この例の上図では,指令電圧として正の値 $\tt 51$ を与えています.その結果,

  • "$\tt PWM\ (IN1)$" ($\tt 6$ 番ピン) への入力が $\tt 255$
  • "$\tt PWM\ (IN2)$" ($\tt 7$ 番ピン) への入力が $\tt 204$

なので,低速で正転します.

 一方,この例の下図では,指令電圧として負の値 $\tt -51$ を与えています.その結果,

  • "$\tt PWM\ (IN1)$" ($\tt 6$ 番ピン) への入力が $\tt 204$
  • "$\tt PWM\ (IN2)$" ($\tt 7$ 番ピン) への入力が $\tt 255$

なので,低速で反転します.

 そこで,以下に示す Simulink モデル "$\tt sample\verb+_+motor3.slx$" を「監視と調整」で実行してみます.

image.png
Simulink モデル "$\tt sample\verb+_+motor3.slx$"

実行後,マウスでダイヤルを回転させることにより,回転速度や回転の方向を変化させることが確認できます.

5.4.4 モータ角の比例制御を行ってみる!

 最後に,モータ角の P 制御を行ってみましょう.

image.png
モータ角の P 制御

 制御出力であるモータ角 $y$ は,「4.2.3 カウント数から角度を算出!」で説明したように,カウント数から角度を算出することができます.

 一方で,「5.4.3 正負の指令電圧により回転方向と速さを切り替える!」で説明したように,指令電圧を正負の整数値(デューティ比)として与えることで,モータの回転方向と速さを切り替えることができました.ここではさらに,以下のことを行います.

  • 9V/1.3A の AC アダプタを使用していることを考慮し,便宜的に,電圧値 ($-9\ {\rm [V]} \sim +9\ {\rm [V]}$) を $-255 \sim +255$ の整数値に割り当てることにします.

  • モータに正の指令電圧を加えると,反時計回りに回転することが確認できたので,時計回りが正になるように極性を変更します.

以上の操作を行うため,そのために,Simulink ブロック "${\tt Gain}$" を利用して,

\begin{align}
  &{\tt u\mbox{_}int} = {\tt Gain2} \times {\tt Gain1} \times {\tt u}
  \\
  &\quad
  {\tt Gain1} = \dfrac{255}{9},\ 
  {\tt Gain2} = -1
\end{align}

という演算を行います.

image.png
Simulink モデル "$\tt sample\mbox{_}motor\mbox{_}encoder\mbox{_}pcont\mbox{_}dual.slx$"

 AC アダプタを接続しない場合は,DC モータには USB ケーブルを介して電力が供給されますので,弱々しく動きます.

 一方で,AC アダプタを接続した場合は,DC モータには AC アダプタから電力が供給されますので,力強く動きます.

6. おわりに

 昨年末に続き,今年もなんとか 2 編,投稿できて良かったです!(2 編目は予定のところまでは完成しませんでしたが…)

 機会を与えていただき,ありがとうございました,モータ制御マン (@motorcontrolman) さん!

 今にして思えば,コロナ禍での様々なストレスの気晴らしで始めたネット上での技術的な配信ですが,今後も,こそーっと,この趣味を続けていければと思う次第です.

(おしまい)

付録 A Arduino Uno の場合はどうなの?

 各種の Arduino(もしくは ESP32)+ Simulink Support Package で使用できるピンは

image.png

により

image.png

のように確認できます.たとえば,以下のようになります.

Arduino Uno + Simulink Support Package で使用できるエンコーダ入力のピンは $\tt 2$, $\tt 3$ 番ピンのみですので,1 個のエンコーダをのみが使用可能です.

付録 B Rensselaer Arduino Support Package Library (RASPLib) との違い

 Simulink Support PackageRensselaer Arduino Support Package Library (RASPLib) の利用するピンの違いについて少し説明します.RASPLibMinSeg.com さんの製品を使用することを前提として Simulink ブロックが提供されています.

 エンコーダ信号を取得するためのピンは以下のとおりです.

Simulink Support Package RASPLib / M2V5 Library RASPLib / MinSegMega Library RASPLib / M2V3 Library
$\tt 2$, $\tt 3$ $\tt Encoder0:$ $\tt 2$, $\tt 3$
$\tt 18$, $\tt 19$ $\tt Encoder1:$ $\tt 18$, $\tt 19$ $\tt Encoder1:$ $\tt 18$, $\tt 19$
$\tt 20$, $\tt 21$
$\tt Encoder2:$ $\tt 6$, $\tt 7$
$\tt Encoder3:$ $\tt 15$, $\tt 62(A8)$
$\tt Encoder4:$ $\tt 11$, $\tt 12$

 また,PWM 出力をするための(モータドライバに入力するための)ピンは以下のとおりです.

タイマ Simulink Support Package RASPLib / M2V5 Library RASPLib / MinSegMega Library
Timer0 (8bit timer) $\tt 4$, $\tt 13$
Timer1 (16bit timer) $\tt 11$, $\tt 12$
Timer2 (8bit timer) $\tt 9$, $\tt 10$ $\tt 9$, $\tt 10$
Timer3 (16bit timer) $\tt 2$, $\tt 3$, $\tt 5$
Timer4 (16bit timer) $\tt 6$, $\tt 7$, $\tt 8$ $\tt 6$, $\tt 7$
Timer5 (16bit timer) $\tt 44$, $\tt 45$, $\tt 46$ $\tt 44$, $\tt 45$

PWM 出力については,以下の点に注意してください.

  • RASPLib では,モータドライバに入力するための Simulink ブロックが提供されています.これは,基本的に,「5.4.3 正負の指令電圧により回転方向と速さを切り替える!」で説明した Simulink モデルをマスク化したものです.
28
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
28
19