はじめに
以前から、PC の画面を点滅させて、それを光センサで受信すれば、簡単に可視光通信ができるのではないかと思っていました。
そこで今回は、FM ラジオ IC の RDA5807FP と、2個の光センサ (フォトトランジスタ) を使って、動画を見せると電源が ON になってチャンネルが切り替わる、変な FM ラジオを作りました。
結果
- PC の画面上で 2個の四角形を白と黒に点滅させる動画を作って、フォトトランジスタに 2 線式シリアル通信 (I2C) でデータを送信しました。
- 通信速度は最大毎秒 15bit (注: 15Byte/s ではなく15bit/s。遅い!!) でした
- この方法で FM ラジオ IC にコマンドを送って、約3秒で電源 ON + チャンネルの切り替えができました
- 送信だけで受信はできないので、画面から IC への送信のみの一方通行の通信です
- EEPROM (24LC256) や、OLED 表示器 (SSD1306) にも同じ方法で I2C でデータを送って制御できました
回路図
FMラジオ IC RDA5807FP
回路図の右半分は RDA5807FP を使った FM ラジオです。この IC と水晶発振子、コンデンサ2個、ステレオイヤホンだけで FM ラジオが作れます。仙台市内では、アンテナ端子 (pin4) に 15cm くらいのビニール線をつなぐだけで十分に FM ステレオ放送が聴こえました。すごい感度です!!
この IC の本来の使い方では、SCLK (pin7) と SDA (pin8) をマイコン等に接続して I2C で通信して、電源を ON にしたり、チャンネル、音量などを制御します (逆に受信中の電波の強度や音声データを外部にデジタルで送信する機能もあります)。実はマイコンを使わず、IC に直接スイッチをつなぐだけで、電源、チャンネル、音量を操作できる隠しモードもあります。
ただし今回は普通ではない使い方です。マイコンも隠しモードも使わず、回路図の左半分に示したように SCLK (pin7) と SDA (pin8) にフォトトランジスタを接続して、受信した可視光の信号を直接送り込みます。
FMラジオ IC RDA5807FP に送るコマンド
RDA5807FP の SCLK(pin7) と SDA(pin8) に、I2C のプロトコルで、下記の図の ①~⑤ の5バイトを順に送信すると、FM ラジオとして動作します。
①の前にスタートコンディション、⑤の後にストップコンディションが必要です。この図の値は 76.0MHz を受信する場合の例で、20H,C0H,05H,00H,18H の 5バイトを送信すると、IC の電源が ON になり、76.0MHz の放送を受信し始めます。
図の中の値の意味は以下の通りです。
- I2C スレーブアドレス, R/W
常に RDA5807FP のスレーブアドレス(10H) を左に 1bit シフトした 20H を送信します。R/W のビット(0) は、外部から IC 方向への通信であることを表します。 - 音声出力, ミュート解除, 電源
電源を ON にして音声を出力するために、いずれも 1 にする必要があります。「電源」のビットを 0 にすると、電源が切れます。 - 新方式
RDA5807FP のデータシートに、このビットを1にすると新しい復調方式になり、受信感度が 1dB 上昇するとの記載があります。試したところ実際に受信感度が改善したようでしたので、今回は1にします。 - 周波数
受信したい FM ラジオ局の周波数を指定します。
$$ FM ラジオ局の周波数 = 周波数間隔 * x + 開始周波数 $$
の $x$ にあたる値 (10bit の整数) を書き込んで周波数を指定します。下記の通り、周波数間隔は 0.1MHz(=100kHz), 開始周波数は 76.0MHz です。 - 周波数変更
受信周波数の変更を有効にするために 1 を指定します。 - バンド
FM 放送で使用するバンド。日本では FM 補完放送を含めた全周波数を受信できるように 10H(76–108MHz) を指定します。
値 | バンド |
---|---|
00H | 87–108MHz (US/Europe) |
01H | 76–91MHz (Japan) |
10H | 76–108MHz (World wide) |
11H | 65–76MHz/50-76MHz(East Europe) |
- 周波数間隔
日本では 00H(100kHz) を指定します。
値 | 周波数間隔 |
---|---|
00H | 100kHz |
01H | 200kHz |
10H | 50kHz |
11H | 25KHz |
フォトトランジスタ
フォトトランジスタ(光センサ) は赤外線用ではなく、可視光に反応するものが必要です。今回は秋月で販売しているこの製品を2個使いました。

側面からの光に反応しないように、側面をゴムチューブでカバーしています (本当は写真よりも長めにしてしっかりカバーしたほうが良い)。ゴムチューブはカインズでサンプルにもらったこの製品(直径 4.5mm)を輪切りにして使いました。
ゴムチューブはダイソーでも買えるようです。
フォトトランジスタはトランジスタの一種で、順方向電圧をかけると、明るさに応じた順方向電流が流れるという性質があります。
今回のケースでどれだけの電流が流れるか測定するため、NJL7502L に 200kΩ の抵抗をつないで 3V の順方向電圧をかけ、液晶モニタに表示した白と黒の四角形に向けると、それぞれ下記の電流が流れました。
NJL7502L | 順方向電流 |
---|---|
液晶モニタの白色表示部分に向けたとき | 13μA |
液晶モニタの黒色表示部分に向けたとき | 0.5μA |
この順方向電流の差を利用して IC への入力を ON/OFF します。上の方にある回路図で、Q1, Q2 が白の時に OFF、 黒の時に ON になるように、下記のサイトを参考に R2 と R4 の抵抗値 (100kΩ) を求めました。
フォト・マイクロセンサの基礎知識:設計編 II
受光素子側の設計
I2C データ送信用動画
RDA5807FP に制御用の 5 バイトのデータが I2C で送信されるような動画を作りました。
SCL(SCLK) を左側、SDA を右側として、単純に電圧が H の 時に黒の四角形、L の時に白の四角形を表示して、点滅させているだけです。長さ 0.05 秒の (白-白) (白-黒) (黒-白) (黒-黒) の4パターンの動画を作って、ffmpeg コマンドで連結して作りました。また、現在どの値を送っているかを、動画の下の方に表示するようにしました。
この動画を、2 個のフォトトランジスタに向けて表示すると、ラジオ IC の電源が入って周波数が設定され、FM ラジオの受信が始まります。
日本の FM ラジオは 76.0[MHz] から 98.9[MHz] までの 230 チャンネルがあるようなので、力技ですが 230 個の動画を作って、どのチャンネルにも切り替えられるようにしました。例えば fm_on_76.0MHz.mp4 を再生すると、電源が ON になり、76.0[MHz] を受信します。ラジオの電源を OFF にするコマンドを送る動画 fm_off.mp4 も作成しました。
この動画をフォトトランジスタに見せたときの、FM ラジオ IC RDA5807FP の SCL(SCLK)(黄) と SDA(赤) の電圧は以下の通りです。左端の黄色い縦の点線がスタートコンディションで、その後 20H, C0H, ... と続けて送信されています。
横軸の 1 目盛りが 200[ms] なので、電気信号にしてはかなりゆっくりです。5バイトを送信するのに約4秒間かかります。
動画の再生速度を 1.5 倍に上げても動作しましたので、最大通信速度は 15bit/s でした。
実験: EEPROM (24LC256) の書き込み
同じ方式で、8 ピンの EEPROM 24LC256 に I2C で 1バイトのデータを書き込む実験をしました。
この EEPROM に I2C で
① A0H
② 書き込むアドレス(上位)
③ 書き込むアドレス(下位)
④ 書き込む値
の4バイトを送信すれば書き込みができます。ただし、通信が一方通行なので、書けても読み込む手段がありません。そこで、光通信での書き込み後に、別途下記の製品で正しく書き込まれていることを確認しました。
実験: OLED 表示器 (SSD1306) の表示
同じ方式で、コントローラに SSD1306 を使った OLED 表示器に文字を表示させる実験を行いました。

こちらはハードウェアの初期化、表示位置の指定、表示パターンと、送信するデータが少し複雑になります。
この HELLO の5文字を表示するだけで 67 秒かかりました。1文字表示するのに、表示位置の指定も含めて13バイトを送信しています。文字以外の場所は初期状態でノイズが表示されていますが、時間がかかりすぎて消すのはあきらめました。さすがにこの使い方は厳しいですね。
備考
今回気づいた点を以下に書いておきます。
- 通信速度
今回使った液晶モニタのリフレッシュレートは 120Hz で、毎秒 120 枚の画像しか表示できません。動画のどこで液晶画面が切り替わるかのタイミングは分かりませんので、確実に送れる情報量はこの半分程度でしょう。I2C の 1bit を送信するためには 2~3フレームの画像が必要なので、通信速度は 20~30bit/s が上限と考えました。
今回、動画の再生速度を変えて実験したところ、15bit/s まで動作しましたので、無茶な方式の割には意外と上限に迫っていると思います。 - FMラジオ IC RDA5807FP の入手
Aliexpress で、この IC を使った FM ラジオキットが数百円で売られています。今回はキットを購入して、その中の IC だけを使いました。IC 単体でも売られているようです。 - RDA5807FP の GND ピン
pin2, pin5, pin14, pin11 は IC 内部で結線されていて、実際はどれか1か所だけを GND に接続するだけでも大丈夫でした。ただし pin6 だけは隠しモードの有効化/無効化の選択に使われており、オープンにせず必ず GND に接続する必要があります。pin3 (RF_GND) も GND に接続する必要があるでしょう。 - RDA5807FP の I2C 端子と VDD の間の抵抗値
RDA5807FP の SCLK(pin7)とVDD(pin10)間, SDA(pin8)とVDD(pin10)間の抵抗値はいずれも 70kΩ 程度でした。通常はこれらの端子は外部の I2C バスのプルアップ抵抗に接続されるので問題になりませんが、回路によってはこの抵抗値を考慮しないといけないケースがあります。 - 音量調整
RDA5807FP の pin12,pin13 からアナログの音声が出力されます。この IC にはデジタルで音量を調節する機能がありますが、そのためにはチャンネルの切り替え後に、追加で4バイトの送信が必要なため、今回は省略しました。電源 ON 時のデフォルトでは音量が最大です。イヤホンで直接聴くと音が大きすぎるので、1μF のコンデンサを入れて音量を絞っています。ここを 100μF にすると音が大きくなります。 - 受信感度
キットや制作例では、アンテナ端子にコイル (100nH) とコンデンサ (30pF) による共振回路を入れている例が多いですが、仙台市内では単にアンテナ端子に15cm のビニール線をつなぐだけでも良好に受信できました。
5kW で送信している FM ラジオ局の場合、送信所から 10~20km ほど離れると雑音で聴き取りにくくなりますが、その場合はアンテナ端子に 1.5m 程度のビニール線をつなぐとよく聴こえるようになりました。ただし 20W で送信しているコミュニティー FM の場合は、近所であっても屋外に 1.5m 程度のビニール線を出して受信する必要がありました。 - フォトトランジスタの反応速度
フォトトランジスタの反応速度が意外と遅く、今回使った NJL7502L では明→暗の反応に数[ms]~10[ms] 程度かかっています。秋月で購入した別のフォトトランジスタ NJL7302L では、明→暗の反応に 150[ms] くらいかかりました。これを高速化する方法がありましたら教えてください。 - I2C 誤受信
可視光通信中に突然動画を止めると、その後誤動作で突然ラジオの電源が切れることがありました。フォトトランジスタは電源が入っている間、常に光を受信していますので、ノイズを I2C のデータと誤認する可能性があります。スタートコンディション+スレーブアドレスがたまたま一致することはまれなので、何も入力していないのにノイズでラジオが反応することはまずないと思いますが、正常なスタートコンディションの受信後に動画を止めると、ストップコンディションが受信されるまで、SCL にノイズが入るたびに誤ったデータ (おそらく00H) を受信し続けると思われます。