2019年3月14日木曜日

パワー値の算出とキャリブレーション


■パワー計のパワー算出式
パワー(watt) = トルク × 角速度

これをプログラムコードにすると
Power=Torque*(CadenceRPM/60)*6.28

以下、前回記事のAndroidパワー表示アプリで使用した、パワー算出コードです。

//calc Power
 iCdc = (6000000/iMills);  //ケイデンスを算出
              //iMillsはクランクが360度回転するのに要した時間ミリ秒

 iRead=iRead-(int)iZero; 
    //読み取り値平均からゼロオフセット値を引き、歪の変化量を抽出
             
iTorque =(iRead * 0.175 / iSlope); //スロープ値からトルクNmを算出
                  // クランク長175mm
if (iTorque <= 0) {iTorque=0;};
iPower  = (int) (iTorque * (iCdc/60*6.28)); //パワー(ワット)を算出


■ゼロオフセット値(iZero)のキャリブレーション
 負荷ゼロのときのひずみゲージ値を取得します。
 重りなしでクランクを地面に垂直に真下に向けて、ひずみゲージの値を読み取ります。
 5回計測して、 最高値と最小値を除いた3回分の値の平均をゼロオフセット値とします。
 市販のパワー計で、皆さんがよくやってるキャリブレーションです。
 温度が変わると、ゼロオフセット値も変化するため、キャリブレーションが必要になります。

■スロープ値(iSlope)のキャリブレーション

スロープ値=ひずみ変化量÷トルク(Nm)

クランク長:175mm
おもり重量:2.605Kg
の場合のトルク(Nm)= 2.605×9.81×175/1000 = 4.47213375

ゼロオフセット値:928788(実測値)
(クランクを垂直に真下に向けおもり無しのときのひずみゲージの読取り値)

クランクを3時方向(下記のwatteam方式は9時)に向けておもりを付けたときの値 :930838(実測値)

上記のひずみ変化量 = 930838-928788 = 2050

したがって、
スロープ値 = 2050/4.47213375=458.39
というように算出します。

これを自動計算するスプレッドシートを作りUPLOADしました。
ttps://sites.google.com/site/myfiles1138000
本日の日付の入ったXLファイルです。
(実際にアクセスする場合、末尾の000を削除して1138で終わるようURLを修正する必要があります。ロボット除けのためで、お手数をお掛けします)



watteam社は、ユーザが自身でスロープ値のキャリブレーションを行う際、以下の方法を指示しています。
オモリの水入りバッグ(5Kg程度)を両方のクランクにつけているのがミソです。

私は、オモリのペットボトルを片側につけ、ペットボトルの重さに苦労してましたが、バイクを逆さにして両方のクランクにオモリをつけると楽そうです。
天才的発想と感心してしまいました。


















オモリは、2.6Kg程度では軽すぎで、Powertap比で最大10%程度の差が出ます。
SRM社は20Kg程度を使っているそうです。
本来は、体重に匹敵する数十キロの オモリが必要です。
数十キロの重りはぶら下げられない・・・と思ってましたが:

https://shinshu-makers.net/shinshu_makers/2017/03/21/%E3%80%903%E6%9C%8821%E6%97%A5%E3%80%91%E3%83%91%E3%83%AF%E3%83%BC%E3%83%A1%E3%83%BC%E3%82%BF%E3%83%BC%EF%BC%9C%E6%A0%A1%E6%AD%A3%E5%8F%B0%E8%A9%A6%E9%81%8B%E8%BB%A2%E3%83%AD%E3%83%BC%E3%83%89/

すごいアイデアです。やはりプロ中のプロの技術者は違うと感心しました。
耐荷重40Kgということで、こちらが王道かと思います。


■ その他の校正方法

1. パワータップハブで校正

後輪にパワータップハブをつけ、サイコンにパワー値を表示し、
自作パワーメーターのスロープ値を変更していき、パワータップと同じパワー値の表示になるようにします。
お手軽なうえ、「パワータップと同じ値がでている」という安心感があります。


2. 他人頼み校正
自作パワーメーターのスロープ値を適当に入れて、時速30Km/h時に200wくらいと表示されるようにします。

次にパワーメーター付きのバイクに乗ってる仲間とヤビツ峠とかを一緒に上り、一緒にゴールして平均何ワットだったか聞き出します。
相手との体重差を計算にいれつつ、自作パワーメーターと何ワット差があるか把握して、その差をなくすようスロープ値を変更します。
間違っても、自分よりも速い人と一緒にいってはいけません。
千切られたうえに、「平均出力は320wくらいかな」とドヤ顔されて、
普段の練習方法の校正が必要と凹んでしまうだけです。

■ご参考
パワー、トルク、角速度の解説動画です。
 https://www.youtube.com/watch?v=MO5Ylm9qJ5Q
解説者の方は、世界で最初に自作パワーメータの作り方を公開し、後に4iiii社と組んで商品化したエンジニアです。
この動画は、4iiiiと組む前に、自作パワー計Version3を趣味で製作された際に公開されました。

私は、パワーとトルクの違いも説明できなかったド素人ですが、こちらの方が公開された情報をもとに、パワー計の作り方を学びました。

彼はブログの中で、エンジニアとして、この世に革新的なものを生むには、 まず自分が基本的な事項を公開し教える、とのポリシーのもと、情報公開をされていました。
ありがとうございます。








誰でも簡単!?手作りパワーメーター(準備中)

現時点で最もお手軽に作れるクランクアーム型パワーメーターを製作しました。

■必要なハードウェアは
1)歪ゲージ付きアルミクランクと
2)電子回路

電子回路の基本モジュールは
- ADコンバータHX711(約150から350円。eBay、秋月等)と
- 無線マイコンBL652(約900円@Digikey)
の2つのみです。




■動作原理
電子回路に通電すると、
- マイコンBL652がADコンバータHX711にひずみゲージの値を読み取るよう命令を発行
- HX711は、約80回/秒でBL652にひずみゲージの値を送信
- クランクが1回転し、REEDスイッチがバイク・フレーム上のマグネット上を通過すると、REEDスイッチが磁力でONとなり、BL652が1回転に要した時間(ミリ秒)とそれまでに取得したひずみゲージの読み取り値の平均値をBLEで無線送信
- AndroidでBLE信号を受信し、パワー値を算出し、画面にパワー表示

以降、この繰り返し
です。

■組み立て

各電子部品を以下のように結線します。


赤線と黒線は、電源ラインです(赤が+、黒が-)。
ADコンバータとマイコンの接続は、緑とオレンジの2本のみの簡単配線です。

電池は、爆発リスクがなく充電できるeneloop、これをAE-XCL102D333CR-G(300円@秋月)で3.3vに昇圧しています。

HX711は読み取り速度を80Hzに変更(PIN15を浮かせてVDDに接続)しておきます。
HX711をひずみゲージに接続します。
<解説準備中>



個々のひずみゲージはただの可変抵抗と考えられ、プラスマイナスの極性はありません。
でも裏表はあるので、張り付けるときは、要注意です。

私は、アルミ用のひずみゲージを使用しています。
鉄用のは、未だに使いこなせておりません。

張り方はこちらで紹介されています。
https://shinshu-makers.net/shinshu_makers/2019/03/11/%e3%80%90mft2019%e3%80%91%e7%b0%a1%e5%8d%98%e8%87%aa%e4%bd%9c%e3%83%ad%e3%83%bc%e3%83%89%e3%82%bb%e3%83%ab%e8%ac%9b%e5%ba%a7%ef%bc%91%ef%bc%9c%e5%8d%8a%e6%97%a5%e3%81%a7%e4%bd%9c%e3%82%8c%e3%82%8b/

ありがとうございます。

ひずみゲージは4個を1組にWheastone bridge(下のOMEGA社の資料の図B)として結線します。
なぜか・・・
頭の良いWheastone氏がそれがよいと考えたから。
それを真似すれば間違いない。
当初は、本当にこんなレベルでやってました。








配線が無事に完了すると(120Ωのゲージの場合)
Exc+とExc- 間は約120Ω
Exc-とSig+間は約90Ω
Exc-とSig-間は約90Ω
上記から大きく抵抗値がずれる場合は配線に失敗してるので、見直します。

クランクへの貼り付け位置は、下のOMEGA社資料にある、bending strain計測用の図Cの位置に貼るのが基本のようです。





ハード的にはこれだけです。
あとフレームに100均マグネットを一つ、クランク上のReedスイッチ(1パック300円@秋月)が通過するそばにはります。

以下、パイオニアの説明書の引用ですが、同じように磁石をフレームに貼ります。
“マーク” との記載あるクランク箇所にReedスイッチをつけます。


ソフトウェアについては、
AndroidからマイコンBL652に、パワー計のファームウェアをUPLOADし、
<UPLOAD方法要説明追加>
対応アプリをAndroidにInstallすれば、パワー表示できます。

上記はデバッグ・アプリです。
クランク上のBL652からは、「:;001812E004D00268」
というフォーマットで文字列がBLE無線送信(advertise)されています。

この文字列の意味は上の図のとおり、
青□が歪ゲージの読取値(平均)
緑□が温度(BL652内蔵温度センサ)
ピンクがクランクが360度回転に要した時間ミリ秒
赤字がこれらをもとに算出したパワー値(3回転Average)

上記のAndroidのデバッグ・アプリは、このadvertiseを受信し、
パワー値を算出し、表示しています。
このadvertise送信を受信する方法は、connectionをはる必要がないので、安定して受信できるメリットがあります。
BLEのconnectionが切れて、データを受信できなくなることがなくなります。

ただ、このADVERTISEを1秒間に複数回受信できるのは、私の知る限りSONYのXPERIA Zシリーズのみです。
ジャンクなAQUOS, ARROWS, GALAXYのいづれも、受信が安定せず、最悪6秒程度、データを受信できない場合もありました。
BLEチップのファームかドライバの実装の問題のようで、ANDROID OSからでは、どうやっても解決できませんでした。


BLE無線送信用のファームウェア(.inoファイル)と
Androidデバッグ・アプリ(.zipファイル)のソースコードをUPLOADしました。
ttps://sites.google.com/site/myfiles1138000
本日の日付のファイル名です。
(実際にアクセスする場合、末尾の000を削除して1138で終わるようURLを修正する必要があります。ロボット除けのためで、お手数をお掛けします)

Androidの開発環境は、
Ubuntu 16.04
Android Studio 3.1.2

【ANT+対応(ZWIFT対応)について-ご質問へのご回答】

ZWIFTでパワーデータを受信するには、パワー計がBLEかANT+のPowerプロファイルに対応する必要があります。

今回の記事のパワー計は、いずれのパワー計プロファイルにも対応していません。
あくまで、BLEのAdvertiseをAndroidで受信して、パワー表示をしてます。



これをANT+に対応するには、
1.市販品のようにクランクからANT+で無線送信するか、
2.パイオニアのように一旦サイコン側でパワーデータを受信し、ANT規格に変換して送信しなおす必要があります。

上記1.は、クランク上の電子回路が複雑になります。クランク上の電子回路はその衝撃と遠心力で故障リスクが高いため、なるべく簡素化したいので、ANT送信モジュールは載せたくありません。
上記2.は、AndroidでANT無線送信する手段が考えられますが、簡単に作れるソースコードを持ち合わせておりません。

そこで、クランクからAdvertiseされてる無線データを拾い、ANT+規格に変換してZWIFTやGARMINに送信するデバイス「ANTコンバータ」を作りました。



クランクのデータは、AdvertiseとしてTV放送波のようにbroadcastされているので同時にAndroidとANTコンバータで受信可能です。

ハードの構成


BL652でクランクのデータを受信し、ArduinoProMiniにTx信号線で送信、
Arduinoは、HARDWARE Rx端子で受信して、パワー値を算出、ANT送信モジュール(D52またはAP2モジュール。詳細は2019年4月19日の「ArduinoとANT無線中継機とZWIFTオーバーテイクボタン」にあります)でANT送信します。

ANT+については、2019年5月現在、自作パワー計でもZWIFTはパワーデータを受信しています。
ただ、ZWIFTの問題として、PCのスペックが低いと、時折0Wと表示されてしまう問題を抱えているようです。


ANTコンバータ用のBL652とArduinoのソースコードを以下のサイトに置きました(2019/05/25の日付をファイル名としています)。

(実際にアクセスする場合、末尾の000を削除して1138で終わるようURLを修正する必要があります。ロボット除けのためで、お手数をお掛けします)

ttps://sites.google.com/site/myfiles1138000

なお、ANT通信を行うには、NETWORK KEYを入手してソースコードに書き込む必要があります。
このあたりは信州Makers管理人様が詳しく公開されております。
いつもありがとうございます。
http://maru-yo.net/shinshu_makers/2017/08/15/%E3%80%90%E3%83%91%E3%83%AF%E3%83%BC%E3%83%A1%E3%83%BC%E3%82%BF%E3%83%BC%E3%80%91antatmega328p%EF%BC%88%E5%86%85%E8%94%B58mhz%E6%8E%A5%E7%B6%9A%EF%BC%9C5v-3-3v%E3%82%82%EF%BD%8F%EF%BD%8B%EF%BC%9E/