0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

GNU Radioで体温計の音波通信をデコードする — OMRON MC-6800B

0
Last updated at Posted at 2026-02-07

はじめに

体温計の買い替え検討していた時に、オムロンの体温計 MC-6800B に、「音波通信で測定データをスマホに転送する」機能があり無線屋的に興味を持ちました。結構詳細に書いてある技術解説もあったので数百円高いけど買ってしまいました(笑。

オムロン技報: 音波通信技術の体温計への応用

内蔵の圧電ブザーから音波を発し、スマホのマイクで受信&デコードする仕組み。ASKということも明記してあるのでこれはいけるかと。というわけで、この情報を元にGNU Radio Companion(GRC)でフローグラフを組んでデコードしてみました。

信号の概要

実測してみると搬送波が約17.2kHz付近。という感じ。

Freq.jpg

パラメータ
変調方式 ASK(振幅偏移変調)
搬送波周波数 17,200 Hz
ビット周期 ~12ms
パケット長 56 bit(7バイト)?

パケット長については未確定。約720ms間隔で繰り返し送信。

フローグラフ全体像

とりあえずスマホで録音して試行して、最終的には以下の感じになりました。

GnuRadio.jpg

Audio Source (WAV 48kHz)
   ↓
Band Pass Filter (16,700 – 17,700 Hz)
   ↓
Hilbert Transform → Complex to Mag  ← 包絡線検波
   ↓
Moving Average (48tap = 1ms窓)
   ↓
AGC2 (振幅正規化)
   ↓
Add Const → Binary Slicer  ← 閾値判定で0/1化
   ↓
Packet Decoder (epy_block)
    │
    ├──→ [Message Debug] (パケットHEXダンプ)
    └──→ [Temperature Display] (Qt GUI 体温表示)

各ブロックの役割

帯域通過フィルタ

搬送波17,200Hz ± 500Hzの帯域だけ通すように。日常の雑音(会話、テレビ等)はここでほぼ除去されます。

BPF.jpg

low_cutoff:  carrier_freq - bandwidth = 16,700 Hz
high_cutoff: carrier_freq + bandwidth = 17,700 Hz
transition:  200 Hz
type:        FIR Band Pass (Hamming窓)

AM復調(包絡線検波)

ASK復調の定石として、AM復調と同様に包絡線検波を行います。
ヒルベルト変換で解析信号を作り、絶対値を取ることで包絡線(エンベロープ)を得ます。

demo.jpg

Hilbert FC → Complex to Mag → Moving Average (48 samples)

移動平均の48サンプルは48kHz÷48=1msに相当し、搬送波成分のリップルを平滑化します。

AGC と 2値化

AGC2ブロックで振幅を正規化した後、閾値(デフォルト0.5)と比較してBinary Slicerで0/1のビット列にします。

パケット構造

ここはちゃんとした資料がないのでいくつかのパターンを独自解析してみた結果です。56ビット = 7バイトのパケットが繰り返し送信されます。

Byte0: 0x55  (同期バイト: 01010101)
Byte1: 0x51  (デバイスID)
Byte2: var   (体温データ)
Byte3: ??    (チェックサム等)
Byte4: ??
Byte5: ??
Byte6: ??

手持ちデータから推測した体温の計算式:

temp_celsius = 40.25 - Byte2 / 20

例えば Byte2 = 0x4B (75) なら:

40.25 - 75/20 = 40.25 - 3.75 = 36.5℃

という感じではないでしょうか...。ビット列が出た時点でだいぶ満足してしまったので、パケット構造はちょっと自信がないです。

最初の同期バイト 0x55 は 01010101 のビットパターンになっているので、定番な感じですね。

ビット判定のロジック:

  • ON区間bit_threshold_samples (5ms = 240サンプル) より長い → ビット 1
  • 短い → ビット 0
  • OFF区間packet_gap_samples (20ms = 960サンプル) を超えたらパケット境界

まとめ

体温計の音波通信は、搬送波17.2kHzのASK変調に56ビット(7Byte)パケットを載せただけのシンプルな構成でした。GNU Radioの基本ブロック(BPF → ヒルベルト変換 → 包絡線検波 → 2値化)でデコードできました。

オムロン技報ではAM復調にピーク包絡線検出を使い、ブザー由来のスパイクノイズ除去フィルタも入れていますが、GNU RadioではHilbert変換+移動平均で代用しました。実験的にはこれで十分でした。

BLEペアリング不要でマイクに近づけるだけで瞬時に取りこまれる動作は非常に快適です。ブザーの可聴帯域ギリギリを使ったナローバンドASKという、無線家的にも面白い実装でした。

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?