Tanuki_Bayashin’s diary

電子工作を趣味としています。最近はラズベリーパイPicoというマイコンを使って楽しんでいます

倒立振子の製作(覚え書き)

※なにか気になる点がありましたらコメント欄にご記入ください。また、工作や回路を製作する場合には、細かい作業などに対して、細心の注意を払われるようお願いいたします。

【目次】

1.はじめに

およそ3か月の間、倒立振子に携わっていました。

その前は2年前の3月ごろから昨年10月まで取り組み、そのときはYoutubeで紹介されていたものと似たものを組み立て、お茶を濁して区切りをつけたのですが、どうしてもうまく制御して振り子を倒立させたいという思いから、再び挑戦しました。

今回の取り組みの結果として、1輪車型の倒立振子にて、約10秒ほど倒立の状態を維持させることに成功しました。(正確に言うと未だ道半ばです)

ここにそのときの経緯を、覚書として残しておこうと思います。

写真1 倒立振子の写真(現在の姿)

2.改造を加えた点

大元になる参考資料は2019年11月号のトランジスタ技術の特集記事になります。(カルマンフィルタは使用してないですが)
toragi.cqpub.co.jp

また筆者の取り組みに関しては、過去の記事がたくさんあります。次のものなどが参考になると思います。
tanuki-bayashin.hatenablog.com
tanuki-bayashin.hatenablog.com

以上を踏まえて、今回取り組んだ内容について記述していきます。

図1 回路図

ソースコードのリンク Github)(工事中)

改善を加えた点は次の7点です。

2.1 基板をプリント基板化した(いくつか機能も追加しました)

プリント基板を写真2に示します。

図2 プリント基板の図面 その1(KiCAD)

前回取り組んでいた時の基板はユニバーサル基板で、GNDが安定していなかったせいか、ラズPicoが早いときは2,3秒でフリーズしていました。
(動作確認用のGP25のLEDが、点滅を止めていました)

そのためプリント基板ではGNDをベタパターンとし、動作を安定させようとしました。しかし、以前取り組んでいた時と同様、やはり制御をしようとするとすぐにPicoは動作を止めていました。(モータの回転が低速のときなどは、長い時間保っていたようでした)

また、これ以外に左右のモーターの動きが一致せずに、回転に違いが発生していました。

新しく基板を作るに際して盛り込んだ内容としては、

  • 電流センサを取り入れ、モーターの電流値も測定できるようにした。(AE-ACS712 秋月電子通商(以下秋月と表記))

 これにより、より精度よく制御が可能になることを期待していましたが、他のことに手を取られ、動作の確認をいまだにできておらず、企画倒れの状況です(恥)

  • モータードライバにSMD部品であるBD6212HFPを使用した

 せっかくプリント基板化するということでSMD部品を使用しました。
 はんだ付けが大変でした。

  • モーター電圧をラズベリーパイPicoのA/D変換器で測定できるようにした

 実際にモーター電圧を測定しようとしましたが、モーター電圧(というかモータードライバの出力)の電圧値がマイナスとなることがあり、正確に測定しづらいことがわかりました。

その結果、モーター電圧は測定した各値から、PC上にて制御則の式をもとに計算で求めるといった形に収まりました。
(なので実際にモータに加わった電圧とは若干違いがあったかもしれないです)

  • USBシリアル変換アダプタの変更(AE-CH340E-TYPEC 秋月)

わりと新しい変換アダプタに変更しました。秋月電子通商のキット商品です。(回路図参照)
使ってみたところ、このキットの電源の端子と基板の電源はつながないほうがいいみたいです。

Picoにプログラムをアップロードするとき、うまく書き込めなかったかと思います。
(なのでCH340のUSBをいちいち外さなくてはなりませんでした)

2.2 プリント基板化第2弾(1括アース化した)

3年前に組み立てた倒立振子のキットというのがあって、その基板を見てみたら、動力部と制御部とで電源やGNDのパターンが細い線でつながっているだけでした。
www.marutsu.co.jp

こんな工夫が施されていたんだと、自分なりに大発見をしました。動力部からのノイズの侵入を防いでいるのかもしれないです。

それをもとに製作した基板を以下に示します。

図3 プリント基板の図面 その2(KiCAD)

こちらの基板ではモータドライバ2個をそれぞれ別のPWM信号により制御できるようにしました。左右の車輪のバランスがとれるようにするためです。

またCH340の電源ラインも2.1で書いた通り、基板の電源とはつなぎませんでした。

あとは本当におまけですが、基板にチェックピンを取り付け、モーター電圧などが観測できるようにもしました。(地味に便利でした)

2.3 割り込みの間は、他の割り込みを無効にした

割り込み時には当然の手続きなのでしょうが、Pico-SDKの環境でどのようにしたらよいのか分からず、割り込み可の状態にしていました。

ChatGPTに何げなく聞いたところ、さらっと関数を教えてくれたので助かりました。(図4参照)

(図4割り込み可、割り込み不可の関数とインクルードファイル名)    (工事中)

これによりPicoがフリーズすることがなくなりました。2.2の影響もあったかとは思いますが、フリーズせずに制御が継続されるようになったのは、今回の大きな成果の一つです。

2.4 ノイズの処理に移動平均化法を取り入れた

これもChatGPTに教えてもらった手法です。過去のいくつかのデータの平均をとるというものです。
これにより、センサからの信号のノイズが除去できました。
(図5 移動平均化法によるノイズの除去)         (工事中)

2.5 積分動作を取り入れた

ロボットの制御でわりとよく扱われるものに、PID制御というものがあります。
P(比例:propotional)、I(積分:Integral)、D(微分:derivative)の頭文字をとったもののようです。

今まで傾斜角とタイヤの回転角、およびそれらの時間微分値である角速度をもとに、モータ電圧の値を決めていましたが、今回はそれに加えて積分値も使うようにしました。(ただし傾斜角の積分は、傾斜角から平衡点の値を引いてから積分しています)

積分の求め方は、各値に制御周期をかけたものを足し算するといった感じになります。

ただ過去のデータに依存しすぎないようにするためと、観測データのオフセットを除去することから、計算値に0.99といった値をかけ、簡単なハイパスフィルタを構成したりもしました。

結果としては、なんとなくですが、積分動作の影響が大きく出て、かえってうまく働かなくなったという印象が残りました。
チューニングが甘いんだと思いますが、今回は実を言うと、検討はしたけど成果には結びつかなかったといったところでした。

2.6 パラメータ同定や平衡点の角度を詰めた

パラメータ同定では各部の重さや距離などを求め、振子の重心の位置や慣性モーメントの値を詰めました。

倒立振子を動かしたとき、傾いてもそのまま倒れてしまうケースがあったので、モータのトルク不足を疑い、電池ボックスや基板の位置をできるだけ下げて、重心位置を下げ、必要なトルクを小さくすることも試みました。

結果として、倒れた状態からも起き上がる動作が見られるようになりました。ただチューニングした影響もあったかとは思います。

2.7 3点微分を取り入れた

前に書いた記事で取り上げた3点微分を、ロータリーエンコーダーから求めた回転角からタイヤの角速度を求めるときに用いました。

3点微分については、前回書いた記事を参照してください。

tanuki-bayashin.hatenablog.com

使うことは使いましたが、大きな性能の向上にはつながらなかったのでは、といった思いが残りました。

3.動いている様子

以上の取り組みと、制御するときの各パラメータの調整を行った結果、約10秒間倒立を維持することができました。
そのときの様子をお見せします。

Youtube)   (工事中)

4.まとめ

以上になります。
今後取り組んでゆくとしたら、

  1. 信号のノイズ除去にカルマンフィルタを用いる
  2. Slotineという方の適応制御を試してみる

①については移動平均法より好ましい効果が出るだろうとChatGPTから勧められたからで、②に関しては卒論のテーマでは、この方の論文が研究テーマだったというのがあります。

最近は別の方面の事案に足を突っ込んでいるので、なかなか時間が取れない状況ですが、いずれその内取り組んでみたいテーマではあります。
(XのTLで、割りとうまく制御できている方の動画を拝見し、”うらやましい”という羨望を抱いているというのはここだけの秘密です)




最後までお付き合いくださり、ありがとうございました。

(多くの点で不完全な状態で投稿していることにつきまして、深くお詫び申し上げます)