По запросу “радио на Arduino” вы в сети интернет найдете, в основном, проекты радиоприемников на основе платы Arduino, которые работают в современном FM диапазоне (88-108 МГц в Европе). Тем не менее, для многих наверняка представляют интерес и диапазоны LW, MW и SW, которые занимают диапазон частот от 0,2 до 30 МГц. Особенно интерес диапазон коротких волн (SW) – радиоволны в этом диапазоне отражаются от ионосферы и, таким образом, могут распространяться на огромные расстояния, и даже огибать земной шар.
Необходимые компоненты
- Плата Arduino Nano (купить на AliExpress).
- ЖК дисплей 16х2 (купить на AliExpress).
- Модуль Si4730.
- Инкрементальный энкодер c кнопкой (Rotary Encoder) (купить на AliExpress — не уверен в том, что в нем есть кнопка, но она точно есть в этом лоте — купить на AliExpress № 2, но он продается, к сожалению, только по 5 штук).
- Модуль усилителя звуковой частоты (класс D), например, PAM8403 (купить на AliExpress).
- Громкоговоритель (Speaker) 0,25 Вт, 8 Ом.
- Ползунковый переключатель.
- Ферритовый стержень от старого радиоприемника средних волн (MW).
- Резисторы и конденсаторы согласно схеме, представленной ниже.
Реклама: ООО «АЛИБАБА.КОМ (РУ)» ИНН: 7703380158
Общие принципы работы радиоприемника
“Сердцем” нашего проекта является модуль Si4730 от компании Silicon Labs, который можно купить на AliExpress в форме небольшой платы для разработки всего за несколько долларов (даташит на модуль Si4730) или в форме отдельной микросхемы (менее 100 рублей).
Данным модулем можно управлять с помощью платы Arduino по протоколу I2C с помощью библиотеки Si4735-I2C-R4 (ее можно скачать по ссылке, приведенной в разделе “исходный код программы” данной статьи), написанной Julio C. Rosa. Хотя производитель утверждает, что чип Si4730 работает только в диапазонах AM и FM, тем не менее, он может работать и в диапазоне коротких волн (SW) (хотя если верить последней версии даташита на данный модуль, он работает во всех диапазонах — LW, MW, SW, FM). Для усиления звуковой частоты с выхода модуля автор проекта (ссылка на оригинал приведена в конце статьи) использовал плату цифрового усилителя 2*3W PAM8403 Class D, которая отличается приемлемым функционалом и сравнительно дешево стоит (33 рубля на алиэкспрессе). Данный усилитель ранее уже был использован в проекте радиостанций на Arduino на нашем сайте.
Автор проекта собрал данный радиоприемник в компактном корпусе (см. фото и видео) и прикрепил к нему антенну для диапазона метровых волн. По его утверждению, качество приема рассмотренного проекта радиоприемника не уступает промышленным компактным моделям радиоприемников. К слову сказать, модуль Si4730 используют в своих устройствах такие известные производители компактных радиоприемников как TECSUN, DEGEN, SANGEAN и другие.
Схема проекта
Схема всеволнового радиоприемника на Arduino и модуле Si4730 представлена на следующем рисунке.
К выходу модуля Si4730 не забудьте подключить усилитель звуковой частоты, например PAM8403, с выхода которого уже и подавайте сигнал на громкоговоритель.
Исходный код программы (скетча)
Библиотеку для работы с модулем Si4730 можно скачать по этой ссылке.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 |
/************************************************************************************************** JCR Si4730/5 Receiver LW/MW/SW/FM - Version to share. See schematics for wiring details. 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); *****************************************************************************************************/ // необходимые для проекта библиотеки #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; // объявление необходимых переменных 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. (создаем объект для работы с модулем Si4730) Si4735 radio; void setup() { lcd.begin(16, 2); PCICR |= (1 << PCIE2); PCMSK2 |= (1 << PCINT18) | (1 << PCINT19); sei(); //Pushbutton seletor de bandas (кнопка для выбора диапазона) pinMode(band, INPUT_PULLUP); // Initialize the radio. Possible modes are AM, FM, SW, LW. (инициализируем радио) radio.begin(); radio.setMode(AM); command_am(); // Set the initial Frequency (устанавливаем начальную частоту) 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); // Seletor de bandas (считываем номер диапазона) if (buttonstate == LOW) { inc_preset(); while (digitalRead(band) == 0); } // Medidor - S-Meter (dBu) e SNR (dB) - uncomment if want to use 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); } // Presets INC void inc_preset() { count++; if (count > 15) count = 1; bandpresets(); delay(100); } // Presets Seletor de Bandas 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; } } //Sintonizador - tuner void tune() { radio.tuneFrequency(freq); } |
16 ответов к “Всеволновое радио (LW, MW, SW, FM) на Arduino и модуле Si4730”
Полностью не рабочая шляпа, автор даже передрать проекты толком не может.
Почему не рабочая то? Многие ведь уже сделали его, посмотрите на количество просмотров данной статьи
У меня при загрузке скетча выдает целый ряд ошибок. После удаления строк с ошибками и загрузке скетча, энкодер не переключает частоту в обратном направлении. Переключает частоту только в сторону её увеличения причем на всех диапазонах. Доходит до 108000 кгц и дальше тупик.
К сожалению, на работу энкодеров (особенно дешевых) очень много жалоб в комментариях на моем сайте. Попробуйте заменить его на две кнопки и проверить работоспособность проекта. Если заработает можно попробовать сменить энкодер
Si4730 поддерживает только 522-1710Кгц.
Ну если нужен диапазон частот побольше вместо него можно купить Si4734/35, основные принципы работы представленного проекта не изменятся
И всё же, как решить вопрос с command_am(); ?
В самом нижнем комментарии к данной статье указаны варианты решения вопроса с command_am(). Можете выбрать какой из этих вариантов вам больше подойдет
Доброй ночи. Есть ферритовый стержень от приемника MW. Только обязательно 300uH должен быть?
Добрый день. Не обязательно. Но тогда либо изменится диапазон частот приемника, либо соответствующим образом нужно изменить емкость конденсатора
Здравствуйте. Не подскажите, где найти такую антенну? Буду признателен.
Добрый вечер. К сожалению, точно не подскажу потому что лично не собирал данный проект. Можно попробовать посмотреть на Алиэкспрессе, Амперке или voltiq.ru.
Можно вопрос, а почему в общей схеме проекта изображена схема платы Arduino Uno, а в необходимых компонентах указана плата Arduino Nano, получается нужно в этом проекте использовать именно Arduino Nano?
Добрый вечер. Без разницы. Возможностей любой из этих плат Ардуино для этого проекта хватит. Надо просто по номерам контактов посмотреть все ли совпадает если будете использовать другую плату. Но если даже не совпадает всегда можно внести небольшие изменения в программу чтобы исправить это
При компиляции выскакивает вот такая ошибка.C:\Users\E786~1\AppData\Local\Temp\arduino_modified_sketch_237806\sketch_feb20b.ino: In function ‘void setup()’:
sketch_feb20b:55:3: error: ‘command_am’ was not declared in this scope
command_am();
^~~~~~~~~~
C:\Users\E786~1\AppData\Local\Temp\arduino_modified_sketch_237806\sketch_feb20b.ino: In function ‘void bandpresets()’:
sketch_feb20b:135:7: error: ‘command_am’ was not declared in this scope
command_am();
Библиотеки все установлены.
Причина, видимо, в библиотеке Si4735.h потому что команда command_am из нее. Попробуйте эту команду убрать, а вместо нее попробовать использовать какие нибудь другие команды из библиотеки Si4735.h (все ее команды можно найти в ее заголовочном файле). Также из этой библиотеки можно скопировать код функции command_am к себе в программу и изменить немного ее название и попробовать заработает ли программа в этом случае или нет