田舎の家に取り付けた433MHz帯の無線警報システムで、離れた場所のセンサーが親機まで電波を届かせられない。厚い壁が信号を遮っていた。専用の中継器は高価で、システムごと入れ替えるのも現実的ではない。gabrielerandazzoと名乗る製作者は、Raspberry Pi PicoとCC1101トランシーバーで信号を中継する装置「RFRepeater」を自作し、MITライセンスでGitHubに公開した。
設計の要は、電波の中身を解読しない点にある。警報機や気象観測機、リモコンなど、家庭用の無線機器の多くはOOK(オンオフ変調)やASK(振幅偏移変調)と呼ばれる単純な方式を使う。信号のプロトコルを1つずつ解析していく代わりに、製作者はCC1101のGDO0ピンを非同期モードで使い、ピンの状態を38マイクロ秒ごとに読み取ってRAMに記録する方法を選んだ。オンとオフの並びをそのまま保存し、同じ順序で送り直す。いわばRF信号のテープレコーダーで、どんなプロトコルにも対応できる。
苦労したのは、いつ再送を始めるかの判断だった。電波は空気や障害物の影響で常に揺らぐ。信号の強さが設定した閾値をわずかに下回った瞬間に再送を始めると、まだ送信中の信号を途中で切ってしまう。そこで製作者は10dBmのヒステリシス(余裕幅)を設けた。いったん信号を捕らえたら、受信強度が閾値より10dBm以上下がるまで待ち、元のセンサーが送り終えたと判断してから記録した信号を全力で送り出す。
もう1つの壁は、CC1101が「聞こえなくなる」現象だった。周波数を走査しながら送信せずにいると、チップ内部の位相同期回路と状態機械が固まり、受信できなくなる。製作者はこれに対し、SIDLE、SFRX、SFTXというSPIコマンドを定期的に送ってバッファを空にし、チップを強制的に正常な受信状態へ戻す関数を組み込んだ。
配線はCC1101の8ピンをPicoのGPIOにつなぐだけで、はんだ付けの規模も小さい。設定はシリアル接続の対話型コマンドラインで指定する。周波数の走査範囲、捕捉を始める受信強度の閾値、周波数を刻む幅、記録時間を指定でき、設定値はPicoのEEPROMに保存される。書き込み時には整合性の検査を挟み、メモリーが壊れるのを防ぐ。単一の周波数だけを中継したい場合は、開始と終了に同じ値を入れればよい。
製作者は電波干渉についても投稿とREADMEの両方で断りを入れている。人口密度の低い地方の私有地で、自分が所有する合法な機器を中継する目的で設計したものであり、1回の作動につき数ミリ秒しか送信しないため、標準的な送信時間の制限には収まるという説明だ。そのうえで「隣家のガレージドアに対するリプレイ攻撃には使わないように」と釘を刺し、電波法規の順守を求めている。