MENU

ArduinoとMATLAB/Simulinkを連携させてDCモータを速度制御してみる

最近MATLAB/Simulinkを使って制御実験をしたいなと思っていたのでいろいろ調べて試してみました。

 

やってみたかったこととして, 

MATLAB/SimulinkMCU(MPU)を連携する。

・入手性の高い部品を使用する。

・"簡易"なプラントで“平易"な制御ロジックを組む (複雑なプラント, 制御は今回はスルー)

 

基本的なDCモータのフィードバック制御をしようと思います。

 

 <モータのモデリングと制御>

DCモータの速度制御系は、モータの入力電圧から出力の回転速度までの伝達関数が1次遅れ系と呼ばれる基本的な伝達関数になっていて, 制御の基本であると言われています。ふと"思う"ところがあったので, モータのモデリングについては次回以降にて説明しするとして, 今回はフィードバック制御が働いている, ことを確認するまでにします。ここでは, モータの回転数と出力電圧が比例するものとします。

 

<使用するマイコンボードについて>

f:id:Manao55:20190906001131j:plainhttps://ja.wikipedia.org/wiki/Arduino

Arduino Uno ... 手持ちにあったマイコンボード。価格も3000円ほどで入手しやすいと思います。初心者でも比較的簡単にプログラムやプロトタイプのシステムを作れるようになっていて, 電子工作の流行を作ったヒット製品だと思います。慣れている方はキャッシュのミスヒットなどが気になるかもしれませんが, 導入の容易さをメインに置いていますですので, MCU自体の純粋な性能は今回は追求しません。半導体メーカ各社の他マイコンでも可かと思います。

 

<MATLAB/Simulinkについて>

 大学や産業界で普及が進むようになりました。米国のMathWorks社が開発している数値解析ソフトウェアであり, その中で使うプログラミング言語の名称でもあります。従来は制御系設計・解析ツールとしての使われてきたと認識していますが, 近頃では無線通信や機械学習などのAIのツールボックスも追加されてきていますので, IoTやAI機器の開発・設計が容易になることを期待しています。

 

 Arduinoとの連携ですが, Legacy MATLAB and Simulink Support for Arduino(旧ArduinoIO)を用いてホストPCからUSBケーブルを通じてArduinoを入出力デバイスとして使っていきます。

 

 <Legacy MATLAB and Simulink Support for Arduino (ArduinoIO) と各種設定>

以下のページからダウンロードできます。

https://jp.mathworks.com/matlabcentral/fileexchange/32374-legacy-matlab-and-simulink-support-for-arduino

ArduinoIOを解凍し, フォルダごと インストールしたArduinoフォルダの中に移します。

MATLABを起動し, install_arduinoを実行します。

f:id:Manao55:20190912220657j:plain

私はすでに実行してしまったので警告が出ていますが, 上のようなメッセージが出れば設定OKです。以下のようなライブラリが追加されました。

f:id:Manao55:20190912221343j:plain

Arduino側での設定ですが, ArduinoIOフォルダに含まれる専用スケッチ, adioesをArduinoに実行します。

f:id:Manao55:20190912221844j:plain

これで設定は終了です。

 

(余談:他MCU / MPUとの例 Embedded Coderを含みます。)

・TI

 C2000 ⇔ C2000 Support from Embedded Coder 

Renesas Electronics

 RL78, RX, RH850 ⇔ Embedded Target for Renesas CS+

・STMicroelectronics

    STM32 ⇔ STM32-MAT/TARGET

 

 他にもいろいろとあると思います。お好きなように。

 

<回路図>

f:id:Manao55:20190912224018j:plain

 

・FA-130RA (マブチモータより)

f:id:Manao55:20190912230441j:plain

・2SK3234 (Renesas Electronicsより)

f:id:Manao55:20190912225632j:plain

アナログ出力D3から出力されたPWM波形でFETスイッチングをし、モータを駆動します。カップリングされたDCモータを速度検出用の回転計として用います。直流モータは回転数と電圧が比例関係にあるため、回転計用モータ出力電圧をRCローパスフィルタを介してアナログ入力A0に入力します。モータに並列接続された0.1 uFのセラミックコンデンサは, モータのノイズを除去するためのものです。モータに逆並列に接続されたダイオードは, 電流が遮断してしまった際にモータの逆起電力による過電圧の発生を防ぐために用いられます。

<装置外観>

f:id:Manao55:20190912231402j:plain

 

<フィードバック制御>

フィードバック制御は, 下図に示す通り, 出力をセンサなどで観測し, それを指令値と比較してその偏差に応じて制御器によって制御入力を決めるという動作を連続的もしくは離散的に行うことで実現します。偏差から制御入力を決める部分は補償器または制御器と呼ばれ, 制御設計のキモとなります。今回はDCモータの速度を制御します。DCモータは回転数と出力電圧が比例するので(低速では静止摩擦力の影響が無視することができませんが), DCモータの出力電圧をフィードバック制御することで, DCモータの回転速度の制御を実現します。 

f:id:Manao55:20190911235433j:plain

 まず, シンプルな制御であるP制御(Propotional)を試してみます。P制御は制御器に定数(比例ゲイン)を設定した制御です。このとき制御入力 u(t) は以下の式になります。

f:id:Manao55:20190913193946j:plain

Simulinkで以下のようなブロック線図を作ります。

f:id:Manao55:20190912231917j:plain

指令値入力として1⇔1.5Vのパルス波形を設定しました。比例制御器に比例ゲイン 8 [V/A] を設定しました。(DCモータのモデリング, ステップ応答によるパラメータ同定は次回以降に書きます)

制御プラントのモータはサブシステム化しています。

f:id:Manao55:20190912233111j:plain

サブシステムの中身です。モータの出力電圧をA0ピンの10ビットadcで読み取って, Gain3で0~5 Vに変換します。FETのゲート電圧への入力は, 0~5 V の制御入力に8ビットpwmでA3のpwm出力で抵抗を介してゲートを叩いてもらいます。それでは実験に移りましょう。

<実験結果 - P制御>

f:id:Manao55:20190912235523j:plain

上の図で, 黄線が指令値で青線がモータの出力電圧になります。下の図の黄線は制御入力を示しています。指令値と出力に一定の偏差が見られました。これを定常偏差といいます。比例ゲインが小さいほど, 差を補正しようとする量は小さいので定常偏差は大きくなります。では, 補正量を増やすために比例ゲインを5倍の40 [V/A] にしてみました。

f:id:Manao55:20190913000100j:plain

 入力と出力の偏差は改善が見られたものの、出力電圧が振動的に応答するようになってしまいました。もっとゲインを大きくすると, 振動が止まらなくなってしまうかもしれません。出力の振動が発散しシステムを不安定な系といいます(間違ってたらごめんなさい)

 

<PI制御>

P制御では定常偏差が発生してしまいます。

もし仮に偏差が0になるとしたら, 0に比例ゲインをかけた0を制御入力とするので, 今回はゲートに0 Vを印加することになり, そもそもモータは回転しないことになります。モータが一定回転するには電圧が必要なのです。

したがってP制御では定常偏差が0になりません。

 そこで 偏差を時間で積分して蓄積するというI制御が登場します。

I制御では, 偏差の積分積分ゲインをかけたものを制御入力とします。

このとき制御入力 u(t) は以下の式になります。

 f:id:Manao55:20190913194729j:plain

現時刻で偏差が0でも, 過去時刻で偏差を積分して蓄積した量は残っていて, それに積分ゲインをかけた出力は0とは限りません。積分ゲインがモータが安定して動作するようにゲートに電圧が印加される設計がなされれば, 振動もせず偏差も0で動作する状況にすることができます。
Simulink上でブロック線図を作ってみました。

f:id:Manao55:20190913014425j:plain

P制御で実験した比例ゲイン 8 [V/A] に, 積分ゲイン16[V/A]を設定して実験してみました。

 

f:id:Manao55:20190913195809j:plain

I制御を加えたPI制御では, 定常偏差を生じることなく, 出力が指令値に応答することが確認できました。"いい感じ"に制御できています。

<風景>

<感想>

 マイコンボードとMATLAB/Simulinkをつなげて, 設計しながら(今回はしていませんが)制御するところまで体験できてよかったです。

 PI制御について, この時私はたまたま比例ゲインがこれくらいだから積分ゲインがこれくらいで”いい感じ”に動いてくれるかな、のような感性と経験に従ったPIDおじさんチューニングが一発でうまく動いてしまい、モデルベース設計やマイコンによるデジタル制御(離散化に伴うデジタル再設計)といったあるべき数学的アプローチに基づいた設計とは異なるので恥ずかしくなったうえに不思議な気持ちになってしまいました。(”いい感じ”という不論理極まりない文言)ふと思うのですが, 制御という言葉が「制し御する」「”思った”通りに対象を動かす」意味合いがあるように、どうしても制御する人のその時の心理状態や感情が乗るような気がしてならないのです。(本当は頭の中の演算結果なのでしょうけど)情報系プログラマのかたは, 論理に依存する言動の傾向があり、制御系プログラマの中では各々の想いや感情が激しく発露するかたも見受けられて、ある種の傾向があるのか、これもまた気になっている事象でもあります。なにかあるといいですね。どなたか調査お願いします。

 次機会がありましたら, DCモータのモデリングやパラメータ同定, 極配置といった制御工学の理論に基づいた”正しい”アプローチで制御したよと書けたらいいなと思います。

 

<参考文献>

ArduinoMATLABで制御系設計をはじめよう! , TechShare株式会社

本当に参考になりました。というかこの本に沿ったらできました。いつもお世話になっています。ありがとうございます。

・制御基礎理論, コロナ社

初めて買った制御の本です。お世話になっております。

・2SK3234 データシート

パワーMOSFETの復習します。