|
1. 概要 |
si4732というワンチップのラジオIC[1]のArduinoライブラリが公開されており[2]、多数の製作例が紹介されています。
このライブラリを使い、パソコンのブラウザ操作で利用するラジオを作ってみました。
ラジオアプリはWebサーバに置いて共同で利用することもできますし、自分専用のラジオアプリ(HTMLファイル)を作ってパソコンに置いて利用することもできます。
遠隔地にあるラジオを操作できるわけではありませんのでご注意ください。
|
通常のラジオの操作が困難な障害者の方も、「パソコン操作が可能であれば」利用できます。また、よく使うボタンを精選したり、ボタンを大きくしたり、Webページを工夫して使いやすくすることができます。 |
以下のブラウザ・マイコンおよびラジオモジュールで動作を確認しています。
| パソコンとブラウザ | 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の詳細はこちらをご覧ください。
以下はシンプルなラジオアプリの表示画面で、ボタンを押すと対応するラジオ局が聴こえます。

radio1.html:
|
Volume |
4行目でwebio2.jsを読み込んでいます。
12~16行目では選局ボタンを表示し、ボタンが押されると「onclick=...」で関数を呼び出しています。( )内で周波数表示の下限, 同上限, 周波数, 周波数調整のステップ を指定しています。 この関数はwebio2.jsで定義されています。この箇所を変更すれば、お住まいの地域のラジオ局を聴けるようになります。
17行目はボリュームです。
以下は少し高機能にしたラジオアプリの表示画面です。

ボリュームやチューナーのスライダーはそれぞれノブで調整できる他、マウスのホイール操作で行うこともできます。
~のボタンを押すと、短波帯のSSB波を受信できます。短波帯では、チューナースライダーの右に、

また、選局のボタン操作は「シンプルなラジオ」と同様ですが、カスタマイズできます。
のボタンを押すと以下のような編集画面が現れます。

各行がラジオ局のボタンに関する記述になっていて、
この部分を変更し、ボタンを押すとその内容がブラウザに保存されます。
[1] si47xx programming guide AN332, Skyworks.
[2] PU2CLR Si4735 Arduino Library
| 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) | ||||