RIGHT STUFF, Inc.Right Stuff Wrong StuffForerunner301の心拍センサー Forerunner301の心拍センサー。どういう信号が出ているのか気になります。もしこれを解析出来てシミュレーションツールでも作れれば試験が凄く楽になります。と言うことで調べてみました。 スペックを見るとForerunner301だけは周波数が127kHzと記載がありました。そこで広帯域受信機のVR-500でモニターしてみると、127kHz近辺で断続音を聞くことが出来ました。 VR-500で聞いた限りでは、だいたい2秒に一回の間隔で短い音がします。GPS側の表示更新もこういう言うイメージなので、2秒に一回データを送っているのでしょう。 2秒に一回の短い音の中に、どういったデータが含まれているのか見てみました。
トランスミッターの送信部と思われる部分の周囲に、その辺に落ちていた電線を巻き付けてプローブを繋いでみました。これだけで十分に観察出来る波形が出ます。 受信機で聴いたとおり、2秒に一回何らかのデータが出てきます。基本の周波数はスペックに書いて有るとおりで127kHzでした。この電波が適当なオンオフを繰り返して、全体としては10msから15ms程度のデータ列となって出てきていました。 最初はどこかのパルス幅が意味を持っているのでは無いかと考えて、スクワットを繰り返して心拍を上げては安静時のデータと違いを比較していました。しかし全く見えてきません。 くたびれてプローブを付けたままオシロの画面を見ていると、ある時くっついてずらっと並んだ列が無くなって1個のパルスだけになりました。GPS画面では心拍は1拍しか変わっていません。と言うことはもしかして二進数!? と予想を立てて連続した心拍データで検証したのが以下の資料です。
55拍の時の信号です。デジタルオシロでいい加減なサンプル数で見ていますから、細かい振幅は「嘘の波形」です。 100111000110111・・・と読めます。
56拍の時の信号です。 100111000111・・・と読めます。
57拍の時の信号です。 1001110001110011・・・と読めます。
58拍の時の信号です。 1001110001110101・・・と読めます。
解ってしまいました(^^)。 全部で16ビット。最初の1ビットがスタートビット。次の6ビットが固有のID。次の8ビットが心拍データ。最後の1ビットが偶数パリティ。です。 55拍の例では1001110001101110となります。これを「1」「001110」「00110111」「0」と分けてみると良くわかります。この場合は最初の「1」がスタートの合図です。IDは「001110」=14番と言うことになります。そして心拍は「00110111」=55拍と変なオフセットも無くそのままでした。最後のパリティーはこの場合「1」の合計本数が9本と奇数なので「0」です。 この予想に則って様々な心拍数を試してみるとバッチリでした。パルスの幅や間隔ではなくて、心拍数がそのまま二進数に変換され、モールス符号みたいにA1変調されて送られていたのでした。 心拍センサーはR波を拾う様になっていますので、R波の間隔を測定してその間隔をデジタル化する「周波数(周期)→デジタル変換」ICでも入っていて、それが127kHzの発振器をオンオフで変調しているのでしょう。ICの出力がシリアルの二進で有れば回路は相当簡単です。 Forerunner301のスペック上は30拍から240拍と成っていますが、データの幅的には0拍から255拍まで対応していることになります。下の30制限は変換ICの制限?で、上の240制限は常識的な上限?として設定されて居るような気がします。
変調しているパルスの幅を特定したかったので、16パルスの幅を計り直してみました。16パルス分で15.52msと出ました。これは1パルスの幅が0.97msとなり、逆算すると1031Hzとなります。 何回測定しても1パルスがキリの良い1msにはなりません。そこで色々と考えてみると時計用のクリスタルを分周すると近いことが解りました。時計用に良く用いられる32.786kHzを5分周すると1024Hzになります。これは測定値に非常に近い周波数です。 さらに心拍という時間軸の測定であることや、一般的で小型で安い周波数を用いる設計的な意味合いも納得出来ます。たぶん1024Hzなのでしょう。勝手に決めつけておきます(笑)。
何回か測定を繰り返しているとIDに関しても解ってきました。センサーは固有のIDを持っているのではなくて、起動時にランダムにIDを発生させて居るようです。上記の例は全て同じ心拍センサーを用いていますが、ID部分が変わっています。 最初は固有のIDを持っているのかと思っていましたが、それだと生産的に非常に効率が悪い様な気がします。まったく同じセンサーを生産して、起動時にランダムなIDを発生させる方法の方が理に適っています。 ここでIDには6ビット割り振られていますので、Forerunner301のセンサーには最大で2^6=64種類のIDが存在することになります。しかし「クラスの誕生日問題」と同じで、実際には64人がくっついて競技出来る訳ではありません。
ついでなのでそのほかの挙動も調べてみました。 単体で置いたセンサーは省電力モードに成っていて電波は出しません。胸に装着してR波を検出すると電波を出し始めます。この間が10秒から20秒くらいかかります。その後にGPS本体がIDを認識して、以後はこのIDだけを受信するぞと心に決めるわけです。 電波を出しているセンサーを意識的に胸から離すと電波は当然止まります。しかしある程度余裕が持たせてあって、こちらも10秒から20秒くらいは最後の心拍データを出し続けています。こういう処理がないと直ぐにエラーが出てしまうのでしょう。 直前のデータを出し続けている上記の10秒から20秒の間に再装着すると、新しい心拍データを出し始めます。センサーのIDは変わりません。 仮のデータを出し続けている期間を過ぎてもセンサーを胸から離していると、センサーは電波を止めてしまいます。一旦この状態になってしまうと、再装着しても電波が出るまでに時間がかかりますし、電波が出始めてもIDが変わっていますからGPSも直ぐには反応しません。従ってこういう状態を作らないように使うことが大事みたいです。
だいたい挙動が解りました。私が往年のラジオオジサンでPIC使いの名手ならば、チョチョイノチョイで電波を受信して心拍数を表示するおもちゃや、DIPスイッチで設定した心拍データを送信する試験用送信機を作っていることでしょう。 でも残念なことにそこまでの能力はないので(^^)、そう言う機械が完成するのはずっとずっと先のことになりそうです。 |