Подключение 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, описание слева.

  • 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.