RDA5807M или китайский RRD-102V2.0

voffka_rostov
Offline
Зарегистрирован: 13.04.2015

Уважаемые, всем доброго времени! Второй день ломаю голову, пытаюсь разобраться с этим модулем. НА просторах нашел единственный рабочий пример:

// 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

#include <Wire.h>               // I2C-Library

double f_ini=104.6;             // Стартовая частота настройки приемника. (Изменяем на нужную).

void setup()                    // Инициализация.
{
  Wire.begin();                 // Инициализация двухпроводной шины I2C.
  setFrequency(f_ini);          // Вызываем фукнкцию загрузки частоты настройки в модуль EM5807M.
}

void loop()                     // Основной цикл программы
{
  // Здесь можем написать нашу самую лучшую программу, которая будет работать так как нам нужно.
}
  

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.endTransmission();                // формируем I2C-Stop.
} 

Но не понимаю как работает функция загрузки частоты, и почему указан адрес 0х60, а в даташите к rda5807m указан адрес 0х58. Как оно работает!? Выручайте! по i2c отправляется в рамках begin...end только старший и младший байт, как я понимаю. ПОчему в примере отправляется еще чтото в этих скобках? Что за данные отправляются? (без них не работает)...

TevatroN
Offline
Зарегистрирован: 17.11.2013

Когда мне пришел первый такой чип, я нашел данную библиотеку на большинство FM чипов за 5 минут.

Это ответ на: НА просторах нашел единственный рабочий пример... значит плохо искали

Ладно, там отличные примеры, и легко переделываемые под совместное использование например с часами или метеостанцией и т.д.

https://yadi.sk/d/fd_hXJk_fzEzJ

zevsgeloc
Offline
Зарегистрирован: 23.02.2016

Библиотека конечно хорошая, но для нормальной работы требует загрузки radio.h и 5807.h вообщем они обе жрут 700 байт оперативки которой та максимум 2К а в 168 вообще 1К. Есть еще информация о том как по прмеру выше работать, сейчас и на него отвечу

zevsgeloc
Offline
Зарегистрирован: 23.02.2016
 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(false);  // формируем I2C-Stop.  не работает так 
Вообщем без Wire.endTransmission(false); (конкретно без faise) не работала зависала на этой процедуре. а 0х60 это резервный регистр... или кто может сказать в чем я не прав, хотелось бы знать, как в этом случае регулипровать громкость. Может кто знает
p.s. только сейчас заетил, что работает с EM5807M а не rda5807, попробую поискать там ответы
zevsgeloc
Offline
Зарегистрирован: 23.02.2016

https://www.drive2.ru/b/1880545/?page=0#a160242070 там подробнее  

отдельное спасибо Владимир Чебанов за пояснения, сейчас попробую написать нормальную функцию и добавить ... или лучше смотрите по ссылке в коментариях
void SetFreq(double fmhz, int v)
{
  /*      int  frequencyB = (fmhz*100 - 8700) / 10;
        char frequencyH = frequencyB >> 8;     // Старший байт.
        char frequencyL = frequencyB & 0XFF;*/
        
Wire.beginTransmission(0x10);  // Адрес чипа RDA5807M
Wire.write(0b11010000);                // 02h
Wire.write(0b00000101);                // 02L
        Wire.write(0b01010111);                //частота H      
Wire.write(0b10011111);               //частота L
// Wire.write(frequencyH);                // Старший байт. 03h
//      Wire.write(frequencyL);              // младший байт. 03l  
Wire.write(0b00000000);                // 04h
Wire.write(0x00);                      // 04l
Wire.write(0b10001000);                // 05h
Wire.write(v);                // 05l f-максимальная громкость 1111
        Wire.write(0x00);                      // 06h
        Wire.write(0x00);                      // 06l
        Wire.write(0b01000010);                // 07h
        Wire.write(0b00000011);                // 07l 
        Wire.write(0b00100010);                // ручная частота 08h 08l
        Wire.write(0b00111000);
Wire.endTransmission();
}

 

zevsgeloc
Offline
Зарегистрирован: 23.02.2016

https://www.drive2.ru/b/1880545/?page=0#a160242070 там подробнее  

отдельное спасибо Владимир Чебанов за пояснения, сейчас попробую написать нормальную функцию и добавить ... или лучше смотрите по ссылке в коментариях
void SetFreq(double fmhz, int v)
{
  /*      int  frequencyB = (fmhz*100 - 8700) / 10;
        char frequencyH = frequencyB >> 8;     // Старший байт.
        char frequencyL = frequencyB & 0XFF;*/
        
Wire.beginTransmission(0x10);  // Адрес чипа RDA5807M
Wire.write(0b11010000);                // 02h
Wire.write(0b00000101);                // 02L
        Wire.write(0b01010111);                //частота H      
Wire.write(0b10011111);               //частота L
// Wire.write(frequencyH);                // Старший байт. 03h
//      Wire.write(frequencyL);              // младший байт. 03l  
Wire.write(0b00000000);                // 04h
Wire.write(0x00);                      // 04l
Wire.write(0b10001000);                // 05h
Wire.write(v);                // 05l f-максимальная громкость 1111
        Wire.write(0x00);                      // 06h
        Wire.write(0x00);                      // 06l
        Wire.write(0b01000010);                // 07h
        Wire.write(0b00000011);                // 07l 
        Wire.write(0b00100010);                // ручная частота 08h 08l
        Wire.write(0b00111000);
Wire.endTransmission();
}

 

voffka_rostov
Offline
Зарегистрирован: 13.04.2015

Спасибо за благодарность! )))

______

Владимир Чебанов

Русл@н
Offline
Зарегистрирован: 14.04.2016

Здравствуйте, можете мне объяснить как скрестить Ардуину нано, модуль rrd102, с кнопками и дисплеем OLED? По отдельности радио поет, дисплей показывает тестовые примеры) Что делать дальше? Тему на драйве читал. И кстати по шине I2C сканером выдается четыре адреса

Scanning...
I2C device found at address 0x10  ! этот возможно радио исходя из верхних постов
I2C device found at address 0x11  !-этот что такое?
I2C device found at address 0x3C  ! -этот дисплей OLED
I2C device found at address 0x60 этот я понимаю радио

И почему модулю радио дается два адреса?

Простите если мои вопросы покажутся вам наивными, я пытаюсь разобраться как устроена ардуинка)

Нашел вот этот форум, там собрано радио на дисплее 5110, но там вообще все сложно) Хотя собрал, все заработало, пришлось подправить контрастность и температуру 5110. Можете объяснить как прикрутить OLED дисплей 128*64 I2c? и почему кнопки там притянуты через резисторы?

      
zevsgeloc
Offline
Зарегистрирован: 23.02.2016

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

а по дисплею смотри тут https://www.youtube.com/watch?v=niA3aPu3-dQ

Русл@н
Offline
Зарегистрирован: 14.04.2016

По дисплею посмотрел) Мне непонятно само программирование, как впилить дисплей в прошивку или как выпилить его и впилить например 1601. По кнопкам, там видимо делитель напряжения на аналоговый вход, идея понятна. А еще вопрос почему там значения переменных записаны в BIN или в HEX вместо двоичной системы? Спасибо.

zevsgeloc
Offline
Зарегистрирован: 23.02.2016

тебе ничего не мешает перевести их в десятичные, просто передача например радио частоты програмируется 16 битами 3 из которых это одно еще 8 сама частота и оставшиеся 4 бита чтото еще. ну это примерно как с 0 до 100 первое со 100 до 1000000 второе итд а чтоб отправить надо 1000000 сложить со 100 и получившееся отправить 

у меня нет времни учить тебя програмированию как и чо разбирайся

Русл@н
Offline
Зарегистрирован: 14.04.2016

Я наверное неправильно выразился) В примерах настройка частоты идет числами например от 1 до 100, так-же и яркость дисплея, в этом скетче частота упрятана в BIN, это сокращает объем кода или для чего еще?

zevsgeloc
Offline
Зарегистрирован: 23.02.2016

да это сокращает объем кода, это управление напрямую по адресу 5807, а в примерах работа с ним через модуль в который зашито все что можно, модуль прилично оперативки жрет, а там ее всего 2КБ

Русл@н
Offline
Зарегистрирован: 14.04.2016

Ага понятно. В общем забавная игрушка. В этой теме вопросов больше нет, все работает прекрасно.

Yon
Offline
Зарегистрирован: 24.07.2018

Радио работает. Вот часть кода, которое залито в Атмегу8.

Как его подправить, чтобы громкость регулировать (Wire.write(v); // 05l f-максимальная громкость 1111)?

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.

}

 

zevsgeloc
Offline
Зарегистрирован: 23.02.2016

RDA5807M radio;  

radio.setVolume(15);

значения от 0 до 15

zevsgeloc
Offline
Зарегистрирован: 23.02.2016

а то что ты привел только для установки частоты приема

 

Yon
Offline
Зарегистрирован: 24.07.2018

OK.

XOR
Offline
Зарегистрирован: 25.04.2015

Пришли 5807 как на картинке, но запускаются как 5802, адреса сканятся
20
22
A0
C0
почему такое может быть и что я делаю не так?

Novice User
Offline
Зарегистрирован: 25.09.2017

5807 может работать как 5807 (адрес записи 20,чтения 21,прямая запись 22),так и в режиме совместимости с теа5767 (адрес записи С0)

даташит в режиме совместимости и родной  http://www.i-biznes.com/datasheets/RDA/RAD5807P_ProgManual_1.0.pdf

в родном варианте можно регулировать больше функций

Я уже описывал управление,могу найти