Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Сборка многодиапазонного радиоприёмника на 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-радио», обычно имеют в виду современный FM-диапазон (88–108 МГц в Европе). Диапазоны LW, MW и SW покрывают 0,2–30 МГц. Коротковолновой (SW) диапазон особенно интересен: радиоволны отражаются от ионосферы, что позволяет принимать станции с других континентов.

Ниже представлена разработка радиоприёмника, охватывающего все указанные диапазоны. «Сердце» устройства — чип Si4730 от Silicon Labs, который можно купить на AliExpress в виде небольшой отладочной платы за пару долларов.

Сборка многодиапазонного радиоприёмника на Si4730 и Arduino Nano — LW, MW, SW, FM

Плата управляется 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» оригинального проекта.

Производственный процесс

  1. Схемы кристаллических и транзисторных радиоприёмников: от простых детекторов к интегрированным AM/FM приёмник…
  2. Эволюция и инженерия радиотехнологии: от Маркони до наших дней
  3. Эволюция и производство резинок для денег: от натурального каучука к современным эластичным кольцам
  4. DIY Thermocam: от идеи в классе к глобальному продукту
  5. DIY UVC-стерулизатор: бюджетный UV-коробок для медицинских и бытовых предметов
  6. Wi‑Fi интернет-радио на Raspberry Pi и Arduino: стриминг станций со всего мира
  7. JX Wave Generator — Генератор сигналов на Arduino с DDS AD9833 и OLED-дисплеем
  8. Сборка DIY VR-скейтборда на Arduino, Google Cardboard и Bluetooth
  9. Водонепроницаемая FM-радио для душа на Arduino Nano, RDA5807, Nokia LCD и PAM8403
  10. Вертикальная ленточная пила: назначение, особенности и применение