オープンキャンパスプロジェクト2025
Arduinoを用いた振子吊り下げ制振制御
(日高・吉澤・宮山・上野・工藤)
目次
はじめに
平田研究室では,2025年7月26日に行われた宇都宮大学オープンキャンパス2025にて,Arduinoと3Dプリンタを用いた振子吊り下げ型台車の制振制御を行いました. ここでは当日の発表内容を紹介します.
目的
本プロジェクトでは,オープンキャンパスを通して制御を目に見える形で表現し,制御の楽しさや凄さを来場者に伝えることを目的としています. その方法として,3Dプリンタで振子吊り下げ型台車を製作し,Arduinoを用いた振子の制振制御を行いました.
Arduinoについて
本プロジェクトでは, Arduino を使用しました.
AVRマイコンや入出力ポートを備えた基板であり、Arduino言語や専用の統合開発環境によって構成されるシステムになっています.
実機
実機は3Dプリンタを用いて作成し,振子,車輪の角度測定に磁気エンコーダを使用しました.図1が実機の全体図で,振子を取り付けた台車がモータで駆動し,レール上を動くようになっています.台車が動くことによって,振子が振動します.制御に必要となる車軸と振子の回転角は,磁気エンコーダで読み取られ,マイコンに情報が送られます.
図1 実機の全体図
今回工夫した点は,実機のほぼすべてを3Dプリンタで作成したことです.主に作成したものとしては,振子,ベアリング,ギアボックスが挙げられます.振子については,先端に磁気エンコーダが振子の角度を読み込むための磁石がついています.ベアリングについては,振子の回転軸の摩擦の影響を低減し,角度測定の精度を向上させる効果があります.BB弾を利用して再現されたもので,先輩方が以前作成したものを活用しました.ギアボックスについては,車輪がレール上を動く上で最適なトルクになるように設計しました.
全体的な制御の流れは図2のようになり,振子の回転軸と車輪の回転軸に取り付けられた磁気エンコーダから得られる情報をもとにArduino Megaが最適な制御入力(電圧)を計算します.この制御入力でモータを駆動させ,振子を振動させない速度を出力します.このサイクルは1秒間に100回繰り返されています.
図2 制御の流れ
制御方式
今回は2種類の制御方式を構築し,制振制御を行いました.1つ目は振子の振動周期に合わせた台形加速度目標値を作成する方法,2つ目は最適サーボ系によって位置決めする方法です.
1.台形加速度目標値による制御
振子は急激な加速度の変化が原因で振動してしまいます.この変化を抑えることにより,振子が振動しないように台車を走らせることが可能になると考えられます.そこで,図3に示す,立ち上がり時間と立ち下がり時間が振子の周期Tに一致する台形加速度目標値を作成し,振子が振動しないようにします.今回,振子の固有周波数は0.98 Hzだったので周期は1.02 sになります.
図3 台形加速度
制御対象の伝達関数は,「モータに印加する電圧から速度」までの伝達関数となっているので速度目標値が必要になります.そのため,先ほどの台形加速度目標値を積分し,速度目標値に変換します.この速度目標値に台車の速度が追従すれば,振子が振動せずに台車が走行できるようになります.台車の速度yについては,車輪半径l(m)と磁気エンコーダで得た車輪の回転角φ(rad)から移動距離x=lφ(m)を計算し,それを微分することで求めています.
図4 速度目標値への変換
作成したブロック線図は,図5のようになります.制御対象Pが振子吊り下げ型台車,目標値rが先ほどの速度目標値(m/s),出力yが台車が移動する速度(m/s),制御入力uはモータに印加される電圧(V)になっています.制御器はPI制御を使用しました.PゲインKp,IゲインKiは極指定法を用いて算出し,制御入力uはそれらを用いてu(t) = Kp·e(t) + Ki ∫0t e(τ) dτから計算されます.この制御入力により,台車の速度yと目標値の速度rの差(偏差)e=r-y=0,つまり,目標値r=出力yとなるように調整されていきます.
図5 PI制御のブロック線図
これにより,台車の速度yが速度目標値rに追従させることが可能となり,振子の制振制御ができました.
2.最適サーボ系
最適サーボ系のブロック線図は図6のようになります.制御対象がP,目標値rは台車の目標位置(m),出力yは台車が移動した距離(m),制御入力uはモータに印加される電圧(V),偏差żはż=r-Cxになっています.żを積分するループを設け,それが0になるように積分を続けます.ここでは,状態フィードバックベクトルFと積分ゲインKiが設計パラメータになっており,FとKiは最適サーボ問題を解くことで求められます.これらを用いた制御入力u=-Fx+Kizが目標値rと現在の出力yとの偏差を0にしています.
図6 最適サーボ系のブロック線図
FとKiを求める方法について説明します.まず,振子吊り下げ型台車の運動方程式から式(2.1)の状態空間表現を求めます.入力uはモータに印加する電圧(V),状態変数xは振子の角度θ(rad),台車の位置x(m),振子の角速度θ̇(rad/s),台車の速度ẋ(m/s)としています.
次に,定常値からの誤差xe=x-x(∞),ue=u-u(∞)とuの微分であるvに対して式(2.2)の評価関数Jを最小化する問題を考えます.この問題は最適サーボ問題と呼ばれます.ただしQeは重み行列,ruとrvはそれぞれue,vに対する重みです.
このような最適サーボ問題は式(2.3)の拡大系に対する状態フィードバック問題に帰着できます.
この時,評価関数Jは拡大系の状態x̅を使用して式(2.4)のように表せます.
v=-F̅ x̅によってこの評価関数Jを最小にする状態フィードバックベクトルF̅を求めると,式(2.5)からFとKiが求められます.
重み行列は,MATLAB/Simulinkを用いたシミュレーションで試行錯誤的に決定し,Q=diag(10000,1000,1000,100,100),rv=100となりました.
今回は目標値rを台車が移動する距離として,r=1.5 mにしました.これにより目標位置1.5 mで台車が停止し,振子の角度0 radに落ち着く制御が達成できました.
