血圧計の解析(2)

昨日の続き。

逆さにしてみたり、横にしてみたりして、考えたけど、 わからなかった。

まだ、全然違う所にあるパットがあるから、そっちを調べようと思い、再度分解し、 周辺を調べたら、クロックっぽい信号がでてるのを発見した。

昨日もこのピンを調べたと思うんだけど、 昨日は押し付けが甘かのかな?

この2つを合わせたら、どうもi2cっぽい信号だ。

i2c

データを集めたいが、ノートPCのメモリ10GBいっぱいにデータを読み書きしても足りないし、 保存が遅い。 そこで、Hantek 6022BLのロジアナモードを使う事にした。 これならデータ量が1/8で済むはずだ。

ロジアナのプローブは固定できなかったので、 ケーブルをハンダ付けした。 最初は太いケーブルを付けて、「これだとパターン剥げそうだな。」と思ってたら、 パターン剥してしまった。

なんてこったい。

とりあえず、横のスルーホールが残っていたので、そこに配線しなおした。 ついでに、細いポリウレタン線に替えた。

また取れちゃうかもしれないから固定方法を考えないと。

上から瞬間接着剤をたらして固定かな? ディスプレイに近いから気をつけないと。

wire

データを解析

気をとりなおして、 解析した結果、このバスには、 54,55,75,77などのアドレスのデバイスがあるようだ。

このうち、アドレス54はフラッシュロムのようなパターンに見える。 起動時に、中身を全部ダンプしてCPUに読み込んでる。

このBP710は、過去の計測結果を14件保存して後で見る事ができる。

ここから考えると、この信号は、機器内部のi2cバスがそのまま出ていて、 アドレス54のデバイスに、計測結果を保存してるはずだ。

そう考えて、血圧計測が完了した辺りのデータを見てみる。 次のような事が行われていた。

  1. 4バイトのデータを保存。 アドレスは0x70-0xA7のどれか (指定された書き込みアドレスは0x70から0xA4で順繰り)
  2. さっき書いた4バイトのデータを読み込む。 ベリファイ用だと思う。 これは書き込み直後だと、busyで失敗するみたいで、リトライが何度も行われる。
  3. アドレス0x6Eと0x6Fに、2バイトのデータを書き込む。 どちらのバイトも毎回違う。
  4. アドレス0x6Eと0x6Fを読む。

たぶん、リングバッファになっていて、先頭アドレスを書き込んでるんじゃないか?と思って、もっと見てみる。

まず、1で書いてる4バイトのデータ。 バイト3とバイト4は、拡張期血圧と、心拍数の16進数表記そのものにみえるが、 バイト2は収縮期血圧ではない。

血圧計のカタログを読むと、 血圧0から299まで測れるから、バイト1と2と3を組み合わせて、 血圧の2つの値を構成してるのではないかと思ったんだけど、 足したり掛けたりビットシフトしたけど、わからなかった。 計測値が1しか違わなくても、複数のバイトが変わる。

何度も計測して、差をとったりした所、 バイト2は収縮期血圧に25を足した物だと気がついた。

たぶんバイト1はチェックサムじゃないかな? 俺だったらチェックサムは最後につけるけど、 このマイコンは起動時にフラッシュを全部読めるぐらいメモリがあるし、 最初に計算してから書き込んでるんだろう。

カタログスペックでは血圧299まで測れるそうだけど、 256までしか記録できないのかな。

これを踏まえて、3で書いてるデータを見ると、 0x70に書いてる時に2バイト目が1だから、 最後に書き込んだ位置を1オリジンで書いていて、 1バイト目はチェックサムかもしれない。 いや、そうに違いない。

つづく

さて、ここまで来たら、実際にマイコンで読む事を考えたい、 ESP8266をつけりゃいいと思ってたんだけど、 i2cバスをスパイするとなると、リアルタイム処理ができないとこまる。 さてどうしたものか? とりあえず、arduinoをつけてみようか。