Здравствуйте. Провел уже не одну практически бесонную ночь, пытаясь заставить работать радиомодуль на 5807. Выглядит он так: Подключал я его аналогично другому радиомодулю который более известен - tea5767. Вот и его распиновка: (rclk не используется) подключаются оба по i2c шине к А4 и А5 ардуины для прошивки в модуль необходимой частоты. Но последний (5767) у меня заработал сразу, каналы переключались кнопкой - все как надо. Но прошив тот же самый скетч в модуль 5807 - он отказывался работать будучи подключенным к ардуино. Отключая же питание от ардуино - модуль начинал работать, но каналы само собой не переключались. Скажите, в чем тут может быть дело? Меня экземпляры модулей на предмет возможной поломки - у других поведение аналогичное. Менял местами А4 и А5... По сути идентичное подключение по одному интерфейсу, и в скетче нет ничего заумного. Уже как только не изгалялся...
В инете плавало. FM rda5807m. Там указан немного другой код, не как для tea5767: Код (Text): // 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=106.2; // Стартовая частота настройки приемника. (Изменяем на нужную). 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.write((byte)0x00); // Wire.endTransmission(); // формируем I2C-Stop. } Хотя... Проверьте пайку ещё раз, пройдите паяльником по всем контактам. Их очень легко повредить.
потому что это разные модули это я знаю, проштудировал половину интернетов, с этим скетчем, то что вы скинули - модуль работает, но он работает только на частоте которая указана в инициализации (setup), на кнопку же никак не влияет. Кнопка не так поцеплена? Да точно так же как и в tea5767 Со скетчем для 5767 этот модуль не работает, то есть... при нажатии на кнопку, он перенастраивается на нужную частоту, но замолкает спустя времени равное всем delay в коде (соблюдая условия if), нажав еще раз - настройка на следующую станцию и опять тишина... со скетчем который вы выложили - на кнопку вообще не реагирует, работает (и не замолкает) на частоте инициализации... На что это вообще похоже?
[сообщение не редактируется] Добавлю, что я так же менял местами подключения SCL и SDA - на предмет не правильного подключения - результат никакой. По поводу пайки - да, контакты крайне хрупкие, но я сделал переходник с 2мм на 2.54 dip, в общем приложил как soic корпус и припаял плату к переходнику У меня два таких модуля - подключал оба, поведение идентичное
И даже так не переключает? Код (Text): // 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=106.2; // Стартовая частота настройки приемника. (Изменяем на нужную). void setup() // Инициализация. { Wire.begin(); // Инициализация двухпроводной шины I2C. setFrequency(f_ini); // Вызываем фукнкцию загрузки частоты настройки в модуль EM5807M. } void loop() // Основной цикл программы { f_ini = 107.0; setFrequency(f_ini); delay(10000); f_ini = 88.0; setFrequency(f_ini); delay(10000); f_ini = 87.6; setFrequency(f_ini); delay(10000); f_ini = 102.0; setFrequency(f_ini); delay(10000); f_ini = 100.0; setFrequency(f_ini); delay(10000); } 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. }
Дело не в переключении, переключает он станции, а в том что он не воспроизводит долгое время одну выбранную станцию, выбрал, поиграл полсекунды и замолк
Всем откликнувшимся спасибо, оба модуля благополучно накрылись (сейчас, это не является причиной их не правильной работы), в одном оборвал дорожки, а другой просто молчит и потребление тока упало до ноля... Жаль, а по звучанию эти модули на порядок качественнее звучат и лучше ловят сигнал (даже без антенны совсем) чем tea5767...
Код (C++): #include <LCD5110_Graph.h> #include <Wire.h> int encoder0PinA = 8; // вход энкодера int encoder0PinB = 9; int encoder0Pos = 0; int encoder0PinALast = LOW; int n = LOW; LCD5110 myGLCD(2,3,4,6,5); extern uint8_t SmallFont[]; extern uint8_t MediumNumbers[]; extern uint8_t BigNumbers[]; unsigned char frequencyH=0; unsigned char frequencyL=0; float f = 100.5; // частота при включении // функция пишет частоту в модуль void setFrequency(float frequency){ unsigned int frequencyB = 4 * (frequency * 1000000 + 225000) / 32768; byte frequencyH = frequencyB >> 8; byte frequencyL = frequencyB & 0XFF; Wire.beginTransmission(0x60); Wire.write(frequencyH); Wire.write(frequencyL); Wire.write(0xB0); Wire.write(0x10); Wire.write(0x00); Wire.endTransmission(); } //// для кнопок ЛСДшилда byte key(){ int val = analogRead(0); if (val < 50) return 2; else if (val < 200) return 3; else if (val < 400) return 4; else if (val < 600) return 5; else if (val < 800) return 1; else return 0; } // вывод всего на LCD void LCDsend(){ int csr = map(f*10, 880, 1080, 0, 840) / 10; myGLCD.clrScr(); myGLCD.setFont(BigNumbers); myGLCD.printNumF(f, 1, CENTER, 0); myGLCD.setFont(SmallFont); myGLCD.print("mHz", CENTER, 32); myGLCD.print("FM", LEFT, 0); myGLCD.print("87", LEFT, 35); myGLCD.print("108", RIGHT, 35); myGLCD.drawLine(0, 47, 83, 47); // шкала myGLCD.drawLine(0, 43, 83, 43); myGLCD.drawLine(0, 43, 0, 47); myGLCD.drawLine(83, 43, 83, 48); for (int i = 3; i < 84; i += 7) myGLCD.setPixel(i, 45); myGLCD.drawLine(csr, 43, csr, 47); // полоска на шкале myGLCD.drawLine(csr+1, 43, csr+1, 47); myGLCD.drawLine(csr-1, 43, csr-1, 47); myGLCD.update(); } void setup(){ myGLCD.InitLCD(60); Wire.begin(); pinMode (encoder0PinA,INPUT_PULLUP); pinMode (encoder0PinB,INPUT_PULLUP); setFrequency(f); LCDsend(); } void loop(){ /* // управление кнопками шилда if (key() == 2){ f -= .1; setFrequency(f); LCDsend(); } if (key() == 5){ f += .1; setFrequency(f); LCDsend(); } delay(100); */ // управление энкодером n = digitalRead(encoder0PinA); if ((encoder0PinALast == LOW) && (n == HIGH)) { if (digitalRead(encoder0PinB) == LOW) { f -= .1; } else { f += .1; } setFrequency(f); LCDsend(); } encoder0PinALast = n; // защита от выхода за диапазон FM if (f < 87.4) f = 87.4; else if (f > 108.0) f = 108.0; }