姿勢センサとして一般に知られているものに角速度センサがあり,自動車の姿勢検出やカメラの手振れ補正などに利用されています。本倒立振子には,MEMS技術を用いた小型な角速度センサを利用しました。
角速度センサからは角速度に比例した電圧が出力されるので,この値をマイコンでAD変換すれば本体角速度ωを得ることができます。また,これを時間積分すればθを得ることができます。 ここで注意しなければならない事は,θが積分値であるため,温度変化による出力変化やノイズ等により得られるθが徐々にドリフトしてしまう点です。 そこで,角度そのものを検出できる加速度センサを併用する手法を用いました。加速度センサを用いて重力加速度を検出すれば,本体角度θを直接検出できます。 しかし,加速度センサには自身の並進運動による加速度も検知してしまう欠点があります。そこで,以下の方法を用いました。
相対的に見て,角速度センサは周波数の高い領域で,加速度センサは周波数の低い領域で優れていると言えます。 よって,図9.3のように,各々の出力からフィルタで欲しい領域だけ取り出して角度同士で加えることにより,適切な車体角度θを得る事にしました。
ここで,LPFとHPFに同じ時定数τを持たせると,両者の伝達関数の和は1となります。すると,必要なHPFをLPFで実現することができます。
上記の表現が正しいかどうかは良く分かりませんが・・・。とにかく,2系統でLPFを共有できるようにすると,図9.4のようにフィルタ部を1個で済ませることができるので,計算資源を削減することができる!。 詳しい原理はよくわかんないので制御工学の教科書をよんでください。
角速度センサはMLX90609を選択しました。このセンサは角速度ω[deg/s]に比例した電圧が出力されます。フルスケール(FS)は±300[deg/s]あります。 AD変換の分解能向上のため,CMOSオペアンプLMC6482で出力信号を-3.3倍で反転増幅しています。
加速度センサはKXM52-1050を選択しました。このセンサからは加速度に比例した電圧を出力し,FSは±2[g]です。こちらの信号出力はボルテージフォロワを介してSH/7125のAD変換器へ接続しました。
センサ回路は最も低い位置に設置しました。その理由は,加速度センサの並進運動をできるだけ抑えるため,センサ回路の回転中心と思われる車軸に出来る限りセンサ回路を近づけるべきだと考えたからです。
マイコン上でLPFを実現するため,オイラー法を用いました。プログラムで実装した計算式を以下に示します。
時定数τの設定は,実際にセンサの出力を観察しながら合わせ込むことにしました。用いた手順は以下の通りです。本当はもっとまともな方法がありそうですが・・・
加速度センサの出力は,鉛直が分かり角速度センサのオフセットが除去できる程度に反映できればよいと考え,時定数τを100[ms]から徐々に大きくしていきました。 すると,τ = 3[s]で適当な出力を得られたので,この値をLPFの時定数に決定しました。・・・なんというか,手動で周波数特性を取ったという感じです
τ = 100[ms]において@を見ると,LPFの機能が働いて,加速度センサのノイズを除外できているのが分かります。また,Aを見ると角速度センサのオフセットが除去できています。 しかし,Bを見ると,フィルタ出力が角速度センサから求めた角度値の振幅を大きく上回っており,加速度センサ成分を過剰に反映していることが分かります。 よって,τ = 100[ms]ではLPFによる帯域制限が不十分であると判断しました。
τ = 3[s]において,@やAの挙動はτ = 100[ms]と同様に良好です。さらに,時定数を増加させた効果がBに現れ,フィルタ出力の振幅と角速度センサ出力の振幅はほぼ一致するようになりました。 与えている振動数は最大1[Hz](周期1[s])程度なので,3[s]の時定数はうまく機能したみたいです。 ここで,角速度センサ積分値のドリフトを見てみると,動作開始からわずか16[s]で約4[deg]のドリフトが生じています。しかし,フィルタ出力はドリフトを除去できているので当面の倒立制御には問題ないと考えました。 このドリフト値に改善の余地があるかどうかは分かりません。
vを得るために,モータはロータリエンコーダが付属するものを選択しました。ロータリエンコーダから出力される2相のパルス波の数から車輪傾斜角度φが分かるので,変換係数を乗じて倒立制御周期TAで割れば車輪並進速度vが分かります。 また,パルス波の位相進みと遅れから回転方向を知ることができます。
SH/7125には,このようなパルス波を計測するパルスカウンタ機能(位相計数機能)が用意されています。 この機能をもつ端子に図9.9のような波形を入力すれば,内部のカウンタが自動でパルス波の個数を計測してくれます。vを求める計算は,以下の通りです。
位相計数を2逓倍で行うと,モータ一周あたり200[count]である。ギヤ比はn = 22.4なので,タイヤ一周あたりのカウント数は
ここで,1[count]あたりの走行距離分解能Δxは,タイヤの直径が80[mm]なので
倒立制御周期TA あたりのカウント値の変化をΔCNTとすると
5.2式のゲインF1〜4は以下の手順で決定しました。この決定方法は何らかの理論に基づいているものではなく,私が場当たり的に適用した方法です(;´Д`A ```
決定した倒立制御式を以下に示します。
もちろん,各ゲインはどんな倒立振子を作るかによって異なってきます。値の桁を参考にする程度で。
私が製作したメカでは駆動部のバックラッシが大きく,各ゲインを上げ過ぎるとモータが激しく振動してしまいました。やはりステッピングモータで作るべきだったか!?
・・・
製作した倒立振子に初期位置x = 150[mm]を与え,動作が収束する様子を観察した結果を図に9.13に示します。定常状態では,5[mm]程度の振幅で一定位置に留まることができました!(図9.15)