モータコントローラ用通信アプリを作成してみました
イントロダクション
こんにちは技術部のk’zです。入社して半年経過しました。未経験分野でしたモータについてはまだまだ勉強中です。
高校や大学で学んだ知識以上の事が多々あり、技術の習得に邁進しています。毎日のラジオ体操(第一・第二)も身体が覚えてきました。真面目にすれば、ラジオ体操の消費カロリーは12~18キロカロリーになるそうです。冬の敵、持病の腰痛にも効果がでています。(最近は動かした方が良いとテレビで観た記憶が有ります)。以前働いたことがある工場では、朝と昼の2回もラジオ体操をするところもありました。体を動かしリフレッシュすることで作業ミスが減るそうです。
私は現在、主にモータのフレーム図面作成や特性試験、耐久試験を行っております。CAD図面作成や特性曲線の作成、モータの分解・組立てにも慣れてきました。
喜ばしい事に、以前に従事していたソフトウエアの作業をさせていただける事になりました。
今回は私が主に担当しているシリアル通信 ~ モータコントローラ用通信アプリ(社内試験・評価用)についてご紹介します。
モータコントローラ
弊社の主力となりつつ有るIPM((Interior Permanent Magnet))モータですが、モータを制御する為のモータコントローラが必要です。コントローラには、モータを運転させる為の制御装置や素子、回路を含むモータドライバ部と直流から交流に変換する電源装置であるインバータを含みます。またモータを制御する為に、高機能なマイクロコンピュータ(マイコン)が内蔵されています。
弊社のコントローラには当然、各種インターフェイスやシリアル通信機能が内蔵されていますが、専用品が中心なので今まではユーザーがPCで設定を変更するためのアプリケーションは提供していませんでした。
最近そのようなニーズが増えてきた事と社内の試験・評価用途とで、モータの勉強を兼ねてアプリ開発をチャレンジすることができました。
今回は第一ステップとして、ハードウェアで行える制御をPCアプリに置き換えてより分かりやすくする事を目指しました。
そこでマイコンに内蔵されているシリアル通信機能のUartを使って、PCアプリとコントローラ間で通信を行いました。
前回のブログで紹介がありました、新規に追加したCAN通信もシリアル通信の一つです。こちらはお客様の要望を形にしたものです。
具体的には、現在モータを操作するのにコントローラ本体に有るボタンやボリュームスイッチなどで、手動で行っています。そこでPCアプリ(通信ソフト)を使用してコマンドを送信し、モータコントローラに指令を送って操作しようということです。
モータの電源をON/OFFしたり、回転方向を変更したり、回転速度を変えたりしてみました。また、コントローラに接続される電流・電圧・温度センサーの値をPCアプリ上で確認してみました。
シリアル通信について
先ずは、シリアル通信について調べてみました。
シリアル通信は1~2本の細いケーブルを使用して機器を接続し、0又は1のデジタル信号を1ビットずつ順番に送信・受信する通信方法です。 よく比較としてパラレル通信という言葉を耳にしますが、パラレル(parallel)は並列という意味で、複数本のケーブルで同時に通信を行う方法です。現在の主流は?シリアル通信の様です。技術革新のおかげで1~2本のシリアル通信でも十分速度が速くなりました。昔は9600bpsの速度でも高速だと言っていたような気がします。シリアル通信はケーブルの本数が少ないのがメリットだと思います。
8bitのデータを8本のケーブルで1回で送るイメージ図
私のシリアル通信のイメージは、RS-232Cという規格が思い浮かびます。懐かしいです。
昔の古いPCにDSUB 9ピンポート( 実際はEIA-574(9ピン)らしいです。 )が付いていて、それにRS-232C用のケーブルを接続してシリアル通信を行うのが主流な?時代が有ったと思います。
シリアル通信で使用していた9ピンの端子
今ではお馴染みのUSB(Universal Serial Bus)の時代ですが、RS-232Cもまだ健在の様です。
PCではUSBの通信が一般的ですが、マイコン側は SIO, SPI, I2C, Uart そして前回のブログで紹介が有りました CANの通信方式が有ります。私も前回Raspberry PiのLinux上でcan-utilsを使ってコントローラの通信相手としてCAN通信を勉強させて頂きました。
CANではたった2本のケーブルで通信が可能で、しかも複数台接続ができノイズに強いのが特徴でした。しかもノードを簡単に追加したり外したりできる。CANは自動車でよく使われています。
今回はUartの通信方式を試してみました。USB変換ケーブルの利用でPCのUSBポートとマイコンのUart機能が有る端子を簡単につなぐことができます。
同期(通信タイミング)
相互に通信を行うには同期を取る必要があります。お互いの合図、タイミングみたいなものです。シリアル通信の同期方式はクロック同期と調歩同期が有ります。クロック同期の場合はクロック送信用の配線が必要となり接続本数が増えてしまいます。調歩同期の場合は、送信データの先頭にスタートビット:0、データの最後にストップビット:1をセットするだけで同期がとれます。
通信方式
全二重通信を行います。データのやり取りに2本の線を使います、一つは送信用、もう一つは受信用です。相手が送信している間でも自分が送信することが可能です。一方、1本の線で送受信できる半二重通信という通信方法があります。この場合、線が1本なのでお互いに送信する順番や手順を決める必要があります。同時に送信してしまうと、データがぶつかり合って、受け取れなくなってしまいます。そのため、交互に通信する必要がでてきます。マイコンを使った制御ではたいてい全二重通信が多いと思います。
シリアル通信のデータをスタートビットとストップビットで挟んだ調歩同期図
通信仕様(設定)
・スタート、ストップビットをそれぞれ1bit固定(2bitに設定も可能です)
・データ長は8bit固定(データ部は上図の0~7bit目までの1Byteづつ送信します。)
・パリティビット無し(データの整合性をチェックする方法)
パリティを有効にするとデータの整合性が増しますが、ストップビットの手前に1bitのパリティビットを付けるので、毎回の1回の送信サイズが1bit分増えてしまいます。
・フロー制御無し
ハードウエアハンドシェイクなど送信リクエストを送り合う方法はここでは使用しません。送信・受信以外の別の信号線を取り付けて、今から信号を送りますよと相手に知らせてから、送信・受信を行うものです。
・通信速度(ビットレート):57600bps
代表的なビットレートは、9600bps/19200bps/38400bps/115200bpsだそうです。
マイコン側のクロック周波数の速さとの兼ね合いも含めて最適な通信速度を選びます。今回は57600bspを設定してみました。今ではなんと10Mbpsでも設定可能なコントローラやマイコンが有るようです。
通信エラーに関して
Uartにはパリティチェックエラー、オーバーランエラー、フレーミングエラー などエラーを認識する機能が盛り込まれています。
上述の通り、パリティチェックは未使用です。
パリティには偶数パリティと奇数パリティが有ります。偶数パリティは8bitデータの内 “1” の個数が偶数の場合にパリティビットを1、奇数の時0とします。奇数パリティは、“1”の個数が奇数個の場合パリティビットを1に、偶数の時に0とします。データの最後にパリティビットを1bitだけのせて送信します。
受信側も送られてきた8bitデータの内の“1”の個数からパリティを計算し、データの最後に付与されて送られてきたパリティビットと照合し、マッチしていれば正しいデータとして受け取ります。
オーバーランエラーは、前のデータが処理される前に、次のデータを取り込んでしまい、前の受信データが失われた場合に発生します。
フレーミングエラーは、先ほど説明しました調歩同期に出てくるストップビットに関するエラーで、ストップビットを検出できなかった場合に発生します。
過去にこられのエラーの試験を行ったことが有ります。通信をタイミングよく遮断して無理やりエラーを起こして、Uartモジュールが正しくエラーを吐き出すか波形を見てテストしたことを思いだしました。オーバーランエラーはさすがに無理でしたけど・・・。
おまけ(シリアル変換モジュールについて)
今回、USBシリアル変換モジュールというものを使いました。このモジュールを使用することで、PC側からUSBケーブルを伝ってマイコンのUartシリアル通信が可能になります。USBの信号をUart用の信号に変換してくれます。PC側には変換モジュール専用のUSBドライバをインストールする必要が有ります。PCのUSBドライバには仮想COM(Virtual COM Port)という技術が使われています。
最初はブレッドボードを使ってマイコンとこの変換モジュールを接続して、通信テストしました。PC側はUSBType-Aで、反対側が上図のUSB microB端子になります。モジュールには沢山端子が在りますが、使用するのは5V出力端子(マイコンの電源用)とグランド(GND)と送信端子(TXD)、受信端子(RXD)の4本になります。他の端子は、先ほど述べましたハードウエアによるフロー制御とかに使用します。
現在は、このUSB変換モジュールがコネクタ内に埋め込まれたものまであります。
実機であるコントローラには、モジュール内蔵ケーブルを使用しました。
通信アプリの紹介
PCアプリ側をマスター(指令側)、コントローラ側をスレーブ(指令を受ける側)として、PCアプリのプログラムと、コントローラ側のマイコンのプログラムを作成しました。
マイコン側はレジスタの設定や制御プログラムを書いたりデバッグしたりと結構作業ボリュームが多く大変でした。
操作方法
1.通信接続
PCのUSBポートのCOM番号を選択します。プルダウンでCOM番号が表示されるので、コントローラ通信用のCOM番号を選択し接続ボタン(connect)を押すと通信が可能となります。
切断ボタンも用意しました。接続ボタンを押すと、コントローラの初期設定値を自動で読み込むようにしました。
コントローラの電源状態、現在設定されている回転方向、速度指令値、立ち上がり速度指令値の初期値や設定されているゲインなどです。
2.ソフトウエアバージョン
コントローラのソフトウェアバージョンを確認できるボタン(check)を付けました。
バージョン管理ができれば、いつ作成されたプログラムで、どのような機能が入っているのかがわかります。
3.電源ボタンと回転方向
回転方向と電源ボタンは一つのグループにしました。ラジオボタンのチェックで回転方向(CW・CCW)を選択できます。
電源ボタン(power ON)を押すとボタンが赤く変わり、表示部分がOFFからONに変わります。
4.回転速度と立ち上がり(下がり)速度設定
回転速度を設定するボタン(speed)と立ち上がり/下がり速度を調整するボタン(accel)を設置しました。
これらの2つのパラメータを指定して「SET」ボタンを押すとモータは回転します。
立ち上がり速度の設定加減に沿って目標値である回転速度まで徐々に回転数が増加します。accelの設定値を0にすれば、瞬時に回転数が立ち上がります。
speedとaccelの設定はスライドバーまたはプルダウンボックスで行います。
モータを止めずに回転させたまま回転速度を変更させる為に、「連続速度調整機能」である速度のボリュームスイッチ代わり(speed ctr スライドバー)を設置しました。
コントローラの仕様にも寄りますがボリュームスイッチ付の場合、ボリュームを回すことで回転速度を調整できます。このボリュームを再現する為に、スライドバーで連続で調整できるようにしました(上述の毎回SETを押す必要が無い)。スライドバーを右に持っていくと回転速度が上がります。
5.連続モニタリング
IPMモータに内蔵されるセンサで、実際のローターの回転速度(rotor speed)を確認することができます。
このロータの回転速度と、立ち上がり具合(accel)の変化とコントローラの電圧値・電流値を連続通信で数値をモニタリングできるようにしました。「目標回転速度(speed)」、「立ち上がり速度(accel)」、「ローターの回転数(rotor speed)」をグラフ化しました。モータに回転させる対象物を取り付け、負荷が掛かった状態の回転数をグラフで見ることができます。
6.モータ制御調整
モータの制御調整で、基本的なPIDの3つのパラメータを調整してみました。
おなじみのP(比例制御),I(積分制御),D(微分制御)です。
P(比例): 目標とする回転に到達する為のゲインみたいなもので、比例なので直線の傾きの様な値です。値が小さいと、ゆっくりと目標回転数に到達し、値が大きいと速く目標回転に到達する。だだし、大きくしすぎると目標値をオーバーランしてしまい、戻そうと下げようとして目標値から下げ過ぎてしまう。その繰り返しで目標値付近でゆらいでしまうことがあります。
I(積分):P(比例制御)とセットで効果を発揮します。比例制御で生じた誤差の累積値を補うことで目標設定値に近づけます。
D(微分):こちらもP(比例制御)に効果を生じます。先ほど述べました比例制御で発生するゆらぎを抑える働きをします。P制御で生じた誤差の変化量をつかって変化を抑えようとする働きをします。
以前、制御を得意とする先輩にPID制御に関して色々教えていただいたのですが、IとDの制御は簡単ではないとのことです。計算で算出できるそうですが、色々値を変更して値を決めることも一つの手だそうです。パラメータの決定はP→I→Dの順番だそうです。以前扱ったことのあるサーボモータは調整項目が多すぎて、50個以上パラメータが有り調整が大変でした(PIDゲイン以外にも、位置制御、トルク制御、速度制御にそれぞれ設定が・・・)。私もまだまだ勉強が必要です。
※ テスト中の為、電圧を1/10以下に下げてモータの出力を弱めて撮影しています。
電圧が低過ぎる為、始動は手動で行っており、スライドバー操作による回転数の変化も少なくなっています(AC200V品を20V程度で試験)
まとめ
コントローラのマイコンのUartを使用して、シリアル通信を行いました。
PCのアプリを作成し、画面のボタンクリックでモータコントローラ及びモータを操作しました。(アプリはまだまだ開発途中です。)
モータの電源ON/OFFや回転方向、回転速度や立ち上がり速度、ローターの回転数や電流・電圧のモニター及びグラフ化を行い、ゲインの設定変更まで行いました。
以前からコントローラのモータパラメータをお客様が変更できるようにする課題がありましたが、他の優先開発がありなかなか公開できるまでに至っておりませんでした。まだ開発段階ですが、ようやくこの様なPCから通信及び設定変更ができるアプリができつつあります。
今回は、社内試験・評価用としてアプリを紹介しました。これらの機能を必ずしもすべてご提供できるとは限りませんが、一般的な速度制御の範囲、モータの立ち上がり速度の調整にとどまらず、モータ保護レベル設定の変更、さらには各お客様ごとの特殊機能の調整ができるように、またそれぞれの調整状況・状態が確認できるようなグラフィカルな表示等にも対応できるように考えております。
ご拝読、ありがとうございました。