ФМ-радиомодули и Ардуино

Тема в разделе "Arduino & Shields", создана пользователем SSnick, 20 янв 2015.

  1. SSnick

    SSnick Гик

    Здравствуйте.
    Провел уже не одну практически бесонную ночь, пытаясь заставить работать радиомодуль на 5807. Выглядит он так:
    [​IMG]
    Подключал я его аналогично другому радиомодулю который более известен - tea5767. Вот и его распиновка: (rclk не используется)
    [​IMG]
    подключаются оба по i2c шине к А4 и А5 ардуины для прошивки в модуль необходимой частоты.
    Но последний (5767) у меня заработал сразу, каналы переключались кнопкой - все как надо. Но прошив тот же самый скетч в модуль 5807 - он отказывался работать будучи подключенным к ардуино. Отключая же питание от ардуино - модуль начинал работать, но каналы само собой не переключались.
    Скажите, в чем тут может быть дело? Меня экземпляры модулей на предмет возможной поломки - у других поведение аналогичное. Менял местами А4 и А5... По сути идентичное подключение по одному интерфейсу, и в скетче нет ничего заумного.
    Уже как только не изгалялся...

     
  2. Unixon

    Unixon Оракул Модератор

    А почему распиновка модулей зеркальная на фото и рисунке?
     
  3. Salk

    Salk Гик

    В инете плавало. 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.
    }

    Хотя...
    Проверьте пайку ещё раз, пройдите паяльником по всем контактам. Их очень легко повредить.
     
  4. SSnick

    SSnick Гик

    потому что это разные модули
    это я знаю, проштудировал половину интернетов, с этим скетчем, то что вы скинули - модуль работает, но он работает только на частоте которая указана в инициализации (setup), на кнопку же никак не влияет.
    Кнопка не так поцеплена? Да точно так же как и в tea5767
    Со скетчем для 5767 этот модуль не работает, то есть... при нажатии на кнопку, он перенастраивается на нужную частоту, но замолкает спустя времени равное всем delay в коде (соблюдая условия if), нажав еще раз - настройка на следующую станцию и опять тишина...
    со скетчем который вы выложили - на кнопку вообще не реагирует, работает (и не замолкает) на частоте инициализации...
    На что это вообще похоже?
     
  5. SSnick

    SSnick Гик

    [сообщение не редактируется] Добавлю, что я так же менял местами подключения SCL и SDA - на предмет не правильного подключения - результат никакой.
    По поводу пайки - да, контакты крайне хрупкие, но я сделал переходник с 2мм на 2.54 dip, в общем приложил как soic корпус и припаял плату к переходнику
    У меня два таких модуля - подключал оба, поведение идентичное
     
  6. Salk

    Salk Гик

    И даже так не переключает?
    Код (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.
    }

     
     
  7. SSnick

    SSnick Гик

    Дело не в переключении, переключает он станции, а в том что он не воспроизводит долгое время одну выбранную станцию, выбрал, поиграл полсекунды и замолк
     
  8. SSnick

    SSnick Гик

    Что с форумом? Сообщения не удалить, не изменить... в общем попробую сейчас то что вы написали
     
  9. SSnick

    SSnick Гик

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

    Security000 Нуб

    [​IMG]
    Код (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;
    }
     
  11. пора бы запретить хотлинк на сайте (
     
    ИгорьК нравится это.