2018年1月3日水曜日

最安パワー計製作計画 プチ成功

クランクアームにひずみゲージを貼り付けるパワー計では、クランクアームの捻じれの程度によって、見かけ上パワー値が上下してしまう問題がありました。
クランクアームの捻じれは、ペダル軸の外側を踏むとより大きく発生します。

通常踏んでいる55mm地点付近よりも110mm地点を踏んだ方が、クランクアームの捻じれが大きくなり、見かけ上のパワー値が大きくなってしまいます。

そこで、この見かけ上のパワー値を補正して真のパワー値を算出する方法を試しました。
すでに各社の特許出願に記載されている技術で、何も独創的なものはありません。

ひずみゲージセットアップ

曲げ計測用(赤丸)
ペダルを踏むとクランクアームが下方向に曲がり、クランクアームの上面が伸び、下面が縮みます。
この変化を赤丸ひずみゲージでとらえて、電圧としてフィードバックします。

ねじれ計測用(青丸)
クランクの側面に45度の角度でひずみゲージを貼り付けます。クランクアームに捻じれが生じると、捻じれ方向により、片側のひずみゲージが伸び、もう一方のゲージが縮みます。このように2つのゲージでひずみを捉えて電圧に変換することのより、2倍の感度を実現します。

実物・・・汚い・・・


ハードウェア構成
今回、2系統のひずみゲージ・ブリッジからデータを取得するため、ひずみゲージが返す電圧の変化をデジタルに変換するADコンバーターを2個設置しました。



HX711は1個でも3チャンネルの接続端子がありますが、2チャンネル分を同時に80回/秒で変換するのは無理と思い、ADコンバータを2個づけにしてみました。
Arduinoマイコンから読み取りコマンドを同時に2つのADコンバータに送信し、結果を同時取得します。

ADコンバータHX711からの読み取りルーチンは以下のとおりです。
long AE_HX711_Read(void)
{
  long data=0; long data2=0;
  uint8_t dataary[3] = { 0 };
  uint8_t filler = 0x00;

  while(digitalRead(pin_dout)!=0);
  while(digitalRead(pin_dout2)!=0);//メモ:2つのHX711が両方ともREADYになってから読み込み開始しないと不正確なデータになってしまう。1個がreadyならもうひとつも・・というのはNG。
  delayMicroseconds(10);
  for(int i=0;i<24;i++)
  {
    digitalWrite(pin_slk,1);
    digitalWrite(pin_slk2,1);
    delayMicroseconds(5);
    digitalWrite(pin_slk,0);
    digitalWrite(pin_slk2,0);
    delayMicroseconds(5);
    data = (data<<1)|(digitalRead(pin_dout));
    data2 = (data2<<1)|(digitalRead(pin_dout2));
  }
  digitalWrite(pin_slk,1);
  digitalWrite(pin_slk2,1);
  delayMicroseconds(10);
  digitalWrite(pin_slk,0);
  digitalWrite(pin_slk2,0);
  delayMicroseconds(10);

  A2D_CH1=data;
  A2D_CH2=data2;
  return data;//^0x800000;
}

しかし、ここでHX711固有の問題が発生。
HX711は、AD変換するために約10ms程度ひずみゲージに通電する必要があります。
これを1秒間に80回行うと、ずっーーーーとひずみゲージに通電することとなり、ドリフト(じわじわと読取値がズレる)が発生しました。
このドリフトが20分以上も収まらない状況で、「最初の数十分はパワー値が安定しないパワー計」ができてしまいました。

よい解決策がみつからないので、HX711の利用は一時保留としました。

そこで、ADコンバータを最先端ながらコストは10倍以上のAD7124-4に代えました。
これは1つのコンバータで4chの入力があるので、今回の2ch入力には、1個で足ります。

これで実験しました。
ねじれ計測用のゲージと曲げ計測用ゲージの計測結果に基づくパワー値等をシリアルで無線転送したログの一部です。
55mm地点のペダリング3回転分と110mm地点ペダリング3回転分です。

赤線のAxxx.xxの数値は、曲げ計測用ひずみゲージから算出したパワー値の3回転平均で、約300wです。
このときのケイデンスは、パワー値の2行上のc5080、c5084、c5115をそれぞれ100で割った値で約50RPMです。
それぞれの赤線の2行上にあるA303、A298, A306は捻じれ計測用ひずみゲージから算出したパワー値で、こちらも約300wです(やや校正があまいですが・・・)。

同一負荷の状態でペダリング位置を110mm地点にずらすと、ケイデンスは約50rpmのままですが、パワー値は緑線の値で約330wです。
他方、捻じれ計測用ひずみゲージの値は360w強で、より捻じれに反応してるのが分かります。
本来約300wとなるべきところ、クランクの捻じれにより見かけ上のパワー値がそれぞれで330w、360wと増えています。

固定ローラで、常に55mm地点でのみペダリングをするのであれば、曲げ/ねじれ計測用の一方のひずみゲージだけでパワー値を算出しても問題ないと思います。
実走でダンシングとかするとそうもいかないので、補正が必要です。

補正は、曲げ計測用ゲージとねじれ計測用ゲージの乖離率をベースに補正係数を割り出し、補正してみました。
ペダリングを55mm地点より外側で行うと、55mm地点からの距離に比例して、見かけ上のパワー値が上昇します。

青線の値が補正後の値で、55mm地点ペダリング同様、110mm地点でも約300wとなりました。
この点では、実験成功です。
激安ひずみゲージでも、この補正方式を採用すれば、パワー計として機能しそうです。

4iiiiのパワー計は、これと同じ技術で、精度を確保するため、ひずみゲージを4×2=8枚使用している、と開発者がWEB上で公言しておりました。
最安パワー計を目指すと、8枚も使えないため、1×2=2枚でどのような結果となるか実験する予定です。

数千円の自作パワー計でも、実用的なパワー値は表示されるので、普及すればむやみに上り坂でペースアップする人が減るはず・・・
これをチーム代表に提案するも「いや、登りで上げすぎちゃう人は、パワー計ついててもなおりません」との意見をもらっております。

今回のコードをこちらにアップロードしました。
ttps://sites.google.com/site/myfiles1138000
(20180103.inoというファイル名です。実際にアクセスする場合、末尾の000を削除して1138で終わるようURLを修正する必要があります。ロボット除けのためで、お手数をお掛けします)

なお、私がAD7124の使い方が変わっていないようで、しばしばゼロオフセット値がずれる問題がでておりますが、何が原因かわかっておりません。