$49パワー計に採用したNordic社のマイコン、nRF52は、内蔵するソフトウェアによって、スピードセンサ、心拍センサー、パワーセンサーと様々なものに変身させることができます。
nRF52を使ったパワー計には、それ用のソフトウェアが必要です。
今回、BLE(Bluetooth Low Energy)上で文字列を転送できる“nRF UART”という通信方式で、パワー計のデータを無線送信するソフトウェアを作成しました。
送信されたパワー計の情報は、Android/iOS上で動作するnRF UARTまたはnRF Toolboxというアプリで表示できます。
BLE上で強引に文字列を転送するためか、端末によってはかなり動作が不安定です。
ANT+対応のパワー計を作る前に、
製作したパワー計が正常動作しているか、必要なデータを取得して確認し、
個々のクランク毎に異なるゼロオフセット値、スロープ値を算出する必要があります。
この目的には、ANT+規格で送信できるデータだけでは不十分で、bluetoothで様々な値を転送し、PC/Smartphone上で表示・確認する必要があります。
こんな感じで表示されます。
ソースコードをまるごと公開しようとしましたが、
「SDKのサンプル部分を除いて、独自開発した部分のみを差分として公開せよ」
との権利元のNordic社がお達しを出してます。
逆らってもしかたがないので、こちらに差分を公開しました
ttps://sites.google.com/site/myfiles1138000
(20170606.cというファイル名です。実際にアクセスする場合、末尾の000を削除して1138で終わるようURLを修正する必要があります。ロボット除けのためで、お手数をお掛けします)
この差分をSDK内の
...\nRF5_SDK_12.1.0_0d23e2a\examples\ble_peripheral\ble_app_uart
BLE_UART内のmain.cと結合します。
具体的には、main.c内の“int Main(void)”から最後までを選択し、削除。
イメージ図
削除された部分に、上記差分ファイルをコピペします。
以上です。
なお、本ソースコードは、パワー計の基本アルゴリズムの理解のために作成してます。
わかり易さを優先しているので(本当にわかりやすいかは不明です。コンピュータのプログラムを学んだのは、子供の頃にベーマガ(マイコンBASICマガジン)を少し読んだ程度ですので。)、実際には、改変をして以下の機能を実装した方がよいです。
・精度向上のためのADコンバーター内蔵アンプの設定
・ボタン電池駆動用の省電力間欠動作設定
・ひずみゲージ回路の節電用の間欠動作設定
・温度補正
これらはなくとも最低限のパワー計としての動作はします。
基本的な動作は、
1.Mainルーチンが開始されると、ADコンバータからひずみゲージの値を読み取り、それを繰り返します。
2.クランクが一回転し(リード・スイッチがフレームに張り付けた磁石を通過し)リードスイッチがONになると、それまでに取得したひずみゲージ値と角速度をもとにパワー計算を行い、無線送信します。
基本は、この繰り返しです。
ANT+用のサンプル・ソースがNordicのSDKに含まれているので、このソースコードを移植すれば、簡単にANT+対応にできます。
また、本ソースコードは、ひずみゲージ回路が1回路であることが前提です。
従来通り、クランクアームの上下に4枚のひずみゲージを配置するほか他に、
以下の(赤丸ではなく)緑の矢印の面にそれぞれ1枚ひずみゲージを配置する方法に対応します。

この方法は、SRMと同じく、スパイダーアームがチェーンによりピンクの矢印方向に引っ張られる際のひずみを計測します。
条件付きながら、よいデータが得られています。
この方式では、選択しているリアのギアがトップの場合とローの場合で、計測誤差がでるハズですが、ほぼ無視できそうです(5%とかの差はなく、SRMもこの誤差は補正してないようです)。
メリットとしては、パワー値が安定しており、乗り手の感覚に近い値がでます。
パワータップハブは、クランクの回転とは無関係にパワー値を送信してきて、また同じパワーで回しているのに、今回は270w、次回は30wも下がって240wとか送信してくるため(勿論、平均を表示させれば正確です。)、やや使いづらいと感じます。
構造的には素晴らしいアイデアと技術のパワーメーターではありますが。
クランクアーム式もスパイダーアーム式と比べると・・・