HOME > ものづくり(電子工作) > ラジオ

ブラウザで操作する ラジオ

小山智史

(更新履歴)


目次

1. 概要
2. 動作環境
3. シンプルなラジオアプリ
4. 高機能のラジオアプリ
(付録1) データ送信プロトコルとJavascript関数


1. 概要

 si4732というワンチップのラジオIC[1]のArduinoライブラリが公開されており[2]、多数の製作例が紹介されています。

 このライブラリを使い、パソコンのブラウザ操作で利用するラジオを作ってみました。

 ラジオアプリはWebサーバに置いて共同で利用することもできますし、自分専用のラジオアプリ(HTMLファイル)を作ってパソコンに置いて利用することもできます。

 遠隔地にあるラジオを操作できるわけではありませんのでご注意ください。

 通常のラジオの操作が困難な障害者の方も、「パソコン操作が可能であれば」利用できます。また、よく使うボタンを精選したり、ボタンを大きくしたり、Webページを工夫して使いやすくすることができます。


2. 動作環境

 以下のブラウザ・マイコンおよびラジオモジュールで動作を確認しています。

パソコンとブラウザ Windows版Chrome, Edge など
(Web MIDI API 対応ブラウザ)
マイコン XIAO samd21
ラジオモジュール aitendoのSI4732ラジオ基板

 下の写真のようにブレッドボードで簡単に組み立てできます。操作はブラウザ画面で行うので、スイッチなどはありません。

 webio2.zipを解凍し、XIAO samd21に書き込みます。webio2.inoでは、PU2CLR Si4735 Arduino Library[2]や、USB-MIDIなどのライブラリを使っているので、Arduino-IDEでインストールしてコンパイルしてください。

 また、ラジオアプリではJavascriptライブラリwebio2.jsを利用しています。si4732関連のプロトコルは付録1をご覧ください。webioの詳細はこちらをご覧ください。


3 シンプルなラジオアプリ

 以下はシンプルなラジオアプリの表示画面で、ボタンを押すと対応するラジオ局が聴こえます。

radio1.html:

<!DOCTYPE html><html><head> <meta charset="utf-8"> <title>SI4732 ラジオ</title> <script src=webio2.js></script> <script> function setup(){ RXsetup(3,1); // 3: reset pin, 1:AM(0:FM) } </script> </head> <body> <p><button onclick=RXsetAM(522,1629,846,9)>NHK R1</button> <button onclick=RXsetAM(522,1629,1215,9)>RAB</button> <button onclick=RXsetFM(7600,9500,8600,10)>NHK FM</button> <button onclick=RXsetFM(7600,9500,8000,10)>FM青森</button> <button onclick=RXsetFM(7600,9500,7880,10)>FM AppleWave</button></p> <p>Volume <input type=range onchange=RXsetVolume(this.value) min=0 max=63 value=40></p> </body></html>

 4行目でwebio2.jsを読み込んでいます。

 12~16行目では選局ボタンを表示し、ボタンが押されると「onclick=...」で関数を呼び出しています。( )内で周波数表示の下限, 同上限, 周波数, 周波数調整のステップ を指定しています。 この関数はwebio2.jsで定義されています。この箇所を変更すれば、お住まいの地域のラジオ局を聴けるようになります。

 17行目はボリュームです。

4 高機能のラジオアプリ

 以下は少し高機能にしたラジオアプリの表示画面です。

 ボリュームやチューナーのスライダーはそれぞれノブで調整できる他、マウスのホイール操作で行うこともできます。

 のボタンを押すと、短波帯のSSB波を受信できます。短波帯では、チューナースライダーの右に、

の表示が現れるので、この部分にマウスポインタを置いてホイール操作を行うと、100Hz単位でチューニングできます。

 また、選局のボタン操作は「シンプルなラジオ」と同様ですが、カスタマイズできます。

 のボタンを押すと以下のような編集画面が現れます。

 各行がラジオ局のボタンに関する記述になっていて、

のように「,(カンマ)」で区切られています。

 この部分を変更し、ボタンを押すとその内容がブラウザに保存されます。

(参考資料)

[1] si47xx programming guide AN332, Skyworks.
[2] PU2CLR Si4735 Arduino Library


(付録1) データ送受信プロトコルとJavascript関数

send(PC → I/O) receive(I/O → PC) JavaScript関数備考
11110000(F0)
01111101(7D)
01110101(75)
00000001(01)
00000000(00) 11110111(F7) RXreset() SI4732をリセット
00000001(01) 11110111(F7) RXalive() SI4732動作中
0pppmmm0 11110111(F7) RXsetup(resetpin, mode) SI4732の利用を開始
mode: 0(FM) 1(AM)
11110000(F0)
01111101(7D)
01110101(75)
00000010(01)
0vvvvvvv 11110111(F7) RXgetCurrentRSSI() ... 0-127
11110000(F0)
01111101(7D)
01110101(75)
00000010(02)
00vvvvvv(0-63) 11110111(F7) RXsetVolume(0-63)
01xxxxxx(64-) 11110111(F7) RXvolumeUp(64)
RXvolumeDown(65)
RXsetAudioMute(66(true))
RXsetAudioMute(67(false))
RXfrequencyUp(68)
RXfrequencyDown(69)
RXseekStationUp(70)
RXseekStationDown(71)
RXseekStationProgress(72/73)
11110000(F0)
01111101(7D)
01110101(75)
00000010(02)
00vvvvvv(0-63) 11110111(F7) RXgetVolume() ... 0-63
01xxxxxx(64-) 11110111(F7) RXisCurrentTuneAM() ... 64
RXisCurrentTuneFM() ... 65
RXgetCurrentPilot() ... 66
RXisCurrentTuneSSB() ... 67
11110000(F0)
01111101(7D)
01110101(75)
00000011(03)
0fffffff(LSB)
0fffffff
000000ff(MSB)
または
000001ff(MSB)
11110111(F7) RXsetFrequency(freq) freq: 0-65535 kHz(FMでは10kHz単位)
0fffffff(LSB)
0fffffff
000000ff(MSB)
または
000001ff(MSB)
11110111(F7) RXsetSSBBfo(bfo) bfo: -16383 - 16383 Hz
11110000(F0)
01111101(7D)
01110101(75)
00000011(03)
0fffffff(LSB)
0fffffff
00000cff(MSB)
11110111(F7) RXgetFrequency() ... 0-65535(c=0)
RXgetcurrentFrequency() ... 0-65535(c=1)
11110000(F0)
01111101(7D)
01110101(75)
00000100(04)
00aaaaaa(0-36) 11110111(F7) RXsetAutomaticGainControl(0/1, AGC) 0:enable/1:disable
AGC: 0(minAtt)-36
0100pbbb 11110111(F7) RXsetBandwidth(b(0-6), p(0/1)) 0:6kHz 1:kHz 2:3kHz 3:2kHz(default)
4:1kHz 5:1.8kHz 6:2.5kHz
01010sss 11110111(F7) RXsetSSBAudioBandwidth(s(0-5)) 0:1.2kHzLPF(default) 1:2.2kHzLPF 2:3kHzLPF
3:4kHzLPF 4:500HzBPF 5:1kHzBPF
11110000(F0)
01111101(7D)
01110101(75)
00000100(04)
00aaaaaa 11110111(F7) RXgetAutomaticGainControl() ... 0-36
11110000(F0)
01111101(7D)
01110101(75)
00000101(05)
0fffffff(LSB)
0fffffff
000000ff(MSB)
0fffffff(LSB)
0fffffff
000000ff(MSB)
0fffffff(LSB)
0fffffff
000000ff(MSB)
0fffffff(LSB)
0fffffff
000000ff(MSB)
11110111(F7) RXsetAM(minFreq, maxFreq, Freq, Step) 0-65535 kHz
11110000(F0)
01111101(7D)
01110101(75)
00000110(06)
0fffffff(LSB)
0fffffff
000000ff(MSB)
0fffffff(LSB)
0fffffff
000000ff(MSB)
0fffffff(LSB)
0fffffff
000000ff(MSB)
0fffffff(0-127)
11110111(F7) RXsetFM(minFreq, maxFreq, Freq, Step) 0-65535 (10kHz単位)
11110000(F0)
01111101(7D)
01110101(75)
00000111(07)
0fffffff(LSB)
0fffffff
000000ff(MSB)
0fffffff(LSB)
0fffffff
000000ff(MSB)
0fffffff(LSB)
0fffffff
0000ULff(MSB)
0fffffff(0-127)
11110111(F7) RXsetSSB(minFreq, maxFreq, Freq, Step, 1/2) 0-65535 kHz
1:LSB 2:USB
11110000(F0)
01111101(7D)
01110101(75)
00001000(08)
0fffffff(LSB)
0fffffff
000000ff(MSB)
0fffffff(LSB)
0fffffff
000000ff(MSB)
11110111(F7) RXsetSeekAmLimits(minfreq, maxfreq) 0-65535 kHz
0fffffff(LSB)
0fffffff
000001ff(MSB)
0fffffff(LSB)
0fffffff
000001ff(MSB)
11110111(F7) RXsetSeekFmLimits(minfreq, maxfreq) 0-65535 (10kHz単位)
11110000(F0)
01111101(7D)
01110101(75)
00001001(09)
00vvvvvv(0-63) 11110111(F7) RXsetAmSpacing(0-63) 0-63 kHz
01vvvvvv(0-63) 11110111(F7) RXsetFmSpacing(0-63) 0-63 (10kHz単位)
11110000(F0)
01111101(7D)
01110101(75)
00001010(0A)
00vvvvvv(0-63) 11110111(F7) RXsetSeekAmRssiThreshold(0-63) 0-63 (default 25dBuV)
01vvvvvv(0-63) 11110111(F7) RXsetSeekFmRssiThreshold(0-63) 0-63 (default 20dBuV)
11110000(F0)
01111101(7D)
01110101(75)
00001011(0B)
00vvvvvv(0-63) 11110111(F7) RXsetSeekAmSNRThreshold(0-63) 0-63 (default 5dB)
01vvvvvv(0-63) 11110111(F7) RXsetSeekFmSNRThreshold(0-63) 0-63 (default 3dB)