ラズパイ日記...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と動きの違いを検証してみたいと思います。

2 件のコメント:

  1. micropythonとArduinoコンパイラの速度を簡易的に比較してみました。単純ループの比較なので、プログラムの内容如何では、違った結果になると思います。この比較では、約30倍程度の差が出ました。参考まで、、、
    ---------------------------------------------
    ESP32 micropython
    ---------------------------------------------
    >>> import time
    >>> for i in range(10):
    ... start = time.ticks_us()
    ... delta =time.ticks_us()- start
    ... print (delta)
    ...
    109
    30
    30
    29
    30
    30
    30
    29
    30
    30
    ----------------------------------------------
    ESP32 Arduino
    ----------------------------------------------
    iint i;
    int start ;
    int delta;
    void setup() {
    Serial.begin(115200);
    }

    void loop() {
    for (i = 0; i < 10; i++) {
    start = micros();
    delta = micros() - start;
    Serial.println (delta);
    }
    while (1);;
    }

    2
    1
    1
    1
    1
    0
    1
    1
    0
    1

    返信削除
  2. なるほど、インタプリタはやはり処理に時間かかるのですね。センサー調べたらその辺も検討します。

    返信削除

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

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