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

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

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

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

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

PL102BC-N:

Классика

Классический модуль с шагом контактов 2,0мм, подобные модули есть на микросхемах RDA5807M, CL5767P и тд.

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


SCT-104B VER:4.0:

Данный модуль относительно недавно появился на али, его мне прислали за место классической версии. Стоит отметить крайне не удачную компоновку выводов для самодельщиков.

SCT-104B VER:4.0

Распиновка получена методом научной прозвони. Запустить модуль мне удалось после «появления» в сети картинки, что ниже.

Обратите внимание на ноги BUSMODE и BEN, их описание, слева.

  • 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, готовые решения мне не попадались.

Софт:

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

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

Код
#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;

}



Купить:

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