#1 2016-10-21 11:41:11

Saddamko
Учасник
Зареєстрований: 2016-10-20
Повідомлень: 23

Радиоприемник с цифровой настройкой на базе модуля FM Stereo

Продающийся копеешный радиомодуль em5807m с цифровым управлением по шине i2c я сначала выпаял из поломанного радиоприемника, а подом подкупил еще в Китае. Для управления модулем использовал Ардуино, чтобы выводить частоту настройки использовал дисплейный модуль с 4-я цифрами, тоже программирующийся по шине.

Приемник был смонтирован в корпусе поломанного аналогового приемника с часами (или наоборот).http://forum.arduino.ua/ В корпусе пригодились кнопки - две я задействовал на управление - выбор радиостанции из списка предустановленных в программе.

Картинки радиоприемника (извиняюсь за качество - использован модуль усилителя звука, Arduino Mini Pro, модуль дисплея  tm1637, FM модуль RDA5807M).

radio(2).jpg

radio(6).jpg

Распиновка модуля следующая:

radioem5807m.jpg

Шина I2C это пины 6 и 7 радиомодуля, они подключены к A4 A5 Ардуино, 2 и 3 контакт радиомодуля - выходы звуковые, один из них подключается к модулю усилителя звука.

Для подключения к ардуино используется следующая коммутация (только дисплейный модуль я использовал другой):

radioem5807m42.jpg

Пример кода для создания приемника на основе чипа 5807 и LED модуля tm1637 для индикации частоты приема.

Код рабочий,  частоты настроены для Киева:

// Programm: fm_radio_module_em5807m_rev100.ino
// Language: Arduinio C++
// Hardware: Arduino Nano 3.0 + EM5807M module with RDA5807M Chip.
// Version:  1.00
// Autor:    www.5v.ru
// Link:     www.5v.ru/start/em5807m-arduino-nano-30.htm
/*
92.4	Ретро FM	Oldies
92.8	Europa Plus Украина	CHR
93.8	Бизнес Радио	AC
94.2	Радио Ренессанс	Contemporary Jazz
95.2	Радио Дача	AC
95.6	Джем FM	Rock
96.0	Эра FM	News/Talk
96.4	Хит FM	Hot AC/AC
96.8	DJFM	Dance
98.0	Радіо Київ	News/Talk, AC
98.5	Русское Радио Украина	Russian Top 40
99.0	Radio Nostalgie	Gold Hits/Oldies
99.4	Радио Next	
100.0	Гала Радио	Hot AC
100.5	Народное Радио	-
101.1	Super Radio	Hot AC
101.5	MusicРадио	Easy Listening
101.9	Радио Шансон	Шансон
102.5	Просто Ради.О	AAA/Hot AC
103.1	Люкс FM	Hot AC
103.6	Radio ROKS	Rock
104.0	Радио Шарманка	CHR/Top 40
104.6	Радио 24	AC
105.0	1-й канал НРУ
Радио «Промінь»	News/Talk
105.5	Стильное радио Перец FM	Top 40
106.0	Голос Столицы	News, Gold Hits
106.5	Kiss FM	Dance
107.0	Европа Плюс Киев	AC
107.4	Авторадио Украина	AC
107.9	Наше Радио	AC
*/
#include "TM1637.h"
#include <Wire.h>               // I2C-Library
#define CLK 13//pins definitions for TM1637 and can be changed to other ports       
#define DIO 12
const int buttonPinMax = 9;     // the number of the pushbutton pin
const int buttonPinMin = 8;     // the number of the pushbutton pin
double f_ini=103.6;             // Стартовая частота настройки приемника. (Изменяем на нужную).
// variables will change:
int buttonStateMax = 0;         // variable for reading the pushbutton status
int buttonStateMin = 0;         // variable for reading the pushbutton status
int Station=21;

TM1637 tm1637(CLK,DIO);

void setup()                    // Инициализация.
{
  
    // initialize the pushbutton pin as an input:
    pinMode(buttonPinMax, INPUT);
    pinMode(buttonPinMin, INPUT);
    
    tm1637.init();
    tm1637.set(BRIGHT_TYPICAL);//BRIGHT_TYPICAL = 2,BRIGHT_DARKEST = 0,BRIGHTEST = 7;
  
    Wire.begin();                 // Инициализация двухпроводной шины I2C.
    setFrequency(f_ini);          // Вызываем фукнкцию загрузки частоты настройки в модуль EM5807M.
    DisplayStation (f_ini);
 
}

void loop()                     // Основной цикл программы
{
  // Здесь можем написать нашу самую лучшую программу, которая будет работать так как нам нужно.
  buttonStateMax = digitalRead(buttonPinMax);
  if (buttonStateMax == HIGH) 
  {     
      // turn LED on:    
    Station = Station + 1;
    if (Station >=31) {Station = 1;};
    ChangeStation ( Station);
    DisplayStation (f_ini);
    delay (1000);
  }
   buttonStateMin = digitalRead(buttonPinMin);
  if (buttonStateMin == HIGH) 
  {     
      // turn LED on:    
    Station = Station - 1;
    if (Station <1) {Station = 30;};
    ChangeStation ( Station);
    DisplayStation (f_ini);
    delay (1000);
  }  
}
  
 void ChangeStation (int Station)
 {
  switch (Station) {
    case 1:
      //do something when var equals 1
      f_ini=92.4;
      setFrequency(f_ini);          // Вызываем функцию загрузки частоты настройки в модуль EM5807M.
      DisplayStation (f_ini);      
      break;
    case 2:
      //do something when var equals 2
      f_ini=92.8;
      setFrequency(f_ini);          // Вызываем функцию загрузки частоты настройки в модуль EM5807M.
      DisplayStation (f_ini);            
      break;
    case 3:
      //do something when var equals 2
      f_ini=93.8;
      setFrequency(f_ini);          // Вызываем функцию загрузки частоты настройки в модуль EM5807M.
      DisplayStation (f_ini);            
      break;
    case 4:
      //do something when var equals 2
      f_ini=94.2;
      setFrequency(f_ini);          // Вызываем фукнкцию загрузки частоты настройки в модуль EM5807M.
      DisplayStation (f_ini);            
      break;
    case 5:
      //do something when var equals 2
      f_ini=95.2;
      setFrequency(f_ini);          // Вызываем функцию загрузки частоты настройки в модуль EM5807M.
      DisplayStation (f_ini);            
      break;
    case 6:
      //do something when var equals 2
      f_ini=95.6;
      setFrequency(f_ini);          // Вызываем функцию загрузки частоты настройки в модуль EM5807M.
      DisplayStation (f_ini);            
      break;
    case 7:
      //do something when var equals 2
      f_ini=96.0;
      setFrequency(f_ini);          // Вызываем функцию загрузки частоты настройки в модуль EM5807M.
      DisplayStation (f_ini);            
      break;
    case 8:
      //do something when var equals 2
      f_ini=96.4;
      setFrequency(f_ini);          // Вызываем функцию загрузки частоты настройки в модуль EM5807M.
      DisplayStation (f_ini);            
      break;
    case 9:
      //do something when var equals 2
      f_ini=96.8;
      setFrequency(f_ini);          // Вызываем функцию загрузки частоты настройки в модуль EM5807M.
      DisplayStation (f_ini);            
      break;
    case 10:
      //do something when var equals 2
      f_ini=98.0;
      setFrequency(f_ini);          // Вызываем функцию загрузки частоты настройки в модуль EM5807M.
      DisplayStation (f_ini);            
      break;
    case 11:
      //do something when var equals 2
      f_ini=98.5;
      setFrequency(f_ini);          // Вызываем функцию загрузки частоты настройки в модуль EM5807M.
      DisplayStation (f_ini);            
      break;
    case 12:
      //do something when var equals 2
      f_ini=99.0;
      setFrequency(f_ini);          // Вызываем функцию загрузки частоты настройки в модуль EM5807M.
      DisplayStation (f_ini);            
      break;
    case 13:
      //do something when var equals 2
      f_ini=99.4;
      setFrequency(f_ini);          // Вызываем функцию загрузки частоты настройки в модуль EM5807M.
      DisplayStation (f_ini);            
      break;     
    case 14:
      //do something when var equals 2
      f_ini=100.0;
      setFrequency(f_ini);          // Вызываем функцию загрузки частоты настройки в модуль EM5807M.
      DisplayStation (f_ini);            
      break;  
    case 15:
      //do something when var equals 2
      f_ini=100.5;
      setFrequency(f_ini);          // Вызываем фукнкцию загрузки частоты настройки в модуль EM5807M.
      DisplayStation (f_ini);            
      break;  
    case 16:
      //do something when var equals 2
      f_ini=101.1;
      setFrequency(f_ini);          // Вызываем функцию загрузки частоты настройки в модуль EM5807M.
      DisplayStation (f_ini);            
      break;  
    case 17:
      //do something when var equals 2
      f_ini=101.5;
      setFrequency(f_ini);          // Вызываем функцию загрузки частоты настройки в модуль EM5807M.
      DisplayStation (f_ini);            
      break;  
    case 18:
      //do something when var equals 2
      f_ini=101.9;
      setFrequency(f_ini);          // Вызываем функцию загрузки частоты настройки в модуль EM5807M.
      DisplayStation (f_ini);            
      break;  
    case 19:
      //do something when var equals 2
      f_ini=102.5;
      setFrequency(f_ini);          // Вызываем функцию загрузки частоты настройки в модуль EM5807M.
      DisplayStation (f_ini);            
      break;  
    case 20:
      //do something when var equals 2
      f_ini=103.1;
      setFrequency(f_ini);          // Вызываем функцию загрузки частоты настройки в модуль EM5807M.
      DisplayStation (f_ini);            
      break;  
    case 21:
      //do something when var equals 2
      f_ini=103.6;
      setFrequency(f_ini);          // Вызываем функцию загрузки частоты настройки в модуль EM5807M.
      DisplayStation (f_ini);            
      break;  
    case 22:
      //do something when var equals 2
      f_ini=104.0;
      setFrequency(f_ini);          // Вызываем функцию загрузки частоты настройки в модуль EM5807M.
      DisplayStation (f_ini);            
      break;  
    case 23:
      //do something when var equals 2
      f_ini=104.6;
      setFrequency(f_ini);          // Вызываем функцию загрузки частоты настройки в модуль EM5807M.
      DisplayStation (f_ini);            
      break;  
    case 24:
      //do something when var equals 2
      f_ini=105.0;
      setFrequency(f_ini);          // Вызываем функцию загрузки частоты настройки в модуль EM5807M.
      DisplayStation (f_ini);            
      break;  
    case 25:
      //do something when var equals 2
      f_ini=105.5;
      setFrequency(f_ini);          // Вызываем функцию загрузки частоты настройки в модуль EM5807M.
      DisplayStation (f_ini);            
      break;  
    case 26:
      //do something when var equals 2
      f_ini=106.0;
      setFrequency(f_ini);          // Вызываем функцию загрузки частоты настройки в модуль EM5807M.
      DisplayStation (f_ini);            
      break;  
    case 27:
      //do something when var equals 2
      f_ini=106.5;
      setFrequency(f_ini);          // Вызываем функцию загрузки частоты настройки в модуль EM5807M.
      DisplayStation (f_ini);            
      break; 
    case 28:
      //do something when var equals 2
      f_ini=107.0;
      setFrequency(f_ini);          // Вызываем функцию загрузки частоты настройки в модуль EM5807M.
      DisplayStation (f_ini);            
      break; 
    case 29:
      //do something when var equals 2
      f_ini=107.4;
      setFrequency(f_ini);          // Вызываем функцию загрузки частоты настройки в модуль EM5807M.
      DisplayStation (f_ini);            
      break; 
    case 30:
      //do something when var equals 2
      f_ini=107.9;
      setFrequency(f_ini);          // Вызываем функцию загрузки частоты настройки в модуль EM5807M.
      DisplayStation (f_ini);            
      break; 
    default: 
      // if nothing else matches, do the default
      // default is optional
      break;
  }
 }
  
 void DisplayStation (double Freq)
 {
    int8_t ListDisp[4];
    ListDisp[0] = ((int)Freq/100) % 10;
    ListDisp[1] = ((int)Freq/10) % 10;
    ListDisp[2] = ((int)Freq/1) % 10;
    ListDisp[3] = ((int)(Freq*10)) % 10;
    tm1637.display(0,ListDisp[0]);
    tm1637.display(1,ListDisp[1]); 
    tm1637.display(2,ListDisp[2]);
    tm1637.display(3,ListDisp[3]);
 }
 

void setFrequency(double fmhz)  // Функция загрузки частоты настройки в модуль EM5807M.
{
  int  frequencyB = 4 * (fmhz * 1000000 + 225000) / 32768;
  char frequencyH = frequencyB >> 8;     // Старший байт.
  char frequencyL = frequencyB & 0XFF;   // Накладываем маску 0xFF на младший байт.
  Wire.beginTransmission(0x60);          // Адрес чипа RDA5807M
  Wire.write(frequencyH);                // Старший байт.
  Wire.write(frequencyL);                // Младший байт.
  Wire.write(0xB8);                      // 1011 1000     =Стерео
  Wire.write(0x10);                      // 0001 0000
  Wire.write((byte)0x00);                // 
  Wire.endTransmission();                // формируем I2C-Stop.
}

Остання редакція Saddamko (2016-11-06 17:17:51)

Неактивний

#2 2016-10-21 12:17:27

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: Радиоприемник с цифровой настройкой на базе модуля FM Stereo

привет
http://myshop.biz.ua/index.php?route=pr … duct_id=55
печатаете? или только в планах?

Неактивний

#3 2016-10-21 13:06:24

Saddamko
Учасник
Зареєстрований: 2016-10-20
Повідомлень: 23

Re: Радиоприемник с цифровой настройкой на базе модуля FM Stereo

NoName пише:

привет
http://myshop.biz.ua/index.php?route=pr … duct_id=55
печатаете? или только в планах?

Привет! Печатаю. Любительски. Любительски - потому что не хватает терпения отстроить все, чтобы более качественная печать была - видно по картинкам, что не высокохудожественные работы получаются, но как механические объекты очень прочные.

Сделал два принтера - сначала маленький, потом Graber i3
small3dprinter.jpg
print3d(2).jpg
print3d(4).jpg

Ну и раз начал хвастаться хозяйством - еще сделал лазерный гравер, в корпусе, аналогичном маленькому 3D принтеру, и ЧПУ станок, который уже несколько лет в состоянии - что-то можно делать, но показывать стыдно:
printer_graver.jpg

Остання редакція Saddamko (2016-10-21 13:15:33)

Неактивний

#4 2016-10-21 13:25:42

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: Радиоприемник с цифровой настройкой на базе модуля FM Stereo

молодцы )
[add]
действительно классно что  сделали небольшие станки,

а маленький во что обошелся, а то я что то запутался ?   в текущем зоопарке принтеров )

печатаете на заказ?   мне б корпус для девасины что б крепился на планку пикатинни, (
еще не рисовал )

Остання редакція NoName (2016-10-21 13:32:53)

Неактивний

#5 2016-10-21 13:41:00

Saddamko
Учасник
Зареєстрований: 2016-10-20
Повідомлень: 23

Re: Радиоприемник с цифровой настройкой на базе модуля FM Stereo

NoName пише:

молодцы )
а маленький во что обошелся, а то я что то запутался ?   в кекущем зоопарке принтеров )

печатаете на заказ?   мне б корпус для девасины что б крепился на планку пикатинни, (
еще не рисовал )

Маленький обошелся, наверно, до 50 долларов, а то и меньше.

Но просто он собирался - из того, что уже было -
блок питания от компьютера - очень дорого, но брал свой.
А так - порезка акрила - не помню точно, с материалом кажется 250 грн была,
по принтеру - электроника (Ардуино Мега + Шилд Polulu - долларов 20),
Ну экструдер баксов 5 и шаговик один - со старого винчестера советского.
На разборку на разиобазаре купил старые DVD приводы - где по 10 грн брал, где по 50 грн.
В общем, не очень затратно - я на его основе просто хотел понять, как работает, как настраивается.
Идея себя не очень оправдала - потому что оси, построенные на шаговиках от DVD не очень хорошо под нагрузкой себя ведут - довольно часто проскакивает, сдвигается. Все время возня, что-то подправить, что-то подстроить...
А потом собрал Graber - это уже по накатанной, как конструктор .

Делать на заказ не буду - качество никакое, если на оружие что цеплять - так есть в Киеве много фирм, которые печатают на качественных принтерах, с очень тоненькой и ровненькой печатью совершенно недорого. Я сам много заказывал поначалу.

Кажется, я какие-то крепления для планки видел на
http://thingiverse.com/ - можно там посмотреть, по поиску Picatinny rail

Остання редакція Saddamko (2016-10-21 14:25:35)

Неактивний

#6 2016-10-21 14:05:03

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: Радиоприемник с цифровой настройкой на базе модуля FM Stereo

где отпечатать качественно я знаю,
или выточить с куска  нержавейки ) , ( дорого,  но красиво )

принято )
я еще лодку не закончил )   принтер подождет...

Неактивний

#7 2016-10-21 14:21:47

Saddamko
Учасник
Зареєстрований: 2016-10-20
Повідомлень: 23

Re: Радиоприемник с цифровой настройкой на базе модуля FM Stereo

NoName пише:

где отпечатать качественно я знаю,
или выточить с куска  нержавейки ) , ( дорого,  но красиво )

принято )
я еще лодку не закончил )   принтер подождет...

Лодка, кстати, супер! Мне очень нравится. Плохо, что скоро совсем похолодает hmm  Придется с ванной выгонять всех резиновый уточек и зимой там тестировать wink

Неактивний

#8 2016-11-07 23:20:20

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: Радиоприемник с цифровой настройкой на базе модуля FM Stereo

Saddamko, продайте мелкий принтер )
или поменяйте.  реально некогда возится, я то догадываюсь сколько там часов было потрачено (, времени совсем нет пробовать собирать,
да и не люблю я макеты собирать, много времени теряю (, а у Вас уже работает, и не последний )))
или в аренду  дайте поиграться,  так даже будет лучше.

Неактивний

#9 2016-11-08 01:41:47

Saddamko
Учасник
Зареєстрований: 2016-10-20
Повідомлень: 23

Re: Радиоприемник с цифровой настройкой на базе модуля FM Stereo

NoName пише:

Saddamko, продайте мелкий принтер )

Сожалею, но я его уже частично разобрал на доработку - во первых по одной оси проскальзывает иногда, и половина печатаемого может сдвинуться в сторону, и крепление экструдера отпечатал - чтобы пожестче конструкция была.

Плохая конструкция - все-таки в такой мелкоте чаще бывают проблемы, например - экструдер (та часть радиатора, где плавится) без вентилятора - поскольку вентилятор сильно утяжеляет конструкцию и шаговик еще чаще пропуски делает, так вот экструдер при длительной печати перегревается, пруток к нем расплывается, забивается,  приходится все разбирать и выковыривать.

Так что и жалеть не надо.
Да и размеры - 38х38х38 мм. Я доработал это довольно известный принтер eWaste, так что он по вертикали 38 мм печатает, а в оригинале там шаговик от флопика - наверно мм 15 в высоту... Жабок только печатать:

http://www.instructables.com/id/eWaste-60-3DPrinter/
http://www.instructables.com/id/Curiosi … 3D-Printer

Неактивний

#10 2018-07-24 23:08:15

Yon
Учасник
Зареєстрований: 2018-07-24
Повідомлень: 7

Re: Радиоприемник с цифровой настройкой на базе модуля FM Stereo

Как громкость сюды вставить?

void setFrequency(double fmhz)  // Функция загрузки частоты настройки в модуль EM5807M.
{
  int  frequencyB = 4 * (fmhz * 1000000 + 225000) / 32768;
  char frequencyH = frequencyB >> 8;     // Старший байт.
  char frequencyL = frequencyB & 0XFF;   // Накладываем маску 0xFF на младший байт.
  Wire.beginTransmission(0x60);          // Адрес чипа RDA5807M
  Wire.write(frequencyH);                // Старший байт.
  Wire.write(frequencyL);                // Младший байт.
  Wire.write(0xB8);                      // 1011 1000     =Стерео
  Wire.write(0x10);                      // 0001 0000
  Wire.write((byte)0x00);                //
  Wire.endTransmission();                // формируем I2C-Stop.
}

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму