RSS блога
Подписка
Обновлено. Стерео радиоприёмник Rda5807m + Attiny13a ценой меньше 1$
- Цена: US $0.44
- Перейти в магазин
Как то искал на Али что нибудь для ардуино за дёшево.
Наткнулся на данную платку RDA5807m.
Характеристики FM-тюнера RDA5807m:
* Все в одном корпусе, практически не требуется внешних компонентов
* КМОП технология
* Полоса частот от 50 МГц до 115 МГц
* Настраиваемый шаг между каналами – 200 кГц, 100 кГц, 50 кГц, 25 кГц
* Поддерживает RDS/RBDS
* Высококачественный АЦП
* Синтезатор частот полностью встроен в микросхему
* Автоматическая регулировка усиления
* Цифровое адаптивное подавление шума
* Поддержка выхода звука как в моно, так и в стерео
* Индикатор уровня сигнала (Receive signal strength indicator — RSSI) и SNR
* Усилитель низких частот
* Регулировка звука и функция mute
* Цифровой интерфейс I2C
* Нагрузка на выходе звукового канала 32 Ом
* Встроенный LDO регулятор
* Корпус MSOP (10 выводов)
Электрические параметры FM тюнера RDA5807m:
* Напряжение питания — 3 вольта (от 1,8 до 3,3 вольт)
* Температура окружающей среды — 27 градусов Цельсия (от -20 до +75 градусов Цельсия)
* Ток потребления в рабочем режиме — до 21 мА
* Ток потребления в спящем режиме – 5 мкА
* Коэффициент нелинейных искажений – 0,15 – 0,2 %
* Максимальная частота I2C – 400 кГц
Для начала нашёл библиотеку для работы с радио, и опробовал на Arduino pro mini
!!! Внимание Arduino надо питать от 3.3В !!!, тк питание радио макс 3.3В.
Радио заработало сразу.
Звук чистый, без искажений на высоких частотах ( как на 174ха34), в наушниках звук громкий, достаточный.
Дальше решено было конструкцию удешевить,
Применить контроллер Attiny13a
Подключил библиотеки для attiny13
В контроллере Attiny13 всего 1024 байт памяти и нет железного протокола i2c.
После недели мучений по эмуляции протокола I2C, радио заработало. Но умело оно только включать радио на одну станцию.
На большее просто не хватало памяти.
И началясь тогда оптимизация кода, битва шла за каждый байт.
Для приёмника была изготовлена плата методом ЛУТ
Конденсаторы на плате 10 мкФ керамические.
Управление
SK- Переключение станций
Vol + — Громкость +
Vol — - Громкость — Удерживаем Vol+, короткое нажатие SK — Усиление Басов
Удерживаем Vol-, короткое нажатие SK — Моно/ Стерео
Контроллеры Attiny13a 10 штук 3.2$ 0.32$ Штука
Стабилизатор AMS1117 10 штук 0.39$ 0.04$ Штука
Готовое радио 0.44 + 0.32 + 0.04 = 0.80$ 50р. ))
Документация, скетч, библиотека attiny13
Новый код с автопоиском
Советы по оптимизации кода приветствуются))
Наткнулся на данную платку RDA5807m.
Характеристики FM-тюнера RDA5807m:
* Все в одном корпусе, практически не требуется внешних компонентов
* КМОП технология
* Полоса частот от 50 МГц до 115 МГц
* Настраиваемый шаг между каналами – 200 кГц, 100 кГц, 50 кГц, 25 кГц
* Поддерживает RDS/RBDS
* Высококачественный АЦП
* Синтезатор частот полностью встроен в микросхему
* Автоматическая регулировка усиления
* Цифровое адаптивное подавление шума
* Поддержка выхода звука как в моно, так и в стерео
* Индикатор уровня сигнала (Receive signal strength indicator — RSSI) и SNR
* Усилитель низких частот
* Регулировка звука и функция mute
* Цифровой интерфейс I2C
* Нагрузка на выходе звукового канала 32 Ом
* Встроенный LDO регулятор
* Корпус MSOP (10 выводов)
Электрические параметры FM тюнера RDA5807m:
* Напряжение питания — 3 вольта (от 1,8 до 3,3 вольт)
* Температура окружающей среды — 27 градусов Цельсия (от -20 до +75 градусов Цельсия)
* Ток потребления в рабочем режиме — до 21 мА
* Ток потребления в спящем режиме – 5 мкА
* Коэффициент нелинейных искажений – 0,15 – 0,2 %
* Максимальная частота I2C – 400 кГц
Для начала нашёл библиотеку для работы с радио, и опробовал на Arduino pro mini
!!! Внимание Arduino надо питать от 3.3В !!!, тк питание радио макс 3.3В.
Радио заработало сразу.
Звук чистый, без искажений на высоких частотах ( как на 174ха34), в наушниках звук громкий, достаточный.
Дальше решено было конструкцию удешевить,
Применить контроллер Attiny13a
Подключил библиотеки для attiny13
В контроллере Attiny13 всего 1024 байт памяти и нет железного протокола i2c.
После недели мучений по эмуляции протокола I2C, радио заработало. Но умело оно только включать радио на одну станцию.
На большее просто не хватало памяти.
И началясь тогда оптимизация кода, битва шла за каждый байт.
Скетч
Что может код:
*** Новое** Автопоиск станций ( при вкл если зажата SK)
* Прееключать радостанции покругу ( из списка в коде)
* Регулировка уровня громкости
* Моно / Стерео ( при вкл если зажата VOL-)
* Усиление Басов вкл /выкл ( при вкл если зажата VOL+)
* Все режимы запоминаются в память.
*** Новое** Автопоиск станций ( при вкл если зажата SK)
* Прееключать радостанции покругу ( из списка в коде)
* Регулировка уровня громкости
* Моно / Стерео ( при вкл если зажата VOL-)
* Усиление Басов вкл /выкл ( при вкл если зажата VOL+)
* Все режимы запоминаются в память.
#include <util/delay.h>
#include <avr/io.h>
#include <avr/eeprom.h>
#define SDA_release DDRB &= 0xF7
#define SDA_low DDRB |= 0x08
#define SCL_release DDRB &= 0xEF
#define SCL_low DDRB |= 0x10
#define FREQ_STEPS 10
#define RADIO_REG_CHIPID 0x00
#define RADIO_REG_CTRL 0x02
#define RADIO_REG_CTRL_OUTPUT 0x8000
#define RADIO_REG_CTRL_UNMUTE 0x4000
#define RADIO_REG_CTRL_MONO 0x2000
#define RADIO_REG_CTRL_BASS 0x1000
#define RADIO_REG_CTRL_SEEKUP 0x0200
#define RADIO_REG_CTRL_SEEK 0x0100
#define RADIO_REG_CTRL_RDS 0x0008
#define RADIO_REG_CTRL_NEW 0x0004
#define RADIO_REG_CTRL_RESET 0x0002
#define RADIO_REG_CTRL_ENABLE 0x0001
#define RADIO_REG_CHAN 0x03
#define RADIO_REG_CHAN_SPACE 0x0003
#define RADIO_REG_CHAN_SPACE_100 0x0000
#define RADIO_REG_CHAN_BAND 0x000C
#define RADIO_REG_CHAN_BAND_FM 0x0000
#define RADIO_REG_CHAN_BAND_FMWORLD 0x0008
#define RADIO_REG_CHAN_TUNE 0x0010
#define RADIO_REG_CHAN_NR 0x7FC0
#define RADIO_REG_R4 0x04
#define RADIO_REG_R4_EM50 0x0800
#define RADIO_REG_R4_SOFTMUTE 0x0200
#define RADIO_REG_R4_AFC 0x0100
#define RADIO_REG_VOL 0x05
#define RADIO_REG_VOL_VOL 0x000F
#define RADIO_REG_RA 0x0A
#define RADIO_REG_RA_RDS 0x8000
#define RADIO_REG_RA_RDSBLOCK 0x0800
#define RADIO_REG_RA_STEREO 0x0400
#define RADIO_REG_RA_NR 0x03FF
#define RADIO_REG_RB 0x0B
#define RADIO_REG_RB_FMTRUE 0x0100
#define RADIO_REG_RB_FMREADY 0x0080
#define RADIO_REG_RDSA 0x0C
#define RADIO_REG_RDSB 0x0D
#define RADIO_REG_RDSC 0x0E
#define RADIO_REG_RDSD 0x0F
// I2C-Address RDA Chip for sequential Access
#define I2C_SEQ 0x20
// I2C-Address RDA Chip for Index Access
#define I2C_INDX 0x22
#define RADIO_BAND_NONE 0x0
#define RADIO_BAND_FM 0x1
#define RADIO_BAND_FMWORLD 0x2
uint16_t registers[12];
uint8_t data[5];
//uint8_t fm, vol, BASS, MONO, ns;
bool BTNUP, BTNDN, BTNSK ;
int main( void ){
DDRB = 0x00; //PORTB = Inputs
PORTB = 0x87; //Set Outputs to Low (when DDRB is set to low the pin associated goes Hi-Z)
for (byte i = 0; i <5; i++) data[i]=EEPROM_read(i);
_delay_ms(1000);
setVol();
setFrequency();
if (!(PINB & (1<<PINB0))) EEPROM_write(2, !(data[2]));
if (!(PINB & (1<<PINB1))) EEPROM_write(3, !(data[3]));
if (!(PINB & (1<<PINB2))) scan();
setBassBoost();
while(1){
if (!(PINB & (1<<PINB2)))
{data[0] ++;
if (data[0]>data[4]) data[0]=1;
setFrequency();
EEPROM_write(0, data[0]);
while((!(PINB & (1<<PINB2))));}
if (!(PINB & (1<<PINB1)))
{data[1] --;
if (data[1]<1) data[1]=1;
setVol();
while((!(PINB & (1<<PINB1))));}
if (!(PINB & (1<<PINB0)))
{data[1] ++;
if (data[1]>15) data[1]=15;
setVol();
while((!(PINB & (1<<PINB0))));}
_delay_ms(50);
}
}
void scan(void)
{
data[4] = 0;
data[0]=0;
int ch_prev = 0;
EEPROM_write(4, 1);
setFrequency();
for (int i = 0; i < 100; i++)
{
registers[RADIO_REG_CTRL] |= RADIO_REG_CTRL_SEEKUP | RADIO_REG_CTRL_SEEK;
_saveRegister(RADIO_REG_CTRL);
_delay_ms(400);
_readRegisters();
uint16_t ch = registers[RADIO_REG_RA] & RADIO_REG_RA_NR;
if (ch > ch_prev) {
if (registers[RADIO_REG_RA] & RADIO_REG_RA_STEREO)
{data[4]++; EEPROM_write(data[4]+4, ch);
ch_prev = ch; }
}
EEPROM_write(4, data[4]);
registers[RADIO_REG_CTRL] &= (~RADIO_REG_CTRL_SEEK);
_saveRegister(RADIO_REG_CTRL);
}}
void setVol(void)
{ registers[RADIO_REG_VOL] = (0x9080 | data[1]);
_saveRegister(RADIO_REG_VOL);
EEPROM_write(1, data[1]);
}
void setBassBoost()
{ registers[RADIO_REG_CTRL] &= (~RADIO_REG_CTRL_SEEK);
if (data[3]) registers[RADIO_REG_CTRL] |= RADIO_REG_CTRL_MONO;
if (data[2]) registers[RADIO_REG_CTRL] |= RADIO_REG_CTRL_BASS;
_saveRegister(RADIO_REG_CTRL);
}
void setFrequency(void) {
uint8_t newChannel;
uint16_t regChannel = 0; //registers[RADIO_REG_CHAN] & (RADIO_REG_CHAN_SPACE | RADIO_REG_CHAN_BAND);
newChannel = EEPROM_read(data[0]+4);
regChannel += RADIO_REG_CHAN_TUNE; // enable tuning
regChannel |= newChannel << 6;
// enable output and unmute
registers[RADIO_REG_CTRL] |= RADIO_REG_CTRL_OUTPUT | RADIO_REG_CTRL_UNMUTE | RADIO_REG_CTRL_ENABLE; // | RADIO_REG_CTRL_NEW
_saveRegister(RADIO_REG_CTRL);
registers[RADIO_REG_CHAN] = regChannel;
_saveRegister(RADIO_REG_CHAN);
registers[RADIO_REG_R4] = RADIO_REG_R4_EM50;
_saveRegister(RADIO_REG_R4);
} // setFrequency()
void _readRegisters()
{
i2c_start(I2C_SEQ+1);
for (byte i = 0; i < 2; i++)
{registers[0xA+i]= _read16();}
i2c_stop();
}
uint16_t _read16(void)
{ uint8_t hiByte = i2c_read();
uint8_t loByte = i2c_read();
return(256*hiByte + loByte);
} // _read16
// Save one register back to the chip
void _saveRegister(byte regNr)
{
i2c_start(I2C_INDX);
i2c_write(regNr);
_write16(registers[regNr]);
i2c_stop();
} // _saveRegister
void _write16(uint16_t val)
{
i2c_write(val >> 8);
i2c_write(val & 0xFF);
} // _write16
void i2c_clk(void)
{
SCL_release; //Release Clock
_delay_us(5);
SCL_low; //Pull Clock Low
}
char i2c_read()
{
unsigned char inData;
inData=0x00;
for(int inBits = 0; inBits < 8; inBits++)
{
SDA_release;
SCL_release; //Clock High
_delay_us(5);
inData <<= 1;
inData |=(!(!(PINB & 0x08)));
SCL_low; //Clock Low
}
SDA_low; //Release Data to check for ACK
i2c_clk();
SDA_release;
return inData;
}
/**************************************************************/
void i2c_write(char data)
{
byte i;
for (i=0;i<8;i++) //Clocks out byte MSB first
{
if (data & 0x80) {SDA_release;} //Release Data
else {SDA_low;}; //Pull Data Low
data = data * 2;
i2c_clk();
}
SDA_low; //Release Data to check for ACK
i2c_clk();
SDA_release;
}
/**************************************************************/
void i2c_start(char data)
{
SDA_low; //Pull Data Low
SCL_low; //Pull Clock Low
i2c_write(data);
}
/**************************************************************/
void i2c_stop(void)
{
SCL_release; //Release Clock
SDA_release ; //Release Data
}
void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
{
while(EECR & (1<<EEWE)); /*Ждать завершения предыдущей записи*/
EEAR = uiAddress; /*Проинициализировать регистры*/
EEDR = ucData;
EECR |= (1<<EEMWE); /*Установить флаг EEMWE*/
EECR |= (1<<EEWE); /*Начать запись в EEPROM*/
}
unsigned char EEPROM_read(unsigned int uiAddress)
{
while(EECR & (1<<EEWE)); /*Ждать завершения предыдущей записи*/
EEAR = uiAddress; /* Проинициализировать регистр адреса*/
EECR |= (1<<EERE); /*Выполнить чтение*/
return EEDR;
}
}
Для приёмника была изготовлена плата методом ЛУТ
Конденсаторы на плате 10 мкФ керамические.
Управление
SK- Переключение станций
Vol + — Громкость +
Vol — - Громкость — Удерживаем Vol+, короткое нажатие SK — Усиление Басов
Удерживаем Vol-, короткое нажатие SK — Моно/ Стерео
Контроллеры Attiny13a 10 штук 3.2$ 0.32$ Штука
Стабилизатор AMS1117 10 штук 0.39$ 0.04$ Штука
Готовое радио 0.44 + 0.32 + 0.04 = 0.80$ 50р. ))
Документация, скетч, библиотека attiny13
Новый код с автопоиском
Советы по оптимизации кода приветствуются))
Самые обсуждаемые обзоры
+73 |
3675
145
|
+53 |
3845
69
|
+34 |
2925
55
|
А радио само цифровое и на сверхчувствительность явно не рассчитанное.
8 — Vol+
9 Vol-
10 — Sk
11 — 1 контакт RDA
12 — 2 Контакт RDA
— Либо подключите библиотеку github.com/mathertel/Radio/archive/master.zip
Там есть простые примеры.
Первая ревизия платы, новую ещё не травил.
советы:
1 — не делайте прямых (острых) углов на дорожках — они этого не любят
2 — лудите или сплавом Розе или припоем с помощью оплетки
3 — уделите минут 30 почитать как разводить платы
4 — используйте хороший паяльник с термостабилизацией
5 (опцион) — фотки как нить получше может получатся…
тогда будет получаться так, что низя будет вашими платами пугать детей — вот будешь плохо учится — все устройства у тебя будут ТАКИМИ! Получишь двойку — в школу вот с таким радио пойдешь! еще раз будешь драться — закажем тебе телефон у этого дяди, и будешь с ним ходить не меньше месяца!
но за труд однозначно плюс
Старая байка про разгон 15 дюймового мониитора до 17 дюймов
forum.vegalab.ru/attachment.php?attachmentid=48020&stc=1&d=1237099192
А что для начинающих посоветуете?
1 — иногда без прямых углов не обойтись
2 — лудил обычным оловом с канифолем
3 — до этой платы, последний раз разводил простенькие платы еще в школе, 20 лет назад
4 — использовал паяльник ЭПСН 40/220
5 — фотка как получилась, так и получилась)
Это мой первый в жизни ЛУТ, по краям платы получились дефекты, в школе платы разводил нитрокраской или лаком для ногтей, рисовал в тетрадке в клеточку)))
Все ваши пункты желательны, но все же предпочтительней прямые руки))
2 так тоже можно — но как я написал быстрее и результат немного лучше
3 норм
4 попробуйте нормальный — удивитесь
5 норм
у меня как-то так: mysku.club/blog/aliexpress/37390.html
тип byte вам за глаза хватит — 1 байт
Размер скетча в двоичном коде: 960 байт
vol? vol: 1;
// if (vol<1) vol=1;
Придёт следующяя партия приёмников, буду делать универсальный код.
При первом старте идёт сканирование диапазона и запоминание номеров станций в епром. В 100 байт надо будет уложится ))
остальное пока обдумываю.
трёхкратную проверку PINB заменить однократной. 6 байт.
if PINB {
if (1<<PINB0) BTNUP=0;
if (1<<PINB1) BTNDN=0;
if (1<<PINB2) BTNSK=0;
}
// if (PINB & (1<<PINB0)) BTNUP=0;
// if (PINB & (1<<PINB1)) BTNDN=0;
// if (PINB & (1<<PINB2)) BTNSK=0;
Подсказка — R820T
Вот и виделось такое компактное устройство, с мизерной ценой, которое можно брать с собой в самолёт.
Единственное с антенной — уже на борту могут привязаться.
Прочитал на странице продавца: «Использование общего 102BC модуль пакета, Пользователи могут непосредственно заменить использование, Без изменения цепи дизайн».
RDA может работать в 2x режимах:
— В своём родном ( как в моём скетче)
— В режиме совместимости с TEA
На моём коде TEA работать не будет.
Вот код режима совместимости www.5v.ru/start/em5807m-arduino-nano-30.htm
По чувствительности лучше чем у 174ха34.
В моей партии из 5 штук 4 были лоченые.
Этот Лок легко снимается высоковольтным программатором.
Скетч из статьи мне не помог, тк кроме неправильно выставленых фюзов, ещё был лок на чтение. И фюзы менять не давало.
Подправленый скетч
пс. В топике ссылка на продавца со 174 заказами, и не одного отзыва про лок.
хотя иногда как радио слушаю, фоном, как сводку происшествий
днем ещё вокруг 440МГц в mototrbo какие-то ппс тоже, но ночью ни разу не слышал их
https://aliexpress.com/item/item/FM-Stereo-Module-Radio-Module-64-108MHz-AR1310-Wireless-Module-for-Arduino/32392341497.html
(from AliExpress Android)
Только привычная среда компиляции.
Детекторный приёмник можно собрать и сегодня, да вот только слушать на нём нечего — вещательные передатчики ДВ и СВ, качающие в эфир сотни киловатт мощности уже везде выключены. Вот и приходится собирать современные FM приёмники, получая бонусом стереовыход, RDS, стабильный синтезатор частоты гетеродина. И чтобы конфигурировать эти бонусы ставить микроконтроллер.
Попробуйте использовать переменные byte, uint8_t и т.д. вместо #define
А вообще для таких вещей лучше использовать const, но мне доводилось видеть компиляторы, которые размножали константное значение в стольки экземплярах, сколько оно встречалось в исходнике.
#define — директива препроцессора — а это означает что еще перед компиляцией — все дефайны исчезнут из кода, а в коде появятся конкретные значения или выражения!
#define — нисколько не потребляет памяти и не может этого никак делать!
использование define — это тоже самое, что использование констант, конкретных значений
const — это инструкция для избегания ошибок программиста — на память никак не влияет, если будет попытка поменять значение переменной — то программа не скомпилируется — и все. На память эта инструкция никак не влияет! переменная займет столько памяти сколько требует ее тип! В настройках компилятора можно задать оптимизацию, чтобы компилятор встроил константы в код, конечно если это нужно.
В данном МК обращение к 16-битному значению не напрямую, а по 12-битному адресу тоже способно сэкономить память.
https://aliexpress.com/item/item/Mini-1-8V-3-6V-Built-in-MCU-Broadcast-Signal-Receives-76-108MHz-Stereo-Music-Player/739593225.html
https://aliexpress.com/item/item/PLL-LCD-Digital-FM-Radio-Receiver-Module-87-108MHZ-Wireless-Microphone-Stereo-free-shipping/32325479842.html
https://aliexpress.com/item/item/AMS1117-AMS1117-3-3-SOT223/32452534417.html
Стабилизатор по 0.03$ поштучно.
https://aliexpress.com/item/item/FM-Stereo-Radio-Module-RDA5807M-Wireless-Module-Profor-For-Arduino-RRD-102V2-0/32464120964.html
0.41$
Чтоб вход 3.0-4.2, выход 3.3В. Или хотя бы вход 3,3-4,2, выход 3.0В.
Известные KIS-3R33S и yec-sd200 я так понимаю не годятся, т.к. мин вход 4.75В.
от 3 до 9 можно питать будет.
Приёмник не любит ни чего импульсного.
Подключал к нему усилитель pam8403, приёмник почти перестал ловить. Подключил аналоговый отлично заловило.
Да и сам то приемник — внутри цифровой и управляется цифрой и ловит же как то, может имеет смысл DCDC, усилок или приемник в экран поместить и LC-фильтрами огородить и работало бы…
static uint16_t preset[] PROGMEM= {
ide пишет
In file included from softi2c_13_radio.ino:4:0:
softi2c_13_radio.ino:85:26: error: variable 'preset' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
softi2c_13_radio.ino: In function 'void EEPROM_write(unsigned int, unsigned char)':
softi2c_13_radio.ino:275:20: error: 'EEWE' was not declared in this scope
softi2c_13_radio.ino:278:15: error: 'EEMWE' was not declared in this scope
softi2c_13_radio.ino:279:15: error: 'EEWE' was not declared in this scope
softi2c_13_radio.ino: In function 'unsigned char EEPROM_read(unsigned int)':
softi2c_13_radio.ino:283:20: error: 'EEWE' was not declared in this scope
variable 'preset' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
может подскажите как исправить? Библиотеку поставил вашу.Заранее спасибо.
фьюзы стоят 0x39
выложу мой ардуино иде в нем компилируется ))
1 100,4 хит-фм
2 100.8 ХИТ
3 101.7 КИСС
4 102,8 Бест Фм
5 102.8 СТИЛЬНОЕ РАДИО
6 102.8 Ностальжи
7 103.2 РАДИО 1
8 103.6 ЭРА
9 104.0 Европа +
10 104.6 Рокс ФМ
11 105.3 Русское Радио
12 105.8 ЛЮКС
13 105.8 Русское Радио
14 106.5 Наше Радио
15 106.9 ЕВРОПА ФМ
16 107.6 Наше ФМ
Wap-tolik вам большое спасибо за обзор, но потрудитесь пожалуйста объяснить как решить проблему с ошибкой
скетча возникает ошибка в строке 85
static uint16_t preset[] PROGMEM= {
ide пишет
In file included from softi2c_13_radio.ino:4:0:
softi2c_13_radio.ino:85:26: error: variable 'preset' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
softi2c_13_radio.ino: In function 'void EEPROM_write(unsigned int, unsigned char)':
и т.д…
Просьба обьяснить что к чему или прошить с частотами 100.8,103.4, 106.3 и 104.5.
Пробовал код подправить с кодевижн. Но там много чего надо поправлять. также не справлюсь
ПС. Не те частоты, не та модуляция(авиа=АМ); либо СДР, либо найти «ФМ+АМ» приёмничек 'похуже, но с индикатором частоты', они плохо подавляют паразитную для себя модуляцию, — и «перемотать» катушку, уродуя витки.
Новый код а так же hex
Добавил автопоиск станций, активируется если включить приёмник с зажатой кнопкой настройки.
Так же включаются режим моно и бас. Зажатием при включении vol- (моно) и vol+ (бас)
В 1 посте скетч обновил.
Можно сделать настройку вперёд назад. а громкость по кругу, одной кнопкой.
А в фм диапазоне стерео другой модуляции.
У меня приёмник на RDA5807m и ардуинке работает в двух диапазонах в стерео. Хотелось бы попробовать и на Attiny13. Понимаю, что нужно установить какие-то биты в RDA5807m…
Подскажите, как в этом скетче расширить диапазон поиска.
И ещё, можно ли прописать частоты в епром не сканируя? Дело в том, что при сканировании иногда «ловятся» неправильные частоты, особенно, если РТПС находится недалеко. И было бы лучше, как в старом варианте скетча, иметь возможность прописывать нужные частоты. Или, как вариант, добавить функцию редактирования (удалять ненужную станцию, либо делать пропуск станции, например нажатием одновременно трёх кнопок ).
Но будет искать только в УКВ диапазоне.
На тиньке бился за каждый байт, сейчас в епром сохраняются только номера каналов. Работа с частотой занимает много места в коде.
Автор, если конечно есть возможность, сделай пожалуйста НЕХ, вместо регулировки громкости нужно переключение станций вперед-назад. буду очень благодарен. процесс допиливания колонки встал из-за этого
Можно подробнее? Какой Arduino IDE компилировали и шили?
Всё так и есть. Может библиотеки другие? Ты откуда библиотеку брал?
sketch_feb16a.ino: In function 'void EEPROM_write(unsigned int, unsigned char)':
sketch_feb16a:247: error: 'EEWE' was not declared in this scope
sketch_feb16a:250: error: 'EEMWE' was not declared in this scope
sketch_feb16a:251: error: 'EEWE' was not declared in this scope
sketch_feb16a.ino: In function 'unsigned char EEPROM_read(unsigned int)':
sketch_feb16a:255: error: 'EEWE' was not declared in this scope
'EEWE' was not declared in this scope
Переключение каналов одной кнопкой «CH».
Регулировка громкости кнопками "VOL+" и "VOL-". 15 позиций уровня громкости.
Режим «Поиск Каналов» активируется включением питания с зажатой кнопкой «CH ».
Когда приёмник найдёт канал, поиск остановится на 4 секунды для прослушивания.
Если в это время нажать кнопку «CH » и удерживать не менее 4 секунд- канал запишется в память,
если не нажимать- не запишется. После отпускания кнопки сканирование продолжится.
Режим «Моно/Стерео» переключается включением питания с зажатой кнопкой «VOL -».
Режим «УсилениеБаса» переключается включением питания с зажатой кнопкой «VOL +».
Все установленные режимы записываются в EEPROM.
Кнопки: «VOL +» — 5 нога МК, «VOL -» — 6, «CH» — 7.
у меня
high:FF
low:39
high:FF
low:6А
А если выставить low:39, то тактовая частота микроконтроллера в несколько раз больше и поиск останавливается на время около 1 секунды.
Evgenij77 как прописать все настройки в EEPROM на стадии программирования.
Имеется ввиду:
1. Какие значения и в какие ячейки прописать Mono-Stereo, Bass on/off, последняя станция.
2. Как рассчитать значения и в какие ячейки прописать частоты радиостанций.
Включил и всё готово.
Успехов.
подробности в приложении.
Может кто разъеснит непонятки.
Все данные в шестнадцатеричном виде.
У меня только не сохраняется радиостанция даже если я и пропишу в EEPROM.
При включении шумы, станция только после нажатия ch+ или ch-. Но это я грешу на микросхему приёмника — RDA5807FP. Хотя в другой конструкции сохранение станции работает.
Прав или не прав это может сказать только программист написавший программу.
Он должен знать что куда прописывается и в каком виде.
Некоторые размышления: уровень громкости можно прописывать EEPROM, всё равно будет регулироваться перед УНЧ, а на освободившийся порт повесить светодиод, который бы мигал при достижении радиостанции с максимальной частотой-2 раза, при достижении радиостанции с минимальной частотой-1 раз. Переключение по кругу не нужно. Трудно ориентироваться какая станция принимается, а так хоть какой то ориентир, если хватит места в МК. Автопоиск включать одновременным нажатием кнопок ch+ и ch- при включении приёмника, а сохранение долгим нажатием ch+.
Успехов.
Попробывал последнию прошивку Wap-tolik, станции сохраняет и стартует с этойстанции. Разобрался что писать в ячейку 00-где сохраняются станции. Там пишется номер станции в шестнадцатеричном виде, начиная с ячейки 05-1, 06-2 и.т.д…
Evgenij77 ёщё раз испытал вашу прошивку с каналами, сохраняет станции правильно.
Но при включении необходимо нажать ch. Если нажать ch+ то то начнёт воспроизводится станция выше сохранённой. Если нажать ch- то то начнёт воспроизводится станция ниже сохранённой.
Проверил также прошивку с громкостью, поведение такое же, как и с каналами.
Успехов.
Кто собирал, откликнитесь по поводу сохранённой станции при включения приёмника от Evgenij77.
Может только уменя такой глюк.
Модераторы уберите пост:
Только засоряет. Ниже постом всё описано.
Мои мысли по приёмнику:
1. Убрать кнопку громкость. Уровень громкости прописывается в EEPROM — он не вечен. Для чего: испытывал с разными усилителями НЧ, так для одного 4-5 уровня хватит а для другого и 15 было маловато. А для любителей регулировать громкость кнопками можно сделать такой вариант: длительное удержание — увеличение громкости а кратковременное нажатие — уменьшение громкости.
2. Прописать в EEPROM станцию, которая будет стартовать при включении — EEPROM не вечен.
Можно сделать и такой вариант — при работе длительно удерживать кнопку ch+ чтобы записалась станция.
3. Отключить переключение станций по кольцу. При достижении крайних значений частоты радиостанций — станции не меняются при нажатии кнопки в том же направлении.
У нас в городе 16 станций и когда переключаешь по кольцу то начинаешь путаться.
4. Автопоиск включать одновременным нажатием кнопок ch+ и ch- при включении приёмника, а сохранение долгим нажатием ch-.
5. Басс — при включении приёмника нажата ch+. Можно и в программе включать Басс, при конфигурации регистров микросхемы. Хотя при эсперименте в другой конструкции при включении баса появлялись искажения, при отключении пропадали.
6 Моно/Стерео — при включении приёмника нажата ch-.
Не программист, поэтому не знаю возможно ли всё это сделать и хватит ли памяти МК. Может в описании есть логические не стыковки. Можно только часть мыслей сделать.
Evgenij7 или Wap-tolik при хорошем настроении, желании и возможностей МК может сделаете хотя бы часть.
Спасибо. Успехов.
не использоватьвыпаять… (а EEPROM на жизнь приёмника хватит...)2.-Прописать можно и все нужные частоты, только не в EEPROM, а в программе…
Приёмник во всех прошивках стартует с той станции, которая была включена последняя. (если не так, попробуйте поменять RDA, или Attiny 13- встречались глючные…
3.- Можно сделать.
4.- Можно попробовать, если хватит памяти…
5 и 6 оставляем, как было? Правильно понял?
На счёт функции длительного удержания какой-либо кнопки- думаю, не получится- мало памяти.
Прочитал Ваше сообщение, подумал, что то я разогнался в предыдущем собщении.
Чтобы Вам не мудрить, отключите переключение станций по кольцу. Прописка станций в программе не нужно. Пока эспериментировал с приёмником, обнаружил две новые станции, поэтому если появится что то новое — то просто переписать EEPROM. А в программе — надо делать много телодвижений, не все это смогут.
Ниже мои мысли, информация для размышлений:
Если ещё бы получилось с громкостью, то получилась бы конструкция для всех. Если отключить например настройку баса и моно/стерео, прописывать их в EEPROM и при включении настройки считываются. Не запоминать станци при отключении а прописать в EEPROM. Если я правильно понял Wap-tolik станция определяется по наличию стереосигнала, может определять станции по наличию станции, если это требует меньше памяти. Можно сделать регулировку громкости двумя кнопками, удерживая кнопку Vol и нажимая кнопку ch+ или ch- регулируем громкость, если этот метод займёт меньше памяти МК. Может ещё что то сделать чтобы освободить память.
Глюки RDA и ATtiny допускаю что это имеет место. Но испытывая последнию прошивку Wap-tolik станции сохраняет и стартует с этойстанции.
Здоровья и успехов.
Прошивка с полуавтоматическим поиском каналов.
Переключение станций кнопками «CH +» и «CH -». Переключение станций по кругу отключено.
Регулировка громкости одной кнопкой «VOL». 15 позиций уровня громкости- от 1 до 15, потом снова 1.
Режим «Поиск Каналов» активируется включением питания с зажатой кнопкой «VOL».
Когда приёмник найдёт канал, поиск остановится на 3 секунды для прослушивания.
Если в это время нажать кнопку «VOL» и удерживать не менее 3 секунд- канал запишется в память,
если не нажимать- не запишется. После отпускания кнопки сканирование продолжится.
Режим Моно/Стерео переключается включением питания с зажатой кнопкой «CH -».
Режим УсилениеБаса переключается включением питания с зажатой кнопкой «CH +».
Все установленные режимы записываются в EEPROM.
Кнопки «CH +» — 5 нога МК, «CH -» — 6, «VOL» — 7.
Проверил прошивку, всё работает, перестал даже путаться в каналах и стала включатся запомненная станция. Единственно что не любит старых кнопок, пришлось к макету подпаивать другие кнопки.
Может можно увеличить задержки после нажатия кнопок или как у Вас компенсируется дребезк кнопок.
По поводу управление громкостью сочетанием кнопок «VOL & CH+» и «VOL & CH-» то если у Вас есть желание то буду очень благодарен. Испытаю и это вариант буду вставлять в корпус.
Успехов.
Прошивка с автоматическим поиском каналов.
Переключение станций кнопками «CH +» и «CH -».
Регулировка громкости: сочетанием кнопок «VOL & CH+» и «VOL & CH-».
Режим «Поиск Каналов» активируется включением питания с зажатой кнопкой «VOL».
Режим Моно/Стерео переключается включением питания с зажатой кнопкой «CH -» (но начинает действовать при следующем включении приёмника).
Все установленные режимы записываются в EEPROM.
Кнопки «CH +» — 5 нога МК, «CH -» — 6, «VOL» — 7.
Проверил, всё работает. Бас я так понимаю только через EEPROM.
Буду теперь заниматься облагораживанием.
Успехов!
Выкладываю описание EEPROM, может кому пригодится.
Оптимальна для приёмников с регулировкой громкости потенциометром.
Прошивка с полуавтоматическим поиском каналов.
Переключение станций кнопками «CH +» и «CH -». Переключение станций по кругу отключено.
Громкость установлена на средний уровень и не изменяется…
Режим «Поиск Каналов» активируется включением питания с зажатыми кнопками «CH +» и «CH -».
Когда приёмник найдёт канал, поиск остановится.
Если нажать кнопку «CH +», канал запишется в память и сканирование продолжится.
Если нажать кнопку «CH -»,- канал пропустится и сканирование продолжится.
Режим «Моно/Стерео» переключается включением питания с зажатой кнопкой «CH -».
Режим «УсилениеБаса» переключается включением питания с зажатой кнопкой «CH +».
Все установленные режимы записываются в EEPROM.
Кнопки «CH +» — 5 нога МК, «CH -» — 6,
Как узнать, что цикл поиска станций закончился?
Но другой глючок. Находит около 12 станций, запоминает 7. Какое ограничение на максимум?
А на других прошивках сколько станций запоминает?
Для большей универсальности можно задавать уровень громкости через EEPROM, если возможно.
Испытывал с разными усилителями. С одним усилителем и уровня 6 за глаза, а с другим и уровня 15 маловато будет.
На данном этапе уже 6 видов прошивок, достаточно на все случаи. Большое спасибо авторам.
С Уважением и успехов в личной жизни и творчестве.
Сделал прошивку с ручным поиском каналов…
Переключение станций кнопками «CH +» и «CH -».
Регулировка громкости: сочетанием кнопок «VOL» и «CH +» или «VOL» и «CH -».
(Удерживая кнопку «VOL», нажимать«CH +» или «CH -».)
Режим «Поиск каналов» активируется включением питания с зажатой кнопкой «VOL».
Поиск станций кнопками «CH +» и «CH -». Короткое нажатие соответствует шагу 0,1 МГц.
При удержании кнопки- смена частот со скоростью 2 шага в секунду.
Если в режиме поиска каналов нажать кнопку «VOL», канал запишется в память.
Выход из режима поиск каналов- выключением питания.
Режим «Моно/Стерео» переключается включением питания с зажатой кнопкой «CH -».
Режим «УсилениеБаса» переключается включением питания с зажатой кнопкой «CH +».
Все установленные режимы записываются в EEPROM.
Кнопки «CH +» — 5 нога МК, «CH -» — 6, «VOL» —7 нога.
В режиме поиска нужно много раз нажимать «CH +», или удерживать до появления звука станции. А для записи в память- нажать «VOL». Поиск начинается с частоты 87,5 МГц и до 108МГц.
Если перевести проект на ардуино, то можно добавить и энкодер и дисплей. Но этот уже совсем другой проект…
Правда, я этим заниматься не буду- нет ни времени ни желания…
В автоматическом поиске не все станции находит. Если прописать в EEPROM, то звучание пропущенных станций вполне приличное.
с Attiny13a у меня следующая связка: акк 18650 -> начинка от дешевого повербанка на одну ячейку(для зарядки акка) здесь же получаю 5в -> беру 5в для усилителя на PAM8403 DC 5V 2 Channel а также эти 5в идут на ams1117-3.3 для Attiny13a и Rda5807m -> c Rda5807m получаю аудиосигнал и отправляю это все на PAM8403 -> теперь эта вся радость должна играть на динамиках. Но увы с Attiny13a ничего не получаеться, искажения ужасные. А вот с Arduino Uno все ок, играет чисто и приятно. на Attiny13a пробовал заливать разные ваши варианты — результат одинаков. Просто я купил 10 шт Attiny13a и думал куда их приткнуть.
Так же думал сейчас сделаю мини радио. Пришлось ставить аналоговый усилитель 174ун14 с ним хорошо ловит.
Читал на форумах что при использовании усилителя PAM8403 приёмник работал плохо, когда подключали аналоговый усилитель то работало хорошо. Попробуйте обычный усилитель а не D класса. Также читал что при использовании усилителя PAM8403 приёмник работал хорошо, но там контроллер ATmega8,
Проведите опыты:
1. Приёмник — аналоговый усилитель.
2. Питание приёмника и PAM8403 от отдельных блоков питания, соединяя только общий провод.
3. Поставьте LC фильтры в питание усилителя, приёмника, контроллера.
Бывает от неудачного рисунка печатных плат
Если что то поможет а дальше решать Вам.
Успехов.
Преобразователь повербанка может шуметь… Можно запитать плату приёмника со стабилизатором и усилитель от лития напрямую, а зарядку лития производить через платку на ТР4056.
Микроконтроллер передаёт команды для конфигурирования приёмника- включения и настроек на канал, громкость и т.д. После настройки приёмника на станцию микроконтроллер можно вытащить из панельки и приёмник будет работать дальше, пока не отключишь питание.
Предполагаю, что помехи проходят по питанию, а в ардуино по питанию стоят конденсаторы и стабилизатор, поэтому и звук чище с ардуино.
Возможные причины: не залита прошивка в микроконтроллер, неправильно выставлены фьюзы, или перепутаны местами выводы i2c.
Чувствительность этих цифровых приёмников примерно одинакова. Но у них, по сравнению с аналоговыми, избирательность не очень хорошая.
Подскажите, в характеристика указано "* Полоса частот от 50 МГц до 115 МГц"
Можно ли изменить скетч для приема станций в УКВ диапазоне, на пример 66 МГц, если да то как?
при отсутствии блютус коннекта на модуле квлючается aux. на него идет сигнал с радио. (тут все ясно, все работает)
к блютус модулю подключены 3 физические кнопки (на замыкание) плей-пауза, вперед, назад. хотел на эти-же кнопки посадить радио. не получается. на радио общий контакт кнопок сидит на земле, а на блюте общий кнопок не на земле. так же на модулях на контактах управления (для кнопок) есть напряжения, и при параллельном подключении кнопок модули сливают напругу управления друг на друга. (решается установкой резисторов 33к). при этом управление радио работает, блютус нет, т.к его общий контакт кнопок сидит на земле.
может кто подскажет как быть в таком случае?
что касается плохого приема, провел эксперимент с установкой дросселей в выходную цепь, стало лучше. скоро придут дроссели, которые из даташита, думаю эффект будет ещё лучше.
Вставить в прошивку больше ничего нельзя (если использовать с аттини 13)- область памяти программ заполнена до предела.
Что касается приёма- пробуйте ставить дроссели и конденсаторы по питанию модуля приёмника. Да и неплохо бы усилитель запитать через дроссель.
в архиве печать приемника с сенсорным управлением, ссылка на оригинальный пост с сенсором, прошивка с ручным поиском от Уважаемого «Evgenij77», прошивка сенсора адаптирована под AVR STUDIO 6. как есть, все работает, только нет регулировки громкости. т.к. в прошивке сенсора не реализована возможность одновременной работы пары портов на вывод.(одновременное касание к паре сенсоров — ничего не происходит). возможно кто-нибудь это поправит, у меня не хватает знаний. печать сделана под схему из даташита, с ферритовыми фильтрами. на модуле приемника кондер, идущий от второй лапы микросхемы — закоротить. это антенный вход.
посмотрите пункт 8.
forum.cxem.net/index.php?/topic/162328-%D1%80%D0%B0%D0%B4%D0%B8%D0%BE%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8C-%D1%81-rda5807m-%D0%BF%D1%80%D0%BE%D0%B4%D0%BB%D0%B5%D0%B2%D0%B0%D0%B5%D1%82-%D0%B6%D0%B8%D0%B7%D0%BD%D1%8C-%D1%81%D1%82%D0%B0%D1%80%D1%8B%D1%85-%D1%80%D0%B0%D0%B4%D0%B8%D0%BE%D0%BF%D1%80%D0%B8%D1%91%D0%BC%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2/