Si4730とArduino Nanoで作る全帯域ラジオ:長波、中波、短波、FM対応
必要な部品と材料
| 部品 | 数量 |
|---|---|
| Arduino Nano R3 | 1 |
| Si4730 ラジオモジュール | 1 |
| Adafruit 標準LCD - 16x2 白文字/青背景 | 1 |
| プッシュボタン付きロータリーエンコーダー | 1 |
| 開発ボード、クラスDオーディオアンプモジュール | 1 |
| スピーカー:0.25W、8オーム | 1 |
| 古いMWラジオから取り出したフェライトバーアンテナ | 1 |
| スライドスイッチ | 1 |
必要なツールと機械
- はんだごて(汎用)
使用するアプリとオンラインサービス
- Arduino IDE
プロジェクト概要
Arduinoラジオと言えば、現代ではFMラジオ(ヨーロッパでは88-108 MHz)を思い浮かべます。長波(LW)、中波(MW)、短波(SW)バンドは0.2〜30 MHzの範囲をカバーします。特にSWは興味深いバンドです。短波帯の電波は、電離層と呼ばれる大気中の電気を帯びた原子の層で反射または屈折します。したがって、短波ラジオは非常に長距離通信に使用でき、時には大陸を越えた通信も可能です。
以下に、上記すべてのバンドをカバーするラジオの開発を紹介します。このラジオの「心臓部」は、Silicon LabsのSi4730 ICで、AliExpressで小型開発ボードの形で数ドルで購入できます。

このボードはArduinoでI2Cプロトコルを使用して制御します。コードはJulio C. Rosa氏によって書かれ、以下のコードと回路図とともに提供されているSi4735-I2C-R4ライブラリに基づいています。メーカーはこのチップ(Si4730)がAM/FM専用と言いますが、実際にはSWでも動作します。オーディオ出力には、非常に安価で機能的なミニデジタルアンプボード2×3W PAM8403クラスDを使用しています。
デバイスは適切なケースに組み込まれ、完全な小型ワールドバンドラジオとなっています。私は比較的人口密集地の1階に住んでおり、10メートルの長いアンテナを使用していますが、受信感度は弱いものの、私が持っている市販のポケットラジオと同等の品質です。
最後に、このチップはTECSUN、DEGEN、SANGEANなど、多くの有名なポータブルラジオブランドで使用されています。
コード
Code C/C++
/**************************************************************************************************
JCR Si4730/5 Receiver LW/MW/SW/FM - 共有版. 配線詳細については回路図を参照.
Written by Julio C. Rosa - The CesarSound - May/2019
Commands:
radio.volumeUp(); radio.volumeDown(); radio.seekDown(); radio.seekUp();
radio.mute(); radio.unmute(); radio.setMode(FM); radio.tuneFrequency(9490);
radio.getStatus(); radio.getVolume(); radio.getMode(); radio.getMute();
radio.toggleMute();
RSQMetrics rsq; radio.getRSQ(&rsq); (rsq.stereo); print_number(rsq.stereoBlend);
print_number(rsq.SNR); (rsq.seekable); print_number(rsq.RSSI);
print_mode(); print_station_freq(); print_volume(); print_mute(); print_home();
radio.getCallSign(callSign); printp(rds1); Serial.write(callSign);
radio.getProgramTypeStr(programType); Serial.write(programType);
(rds1); (rds2); (rds3); (rds4); (rds5);
*****************************************************************************************************/
// Library
#include <Si4735.h>
#include <LiquidCrystal.h>
#include <rotary.h>
#include "Wire.h"
// I/O Settings
Rotary r = Rotary(2, 3);
LiquidCrystal lcd(12, 13, 7, 6, 5, 4);
const byte band = A0;
// Variable setting
unsigned int freq = 880;
unsigned int freqmax = 10800;
unsigned int freqmin = 50;
unsigned int fstep = 10;
unsigned int freqold;
unsigned int buttonstate;
unsigned int count = 15;
// Create an instance of the Si4730/5 named radio.
Si4735 radio;
void setup() {
lcd.begin(16, 2);
PCICR |= (1 << PCIE2);
PCMSK2 |= (1 << PCINT18) | (1 << PCINT19);
sei();
// Pushbuttonセレクター
pinMode(band, INPUT_PULLUP);
// ラジオ初期化. 可能なモード: AM, FM, SW, LW.
radio.begin();
radio.setMode(AM);
command_am();
// 初期周波数設定
radio.tuneFrequency(freq);
lcd.setCursor(0, 2);
lcd.print("JCR Multiband Rx");
lcd.setCursor(0, 0);
lcd.print("F>>");
lcd.setCursor(3, 0);
lcd.print(":");
lcd.setCursor(13, 0);
lcd.print("kHz");
}
// Encoder Interrupt
ISR(PCINT2_vect) {
unsigned char result = r.process();
if (result) {
if (result == DIR_CW) {
freq = freq + fstep;
if (freq >= freqmax) { freq = freqmax; }
} else {
freq = freq - fstep;
if (freq <= freqmin) { freq = freqmin; }
}
}
}
void loop() {
if (freqold != freq) { tune(); }
freqold = freq;
lcd.setCursor(5, 0);
lcd.print(freq);
lcd.print(" ");
buttonstate = digitalRead(band);
// バンドセレクター
if (buttonstate == LOW) {
inc_preset();
while (digitalRead(band) == 0);
}
// Sメーター(dBu)とSNR(dB) - 使用する場合はコメント解除
RSQMetrics rsq;
radio.getRSQ(&rsq);
lcd.setCursor(0, 2);
lcd.print("dBu: ");
lcd.print(rsq.RSSI);
lcd.setCursor(9, 2);
lcd.print("dB: ");
lcd.print(rsq.SNR);
}
// プリセット増加
void inc_preset() {
count++;
if (count > 15) count = 1;
bandpresets();
delay(100);
}
// バンドセレクター プリセット
void bandpresets() {
lcd.setCursor(0, 0);
switch (count) {
case 1: freq = 370; radio.setMode(LW); radio.tuneFrequency(freq); command_am(); fstep = 5; lcd.print("LW1"); break;
case 2: freq = 620; radio.setMode(AM); radio.tuneFrequency(freq); fstep = 5; lcd.print("MW1"); break;
case 3: freq = 840; radio.setMode(AM); radio.tuneFrequency(freq); fstep = 5; lcd.print("MW2"); break;
case 4: freq = 3700; radio.setMode(SW); radio.tuneFrequency(freq); fstep = 5; lcd.print("SW0"); break;
case 5: freq = 4985; radio.setMode(SW); radio.tuneFrequency(freq); fstep = 5; lcd.print("SW1"); break;
case 6: freq = 6010; radio.setMode(SW); radio.tuneFrequency(freq); fstep = 1; lcd.print("SW2"); break;
case 7: freq = 7200; radio.setMode(SW); radio.tuneFrequency(freq); fstep = 1; lcd.print("SW3"); break;
case 8: freq = 10000; radio.setMode(SW); radio.tuneFrequency(freq); fstep = 5; lcd.print("SW4"); break;
case 9: freq = 11940; radio.setMode(SW); radio.tuneFrequency(freq); fstep = 5; lcd.print("SW5"); break;
case 10: freq = 13710; radio.setMode(SW); radio.tuneFrequency(freq); fstep = 5; lcd.print("SW6"); break;
case 11: freq = 15400; radio.setMode(SW); radio.tuneFrequency(freq); fstep = 5; lcd.print("SW7"); break;
case 12: freq = 17560; radio.setMode(SW); radio.tuneFrequency(freq); fstep = 5; lcd.print("SW8"); break;
case 13: freq = 21505; radio.setMode(SW); radio.tuneFrequency(freq); fstep = 5; lcd.print("SW9"); break;
case 14: freq = 27015; radio.setMode(SW); radio.tuneFrequency(freq); fstep = 5; lcd.print("CB1"); break;
case 15: freq = 9700; radio.setMode(FM); radio.tuneFrequency(freq); fstep = 10; lcd.print("FM1"); break;
}
}
// チューナー
void tune() { radio.tuneFrequency(freq); }
// ソフトミュートOFF / AVC最大ゲイン
void command_am() {
radio.setProperty(PROP_AM_SOFT_MUTE_MAX_ATTENUATION, 0); // 0 (OFF) - 63
radio.setProperty(PROP_AM_AUTOMATIC_VOLUME_CONTROL_MAX_GAIN, 0x3A98); // 1000 - 7800
}
Libraries C/C++
プレビューなし(ダウンロードのみ)
回路図
回路図ファイルはプロジェクトに含まれています。
製造プロセス
- ラジオ技術の進化と工学
- ゴムバンドの進化と製造:日用品の裏側
- DIYサーモカム:教室アイデアからグローバル製品へ
- DIY UVC滅菌ボックスキット:低コスト・簡単自作の医療・日用品用紫外線殺菌器
- Raspberry PiとArduinoで作るWi-Fiインターネットラジオ:世界中の局をストリーミング
- JX Wave Generator – Arduino互換DDS発振器(OLEDディスプレイ搭載)
- Arduino、Google Cardboard、Bluetoothで作るDIY VRスケートボード
- Arduino Nanoで作る防水シャワーFMラジオ:RDA5807、Nokia LCD、PAM8403搭載
- 自作Arduino J.A.R.V.I.S. 音声アシスタント - アークリアクター風デザイン
- 垂直バンドソー:目的、特徴、用途
- クリスタルラジオとトランジスタラジオ回路:基本検波器からIC AM/FM受信機まで