Сборка многодиапазонного радиоприёмника на Si4730 и Arduino Nano — LW, MW, SW, FM
Компоненты и материалы
| Компонент | Количество |
|---|---|
| Arduino Nano R3 | 1 |
| Радиомодуль Si4730 | 1 |
| LCD-дисплей 16x2 (белый на синем) | 1 |
| Инкрементальный энкодер с кнопкой | 1 |
| Модуль аудиоусилителя класса D (PAM8403, 2×3 Вт) | 1 |
| Динамик 0,25 Вт, 8 Ом | 1 |
| Феритовый стержень от старого МВ-радиоприёмника | 1 |
| Тумблер (slide switch) | 1 |
Инструменты
- Паяльник
Программное обеспечение
- Arduino IDE
О проекте
Когда говорят «Arduino-радио», обычно имеют в виду современный FM-диапазон (88–108 МГц в Европе). Диапазоны LW, MW и SW покрывают 0,2–30 МГц. Коротковолновой (SW) диапазон особенно интересен: радиоволны отражаются от ионосферы, что позволяет принимать станции с других континентов.
Ниже представлена разработка радиоприёмника, охватывающего все указанные диапазоны. «Сердце» устройства — чип Si4730 от Silicon Labs, который можно купить на AliExpress в виде небольшой отладочной платы за пару долларов.
Плата управляется Arduino по протоколу I2C. Код написан Julio C. Rosa на базе библиотеки Si4735-I2C-R4 (приведена ниже вместе со схемой). Хотя производитель заявляет, что Si4730 только для AM/FM, на практике он отлично работает и в SW. Для звука используется миниатюрный цифровой усилитель PAM8403 (Class D, 2×3 Вт) — дешёвый и качественный.
Устройство собрано в подходящем корпусе и представляет собой полноценный компактный мировой радиоприёмник. Автор живёт на первом этаже в густонаселённом районе и использует 10-метровую антенну — приём слабее, чем у стационарных приёмников, но сопоставим с коммерческими карманными радиоприёмниками.
Стоит отметить: этот чип используется во многих известных брендах портативных радиоприёмников — TECSUN, DEGEN, SANGEAN и др.
Код (C/C++)
/**************************************************************************************************
JCR Si4730/5 Receiver LW/MW/SW/FM - версия для публикации. См. схему для подключения.
Автор: Julio C. Rosa - The CesarSound - Май 2019
Команды:
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);
*****************************************************************************************************/
// Библиотеки
#include <Si4735.h>
#include <LiquidCrystal.h>
#include <rotary.h>
#include "Wire.h"
// Настройки I/O
Rotary r = Rotary(2, 3);
LiquidCrystal lcd(12, 13, 7, 6, 5, 4);
const byte band = A0;
// Переменные
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;
Si4735 radio;
void setup() {
lcd.begin(16, 2);
PCICR |= (1 << PCIE2);
PCMSK2 |= (1 << PCINT18) | (1 << PCINT19);
sei();
pinMode(band, INPUT_PULLUP);
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");
}
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); }
void command_am() {
radio.setProperty(PROP_AM_SOFT_MUTE_MAX_ATTENUATION, 0);
radio.setProperty(PROP_AM_AUTOMATIC_VOLUME_CONTROL_MAX_GAIN, 0x3A98);
}
Библиотеки
Библиотека Si4735.h (Si4735-I2C-R4) доступна для скачивания отдельно.
Схемы
Схемы подключения приведены в разделе «Schematics» оригинального проекта.
Производственный процесс
- Схемы кристаллических и транзисторных радиоприёмников: от простых детекторов к интегрированным AM/FM приёмник…
- Эволюция и инженерия радиотехнологии: от Маркони до наших дней
- Эволюция и производство резинок для денег: от натурального каучука к современным эластичным кольцам
- DIY Thermocam: от идеи в классе к глобальному продукту
- DIY UVC-стерулизатор: бюджетный UV-коробок для медицинских и бытовых предметов
- Wi‑Fi интернет-радио на Raspberry Pi и Arduino: стриминг станций со всего мира
- JX Wave Generator — Генератор сигналов на Arduino с DDS AD9833 и OLED-дисплеем
- Сборка DIY VR-скейтборда на Arduino, Google Cardboard и Bluetooth
- Водонепроницаемая FM-радио для душа на Arduino Nano, RDA5807, Nokia LCD и PAM8403
- Вертикальная ленточная пила: назначение, особенности и применение