Карманное FM Радио на RDA5807m, IIC Oled 1.3" и Arduino Nano
- Войдите на сайт для отправки комментариев
Вс, 08/12/2019 - 06:56
Здравствуйте, форумчане. Немного предыстории. Попал в руки старенький FM-приемник "Вестник РП-301", в
состоянии хорошем, но... естественно требуется перестройка на другой диапазон частот, что и было сделано.
Результатом остался недоволен, стал искать замену "начинке" преёмника и в процессе поиска наткнулся на
схемы с использованием модуля RDA5807m. Наибольший интерес представила схема, опубликованная на этом сайте
пользователем GhostLion 19/11/2018, отдельное ему спасибо в виде плюсика ))). Но... имеющийся корпус с
отсеком под "Крону" не позволял разместить все необходимые компоненты. Выход нашел в применении модуля
Arduino NANO, с встроенным мини usb разъемом, стабилизаторами +5 В, +3,3 В и возможностью питания от
внешнего источника 9 В. Это позволило отказаться от печатной платы и просто соединить два используемых
модуля проводами в фторопластовой изоляции. В данном приемнике применена фиксированная настройка на все
местные радиостанции, что значительно упростило схему, у меня таких станций 10 и позволило отказаться
от OLED дисплея (не достаточно места). Естественно в скетче необходимо заменить список на станции своего
региона, желающие могут применить и дисплей. Встроенный в корпус динамик 0,25ГДШ-2 сопротивлением 50 Ом
подключен напрямую, громкость звучания приемлемая. Ток, потребляемый от батареи типа 6F22 ~ 40 мА.
Arduino 1.8.7 https://arduinomaster.ru/program/skachat-arduino-ide/
Библиотеки: - "U8glib.h" https://www.arduinolibraries.info/libraries/u8glib
- <radio.h>, <RDA5807M.h> https://github.com/mathertel/Radio
/*
file MyRadioPubl.ino
*/
#include "U8glib.h" // Библиотека шрифтов OLED
#include "rusUnifont.h" // Русифицированные шрифты для U8glib
#include <Wire.h> // Библиотека интерфейса I2C
#include <radio.h> // Библиотека
#include <RDA5807M.h> // Библиотека
U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE); // Строка настроек OLED-SH1106 не ошибка!
#define BTN_1 12 // Кнопка 1
#define BTN_2 11 // Кнопка 2
RADIO_FREQ preset[] = { // Устанавливаем фиксированные яастоты настройки местных FM станций
8890, // Дорожное
10130, // Радио 7
10170, // Европа +
10220, // Авторадио
10270, // Energy
10320, // Дача
10370, // Русское
10410, // Юмор FM
10470, // Шансон
10510, // Ретро FM
10790, // Хит FM
};
RDA5807M radio;
int i_sidx = 2; // выбор станции при включении, в данном случае Европа+
unsigned long currentTime; // переменная контроля времени для гашения OLED
unsigned long loopTime; // переменная контроля времени для гашения OLED
String nameFM; // переменная для вывода на OLED названия станции
String freqFM; // переменная для вывода на OLED частоты станции
void draw(void) { // процедура вывода на дисплей информации о станциях
u8g.setFont(rusUnifont);
u8g.setPrintPos(1,22);
u8g.print(nameFM);
u8g.setPrintPos(1,54);
u8g.print(freqFM);
}
void clearOLED(){ // процедура гашения (очистки) дисплея
u8g. firstPage ();
do {
} while( u8g.nextPage ());
}
void setup() {
radio.init(); // инициализация радио
radio.setBandFrequency(RADIO_BAND_FM, preset[i_sidx]); // настройка на станция с индексом 2
radio.setMono(false); // режим стерео
radio.setMute(false); // звук включен
radio.setVolume(15); // максимальная громкость
pinMode(BTN_1, INPUT);
pinMode(BTN_2, INPUT);
currentTime = millis(); // считываем время, прошедшее с момента запуска программы
loopTime = currentTime;
} // setup
void loop() {
// обработка нажатия кнопок
int val = digitalRead(BTN_1);
delay(50);
if(val==HIGH)
if (i_sidx < (sizeof(preset) / sizeof(RADIO_FREQ)) - 1) {
i_sidx++; radio.setFrequency(preset[i_sidx]);
loopTime = currentTime;
}
val = digitalRead(BTN_2);
delay(50);
if(val==HIGH)
if (i_sidx > 0) {
i_sidx--; radio.setFrequency(preset[i_sidx]);
loopTime = currentTime;
}
switch (i_sidx) {
case 0:
nameFM = "Дорожное радио";
freqFM = "88,9 FM";
break;
case 1:
nameFM = "Радио 7";
freqFM = "101,3 FM";
break;
case 2:
nameFM = "Европа+";
freqFM = "101,7 FM";
break;
case 3:
nameFM = "Авторадио";
freqFM = "102,2 FM";
break;
case 4:
nameFM = "Energy";
freqFM = "102,7 FM";
break;
case 5:
nameFM = "Радио Дача";
freqFM = "103,2 FM";
break;
case 6:
nameFM = "Русское радио";
freqFM = "103,7 FM";
break;
case 7:
nameFM = "Юмор FM";
freqFM = "104,1 FM";
break;
case 8:
nameFM = "Шансон";
freqFM = "104,7 FM";
break;
case 9:
nameFM = "Ретро FM";
freqFM = "105,1 FM";
break;
case 10:
nameFM = "Хит FM";
freqFM = "107,9 FM";
break;
}
currentTime = millis(); // считываем время, прошедшее с момента запуска программы
if(currentTime <= (loopTime + 5000)){ // сравниваем текущий таймер с переменной loopTime+5 секунд
u8g.firstPage();
do {
draw(); // выводим информацию на дисплей
} while( u8g.nextPage() );}
else {
clearOLED(); // гасим (очищаем) дисплей
}
} // loop
//Конец скетча
grandfox, "кроны" созданы для экономичных схем, где нужно питание 9 вольт. Подключая крону на Vin вы отправляете половину энергии и без того дохлой кроны в фонд всемирного потепления.
Банку лития на пин "+5V", и вопрос решен.
dimax, да, питание от +5 В хорошее решение, но... ну никак не вписывается в имеющийся корпус с отсеком под "крону". А остальным на заметку. Плюсик.
grandfox, Никто ж не заставляет брать банку 18650. В габариты посадочного места кроны запросто влезет компактный аккум и зарядка. Сейчас выпускаются аккумуляторы любых габаритов.
PS: вы тестировали, сколько он проработает от обычной кроны? Кушает то вся эта конструкция поди в разы больше, чем родной приёмник.
Родной приемник ток покоя 23 мА, при приеме сигнала потребление скорее всего сопоставимо. Часов на 10-15, в зависимости от конкретной "кроны", думаю хватит.
grandfox, ток потребления у микроконтроллерных схем имеет импульсный и высокочастотный характер, обычный мультиметр скорее всего даст сильно заниженные показания. Что бы вычислить средний ток нужно включить резистор последовательно питанию Ом на 10, и зашунтировать его конденсатором, не менее 1000мкФ, далее измерить напряжение на резисторе при работе, и вычислить ток по закону Ома.
Замер косвенным способом (резистор 10 Ом+конденсатор 1000 мкФ) дал тот же результат ~ 40 мА.
Что не так с настройкой среды Ардуино? Arduino: 1.8.10 (Windows XP), Плата:"Arduino Nano, ATmega328P"
Попробуйте установить Arduino IDE 1.6.5. Взять здесь https://all-arduino.ru/arduino-ide/
Спасибо! Буду пробовать.
Что не так с настройкой среды Ардуино? Arduino: 1.8.10 (Windows XP), Плата:"Arduino Nano, ATmega328P"
В чем может быть проблема ?
Разобрался сам. Все работает !