2017年6月6日火曜日

$49パワー計(ソフトウェア編 - nRF UART版)

$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とか送信してくるため(勿論、平均を表示させれば正確です。)、やや使いづらいと感じます。
構造的には素晴らしいアイデアと技術のパワーメーターではありますが。

クランクアーム式もスパイダーアーム式と比べると・・・












4 件のコメント:

  1. はじめまして。すごいですね!
    私も少し前に自作PMに熱をあげてました。センサこさえるの面倒で有線SRMのANT+信号コンバーターになっちゃいましたが。

    こちらの一連の記事拝見して、熱が再燃するかも?とnRF52の開発ボード&モジュールをポチりました。わかんなかったら教えてくださいw

    過去作は下記のあたりです。
    Twitter #project_UnQo

    https://github.com/crashracer/msp430-launchpad-WiredSRM-ANTpuls-Converter?files=1

    https://youtu.be/ipNEOol4wtU



    返信削除
    返信
    1. goloveskiさん

      こんなマイナーなブログに興味をもっていただき、ありがとうございます。
      感謝、感謝です。

      昔、Growtac代表のkさんがGTローラーにANT規格を実装するにあたり、ヘルプを求め、goloveskiさんが的確なサポートを提供されたと記憶しております。
      私よりも遥かに工作のスキルをお持ちのようで、私にできることはほとんどないと思いますが、何かお手伝いできることがありましたら、何なりとお問い合わせください。

      goloveskiさんのようなホビーレーサー界に影響力のある方が製作すれば、手作りパワー計の認知度も上がるのではと、楽しみです。

      goloveskiさんと関係があるかわからないのですが、Gotoronicというカンパにもシマノにも何速でも対応できるfantasticな電動ディレーラの記事を見つけました。nRF52の無線機能と組み合わせると、SRAMのeTapを上回るgTapとか作れてしまうと妄想して楽しんでしまいました。

      削除
  2. コメントありがとうございます。ついに量産体制ですかw
    とりあえずnRF52DKとD52モジュールをゲットしましたが、よくわかんなくて発狂してます。
    D52モジュールの方にはsoftdevice S212がすでに入っているんですかね?別途入れないといけませんか?

    あとgotoronicは不肖ワタクシ発のブツです。
    性能もですが見た目が大変イケてないですw

    返信削除
  3. ご連絡ありがとうございます。
    量産体制と書きましたが、スパイダーアーム式のPMは、実走の実績がないので、これらからテストしていく予定です。
    D52モジュールの方には、Dynastream社の過去の製品nRF24AP2モジュール等と互換動作をさせるためのfirmwareが書かれています。
    独自開発のfirmwareを書き込むには、まずこれを完全消去するか、上書きする必要があります。
    SDKのBLE心拍センサーのサンプルの.hexファイルあたりを、mbedのフォルダにコピーし、D52Qモジュールの初期firmwareを上書きすれば、あとはnRFgo Studioから制御できたはず、と記憶しています。
    これでもダメな場合は、またご連絡をお願いします。
    このあたりのネタを公開しようと思いますので。
    Rigado製のnRF52モジュールが一番やっかいで、Dynastreamがその次っだと思います。

    gotoronic、素晴らしいです。
    私は、電動ディレーラの製作に挫折していたので、とても参考になります。


    返信削除