Подключение FM радиоприемника TEA5767 к Arduino

Про различные модули FM радио на микросхеме TEA5767.

Особенности:

  • Теплый ламповый супергетеродинный приемник FM диапазона.
  • Полоса частот: 76 MHz — 108 MHz.
  • Регулировка громкости и отключение звука.
  • Автоматический поиск станций.
  • Интерфейс I2C.
  • Диапазон напряжения питания: 2.5 — 5.0 В.

Распиновка модулей:

PL102BC-N:

Классический модуль с шагом контактов 2,0мм

Классика

Подобные модули есть на других микросхемах, вроде RDA5807M, CL5767P и им подобные приемники прямого преобразования с DSP обработкой и со значительно худшей чувствительностью и качеством звучания.

В качестве переходника на привычный шаг контактов в 2,54мм, можно использовать кусок макетки.


SCT-104B VER:4.0:

Модуль относительно недавно появился в китайских магазинах и возможно уже пропал из продажи. Мне он достался случайно, продавец отправил его за место классической версии.

SCT-104B VER:4.0

Стоит отметить крайне не удачную компоновку выводов для самодельщиков. Распиновка модуля, что выше, получена методом «научной прозвони» и она не полная. С ней модуль не заработал и долго валялся в коробке. Запустить модуль удалось только после того как случайно нашел полную распиновку, что на картинке ниже.

Обратите внимание на описание BUSMODE и BEN, 12 и 13 ноги микросхемы.

  • BUSMODE — в даташите это bus mode select input, Выбор интерфейса, I2C или 3-wire, «The I2C-bus mode is selected when pin BUSMODE is LOW,» соответственно если нужен интерфейс I2C, значит ногу нужно соединить с GND.
  • BEN (BUSENABLE, 13 pin) — в даташите это bus enable input, «Before any READ or WRITE operation the pin BUSENABLE has to be HIGH for at least 10 ms.» Включение интерфейса. Если хотим считать или записать данные в приемник, на пине должен быть высокий уровень, логическая единица, соответственно подключаем к питанию. Чего и нехвотало для запуска модуля.

GNT-503_VER2:

Распиновка получена методом научной прозвонки. Не проверялась.

GNT-503_VER2

BUS на картинке это 13 нога, тот самый BUSENABLE, как указано в даташите. Угадайте к чему подключен BUSMODE? Выбор интерфейса. Ага, модуль рассчитан на работу по 3-wire и по I2C до него не достучатся.

Хотя он удобно напаивается на переходник под SOP.


Подключение к Arduino:

В случаи с классическим модулем.

  • SDA и SCL — Интерфейс I2C, выходы на модулях не подтянуты к питанию и требуют пару резисторов на 10к.
  • VCC и GND — Питание модуля и масса, диапазон напряжения питания 2.5 — 5.0 В, рекомендуемое 3,0 В.
  • OUTL и OUTR — Аналоговый выход
  • ANT — Антенный вход.


В случаи SCT-104B VER:4.0 выход BUSENABLE нужно подтянуть к питанию, в остальном отличий нет.

Для GNT-503_VER2 с его 3-ware, готовых решении мне не попадались.

Софт:

Чтобы запустить приемник, достаточно написать несколько команд в регистр, пример ниже.

Код
#include <Wire.h>  
#include <LiquidCrystal.h>

#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5
 
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

float freq = 100.5;  // частота при включении 

int lcd_key     = 0;
int adc_key_in  = 0;


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();
 }
 
int read_LCD_buttons() {
 adc_key_in = analogRead(0);      // read the value from the sensor  
 if (adc_key_in > 1000) return btnNONE; // We make this the 1st option for speed reasons since it will be the most likely result
 
 if (adc_key_in < 50)   return btnRIGHT;  
 if (adc_key_in < 250)  return btnUP; 
 if (adc_key_in < 450)  return btnDOWN; 
 if (adc_key_in < 650)  return btnLEFT; 
 if (adc_key_in < 850)  return btnSELECT;   

 return btnNONE;  // when all others fail, return this...
}

  // вывод всего на LCD
void LCDsend(){
  lcd.setCursor(0, 0);            
  lcd.print(freq, 1);       
  lcd.print(" MHz ");
 
} 

void setup() {   
  Wire.begin();
  lcd.begin(16, 2);              
  lcd.clear();
  
  setFrequency(freq);  
  LCDsend();
}
 
void loop()
{ 

 switch (read_LCD_buttons())               
 {
   case btnRIGHT:
     {
       freq += .1; 
         setFrequency(freq);
         LCDsend();
         delay(250);
       break;
     }
   case btnLEFT:
     {
       freq -= .1; 
         setFrequency(freq);
         LCDsend();
         delay(250);
       break;
     }
   case btnUP:
     {
       //
       break;
     }
   case btnDOWN:
     {
       //
       break;
     }
   case btnSELECT:
     {
        //
       break;
     }
     case btnNONE:
     {
       // 
       break;
     }

 }


     // защита от выхода за диапазон FM
   if (freq < 87.4) freq = 87.4;
   else if (freq > 108.0) freq = 108.0;

}


Для приемника существует много примеров, проектов и библиотек. Библиотеку могу порекомендовать эту: https://mathertel.github.io/Radio/html/index.html



Купить:

Также существуют полностью совместимые (включая программно) модули, вроде AR1010.