ラズパイ日記...25日目...ちょっとPi zeroでmpu6050

このところ、ESP32+micropython環境でずーと頑張ってましたが、micropythonはモジュールに制限があり、大きな配列等は扱えません。

加速度センサー値をMadgwickフィルターを通してみたいのですが、micropythonのモジュールは見つかりませんでした。Pythonでは沢山あるので、一時的にPi zeroでセンサー調べを行いたいと思います。

半年振りにPi zeroを引っ張り出してきました。
センサーとも接続し、値を読み出してみることに。
接続はPi zeroとI2Cなので、3.3V, GND, SCL, SDAの4線を接続すればOKです。
あれ、Linuxではコマンドなんだったけ?と完全に忘れてます。
あと、
%sudo apt-get update
%sudp apt-get upgrade
したら、 30分ほど終りませんでした。

ESP32からPi zeroに環境変えるだけで1日費やしました。
Linuxもコマンド叩いてないと、結構忘れてます。
Pi zeroをシリアル接続する方法。
https://qiita.com/mt08/items/84d3d3053bee92609c2d

このページを参考に、センサーの値を読み出して、角度表示させるまでは出来ました。
http://www.widesnow.com/entry/2015/09/06/211055
 あとは、この値をMadgwickフィルターに渡して、フィルターなしの場合をグラフで比較したいと思います。Linuxでグラフ表示はどうするのか。しばらくは、Pi zeroでがんばってみたいと思います。

ラズパイ日記...24日目...倒立反省+センサー見直し

倒立振子2ヶ月ほど頑張りましたが、いまだ倒立せずです。
いろいろと振り返って、改善ポイントをまとめると以下のとおりです。

本体

  • 重心は車軸の上に。出来るだけ重心上にものを集めて、重量物なモーターや電池は軸下に配置し、モーターが出来るだけ軽い力で制御できるようにする 

センサー

  • 生データのドリフトやばらつきは、しっかりフィルターで除去する
  • あまりフィルターかけすぎると、遅延が発生するので精度と応答速度のバランスが重要

モーター

  • DCモーターは、電圧をかけてからトルクが出るまでに時間を要する(200-300ms)
  • 電池の状態は、常に気にしないと充電したてと放電してからでは制御パラメータが異なる

制御プログラム 

  • 単一ループでセンサー読み取り→モーター駆動するとモーター駆動間の待ち時間に処理が止まる。センサー読み取りとフィルター処理部分とモーター駆動処理は別のタスクにした方がうまくいくかも(未確認)
と、これまでの反省点です。半日で倒立というblog記事ありますが「倒立は一日にして立たず」が実感です。

まずは、センサーの見直しというか、他のセンサーはどんな動きなのかというのを調べるために2つ新たに購入しました。


左はKXSD9-2050(秋月で720円)、右はMPU-6050(Amazonで320円)とAmazonの方がお安いですが、カメラやビデオの手ブレ補正に使われてるらしく数が出ているものだと思います。

まずは端子を半田付けします。


接続はI2CなのでVCC,GNDとSDA,SCLの4線です。レギュレーター内臓なので、VCCは5V,3.3VいずれでもOKです。
まずはMPU6050から動作確認のためESP32と接続します。
 
micropythonのライブラリを探して、出力されているところまでは確認しました。
あとは、師匠に教えてもらったMadgwickフィルターを調べて、LPFと動きの違いを検証してみたいと思います。

ラズパイ日記...23日目...重心を下げて軸上に

本体の低重心化です。基板等はゴムバンドで止めているだけなので、ぱっと外せます。

付け替えるのが面倒なのはギヤボックスです。ユニバーサル基板と微妙に大きさがネジ穴の位置が違うため、切欠きを新たに。
 ギヤボックスと電池を床下において、軸上に重心センターがくるべく調整します。
重心を合わせるために計量です。
ギヤボックスは、82g。
 
電池ケースは、90g。
 
 差は8gです。これは後で微調整。
あとは、床上に配線の取り回しを考えて基板を配置します。
DCモーターへの配線が短かったので、長いものに交換します。
 
 動作確認して再度パラメータ探しの旅です。高重心の時に比べると、倒立しそうな感じですが、なかなかじっとしません。

師匠から重心とDCモーターの残電池容量の確認、モーターコントロールをタイマー割り込みをやってみるとよいとのアドバイスをもらいました。
電池は再度充電、重心はクリップで微調整しほぼ車輪軸上になりました。

この1週間だいぶ戯れましたが、今日のところまでで「倒立」せずです。(とほほ)

しかし、micropythonの勉強や、9軸センサーの補正方法、DCモーターの特性等いろいろと勉強になりました。頭で理解したつもりでも、実際はいろいろとうまくいきません。
あと、タイマー割り込みはまだ勉強中です。これも取り入れていきたいと思います。

残り少ないGWですが、最後に「倒立」するのか?

ラズパイ日記...22日目...倒立調整中→重心を低く

倒立振子の母体は完成し、センサー出力とDCモーターは連動することまでは確認できました。ただ、このままでは倒立しません。センサーとモーター出力を調整する必要があります。

とりあえず、センサー出力を可視化して眺めてみます。

ジャイロの出力が急峻なのでLPFで滑らかに、加速度は出力をそのまま使うのではなく、角度情報に変換して活用します。

加速度センサーから角度への変換はこちらを参考に
https://garchiving.com/angle-from-acceleration/

micropythonでCtrl-Cを掴んで、終了処理をする方法については以下を。これをいれないとモーターが動きっぱなしになります。
https://qiita.com/keisuke-nakata/items/e77b123d75d4b52aac77

当初のセンサー出力です。センサー出力そのままです。

 青線が加速度、赤線がジャイロの出力です。傾きとジャイロの方向は合っています。
このジャイロ出力にLPFを、加速度はatan2(dx,dy)を計算すると角度になるということで、その結果を入れたのがこちら。
ジャイロ出力がマイルドになり、加速度も角度に変換したので、滑らかに角度を表してます。
これで、加速度とジャイロの係数、LPFの係数、モーターの駆動時間等を変化させながら、最適値を探りましたが、最適値にはたどり着かずです。

これで最適値を探す旅もつらい感じなので、まずはボディーの低重心化をして再挑戦したいと思います。
ざくっとは、こんな感じです。結構重心は下がりました。
BEFORE(高重心版)
AFTER(低重心版)

ラズパイ日記...esp32(arduino)+mpu6050

# esp32で6軸センサー読み出し esp32で6軸センサーを読み出し、値をグラフ表示して動作を確認します。 ## 準備 ハード的な接続は、センサーが3.3V駆動できるので、3.3VとGNDの2線で電源供給します。I2C用にSDAとSCLのデータ線が必要ですが、esp...