rda5807m+PAM8403
- Войдите на сайт для отправки комментариев
Ср, 04/05/2016 - 18:38
Всем привет. В общем использую arduino nano v3 (A4,A5 - sda,scl)+ rda5807m+pam8403+динамик 8 Ом от ПК подключен к PAM напрямую. По i2c модуль FM откликается по адресу 0x60. Использовал разные скетчи- сутиация не меняется , т. е. в динамике один треск и шум. Антену использую - кусок провода
https://cloud.mail.ru/public/AYKw/S4BTdTkHP
https://cloud.mail.ru/public/9EXF/oQArZNbuY
https://cloud.mail.ru/public/AYKw/S4BTdTkHP
https://cloud.mail.ru/public/Mdxx/UGarxGBT3
И что? Вам нужна какая-то помощь или Вы просто довели это до нашего сведения?
А если убрать усилитель? Приёмник болтает на наушники?
А вообще, если хотите помощи, то, давайте сюда схему подключения и скетч. Иначе, разговор в пользу бедных. У меня, например, этот радио-модуль отлично работает. Усилитель у меня, правда, другой, но это не суть.
https://cloud.mail.ru/public/AYKw/S4BTdTkHP
https://cloud.mail.ru/public/9EXF/oQArZNbuY
https://cloud.mail.ru/public/AYKw/S4BTdTkHP
https://cloud.mail.ru/public/Mdxx/UGarxGBT3
Нет, так не пойдёт, тут ни хрена не видно. Давайте схему и скетч.
Кстати, надеюсь, Вы его (приёмник) от 3,3 вольта кормите?
Да, хочу помощи ). На наушники не пробовал, напрямую на 8 Ом не заработал.
Вот 1 из кодов котрый пользовал:
#define RDA5807_adrr 0x60 #define RDA5807_SDA A4 #define RDA5807_SCL A5 #define ARDUINO_PORT(a) ((a<8)?PORTD:(a<14?PORTB:PORTC)) #define ARDUINO_PIN(a) ((a<8)?PIND:(a<14?PINB:PINC)) #define ARDUINO_DDR(a) ((a<8)?DDRD:(a<14?DDRB:DDRC)) #define ARDUINO_PIN_NUM(a) ((a<8)?a:(a<14?(a-8):(a-14))) #define SDA_OUT_HAL(sda) void SDA_OUT (void){bitSet(ARDUINO_DDR(sda), ARDUINO_PIN_NUM(sda));} #define SDA_IN_HAL(sda) void SDA_IN (void){bitClear(ARDUINO_DDR(sda), ARDUINO_PIN_NUM(sda));} #define SDA_HIGHT_HAL(sda) void SDA_HIGHT(void){bitSet(ARDUINO_PORT(sda), ARDUINO_PIN_NUM(sda));} #define SDA_LOW_HAL(sda) void SDA_LOW (void){bitClear(ARDUINO_PORT(sda), ARDUINO_PIN_NUM(sda));} #define SCL_HIGHT_HAL(scl) void SCL_HIGHT(void){bitSet(ARDUINO_PORT(scl), ARDUINO_PIN_NUM(scl));asm volatile ("nop");} #define SCL_LOW_HAL(scl) void SCL_LOW (void){bitClear(ARDUINO_PORT(scl), ARDUINO_PIN_NUM(scl));asm volatile ("nop");asm volatile ("nop");} #define SCL_OUT_HAL(scl) void SCL_OUT (void){bitSet(ARDUINO_DDR(scl), ARDUINO_PIN_NUM(scl));} #define WITE_HIGHT_SDA_HAL(sda) void WITE_HIGHT_SDA (void){loop_until_bit_is_clear(ARDUINO_PIN(sda), ARDUINO_PIN_NUM(sda));} #define _i2c(scl,sda) \ SDA_OUT_HAL(sda) \ SDA_IN_HAL(sda) \ SDA_HIGHT_HAL(sda) \ SDA_LOW_HAL(sda) \ SCL_HIGHT_HAL(scl) \ SCL_LOW_HAL(scl) \ SCL_OUT_HAL(scl) \ WITE_HIGHT_SDA_HAL(sda) _i2c(RDA5807_SCL, RDA5807_SDA); void _i2cWriteByte(byte v) { SDA_OUT(); for (byte i=8;i;i--) { if (v & 0x80) SDA_HIGHT(); else SDA_LOW();SCL_HIGHT(); v <<=1; SCL_LOW(); } SDA_IN();SDA_HIGHT(); SCL_HIGHT(); WITE_HIGHT_SDA(); SCL_LOW(); } enum { OPERATION_SEND_START, OPERATION_SEND_STOP, OPERATION_SEND_ACK, OPERATION_INIT } I2C_OPERATION; void _i2cBusOperation(byte OperationID) { switch (OperationID) { case OPERATION_SEND_START: SDA_OUT(); SDA_HIGHT();SCL_HIGHT();SDA_LOW();SCL_LOW(); _i2cWriteByte(RDA5807_adrr<<1);break; case OPERATION_SEND_STOP: SDA_OUT(); SDA_LOW(); SCL_HIGHT(); SDA_HIGHT(); SDA_IN(); break; case OPERATION_SEND_ACK: SDA_OUT(); SCL_LOW(); SDA_LOW(); SCL_HIGHT(); SCL_LOW(); SDA_IN(); break; case OPERATION_INIT: SCL_OUT();break; } } double f_ini=95.6; void setFrequency(double fmhz) // Функция загрузки частоты настройки в модуль EM5807M. { int frequencyB = 4 * (fmhz * 1000000 + 225000) / 32768; char frequencyH = frequencyB >> 8; // Старший байт. char frequencyL = frequencyB & 0XFF; // Накладываем маску 0xFF на младший байт. _i2cBusOperation(OPERATION_SEND_START); _i2cWriteByte(frequencyH); _i2cWriteByte(frequencyL); _i2cWriteByte(0xB8); _i2cWriteByte(0x10); _i2cWriteByte(0x00); _i2cBusOperation(OPERATION_SEND_STOP); } // the setup routine runs once when you press reset: void setup() { SCL_OUT(); setFrequency(f_ini); pinMode(13, OUTPUT); } byte vol=0; void loop() { digitalWrite(13,HIGH); vol++; delay(300); digitalWrite(13,LOW); delay(2000); f_ini=f_ini+0.1; setFrequency(f_ini); }Питаю все от USB
На наушники не пробовал,
Попробуйте
напрямую на 8 Ом не заработал.
Жив ещё? Не удивлюсь, если нет - такую мощность из него потянуть!
Питаю все от USB
Да, хоть от ЛЭП - схему подключения в студию.
Схему нарисовал прям как на данный момент на столе собрано https://cloud.mail.ru/public/6B6G/5C9ceuAkj
На наушники я так понял праивильно надо подключать через кондесанторы и резисторы , а у меня их нету- напрмяую можно?
Нет, наушники можно подключать прямо к L/R выходам и земле. У наушников сопротивление гораздо больше 8 ом, а динамиком Вы приёмник здорово нагрузили.
А как быть с динамиком большим??? С наушниками сейчас попробую что-нибудь придумать
Так, давайте всё же сначала пробовать только приёмник (чтобы не множить скорбь мира). Усилитель потом прицепите.
Для начала, возьмите вот такой простейший скетч, а то Ваш уж больно заумный.
#include <Wire.h> #include <RDA5807M.h> RDA5807M radio; void setup(void) { Serial.begin(115200); Serial.print("Init result:"); Serial.println(radio.init()); radio.setMono(true); radio.setBandFrequency(RADIO_BAND_FMWORLD, 10600); radio.setMute(false); radio.setVolume(15); } void loop(void) {}Библиотека здесь используется - https://github.com/mathertel/Radio
В строке 11 10600 - частота в МГц умноженная на сто (т.е. имеется в виду 106,0 у меня). Подставьте ту, которая у Вас хорошо принимается.
В сериал должно напечататься 1, если модуль нормально инициализировался и 0, если нет.
Попробуйте.
А как быть с динамиком большим??? С наушниками сейчас попробую что-нибудь придумать
Так динамик подключается к усилителю, а не к самому модулю!
Но давайте пока без услилтеля - убедимся. что радио работает. Потом будете услилитель подключать.
Выдает надпись: Init result: без результата
Странно, а вот так:
#include <Wire.h> #include <RDA5807M.h> RDA5807M radio; void setup(void) { Serial.begin(115200); radio.debugEnable(true); Serial.print("Init result:"); Serial.println((int) radio.init()); radio.setMono(true); radio.setBandFrequency(RADIO_BAND_FMWORLD, 10600); radio.setMute(false); radio.setVolume(15); } void loop(void) {}Должна стать поболтливее, попробуйте.
Оопc!
Вы писали, что "По i2c модуль FM откликается по адресу 0x60". Вы в этом точно уверены? У RDA5807М должно быть 0x11
Если так, то зайдите в файл RDA5807M.cpp библиотеки и там найдите строку 78. Она вот такая
#define I2C_INDX 0x11
Поправьте как надо и снова запустите мой последний скетч. Как запустите, скопируйте сюда всё, что скажет.
Еще раз просканил i2c
I2C Scanner
Если ставлю 11 - вывод такой:
Init result:init()
Вот еще раз просканил i2c
Если ставлю 11 - вывод такой:
Init result:init()
Так, значит модуль находится.
Потом она попадает в RDA5807M::_saveRegisters() и оттуда не выходит.
Функция эта находится в том же файле начиная со сторки 303. Она маленькая.
void RDA5807M::_saveRegisters() { DEBUG_FUNC0("-saveRegisters"); Wire.beginTransmission(I2C_SEQ); for (int i = 2; i <= 6; i++) _write16(registers[i]); Wire.endTransmission(); } // _saveRegistersПопробуйте добавить в неё свою отладочную печать (потом уберёте), например, так:
void RDA5807M::_saveRegisters() { DEBUG_FUNC0("-saveRegisters"); Wire.beginTransmission(I2C_SEQ); Serial.println("POSLE beginTransmission"); for (int i = 2; i <= 6; i++) { _write16(registers[i]); Serial.print("I="); Serial.println(i); } Serial.println("POSLE for"); Wire.endTransmission(); Serial.println("PERED vyhodom"); } // _saveRegistersТаким образом мы поймём в каком именно месте она сдыхает.
Кстати. у Вас на схеме модуль питается от 3,3В - точно так? Это важно.
Да 3.3
Хм, вот что выдал
Не понял, а что
103,7 это радио у нас - в библиотеке все вернуто обратно, т.е. 11 а код добавил и да перестал выдавать . Причем в serial выстреливает раз, через раз.
Напряжение на выходе для научшника 0,07В
Просто Ваше сообщение из 21 поста выглядит с одной стороны как будто всё в порядке и Вы должны слышать радио.
А с другой непонятно куда делись наши печати.
Кстати, Вы подключаете наушники? В к выходу L (или R - пофиг, я там в скетче моно поставил) а другой провод к земле? И звука нет? Провода не перепутали?
Напряжение на выходе для научшника 0,07В
Маловато. У меня до полутора доходит.
Да, как-то все глюячновато выглядит. Вижу, что моно- да подключаю к L,R и провод на GND - напрямую на наушники
Ну, не знаю, так зочно, наверное не смогу помочь, простите.
Самое странное, что не печатает наших отладочных печатей. Дичь какая-то.
Может дело в наушниках - подключаю которые 32 ома
Сейчас вернул все обратно как было изначально
Вшт, смотрите. После init она вернула 1 - значит вроде всё нормально инициализировалось.
Но куда делись наши печати????
Ладно, мне надо уходить. Завтра ещё подумаем.
Отпишитесь что у Вас сегодня вечером ещё получится, я завтра почитаю.
ок
Звука так и не добился напрямую через наушники (((
Доброго времени суток сегодня получил
Залил код из этой темы и радио прекрасно заработало.
#include <Wire.h> #include <RDA5807M.h> RDA5807M radio; void setup(void) { Serial.begin(115200); radio.debugEnable(true); Serial.print("Init result:"); Serial.println((int) radio.init()); radio.setMono(true); radio.setBandFrequency(RADIO_BAND_FMWORLD, 10600); radio.setMute(false); radio.setVolume(15); } void loop(void) {}Теперь вот думаю как дисплей по I2С прикрутить и кнопки, в стандартном примере есть вывод на дисплей. И еще заметил одну особенность или непонятку для меня:
заливаю скетч радио в ардуину, она перезагружается, начинает петь радио. Далее заливаю скетч из меню примеров с тестом дисплея, радио поет и дисплей оживает)) Вот почему предыдущий скетч не стирается?
Поможете понять что и как делать?
И что с дисплеем? Удалось прикрутить?
Со временем проблема, но все будет!
И что с дисплеем? Удалось прикрутить?
А чего сомниватся. Там особых проблем вроде не должно быть.
Доброго времени суток сегодня получил
Залил код из этой темы и радио прекрасно заработало.
Если у Вас та же быблиотека, что и у меня, то не всё там прекрасно. Попробуйте такую последовательность. Поиск станции (seekUp или seekDown), она найдёт, будет играть. После этого попробуйте установить частоту на другую станцию. На моей версии библиотеки такой фокус не проходит. После поиска установка частоты не работает.
И что с дисплеем? Удалось прикрутить?
А чего сомниватся. Там особых проблем вроде не должно быть.
да здесь пробегал код лучшего радио всех времён и народов, но дисплей от нокиа а у меня TFT 3.2
Нипонял, это будет радио или телевизор? ;)
И опять таки проблем жеж быть не может, если по отдельности все работает то надо приложить недюжий талант шоб оно вместе не смогло.
Дополню про это странное радио.
Выше писалт что оно находится сразу на 3-х адресах шины. И это так.
Адрес 0х10 - записуем сразу во все регистры настройки
0х10 - записуем в один регистры настройки
0x60 - странный режим, напоминает первый, но доступны не все регистры
Отсюда чехарда в понимании и реализациях. Вполне рабочая либа здесь - https://github.com/mathertel/Radio/tree/master/src
Всю не проверял, но по её мотвам делал себе прогу чтоб радио просто послушать, управляя из ардуиновского монитора. Вот она (работа с адреса 0x60 закоментирована, но вобщем тоже работала). Без либ и излишеств.
0x60 - странный режим, напоминает первый, но доступны не все регистры
Это режим совместимости с TEA5767
Могу дать полный даташит этого "странного радио" без секретных битов (как в некоторых даташитах). Там все три режима описаны. Только предупреждаю - он на китайском.
Спасибо, ненадо. Режимов 0х10 и 0х11 хватает. Я не настолько радиоман, чтоб все собирать ;)
0x60 - странный режим, напоминает первый, но доступны не все регистры
Это режим совместимости с TEA5767
Могу дать полный даташит этого "странного радио" без секретных битов (как в некоторых даташитах). Там все три режима описаны. Только предупреждаю - он на китайском.
С китайского может Павел Свиридов перевести, он его бегло читает ))) если того стоит, попрошу
TFT - хочу на кухню девайс, несколько в одном, датчики всего + метеостанция + радио +wifi AP+client и всё это на Wemos D1 (esp8266)
Код приёмника с RDS тут
Код приёмника с RDS тут
В той либке что я ссылку кинул, прямо в коде, в модуле RDA5807.cpp для целей отладки в конце тоже висит некая функция с кодом приемника с RDS.
Вполне рабочая либа здесь - https://github.com/mathertel/Radio/tree/master/src
Та самая, в которой после поиска не работает установка частоты. Нужно добавить сброс бита SEEK в функцию setFrequency? Ну, или прямо в seekUp/seekDown после отгрузки регистра.
если того стоит, попрошу
Если для меня, то не надо - с трудом, но прочитать могу.
Вполне рабочая либа здесь - https://github.com/mathertel/Radio/tree/master/src
Та самая, в которой после поиска не работает установка частоты. Нужно добавить сброс бита SEEK в функцию setFrequency? Ну, или прямо в seekUp/seekDown после отгрузки регистра.
Проблема не всегда есть, если устанавливаемая частота отличается (а как правило так) от требуемой а сикает в нужную сторону, то только к лучшему - частоту точней ставит.
Если проблема есть seekUp/seekDown надо вызывать с false, останавливать режим поиска. Хотя в общем логика в сбросе SEEK при установке частоты есть. В общем не критично.