mbedプログラムで、あーじゃないこーじゃないといじっていたのですが、私のプログラミング力を超えている補正方式をやろうとしていると悟りました。EXCELで簡単にやれたことが実際のリアルタイムのプログラムでは、計算アルゴリズムというよりは、
マイコンに適したプログラム構造設計がされてないと安定して走らないことを痛感しました。
バグ1:ゼロ点の認識したりしなかったり
mbedのプログラムの中に下記の正弦波状の踏力をいれて
所望の仕事量、W数がでるかデバッグしました。
これとそっくりのモノがでてくるつもりだったのですが
近いのが下記結果です。マイナスなので逆さになってます。
しかし、回しているうちに突然下記のような現象も発生します。
一回の積分計算に5波形もはいってしまうという異常な現象
これって、とんでもない間違いをしているはずなので直ぐみつかると思っていろいろみたのですが、数十回に一回あちこちに分岐を繰り替えしていて、どうやらリングバッファを回している間に
カウントミスをしていて、たまたま組合わせが合うと発生するみたいです。
バグ2:マイコンメモリーに無理をかけているのか?
printfを入れまくっていて、はずした時に暴走する
積分しない時は6msecでwhileループ回っていて、そこにpirntfを1個いれて、タイマー値とカウント数をPCに表示しているのですが、そこをコメントアウトするとハングするという現象が頻繁に発生していて、wait(0.003)くらいいれると直るという現象があります。タイマーの使い方が悪いのか、変数定義が悪いのか
マイコンのメモリー内で暴走しやすい状況になっているのではないかと思い、CPUをNUCLEO L432KC から
https://developer.mbed.org/platforms/ST-Nucleo-L432KC/
446REに変更してみました。
http://akizukidenshi.com/catalog/g/gM-10176/
クロックが80MHzから180MHzと倍以上、
SRAMも64KBが128KBと性能がいいのでどうなるとみてみたのですが、バグは同様に発生して、唯一の差は、whileループ時間が
早くなっただけでした。
●補正方式を簡易化
上記課題を解決するには、時間をかければいいと思うのですが、4月は時間がないので、MFT2017出展審査にむけて、まとめるために、自分のプログラム能力にあわせて、単純なアルゴリズムでとりあえず、W数がでるプログラムにしました。1個前の半周期の値を次ぎの半周期でも同じと仮定することでリングバッファが必要無い、ゼロ点検索も移動平均を使わない単純な乗算してマイナスならゼロ点と判断するという、ワンパスの単純な積分プログラムにしました。これなら数十分で出来ました、これなら、プログラム構造上でデータ化ける可能性が少ないし、単純なのでデバッグしやすい点を重視しました。そのかわり、定常回転で踏んでないと補正波形がずれて変な値になるリスクがありますが、パワータップと比較してどこが悪いのかが見えてくるので、その基礎データから補正方式をさらに開発していけばいいと思います。
●簡易プログラムの状況
パワータップをみながらできるだけ一定になるようにペダリングしてみました。
パワータップ値80-90Wで踏んでいる時です。
左踏み(プラス)は、大きすぎます。
右踏み(マイナス)は、若干小さい感じです。
とりあえず、右半分の範囲で、W数平均と2シグマは
右踏み | 左踏み | |
平均 | -86.1185 | 102.9786 |
2シグマ | 21.68824 | 11.23101 |
右がばらつきが大きいが左が少ない
しかし、パワータップ比較で±10~20%
の差があります。
足して2で割るとちょうどいいかもしれません。
●以後
①パワータップとの比較ツール
パワータップのデータをPCへ取り込めるようにしてから
詳細に比較校正できるようにします。
②PROCESSINGでグラフとW数をリアルタイムで表示
デモ用には、グラフが動けば一番いいのですが、
動かすとなると結構難しくなるので、調べてみます。
③乗車時と非乗車時のセンター電位の差
今のところ、大差がでてないのですが、データとして
どのくらいあるのか測定してみます。
センター電圧の初回キャリブレーションは、非乗車時と
乗車で全然違ってますので、その差も解析しないといけません。
④フレームへ曲げ力をかけた時です。
例えば、わざとねじるとひずみ値にでてきますので
どういう姿勢でどううごくとどうなるのか、IMUを腰に
つけてみれば、いろいろ見えてくると思います。
⑤プログラムの改良
どこでどんなバグが潜んでいるのか判りませんので
入力値をいろいろ変えて、デバッグしていきます。