記事の概要
2019年7月号のトランジスタ技術において特集されていたカルマンフィルタを利用した倒立振子を実際に制作しました。
他の方の制作に参考になればと、その制作記録をここに公開します。
作業工程を羅列しているだけなので、技術面の解説は本誌をご覧ください。
部品購入
部品リスト(PDF)に従って購入しました。
期間限定ですが、現代制御ロボティクス学習キット(限定生産)という便利なセットがあるので、そちらを利用するのもいいかもしれません。
あちらこちらを回って部品を集める手間が省け、CQ出版社調達のカップラのような、自力では入手が難しい部品も手に入ります。
(2020年7月に販売終了を確認)
マイコンボード
秋月電子にて購入
STM32 Nucleo Board STM32F401 1個
加速度センサ・ジャイロセンサなど
- 加速度センサ・ジャイロセンサ AE-BMX055 1個(秋月電子)
- ロータリ・エンコーダ EC202A100A 1個(千石電商)
- ロータリ・エンコーダ用ケーブル EC202用ハーネス A150 1個(千石電商)
- ICソケット6P 1個(秋月電子)
- 2回路2接点トグルスイッチ 1個(千石電商)もしくは2回路2接点トグルスイッチ 1個(秋月電子)
- 電解コンデンサ470uF 2個
- 電解コンデンサ2.2uF 1個
- セラミックコンデンサ0.1uF 3個
電解コンデンサ470uFはモータードライバの電源近くに配置するもので、記事中の回路図では220uFでした。
0.1uFと並列に接続されているので合成静電容量は、どちらでもほぼ0.1uFです。パスコンの役割を果たしていると思われます。
わざわざ電解コンデンサを入れる理由が分からずに調べたところ、ノイズ対策やアバランシェ破壊対策の為に、電源の近くになるべく大きいコンデンサを入れるそうです。
【復刻】ロボコン向けモータドライバの作り方 Vol.4
なるべく大きければいいということで、容量は適当に数百uFを選択すればいいと思われます。
モータードライバなど
-
モータ・ドライバIC TA7291P 1セット(2個入り)(秋月電子)
- (2020年11月追記)生産終了のようです。「TA7291Pの代わりってないのかしら」において代替品が紹介されています。
- 電池ボックス 単三×4本 リードタイプ 1個(秋月電子)
- 分割ロングピンソケット 2x42 (84P) 2個(秋月電子)
単3電池は1.2Vの充電式ニッケル電池を4本使って4.8V(約5V)にします。1.5Vのアルカリ電池を使用すると電圧が6Vになってしまい、5Vレギュレータが必要になります。
写真の基板はサイズが小さすぎたので、自宅にあった以下の基板を使用しました。
140mm×95mmの片面基板です。
シャーシ
千石電商にて購入
ユニバーサルプレート 210×160 1個
ギア・ボックスとタイヤ
- タミヤ ハイパワーギアボックスHE 2個
- タミヤ スポーツタイヤセット56㎜径 1個
千石電商 秋葉原本店にて購入。通信販売はしていませんが、Amazonなどでも購入できます。
XHコネクタ
細々と揃えるのが面倒だったので、AmazonでXHコネクタキットを購入しました。
実は今回このコネクタは使用していません。モーターと基板を接続するのに使用するはずでしたが、実際には、導線を接ぎ木のように足して、直接基板につけました。
LED、抵抗など
以下は自宅にある在庫を使用しました。
- LED 赤、青、黄色 各1個
- カーボン抵抗 220Ω 4個
- カーボン抵抗 3.3kΩ 2個
- カーボン抵抗 2.2kΩ 2個
カップリング
千石電商にて購入
4Pカップリング
ロータリーエンコーダとギア・ボックスのシャフトを接続するのに使用します。
後述しますが、接続の際にはシャフト側に少しだけ工夫が必要になります。
スペーサーなど
秋葉原の専門店で購入。
基板とシャーシを固定するのに使用します。
電子工作道具
普段から電子工作をしている人には必要ないと思いますが、以下の道具を使用します。マルツパーツやAmazonなどの通販で全て揃います。
- ハンダごて
- ハンダ
- ニッパー
- 導線
- ワイヤーストリッパー
- 精密圧着ペンチ
- ピンセット
傾斜計の作成
マイコンボードとセンサ用のICソケット6P を基板にハンダ付けして、配線をします。
内蔵プルアップ抵抗を有効にするためにJP4とJP5を接続。
3.3Vを有効にするためにJP7を接続。トランジスタ技術にはJP7とJP8を接続すると書いてあったのですが、データシートには、その組み合わせは存在しませんでした。
それと、ピンが邪魔で作業しづらかったので、この作業はピンをつける前にすべきでした。
傾斜計の動作確認
開発環境構築
mbedアカウントでオンラインの開発環境を利用します。
付録DVDの付記資料に従って進めます。
mbed 内の NUCLEO-F401RE のページ にアクセスし、「</> Open Mbed Compiler」をクリックします。
プラットフォーム名の「NUCLEO-F401RE」を選択し、新規からテンプレートを元にプロジェクト作成します。
私は試験毎に、新しいプロジェクトを作成しました。
ST-Link driverをインストールします。
UART通信試験
付録DVDを参照して、UART通信ができることを確認します。
I2C Read/Write試験
付録DVDを参照して、センサとI2C通信ができることを確認します。
センサにchip ID要求命令を書き込み、応答を読み出せるか確認しています。
加速度センサ試験
付録DVDを参照して、加速度センサが正常に動作しているかを確認します。
ジャイロ試験
付録DVDを参照して、ジャイロが正常に動作しているかを確認します。
センサ2000回測定
ヒストグラムは、正規分布の形になっています。
「測定雑音が正規分布に従っている」ことが分かったので、カルマンフィルタを適用する根拠になります。
データはTeraTermのログ機能を利用してテキストに保存しました。
計算とグラフ化はPythonを使用しています。
同様に、静止状態のジャイロセンサを2000回測定してばらつき具合を確認します。
これも正規分布になっています。
カルマンフィルタ試験
雑誌に掲載されているカルマンフィルタを実装します。
USB接続部を上にして、なるべく角度を固定した状態で、前後左右上下に振ります。
その計測結果を見ると、正規分布になっており、加速度の激しい揺れによる角度変化が起きていません。
フィルタが正しく機能していることの証左であります。
倒立振子の作成
センサとカルマンフィルタが正常に機能していることが分かったので、次はいよいよ倒立振子を作成します。
ギア・ボックスの組み立て
基本的に付属の手順書通りに組み立てます。
組み立て時の注意点は以下の通りです。
ロータリーエンコーダとギア・ボックスの接続
シャフトとロータリーエンコーダを接続するのにはカップリングを使用します。
シャフトの径は細すぎて固定ネジが届かないので、ギアボックス付属のナットを使って径を太くします。
カップリングを仲介して、シャフトとロータリーエンコーダを接続します。
シャーシの下から7番目の穴の高さにギアボックスを取り付けて、両端2ヶ所をネジとナットで固定します。
配線
雑誌の回路図通りに配線します。
写真はまだグランドとモーターの配線はしていない時のものです。
配線は単純な作業ですが、5時間ほどかかりました。
キットを購入すれば、専用基板が用意されているので、この手間が省けます。
配線をしながら回路構成を何度も確認するので勉強になりますが、手配線は大変で、ミスによる動作不良も起きやすくなるので、カルマンフィルタの学習に専念したい方はキットを購入する価値があると思います。
組み立て
ギアボックス、ロータリーエンコーダ、基板、電池ボックスを組み立てます。
基板をシャーシに固定するのは、ギアボックス付属のネジを使用しました。
電池ボックスは、取り付け用のネジ頭が平たいものがなく、臨時でテープで貼り付けて固定しました。後でキチンと固定します。
モーターはコネクタで接続するのではなく、ハンダで直付けしました。
モーターは青い線をモータードライバのOUT1に、赤い線をOUT2に接続しました。
モーターには極性があるので、反対に接続すると、サンプルプログラムの出力も反対にしないといけないはずです。そうしないと意図しているのと逆方向に回転してしまいます。
ロータリーエンコーダのコネクタの長さが足りず、裏で導線で接ぎ木のように伸ばしています。
また、ノイズ対策に、モーターとセンサに0.1uFを追加してあります。
動作確認
作成した倒立振子にサンプルプログラムInverted_Pendulum_Kalman.cppを書き込んで動作確認します。
電池は充電式のニッケル電池1.2Vを使用しています。アルカリ電池を使用すると1.5Vなので4本で6Vになってしまいます。
直立させた状態で電源スイッチを入れ、黄色LEDが点灯してから消灯するまで固定します。
(調整不足のせいだと思いますが、やや手前に倒しておくと、その後の動作が安定しました。)
私の場合、以下のように、不安定ながらも倒れずに動作しました。
モーターやセンサーまわりに配線不良のないことが分かりました。
ただ、赤色LEDが点灯しないので、何が原因か調査する予定です。
トランジスタ技術2019年7月号の倒立振子が完成しました。
— 松井 (@RB_79K_BALL) 2019年7月4日
以下の動画のように、前後にフラフラとしながらもバランスを保って倒れずにいます。 pic.twitter.com/nnkOWrBpTN
今後の予定
倒立振子を作成して動作するところまでは確認しました。
次は実際に自分で倒立振子のシミュレーションをして、パラメーターを求める予定です。
力学モデルも自分の作成した倒立振子に合わせて計算しなおしたいです。
また、雑誌後半の理論面の解説記事を実際に計算しながら読んでいきたいと思います。
新しく進捗や発見があれば、また別途記事にしたく思います。