Зарегистрироваться

Обновлено. Стерео радиоприёмник Rda5807m + Attiny13a ценой меньше 1$


Как то искал на Али что нибудь для ардуино за дёшево.
Наткнулся на данную платку 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+)
* Все режимы запоминаются в память.

#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

Новый код с автопоиском

Советы по оптимизации кода приветствуются))
+
avatar
  • ABATAPA
  • 03 сентября 2015, 10:51
0
DC-DC раз в 6 её больше. :)
+
avatar
  • kotmorse
  • 26 октября 2016, 18:06
0
Для слабых сигналов радиостанций Ардуина и вообще микроконтроллеры не годятся — шумят.
+
avatar
  • ABATAPA
  • 27 октября 2016, 21:49
0
О! Спустя более года? ;) Подобное видел на ixbt — там спустя 8 лет ответили. Так что всё ещё впереди! :)
+
avatar
0
А на чем тогда всякую дополнительную логику реализовывать?
+
avatar
  • demonk
  • 21 февраля 2017, 15:31
0
А МК можно и в спячку ложить с пробуждением по кнопкам — и шуметь не будет и батарейку съэкономит.
А радио само цифровое и на сверхчувствительность явно не рассчитанное.
+
avatar
  • airwave
  • 03 сентября 2015, 10:56
0
а можно скет для Ардуино?
+
avatar
0
Этотт же код работает и на ардуино про мини
8 — Vol+
9 Vol-
10 — Sk
11 — 1 контакт RDA
12 — 2 Контакт RDA

— Либо подключите библиотеку github.com/mathertel/Radio/archive/master.zip

Там есть простые примеры.
+
avatar
  • ksiman
  • 03 сентября 2015, 11:03
0
Где готовая плата?
+
avatar
+3

Первая ревизия платы, новую ещё не травил.
+
avatar
  • yurok
  • 03 сентября 2015, 11:32
+23
адский ЛУТ )

советы:
1 — не делайте прямых (острых) углов на дорожках — они этого не любят
2 — лудите или сплавом Розе или припоем с помощью оплетки
3 — уделите минут 30 почитать как разводить платы
4 — используйте хороший паяльник с термостабилизацией
5 (опцион) — фотки как нить получше может получатся…

тогда будет получаться так, что низя будет вашими платами пугать детей — вот будешь плохо учится — все устройства у тебя будут ТАКИМИ! Получишь двойку — в школу вот с таким радио пойдешь! еще раз будешь драться — закажем тебе телефон у этого дяди, и будешь с ним ходить не меньше месяца!

но за труд однозначно плюс
+
avatar
+15
Мой первый ЛУТ ))
+
avatar
  • uZver
  • 03 сентября 2015, 17:51
0
Чем плохи прямые углы?
+
avatar
  • ksiman
  • 03 сентября 2015, 17:56
+28
Бегущие электроны по инерции выпадают :)
+
avatar
  • DenBond7
  • 03 сентября 2015, 18:15
+7
+
avatar
  • Bacchus
  • 04 сентября 2015, 12:45
+1
Это только при очень сильных разгонах ©

Старая байка про разгон 15 дюймового мониитора до 17 дюймов
+
avatar
  • yurok
  • 03 сентября 2015, 18:24
0
электроны, особенно слегка перекормленные, не вписываются в поворот и пробегают прямо — от этого дорожка портится
+
avatar
  • DikiyMan
  • 04 сентября 2015, 00:11
0
собственно, iXBT'шники уже ответили, что к чему.
+
avatar
  • IGeras
  • 06 сентября 2015, 17:48
+1
+
avatar
0
> уделите минут 30 почитать как разводить платы
А что для начинающих посоветуете?
+
avatar
  • Sentinel
  • 05 сентября 2015, 09:18
+1
кечиева почитать…
+
avatar
-1
зпазеба
+
avatar
  • IGeras
  • 06 сентября 2015, 17:50
+1
Выше скачайте док почитайте, как раз начинающим
+
avatar
0
спасибо
+
avatar
  • Valodr
  • 10 января 2016, 11:21
0

1 — иногда без прямых углов не обойтись
2 — лудил обычным оловом с канифолем
3 — до этой платы, последний раз разводил простенькие платы еще в школе, 20 лет назад
4 — использовал паяльник ЭПСН 40/220
5 — фотка как получилась, так и получилась)

Это мой первый в жизни ЛУТ, по краям платы получились дефекты, в школе платы разводил нитрокраской или лаком для ногтей, рисовал в тетрадке в клеточку)))

Все ваши пункты желательны, но все же предпочтительней прямые руки))
+
avatar
  • yurok
  • 11 января 2016, 00:36
+1
1 почти всегда можно обойтись
2 так тоже можно — но как я написал быстрее и результат немного лучше
3 норм
4 попробуйте нормальный — удивитесь
5 норм

у меня как-то так: mySKU.me/blog/aliexpress/37390.html
+
avatar
  • yurok
  • 03 сентября 2015, 11:12
+11
говорите за каждый байт боролись а в циклах используете int который кушает 2 байта…
тип byte вам за глаза хватит — 1 байт
+
avatar
+1
Спасибо сэкономил 6 байт. ))
Размер скетча в двоичном коде: 960 байт
+
avatar
0
можно еще местами юзать тернарный оператор вместо if и инкремент/декремент до переменной
+
avatar
0
Если так правильно то ещё минус 8 байт.
vol? vol: 1;
// if (vol<1) vol=1;
+
avatar
0
да, i++ на ++i поменяли? Тоже вроде должно уменьшить)
+
avatar
0
не помогло )).

Придёт следующяя партия приёмников, буду делать универсальный код.
При первом старте идёт сканирование диапазона и запоминание номеров станций в епром. В 100 байт надо будет уложится ))
+
avatar
0
значит само соптимизировалост)
+
avatar
  • OreSama
  • 03 сентября 2015, 12:56
+1
Там ещё много чего можно. Например, вместо data=data*2 сделать data=<<1, если компилятор проглотит. Или data+=data. И проверку на максимальную громкость сделать как volume&=0x0F. И в сериях условий трёхкратную проверку PINB заменить однократной.
+
avatar
0
data=data*2 data+=data размер тот же,
остальное пока обдумываю.

трёхкратную проверку 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;
+
avatar
  • AndyBig
  • 03 сентября 2015, 16:46
+1
вместо data=data*2 сделать data=<<1
Сейчас уже практически все компиляторы сами умеют такую оптимизацию :)
+
avatar
  • Rzzz
  • 03 сентября 2015, 11:22
0
А амплитудную модуляцию это приёмник умеет? Хочется самолетики послушать.
+
avatar
0
Не умеет.
+
avatar
  • SerjNSK
  • 03 сентября 2015, 11:35
+1
Дык он все равно выше 115 не умеет. В авиа с 118 начинается диапазон.
+
avatar
  • Rzzz
  • 03 сентября 2015, 16:13
0
Да, я прочитал потом характеристики по подробнее, первый раз читал наискосок. Но поправить пост уже не смог.
+
avatar
  • ksiman
  • 03 сентября 2015, 12:54
+1
А амплитудную модуляцию это приёмник умеет? Хочется самолетики послушать.
Для этого есть другие недорогие устройства
Подсказка — R820T
+
avatar
  • Rzzz
  • 03 сентября 2015, 16:25
+1
У меня есть Yaesu для этого, но! Ей не сильно удобно пользоваться и она привлекает внимание. И стоит дорого, обидно потерять. А потерять можно, например, из-за повышенного рвения служб безопасности.
Вот и виделось такое компактное устройство, с мизерной ценой, которое можно брать с собой в самолёт.
+
avatar
+2
Ноутбук и тв-тюнер точно вопросов не вызовут, с андроидом rtl sdr тоже работает ок, батарею только как не в себя жрет.

Единственное с антенной — уже на борту могут привязаться.
+
avatar
  • Rzzz
  • 04 сентября 2015, 09:33
0
Это все как- то нелогично сложно. вот такую платочку бы, ардуинку, пару кнопок и батарейку. Стоило бы рублей 300.
+
avatar
  • Irodenko
  • 03 сентября 2015, 11:31
0
на контроллеры ссылка не открывается.
+
avatar
0
Спасибо исправил.
+
avatar
  • alkoizh
  • 03 сентября 2015, 11:44
+1
Интересно. А плата с TEA5767 FM по командам совпадает? Внешне и по выводам всё совпадает. Можно с Вами проконсультироваться по данной разработке? alkoizh собака rambler.ru. Cпасибо.

Прочитал на странице продавца: «Использование общего 102BC модуль пакета, Пользователи могут непосредственно заменить использование, Без изменения цепи дизайн».
+
avatar
+2
RDA5807 обратно совместима с TEA5767,
RDA может работать в 2x режимах:
— В своём родном ( как в моём скетче)
— В режиме совместимости с TEA

На моём коде TEA работать не будет.

Вот код режима совместимости www.5v.ru/start/em5807m-arduino-nano-30.htm
+
avatar
  • Alex_74
  • 03 сентября 2015, 11:48
0
А антенна у радио где? Как антенну мутили? Как с чувствительностью?
+
avatar
0
Антенна проводок, на схеме под динамиками.
По чувствительности лучше чем у 174ха34.
+
avatar
+4
На али продаётся много контроллеров ATINY13a, лочёных для записи через USBASP
В моей партии из 5 штук 4 были лоченые.
Этот Лок легко снимается высоковольтным программатором.

Скетч из статьи мне не помог, тк кроме неправильно выставленых фюзов, ещё был лок на чтение. И фюзы менять не давало.

Подправленый скетч
Скетч
#define  HFUSE  0xFF   // Defaults for ATtiny25/45/85
#define  LFUSE  0x6A



#define  RST     13    // Output to level shifter for !RESET from transistor to Pin 1
#define  CLKOUT  12    // Connect to Serial Clock Input (SCI) Pin 2
#define  DATAIN  11    // Connect to Serial Data Output (SDO) Pin 7
#define  INSTOUT 10    // Connect to Serial Instruction Input (SII) Pin 6
#define  DATAOUT  9    // Connect to Serial Data Input (SDI) Pin 5 
#define  VCC      8    // Connect to VCC Pin 8




int inByte = 0;         // incoming serial byte Computer
int inData = 0;         // incoming serial byte AVR

void setup()
{
  // Set up control lines for HV parallel programming
  pinMode(VCC, OUTPUT);
  pinMode(RST, OUTPUT);
  pinMode(DATAOUT, OUTPUT);
  pinMode(INSTOUT, OUTPUT);
  pinMode(CLKOUT, OUTPUT);
  pinMode(DATAIN, OUTPUT);  // configured as input when in programming mode

  // Initialize output pins as needed
  digitalWrite(RST, HIGH);  // Level shifter is inverting, this shuts off 12V

  // start serial port at 9600 bps:
  Serial.begin(9600);

  establishContact();  // send a byte to establish contact until receiver responds

}


void loop()
{
  // if we get a valid byte, run:
  if (Serial.available() > 0) {
    // get incoming byte:
    inByte = Serial.read();
    Serial.println(byte(inByte));
    Serial.println("Entering programming Mode\n");

    // Initialize pins to enter programming mode
    pinMode(DATAIN, OUTPUT);  //Temporary
    digitalWrite(DATAOUT, LOW);
    digitalWrite(INSTOUT, LOW);
    digitalWrite(DATAIN, LOW);
    digitalWrite(RST, HIGH);  // Level shifter is inverting, this shuts off 12V

    // Enter High-voltage Serial programming mode
    digitalWrite(VCC, HIGH);  // Apply VCC to start programming process
    delayMicroseconds(20);
    digitalWrite(RST, LOW);   //Turn on 12v
    delayMicroseconds(10);
    pinMode(DATAIN, INPUT);   //Release DATAIN
    delayMicroseconds(300);

    //Programming mode

    readFuses();

    //Write hfuse
    Serial.println("Writing hfuse");
    shiftOut2(DATAOUT, INSTOUT, CLKOUT, MSBFIRST, 0x40, 0x4C);
    shiftOut2(DATAOUT, INSTOUT, CLKOUT, MSBFIRST, HFUSE, 0x2C);
    shiftOut2(DATAOUT, INSTOUT, CLKOUT, MSBFIRST, 0x00, 0x74);
    shiftOut2(DATAOUT, INSTOUT, CLKOUT, MSBFIRST, 0x00, 0x7C);

    //Write lfuse
    Serial.println("Writing lfuse");
    shiftOut2(DATAOUT, INSTOUT, CLKOUT, MSBFIRST, 0x40, 0x4C);
    shiftOut2(DATAOUT, INSTOUT, CLKOUT, MSBFIRST, LFUSE, 0x2C);
    shiftOut2(DATAOUT, INSTOUT, CLKOUT, MSBFIRST, 0x00, 0x64);
    shiftOut2(DATAOUT, INSTOUT, CLKOUT, MSBFIRST, 0x00, 0x6C);

    //Erase device
    Serial.println("Erase device");
    shiftOut2(DATAOUT, INSTOUT, CLKOUT, MSBFIRST, 0x80, 0x4C);
    shiftOut2(DATAOUT, INSTOUT, CLKOUT, MSBFIRST, 0x00, 0x64);
    shiftOut2(DATAOUT, INSTOUT, CLKOUT, MSBFIRST, 0x00, 0x6C);
    while (!digitalRead(DATAIN));

    readFuses();

    Serial.println("Exiting programming Mode\n");
    digitalWrite(CLKOUT, LOW);
    digitalWrite(VCC, LOW);
    digitalWrite(RST, HIGH);   //Turn off 12v
  }
}


void establishContact() {
  while (Serial.available() <= 0) {
    Serial.println("Enter a character to continue");   // send an initial string
    delay(1000);
  }
}

int shiftOut2(uint8_t dataPin, uint8_t dataPin1, uint8_t clockPin, uint8_t bitOrder, byte val, byte val1)
{
  int i;
  int inBits = 0;
  //Wait until DATAIN goes high
  while (!digitalRead(DATAIN));

  //Start bit
  digitalWrite(DATAOUT, LOW);
  digitalWrite(INSTOUT, LOW);
  digitalWrite(clockPin, HIGH);
  digitalWrite(clockPin, LOW);

  for (i = 0; i < 8; i++)  {

    if (bitOrder == LSBFIRST) {
      digitalWrite(dataPin, !!(val & (1 << i)));
      digitalWrite(dataPin1, !!(val1 & (1 << i)));
    }
    else {
      digitalWrite(dataPin, !!(val & (1 << (7 - i))));
      digitalWrite(dataPin1, !!(val1 & (1 << (7 - i))));
    }
    inBits <<= 1;
    inBits |= digitalRead(DATAIN);
    digitalWrite(clockPin, HIGH);
    digitalWrite(clockPin, LOW);

  }


  //End bits
  digitalWrite(DATAOUT, LOW);
  digitalWrite(INSTOUT, LOW);
  digitalWrite(clockPin, HIGH);
  digitalWrite(clockPin, LOW);
  digitalWrite(clockPin, HIGH);
  digitalWrite(clockPin, LOW);

  return inBits;
}

void readFuses() {
  //Read lfuse
  shiftOut2(DATAOUT, INSTOUT, CLKOUT, MSBFIRST, 0x04, 0x4C);
  shiftOut2(DATAOUT, INSTOUT, CLKOUT, MSBFIRST, 0x00, 0x68);
  inData = shiftOut2(DATAOUT, INSTOUT, CLKOUT, MSBFIRST, 0x00, 0x6C);
  Serial.print("lfuse reads as ");
  Serial.println(inData, HEX);

  //Read hfuse
  shiftOut2(DATAOUT, INSTOUT, CLKOUT, MSBFIRST, 0x04, 0x4C);
  shiftOut2(DATAOUT, INSTOUT, CLKOUT, MSBFIRST, 0x00, 0x7A);
  inData = shiftOut2(DATAOUT, INSTOUT, CLKOUT, MSBFIRST, 0x00, 0x7E);
  Serial.print("hfuse reads as ");
  Serial.println(inData, HEX);

  //Read efuse
  shiftOut2(DATAOUT, INSTOUT, CLKOUT, MSBFIRST, 0x04, 0x4C);
  shiftOut2(DATAOUT, INSTOUT, CLKOUT, MSBFIRST, 0x00, 0x6A);
  inData = shiftOut2(DATAOUT, INSTOUT, CLKOUT, MSBFIRST, 0x00, 0x6E);
  Serial.print("efuse reads as ");
  Serial.println(inData, HEX);
  Serial.println();
}



пс. В топике ссылка на продавца со 174 заказами, и не одного отзыва про лок.
+
avatar
-3
115 потолок??? Авиадиапазон не послушать?)))
+
avatar
  • trew911
  • 03 сентября 2015, 12:59
0
148-175мн бы ловилось дпс слушать
+
avatar
  • RomaL
  • 03 сентября 2015, 14:44
+1
И детектор бы в микросхеме узкополосный NFM, а не широкополосный WFM для музыкальных вещалок.
+
avatar
  • Rzzz
  • 03 сентября 2015, 16:49
-1
Они сейчас много где на 450 и в цифре. Слушать можно, но не так просто. А вообще там ничего интересного, слушать там нечего.
+
avatar
+1
угу, в москве apco p25 в основном, один раз только видел аналог, слушать нечего, если только базу собирать номер ву, свидетельства, авто, фио и количество штрафов оплачено/всего)

хотя иногда как радио слушаю, фоном, как сводку происшествий

днем ещё вокруг 440МГц в mototrbo какие-то ппс тоже, но ночью ни разу не слышал их
+
avatar
  • Neos
  • 03 сентября 2015, 15:44
+2
А без Attiny13a радиоприемник не заведется?
+
avatar
+1
Без контроллера не обойтись. ((
+
avatar
  • DenBond7
  • 03 сентября 2015, 16:33
0
И меня этот вопрос интересует. Тоже очень интересно.
+
avatar
0
Без контроллера есть модули с AR1310
+
avatar
0
Fm стерео модуль радио модуль 64 — 108 мГц AR1310 беспроводной модуль для Arduino
aliexpress.com/item/FM-Stereo-Module-Radio-Module-64-108MHz-AR1310-Wireless-Module-for-Arduino/32392341497.html
(from AliExpress Android)
+
avatar
0
Да, вот такой. Не знаю зачем приписали «для Ардуино». Там пять кнопок только припаять и всё.
+
avatar
  • krysa
  • 03 сентября 2015, 16:35
0
deleted
+
avatar
  • KRAB
  • 03 сентября 2015, 18:17
0
Пример бы увидеть…
+
avatar
  • ZucoR
  • 03 сентября 2015, 20:05
+2
ужас, вот раньше народ значл что радио можно сделать из куска провода и лимона, а сейчас ардуино подавай
+
avatar
+1
В скетче от ардуино ни чего не осталось))
Только привычная среда компиляции.
+
avatar
  • Xizel
  • 03 сентября 2015, 22:19
0
Это показан пример-как из 3 кусков кремния сделать приемник. Делал такой же на ардуине с экраном от нокии -на даче самое востребованное.
+
avatar
  • RomaL
  • 04 сентября 2015, 15:00
+3
Мы с другом в детстве соединяли два высокоомных наушника длинным проводом и с радостью переговаривались по такому телефону, а теперь подавай телефоны 8 ядер, LTE, GPS.
Детекторный приёмник можно собрать и сегодня, да вот только слушать на нём нечего — вещательные передатчики ДВ и СВ, качающие в эфир сотни киловатт мощности уже везде выключены. Вот и приходится собирать современные FM приёмники, получая бонусом стереовыход, RDS, стабильный синтезатор частоты гетеродина. И чтобы конфигурировать эти бонусы ставить микроконтроллер.
+
avatar
  • Daredee
  • 05 сентября 2015, 10:50
0
ну можно и по двум стаканчикам переговариваться :)
+
avatar
  • denka55
  • 03 сентября 2015, 22:44
-1
Если не ошибаюсь, #define — это 2 или 4 байта — к сожалению, не могу проверить.
Попробуйте использовать переменные byte, uint8_t и т.д. вместо #define
+
avatar
+2
директива компилятора может занять 2 или 4 байта? каким образом?
+
avatar
  • OreSama
  • 04 сентября 2015, 08:33
0
Как ни странно, она вполне может отжирать байты. Define — явная подстановка строки в исходный текст. Если создать переменную с неизменным значением и использовать её вместо define, после ассемблирования в машинном коде будет не значение, а его чтение из заданного адреса. И в некоторых случаях команда чтения из памяти короче, чем запись в регистр константного значения. Во что оно скомпилируется для данной конкретной атмеги, правда, не знаю, надо проверять.

А вообще для таких вещей лучше использовать const, но мне доводилось видеть компиляторы, которые размножали константное значение в стольки экземплярах, сколько оно встречалось в исходнике.
+
avatar
  • yurok
  • 04 сентября 2015, 08:50
+3
Жесть! из серии очевидное-невероятное!

#define — директива препроцессора — а это означает что еще перед компиляцией — все дефайны исчезнут из кода, а в коде появятся конкретные значения или выражения!

#define — нисколько не потребляет памяти и не может этого никак делать!
использование define — это тоже самое, что использование констант, конкретных значений

const — это инструкция для избегания ошибок программиста — на память никак не влияет, если будет попытка поменять значение переменной — то программа не скомпилируется — и все. На память эта инструкция никак не влияет! переменная займет столько памяти сколько требует ее тип! В настройках компилятора можно задать оптимизацию, чтобы компилятор встроил константы в код, конечно если это нужно.
+
avatar
  • OreSama
  • 04 сентября 2015, 09:43
0
Про данный конкретный AVR не скажу, но в C++Builder если присваивать переменной типа Extended значение, определённое через #define, оно транслировалось в адский ад из четырёх ассемблерных команд. А если бралось из переменной, оно транслировалось в один fld tbyte «адрес»
+
avatar
-1
вы втираете нам какую-то дичь!
+
avatar
0
да и переменная будет, а это указатель и значение. Сэкономить на define можно только если явно указывать на небольших значениях размерность.
+
avatar
  • OreSama
  • 04 сентября 2015, 12:50
+1
Вы таки не понимаете разницу между const и define. Типизированная константа имеет адрес в памяти и все обращения к ней транслируются в чтение данных по указателю. Define — инструкция препроцессора, она просто подставляет один текст вместо другого. Просто сишечка родилась калечной by design и нормальных констант там не было, а затыкать эту дыру предлагалось дефайнами. Однако даже в те дикие времена до людей уже дошло, что обращаться к популярному 4-байтному значению по 2-байтному адресу часто выходит короче, чем тупо дублировать эти 4 байта каждый раз, когда они нужны. И единственный надёжный способ это сделать заключался в том, чтобы объявить константу как переменную и запомнить, что эту переменную менять нельзя.

В данном МК обращение к 16-битному значению не напрямую, а по 12-битному адресу тоже способно сэкономить память.
+
avatar
0
точно! Я и забыл что это 8ми битка))
+
avatar
  • alkoizh
  • 04 сентября 2015, 11:44
0
Я ленивый радиолюбитель. Заказал MCU готовую плату. Только добавь батарейку.
aliexpress.com/item/Mini-1-8V-3-6V-Built-in-MCU-Broadcast-Signal-Receives-76-108MHz-Stereo-Music-Player/739593225.html
+
avatar
  • Xizel
  • 04 сентября 2015, 23:44
+1
Да здесь не в плате готовой дело- а в том, что бы что то собрать своими руками.
+
avatar
  • Fricker
  • 06 сентября 2015, 12:25
0
+
avatar
  • IGeras
  • 06 сентября 2015, 18:13
0
+
avatar
0
Нашёл продавца с ценой ниже 0.44. Ссылка в обзоре.
+
avatar
0
Ams1117 AMS1117-3.3 SOT223
aliexpress.com/item/AMS1117-AMS1117-3-3-SOT223/32452534417.html

Стабилизатор по 0.03$ поштучно.
+
avatar
0
Стерео FM радио модуль RDA5807M беспроводной модуль профор для Arduino RRD-102V2.0
aliexpress.com/item/FM-Stereo-Radio-Module-RDA5807M-Wireless-Module-Profor-For-Arduino-RRD-102V2-0/32464120964.html
0.41$
+
avatar
0
в мобильной версии 0.39$
+
avatar
  • demonk
  • 13 ноября 2015, 13:28
0
А кто-нибудь может порекомендовать компактный DC-DC модуль на 3.3 для такого радио?
Чтоб вход 3.0-4.2, выход 3.3В. Или хотя бы вход 3,3-4,2, выход 3.0В.
Известные KIS-3R33S и yec-sd200 я так понимаю не годятся, т.к. мин вход 4.75В.
+
avatar
0
поставь стабилизатор на 2.5 в и достаточно.
от 3 до 9 можно питать будет.

Приёмник не любит ни чего импульсного.
Подключал к нему усилитель pam8403, приёмник почти перестал ловить. Подключил аналоговый отлично заловило.
+
avatar
  • demonk
  • 16 ноября 2015, 15:57
0
Вот только с линейным стабилизатором как обычно дофига энергии будет на обогрев атмосферы уходить — при напряжении 4,2В — до 40%, при 9В — аж 72% в трубу. Для аккумуляторного девайса довольно расточительно, хотя и просто.
Да и сам то приемник — внутри цифровой и управляется цифрой и ловит же как то, может имеет смысл DCDC, усилок или приемник в экран поместить и LC-фильтрами огородить и работало бы…
+
avatar
0
Ув. автор в вашем архиве содержится прошивка для тиньки (softi2c_13_radio.cpp.hex) можно ли обойтись без ардуино и прошить через программатор если да то какие фьюзы выставлять? И у меня при компиляции вашего скетча возникает ошибка в строке 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)':
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))'
может подскажите как исправить? Библиотеку поставил вашу.Заранее спасибо.
+
avatar
+1
в принципе можно. только частоты каналов в хекс поменять. мои частоты в исходнике…

фьюзы стоят 0x39

выложу мой ардуино иде в нем компилируется ))
+
avatar
0
Я извиняюсь а не могли бы вы компилировать на вашей программе с моими частотами и скинуть прошивку? Фьюзы 0x39 мне не о чём не говорят есть LOW и HIGH фьюзы 0x39 это что?([email protected])
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 Наше ФМ
+
avatar
  • Fizik
  • 07 января 2017, 20:48
0
Можно Ваш Arduino IDE? При компиляции пишет те же ошибки, что и у sergeyovs1980. Прошить удалось только готовый hex через программатор. (0х39 — LOW и 0хFF — HIGH)
+
avatar
  • vsnet
  • 29 ноября 2016, 14:23
0
у меня так же появляется подобная ошибка если вы решили эту проблему опишите подробно как устранить её и
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)':
и т.д…
+
avatar
0
А почему в скетче нет ссылок на PROGMEM? Она обьявлена но не используеться?
+
avatar
  • ars781
  • 30 апреля 2016, 15:48
0
С Ардуино не знаком. Скачал установил. но не компилирует. Ошибки теже что и у sergeyovs1980.
Просьба обьяснить что к чему или прошить с частотами 100.8,103.4, 106.3 и 104.5.
Пробовал код подправить с кодевижн. Но там много чего надо поправлять. также не справлюсь
+
avatar
  • kotmorse
  • 05 сентября 2016, 12:54
0
авиадиспетчеров слушать можно?
+
avatar
  • RONIN
  • 25 октября 2016, 17:17
0
Квакеров можно!
+
avatar
  • abyrwalg
  • 25 октября 2016, 18:37
0
Читать, потом писать!

ПС. Не те частоты, не та модуляция(авиа=АМ); либо СДР, либо найти «ФМ+АМ» приёмничек 'похуже, но с индикатором частоты', они плохо подавляют паразитную для себя модуляцию, — и «перемотать» катушку, уродуя витки.
+
avatar
+1
cloud.mail.ru/public/4rs6/NNGiVLqrH

Новый код а так же hex
Добавил автопоиск станций, активируется если включить приёмник с зажатой кнопкой настройки.
Так же включаются режим моно и бас. Зажатием при включении vol- (моно) и vol+ (бас)

В 1 посте скетч обновил.
+
avatar
0
Большое спасибо за разработку кода прошивки для ATTINY13! Особенно понравилось то что при включении воспроизводится станция, которая играла перед выключением. Wap-tolik, не могли б вы сделать вариант кода с добавлением кнопки (к выв.1) переключения станций назад и убрав из кода включение моно и баса. Ещё хотелось, чтобы сканирование можно было останавливать кратковременным нажатием кнопки SK.
+
avatar
0
1 вывод ресет. Если его включить на чтение кнопки, то тиньку больше не прошить обычным программатором.

Можно сделать настройку вперёд назад. а громкость по кругу, одной кнопкой.
+
avatar
  • Evgenij
  • 20 ноября 2016, 01:56
0
Подскажите, что поменять в скетче, чтобы приёмник сканировал от 64 МГц?
+
avatar
0
В данной реализации можно искать только в одном диапазоне. 87-108. Тк отсев станций идёт по признаку стерео сигнала.
А в фм диапазоне стерео другой модуляции.
+
avatar
  • Evgenij
  • 23 ноября 2016, 02:11
0
Информация не точная. Я работаю с радиопередатчиками. Так раньше, согласен, передатчики ЧМ (советского диапазона 65-74 МГц) были с полярной модуляцией. А примерно лет пять как стали поставлять и устанавливать радиопередатчики с модуляцией с пилот-тоном как в диапазоне FM, так и ЧМ.
У меня приёмник на RDA5807m и ардуинке работает в двух диапазонах в стерео. Хотелось бы попробовать и на Attiny13. Понимаю, что нужно установить какие-то биты в RDA5807m…
Подскажите, как в этом скетче расширить диапазон поиска.
И ещё, можно ли прописать частоты в епром не сканируя? Дело в том, что при сканировании иногда «ловятся» неправильные частоты, особенно, если РТПС находится недалеко. И было бы лучше, как в старом варианте скетча, иметь возможность прописывать нужные частоты. Или, как вариант, добавить функцию редактирования (удалять ненужную станцию, либо делать пропуск станции, например нажатием одновременно трёх кнопок ).
+
avatar
0
Надо просто переключить диапазон. В set fecurency первая строка закоментирравная в место 0 оставить то что закоментиррвано.
Но будет искать только в УКВ диапазоне.

На тиньке бился за каждый байт, сейчас в епром сохраняются только номера каналов. Работа с частотой занимает много места в коде.
+
avatar
  • Evgenij
  • 09 января 2017, 19:49
0
Пробовал раскомментировать. Ничего не меняется. Не ищет в УКВ диапазоне. А как всё-таки поменять диапазон? Хотя бы в первом варианте скетча?
+
avatar
  • sevals
  • 03 декабря 2016, 14:50
+1
Прошивка идеальна для автономного устройства, а вот для стационарного я бы кнопки + — использовал для переключения каналов, от кнопок громкости отказался совсем и регулировал уровень переменным резисторо, и еще очень не хватает функции удаления ненужных станций. Хватит ли памати на реализацию этих пожеланий.
+
avatar
+1
всех приветствую. собрал, работает. почти собрал блютус колонку, хочу в нее поставить этот приемник. но есть проблема с переключением станций.
Автор, если конечно есть возможность, сделай пожалуйста НЕХ, вместо регулировки громкости нужно переключение станций вперед-назад. буду очень благодарен. процесс допиливания колонки встал из-за этого
+
avatar
  • sepryn
  • 18 февраля 2017, 10:30
0
«всех приветствую. собрал, работает.»
Можно подробнее? Какой Arduino IDE компилировали и шили?
+
avatar
  • sepryn
  • 16 февраля 2017, 15:58
0
А у меня никак не компилируется. Перепробовал разные Arduino IDE, везде разные ошибки при компиляции. Что я не так делаю?
+
avatar
+1
Следует использовать только arduino-1.0.6, в других версиях Arduino IDE у меня не получалось…
+
avatar
  • sepryn
  • 18 февраля 2017, 10:27
0
Спасибо за ответ!.. В arduino-1.0.6 у меня тоже нормально компилируется, без ошибок, только никак не могу добиться, чтобы в подменю «Платы» тинька появилась. Вроде всё везде добавил.
+
avatar
+1
Проверь правильный путь в подкаталогах. У меня так — C:\Program Files\Arduino\hardware\attiny13\cores\core13.
+
avatar
  • sepryn
  • 18 февраля 2017, 12:11
0
Вот мой путь C:\Program Files\Arduino\hardware\attiny13\cores\core13
Всё так и есть. Может библиотеки другие? Ты откуда библиотеку брал?
+
avatar
0
Библиотеки выложил автор статьи- ссылка вверху, под фото печатной платы.
+
avatar
  • sepryn
  • 16 февраля 2017, 21:47
0
Arduino: 1.6.4 (Windows 7), Плата«Arduino Nano, ATmega328»

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
+
avatar
  • sepryn
  • 18 февраля 2017, 10:35
0
Вопрос к знатокам. Почему компилируется только в Arduino ID -1.0.6? В других версиях ошибки, причём везде разные.
+
avatar
+1
видимо, библиотеки совместимы только с 1.0.6
+
avatar
  • sepryn
  • 20 февраля 2017, 07:51
0
Всё заработало, спасибо Evgenij77! Компилировать только в Arduino ID -1.0.6 и с библиотекой автора. Спасибо!
+
avatar
+2
Прошивка с полуавтоматическим поиском каналов. Ссылка
Переключение каналов одной кнопкой «CH».
Регулировка громкости кнопками "VOL+" и "VOL-". 15 позиций уровня громкости.
Режим «Поиск Каналов» активируется включением питания с зажатой кнопкой «CH ».
Когда приёмник найдёт канал, поиск остановится на 4 секунды для прослушивания.
Если в это время нажать кнопку «CH » и удерживать не менее 4 секунд- канал запишется в память,
если не нажимать- не запишется. После отпускания кнопки сканирование продолжится.
Режим «Моно/Стерео» переключается включением питания с зажатой кнопкой «VOL -».
Режим «УсилениеБаса» переключается включением питания с зажатой кнопкой «VOL +».
Все установленные режимы записываются в EEPROM.
Кнопки: «VOL +» — 5 нога МК, «VOL -» — 6, «CH» — 7.
+
avatar
0
отлично, спасибо. тестить
+
avatar
+1
"«Когда приёмник найдёт канал, поиск остановится на 4 секунды»" это не работает к сожалению
+
avatar
+1
Странно… и это на двух прошивках? У меня-то всё работает… Проверено, и не раз.
+
avatar
+1
возможно фьюзы. как у вас?
у меня
high:FF
low:39
+
avatar
+1
В моём случае:
high:FF
low:6А
А если выставить low:39, то тактовая частота микроконтроллера в несколько раз больше и поиск останавливается на время около 1 секунды.
+
avatar
+1
ну да, делитель на 8. так и думал. спасибо
+
avatar
  • wrong
  • 01 марта 2017, 08:03
+1
Всем привет.
Evgenij77 как прописать все настройки в EEPROM на стадии программирования.
Имеется ввиду:
1. Какие значения и в какие ячейки прописать Mono-Stereo, Bass on/off, последняя станция.
2. Как рассчитать значения и в какие ячейки прописать частоты радиостанций.
Включил и всё готово.
Успехов.
+
avatar
+1
Собрать приёмник. Включить настроить станции громкость. Считать епром. И во все новые приемники зашивать епром.
+
avatar
+1
Wap-Tolik, как всё-таки в первом варианте скетча поменять диапазон на УКВ (64 — 75 МГц)?
+
avatar
  • wrong
  • 01 марта 2017, 17:02
+1
Сделал копию EEPROM.
подробности в приложении.

Может кто разъеснит непонятки.
+
avatar
  • wrong
  • 02 марта 2017, 11:01
+1
Результаты моих экспериментов. Может кому пригодится.
Все данные в шестнадцатеричном виде.
У меня только не сохраняется радиостанция даже если я и пропишу в EEPROM.
При включении шумы, станция только после нажатия ch+ или ch-. Но это я грешу на микросхему приёмника — RDA5807FP. Хотя в другой конструкции сохранение станции работает.

Прав или не прав это может сказать только программист написавший программу.
Он должен знать что куда прописывается и в каком виде.

Некоторые размышления: уровень громкости можно прописывать EEPROM, всё равно будет регулироваться перед УНЧ, а на освободившийся порт повесить светодиод, который бы мигал при достижении радиостанции с максимальной частотой-2 раза, при достижении радиостанции с минимальной частотой-1 раз. Переключение по кругу не нужно. Трудно ориентироваться какая станция принимается, а так хоть какой то ориентир, если хватит места в МК. Автопоиск включать одновременным нажатием кнопок ch+ и ch- при включении приёмника, а сохранение долгим нажатием ch+.

Успехов.
+
avatar
+1
Желания-то интересные, но свободной памяти в МК уже нет…
+
avatar
  • wrong
  • 02 марта 2017, 13:24
+1
Спасибо за ответ Evgenij77, такие мысли у меня были.
Попробывал последнию прошивку Wap-tolik, станции сохраняет и стартует с этойстанции. Разобрался что писать в ячейку 00-где сохраняются станции. Там пишется номер станции в шестнадцатеричном виде, начиная с ячейки 05-1, 06-2 и.т.д…
Evgenij77 ёщё раз испытал вашу прошивку с каналами, сохраняет станции правильно.
Но при включении необходимо нажать ch. Если нажать ch+ то то начнёт воспроизводится станция выше сохранённой. Если нажать ch- то то начнёт воспроизводится станция ниже сохранённой.
Проверил также прошивку с громкостью, поведение такое же, как и с каналами.

Успехов.
+
avatar
  • wrong
  • 03 марта 2017, 11:59
+1
Добрый день.

Кто собирал, откликнитесь по поводу сохранённой станции при включения приёмника от Evgenij77.
Может только уменя такой глюк.

Модераторы уберите пост:
wrong 01 марта 2017, 17:02
Сделал копию EEPROM.
подробности в приложении.

Может кто разъеснит непонятки.
Только засоряет. Ниже постом всё описано.

Мои мысли по приёмнику:
1. Убрать кнопку громкость. Уровень громкости прописывается в EEPROM — он не вечен. Для чего: испытывал с разными усилителями НЧ, так для одного 4-5 уровня хватит а для другого и 15 было маловато. А для любителей регулировать громкость кнопками можно сделать такой вариант: длительное удержание — увеличение громкости а кратковременное нажатие — уменьшение громкости.
2. Прописать в EEPROM станцию, которая будет стартовать при включении — EEPROM не вечен.
Можно сделать и такой вариант — при работе длительно удерживать кнопку ch+ чтобы записалась станция.
3. Отключить переключение станций по кольцу. При достижении крайних значений частоты радиостанций — станции не меняются при нажатии кнопки в том же направлении.
У нас в городе 16 станций и когда переключаешь по кольцу то начинаешь путаться.
4. Автопоиск включать одновременным нажатием кнопок ch+ и ch- при включении приёмника, а сохранение долгим нажатием ch-.
5. Басс — при включении приёмника нажата ch+. Можно и в программе включать Басс, при конфигурации регистров микросхемы. Хотя при эсперименте в другой конструкции при включении баса появлялись искажения, при отключении пропадали.
6 Моно/Стерео — при включении приёмника нажата ch-.

Не программист, поэтому не знаю возможно ли всё это сделать и хватит ли памяти МК. Может в описании есть логические не стыковки. Можно только часть мыслей сделать.

Evgenij7 или Wap-tolik при хорошем настроении, желании и возможностей МК может сделаете хотя бы часть.

Спасибо. Успехов.
+
avatar
+1
1.- Зачем убирать кнопку? Можно её не использовать выпаять… (а EEPROM на жизнь приёмника хватит...)
2.-Прописать можно и все нужные частоты, только не в EEPROM, а в программе…
Приёмник во всех прошивках стартует с той станции, которая была включена последняя. (если не так, попробуйте поменять RDA, или Attiny 13- встречались глючные…
3.- Можно сделать.
4.- Можно попробовать, если хватит памяти…
5 и 6 оставляем, как было? Правильно понял?
На счёт функции длительного удержания какой-либо кнопки- думаю, не получится- мало памяти.
+
avatar
  • wrong
  • 04 марта 2017, 13:19
+1
Добрый день Evgenij77. Спасибо за ответ.

Прочитал Ваше сообщение, подумал, что то я разогнался в предыдущем собщении.
Чтобы Вам не мудрить, отключите переключение станций по кольцу. Прописка станций в программе не нужно. Пока эспериментировал с приёмником, обнаружил две новые станции, поэтому если появится что то новое — то просто переписать EEPROM. А в программе — надо делать много телодвижений, не все это смогут.
Ниже мои мысли, информация для размышлений:
Если ещё бы получилось с громкостью, то получилась бы конструкция для всех. Если отключить например настройку баса и моно/стерео, прописывать их в EEPROM и при включении настройки считываются. Не запоминать станци при отключении а прописать в EEPROM. Если я правильно понял Wap-tolik станция определяется по наличию стереосигнала, может определять станции по наличию станции, если это требует меньше памяти. Можно сделать регулировку громкости двумя кнопками, удерживая кнопку Vol и нажимая кнопку ch+ или ch- регулируем громкость, если этот метод займёт меньше памяти МК. Может ещё что то сделать чтобы освободить память.
Глюки RDA и ATtiny допускаю что это имеет место. Но испытывая последнию прошивку Wap-tolik станции сохраняет и стартует с этойстанции.

Здоровья и успехов.
+
avatar
+1
Обновлённая прошивка.
Прошивка с полуавтоматическим поиском каналов.
Переключение станций кнопками «CH +» и «CH -». Переключение станций по кругу отключено.
Регулировка громкости одной кнопкой «VOL». 15 позиций уровня громкости- от 1 до 15, потом снова 1.
Режим «Поиск Каналов» активируется включением питания с зажатой кнопкой «VOL».
Когда приёмник найдёт канал, поиск остановится на 3 секунды для прослушивания.
Если в это время нажать кнопку «VOL» и удерживать не менее 3 секунд- канал запишется в память,
если не нажимать- не запишется. После отпускания кнопки сканирование продолжится.
Режим Моно/Стерео переключается включением питания с зажатой кнопкой «CH -».
Режим УсилениеБаса переключается включением питания с зажатой кнопкой «CH +».
Все установленные режимы записываются в EEPROM.
Кнопки «CH +» — 5 нога МК, «CH -» — 6, «VOL» — 7.
+
avatar
+1
Управление громкостью сочетанием кнопок «VOL & CH+» и «VOL & CH-» можно сделать, но в таком случае придётся отказаться от полуавтоматического поиска каналов и установки режимов Моно/Стерео и Усиление_Баса кнопками и устанавливать их в EEPROM вручную.
+
avatar
  • wrong
  • 06 марта 2017, 17:20
+1
Evgenij77 спасибо за внимание.
Проверил прошивку, всё работает, перестал даже путаться в каналах и стала включатся запомненная станция. Единственно что не любит старых кнопок, пришлось к макету подпаивать другие кнопки.
Может можно увеличить задержки после нажатия кнопок или как у Вас компенсируется дребезк кнопок.

По поводу управление громкостью сочетанием кнопок «VOL & CH+» и «VOL & CH-» то если у Вас есть желание то буду очень благодарен. Испытаю и это вариант буду вставлять в корпус.

Успехов.
+
avatar
+1
Прошивка с альтернативной регулировкой громкости
Прошивка с автоматическим поиском каналов.
Переключение станций кнопками «CH +» и «CH -».
Регулировка громкости: сочетанием кнопок «VOL & CH+» и «VOL & CH-».
Режим «Поиск Каналов» активируется включением питания с зажатой кнопкой «VOL».
Режим Моно/Стерео переключается включением питания с зажатой кнопкой «CH -» (но начинает действовать при следующем включении приёмника).
Все установленные режимы записываются в EEPROM.
Кнопки «CH +» — 5 нога МК, «CH -» — 6, «VOL» — 7.
+
avatar
  • wrong
  • 07 марта 2017, 13:29
0
Evgenij77 громадное спасибо за прошивку!!!

Проверил, всё работает. Бас я так понимаю только через EEPROM.

Буду теперь заниматься облагораживанием.

Успехов!
+
avatar
  • wrong
  • 07 марта 2017, 21:59
0
Привет всем.
Выкладываю описание EEPROM, может кому пригодится.
+
avatar
0
Прошивка для радио с управлением двумя кнопками.
Оптимальна для приёмников с регулировкой громкости потенциометром.
Прошивка с полуавтоматическим поиском каналов.
Переключение станций кнопками «CH +» и «CH -». Переключение станций по кругу отключено.
Громкость установлена на средний уровень и не изменяется…
Режим «Поиск Каналов» активируется включением питания с зажатыми кнопками «CH +» и «CH -».
Когда приёмник найдёт канал, поиск остановится.
Если нажать кнопку «CH +», канал запишется в память и сканирование продолжится.
Если нажать кнопку «CH -»,- канал пропустится и сканирование продолжится.
Режим «Моно/Стерео» переключается включением питания с зажатой кнопкой «CH -».
Режим «УсилениеБаса» переключается включением питания с зажатой кнопкой «CH +».
Все установленные режимы записываются в EEPROM.
Кнопки «CH +» — 5 нога МК, «CH -» — 6,
+
avatar
0
Параллельно кнопкам советую подключать конденсаторы 0,01-0,1 мкФ, на программный антидребезг не хватает памяти.
+
avatar
0
Можно получить код (Прошивка с полуавтоматическим поиском каналов) в .ino формате
+
avatar
  • wrong
  • 21 марта 2017, 11:30
0
Проверил прошивку. Работает.

Для большей универсальности можно задавать уровень громкости через EEPROM, если возможно.
Испытывал с разными усилителями. С одним усилителем и уровня 6 за глаза, а с другим и уровня 15 маловато будет.
На данном этапе уже 6 видов прошивок, достаточно на все случаи. Большое спасибо авторам.

С Уважением и успехов в личной жизни и творчестве.
+
avatar
0
Пробовал включать приёмник на значительном расстоянии от РТПС. В принципе, чувствительность хорошая. Ранее настроенные каналы слушать можно, но настроить автоматом ничего нельзя- не записывает каналы.
Сделал прошивку с ручным поиском каналов…
+
avatar
0
Прошивка с ручным поиском каналов.
Переключение станций кнопками «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 нога.
+
avatar
0
на этой версии у меня не работает автопоиск.
+
avatar
0
Читать внимательно- это прошивка с ручным поиском каналов!!!
В режиме поиска нужно много раз нажимать «CH +», или удерживать до появления звука станции. А для записи в память- нажать «VOL». Поиск начинается с частоты 87,5 МГц и до 108МГц.
+
avatar
0
ок, не сразу понял.
+
avatar
0
Преимущества прошивки в том, что можно записать в память станции в любой последовательности и также те, которые автоматически не записываются.
+
avatar
0
это да. чувствительность слабовата у модуля. даже с длинным проводом (антенной) не особо хорошо берет. думал его в портативную колонку засунуть с внутренней антенной. похоже не прокатит
+
avatar
0
Можно получить код (Прошивка с полуавтоматическим поиском каналов) в .ino формате
+
avatar
  • wrong
  • 28 марта 2017, 18:10
0
Вот по этой причине я и изучал EEPROM.
В автоматическом поиске не все станции находит. Если прописать в EEPROM, то звучание пропущенных станций вполне приличное.
+
avatar
0
Пробовал заливать разные версии кода. Радио страшно шумит, слышно, что станцию нашло, но работает отвратительно. Потом вкачестве контролера взял Arduino Uno c #include <RDA5807M.h> залил пример и все прекрасно работает. В чем может быть проблема?
+
avatar
0
Один такой случай- это разговор ни о чём. Не указано: по какой схеме собирал приёмник, использовал ли усилитель и какой, использовал ли стабилизатор, конденсаторы по питанию, да и банально- качество пайки, флюс…
+
avatar
0
Так я же без претензий. Есть у меня старый касетный магнитофон. Вот решил переделать его на литий + добавить стерео фм.

с Attiny13a у меня следующая связка: акк 18650 -> начинка от дешевого повербанка на одну ячейку(для зарядки акка) здесь же получаю 5в -> беру 5в для усилителя на PAM8403 DC 5V 2 Channel а также эти 5в идут на ams1117-3.3 для Attiny13a и Rda5807m -> c Rda5807m получаю аудиосигнал и отправляю это все на PAM8403 -> теперь эта вся радость должна играть на динамиках. Но увы с Attiny13a ничего не получаеться, искажения ужасные. А вот с Arduino Uno все ок, играет чисто и приятно. на Attiny13a пробовал заливать разные ваши варианты — результат одинаков. Просто я купил 10 шт Attiny13a и думал куда их приткнуть.
+
avatar
  • wrong
  • 05 апреля 2017, 12:01
+1
Для DenBond7.

Читал на форумах что при использовании усилителя PAM8403 приёмник работал плохо, когда подключали аналоговый усилитель то работало хорошо. Попробуйте обычный усилитель а не D класса. Также читал что при использовании усилителя PAM8403 приёмник работал хорошо, но там контроллер ATmega8,
Проведите опыты:
1. Приёмник — аналоговый усилитель.
2. Питание приёмника и PAM8403 от отдельных блоков питания, соединяя только общий провод.
3. Поставьте LC фильтры в питание усилителя, приёмника, контроллера.

Бывает от неудачного рисунка печатных плат

Если что то поможет а дальше решать Вам.

Успехов.
+
avatar
+1
Согласен. Сам использую в приёмнике РАМ8403, Источник питания один, трансформаторный. Разносил плату приёмника и усилитель как можно дальше. Всё нормально.
Преобразователь повербанка может шуметь… Можно запитать плату приёмника со стабилизатором и усилитель от лития напрямую, а зарядку лития производить через платку на ТР4056.
+
avatar
0
Спасибо за ответы. Решил все таки сделать на arduino pro mini. Для этой платы я еще могу код править, для Attiny13a — только заливать умею. 20 мА в час меня не сильно пугают. Понимаю, что это с пушки по воробьях, но зато звук прекрасный, шумов вообще нет. Еще раз спасибо за статтью.
+
avatar
0
Всё-таки разберитесь с шумами- из-за чего они возникают?
Микроконтроллер передаёт команды для конфигурирования приёмника- включения и настроек на канал, громкость и т.д. После настройки приёмника на станцию микроконтроллер можно вытащить из панельки и приёмник будет работать дальше, пока не отключишь питание.
Предполагаю, что помехи проходят по питанию, а в ардуино по питанию стоят конденсаторы и стабилизатор, поэтому и звук чище с ардуино.
+
avatar
0
Добрый день. Спасибо за ваши советы. Приношу свои извенения. Я был не внимателен и не читал детально ваши инструкции. Я просто не проводили настройку, по этому и ничего не играло. Сделал все по инструкции — и ВСЕ КЛАССНО РАБОТАЕТ! Спасибо за ваш труд. Теперь работа на даче будет не скучной )))
+
avatar
0
Подскажите пожалуйста, какое напряжение должно быть на выводах GND и L, GND и R. У меня через arduino по i2c сигналы проходях, а динамик не играет -только шум. Напряжение 0,04 в. Или это из-за того, что не настроена плата, или из-за того, что я спалил порты. Спасибо
+
avatar
+1
На выводах L и R RDA5807M во включенном состоянии напряжение 0,8- 0,9 вольт. Если 0,04- 0,05 вольт, то модуль выключен.
Возможные причины: не залита прошивка в микроконтроллер, неправильно выставлены фьюзы, или перепутаны местами выводы i2c.
+
avatar
0
Подскажите собрать приемник на основе ATTINY85 Digispark получится? — один есть в наличии. И как у приемника RDA5807M с чувствительностью относительно TEA5767 и QN8075?
+
avatar
+1
Получится практически на любой Аттини, в которую поместится код. Заливал hex в ATTINY85 без Digispark, работает также.
Чувствительность этих цифровых приёмников примерно одинакова. Но у них, по сравнению с аналоговыми, избирательность не очень хорошая.