ラジコン用サーボの制御機構を作り直す

(2001/01/23)

   はじめに

最近ラジコン屋に材料を探しにふらりとよってみたのですが、店内に入ると大量の部品がところ狭しと並んでいるではないですか。ラジコンなるものに触れたことのない私はかなりのカルチャーショックを受けてしまいました。小型のエンジンなどはまさに工芸品。すべてが袋詰されてとてもきれい。この店はラジコン雑誌で下調べした全国通販している店だったのですが、しばらく回ってみるとひとつのことに気づきました。それはモデルの部品については大量においてあるのですが、たとえばポリカーボネイトの板はどこにあるのかと聞いてみると、それはないという。つまり出来合いの部品は大量にあるが、それを作るための材料はほとんど置いてはいないということである。

それはさておき、ラジコン用のサーボモータがたくさん展示してあったので、見てみると7g位の超小型サーボまであるようですね。小型飛行機用らしいがいろいろつかえそうな気がする。中にはコアレスモータを使用し、4.8V時に0.07sec/60degの超高速タイプまである。コアレスモータがこの値段とは。これも使えそうだ(何に?)。

しかし以前ラジコン用サーボモータを使ったときのことを思い出すと、お手軽にパルス幅で制御できていたことを思い出した。15ms間隔くらいで0.5〜2.0ms位のパルスを入れるだけで位置制御ができていたのだが、15msはやはり間隔が広いような気がする。上記の高速タイプは間隔を1/2にして制御性をうんぬんというのをうたい文句にしていたのですが、もう一ランク上のものがほしいものである。

では、作ろう。というわけで知り合いから壊れたラジコンサーボをもらってきてテスト版を作ってみました。

   製作

ハードの製作

まずもらってきたサーボモータにパルスを入れてみるとやはり壊れていて動きません。モータにまSANWA SM-635と書いてありますが性能などは知りません。モータやVRは壊れていませんでしたので、制御用の部品をすべてはがします。M51791ALというチップが使われていました。データシートが出ていなかったので、類似のM51660Lを調べてみると単純な比例制御か不感帯のみの制御となっているようです。

そして、モータの配線とVRの配線のみ引き出します。制御はAVR(AT90S8535)を使ってみました。

大体こんな感じで接続しました。入力は別付けVRで電圧を与えることでそれに対応するサーボモータの位置を制御します。モータ駆動はTA7289Pを使用しました。これでPWM定電流駆動H-Bridgeとなります。しかもこのドライバは1.5Aまで流せて電流地もデジタル値で16段階に制御可能です。回路図はこれです。

制御プログラム

次に制御プログラムを書きます。AVR-GCCを使ってコーディングしました。今のところfloat関連が使えないようなのでint型を大きくしてプログラムしました。プログラムはこれです。

プログラムでは単純にPID制御+αを行っています。

   制御についての考察

さてプログラムはできるのですが、制御のパラメータの設定をしなくてはなりません。モータの特性などはわかりませんので、感覚で制御パラメータを設定します。大きなギヤ比の先端に軸が取り付けてあるのでモータの慣性モーメントはギヤ比の2乗で効いてくるシステムです。幸いギヤのバックラッシュはほとんど感じられないほど小さいものでした。

で、いろいろゲインをいじくりましたが、結論を述べると比例ゲインのみ大きくするとしゃきっと止まることがわかりました。なぜこうなるのか検証してみる必要があるので物理シミュレーションのプログラムでいろいろゲインを変えながらシミュレーション実験してみました。

プログラムはこれです(227K)。スタティックリンクしてあるので少し大きいですが展開してできるプログラムを走らせれば環境によらず動くはずです。

単位系はMKSで作られていますが、制御パラメータによる軌道の傾向を見るだけですので、理論的には正規化してRCサーボ系に直すと同じような動きをするはずです。単純に初期位置から指定位置までPID制御する(初期位置にステップ入力をしているのと同じ)ものです。

リアルタイムに動きますが普通のメッセージタイマーを使っているために55ms間隔で表示されます。1ステップは1msにしてあるのでfeedを55回ごとに進めています。FeedNumを変えれば見た目の速さを変えることができます。

それぞれのパラメータは設定できるのですが、今回のシミュレートの目的は慣性モーメントとダンピング要素がギヤ比のために極端に大きく、さらにモータトルクに限度がある場合ですので、そのためのプログラムがしてあります。


とりあえず走らせてそのままStartボタンを押すと、スッと収まるように初期パラメータは設定してあります。適当なところで止めてファイルメニューから制御結果を出力できるようにしてあります。ではFile->ResetPosして左下のTorqueLimitEnableをチェックしてもう一度走らせると、今度は行き過ぎてしまいます。トルクに限度があるために積分要素がたまってしまうためです。

ではサーボモータ系の慣性モーメントが大きく減衰も大きい状態にしてみましょう。たとえば値は

Kp=20.0
Kv=4.0
Inertia=1.0
Damper=2.0
TorqueLimit=2.0

この場合はトルクリミットを掛けても掛けなくても収まりはいいです。また慣性要素が大きくても粘性も大きいために収まりはいいです。トルクリミットを掛けると一定トルクつまりモータが飽和しているのと同じ状態になりますので、ほとんどOn-Off制御状態になっています。つまり粘性に助けられて簡単な制御で収束している可能性があります。この場合はOn-Offと不感帯でもいけるかもしれません。また場合によってはI-制御は要らないと思います。(本当のサーボモータはこんなに極端ではありません。)

しかし、スピードが遅いです。何かいい値を見つけるといいと思います。

   まとめ

外部で制御を組んでもそこそこ制御できるようです。同時に最初からついている元のチップでも割合きちんと制御できているので、そのチップはよくできていると関心するとともに、ほとんど改良する必要は制御周期をのぞいてなさそうです。しかし外部で2000Hzで制御を行うとやはり少し違った印象を受けます(カチッと制御してる感じがする)。

今回のプログラムでは、さらにしゃきっと動くようにゲインと高くして、PIDを少し拡張しています(ほんとはこれが効いてるか?)。物性がわからないのでレギュレータで最適値を出すことはできません。よって4つのパラメータを気合で調節しました。また、離散かされているのでそのあたりからも、理論どおりにはいっていませんが、ノーマルよりもいい印象です。


return to previous page