FM радио на Arduino

Автор: | 20.09.2015

Сегодня я хочу поделится своим проектом. Это радиоприемник на Arduino.

Радиоприемник работает в диапазоне FM или как правильно он называется УКВ CCIR. Приемник имеет функции автопоиска, сохранения частоты станции в память и загрузки сохраненной частоты при включении.

На дисплее отображается частота, уровень сигнала и тип (Стерео или моно).

Данный радиоприемник нельзя использовать в повседневной практике по одной причине. В данной схеме используется общее питание для цифровой и аналоговой части, поэтому слышны цифровые наводки в принимаемом сигнале. Но этот проект всегда можно использовать как базис для готовых устройств с кодом написанным на Arduino.

Радио модуль TEA 5767 от Philips является полностью законченным радиоприемником с кристаллом и всем необходимым обвесом. Управляется данный модуль по шине данных i2c от микроконтроллера или Arduino. Данный радиоприемник можно приобрести на Aliexpres за символическую цену. Так же данный модуль можно «выдрать» со всевозможных mp3 плееров, cd плееров, автомагнитол или бюджетных телефонов. Я рекомендую использовать модуль только с переходником, дабы не оторвать хлипкие контактные площадки модуля.

Philips TEA5767 имеет 10 контактов для подключения питания, антенны, микроконтроллера:

  1. I2C контакты 1 и 2 (1-SDA, 2-SCL);
  2. Busmode (настройка шины);
  3. 4,3 Write/Read (не используется);
  4. 5 и 6 питание (5-VCC, 6-GND);
  5. 7 и 8 аудио выход (7-audio R, 8-audio L);
  6. 9 MPXO (не используется);
  7. 10 антенна.

Модуль может работать при напряжении  от 2,5до 5В


 


 


#include <TEA5767.h>
#include <Wire.h>
#include <LiquidCrystal.h>
#include <EEPROM.h>
TEA5767 Radio; //создаем обьект радио
LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //создаем обьект дисплей
int search_mode = 0;
int search_direction;
unsigned long last_pressed;
float freqOld;
float current_freq;

void setup() {
pinMode(8, INPUT);
pinMode(9, INPUT);
pinMode(10, INPUT);
Wire.begin();

Radio.init();
current_freq = EEPROM_float_read(0);
Radio.set_frequency(current_freq);
lcd.begin(16,2);
lcd.clear();
}

void EEPROM_float_write(int addr, float val) // запись в ЕЕПРОМ

{
byte *x = (byte *)&val;
for(byte i = 0; i < 4; i++) EEPROM.write(i+addr, x[i]);
}

float EEPROM_float_read(int addr) // чтение из ЕЕПРОМ
{
byte x[4];
for(byte i = 0; i < 4; i++) x[i] = EEPROM.read(i+addr);
float *y = (float *)&x;
return y[0];
}

void loop() {

unsigned char buf[5];
int stereo;
int signal_level;

unsigned long current_millis = millis();

if (Radio.read_status(buf) == 1) {
current_freq = floor (Radio.frequency_available (buf) / 100000 + .5) / 10;

stereo = Radio.stereo(buf);
signal_level = Radio.signal_level(buf);

if (current_freq != freqOld){
lcd.setCursor(0,0);
lcd.print(» «);
}

lcd.setCursor(0,0);
lcd.print(«FM: «);
lcd.print(current_freq);
lcd.setCursor(0,1);
if (stereo) lcd.print(«STEREO «);
else lcd.print(«MONO «);
lcd.setCursor(7,1);
lcd.print(signal_level%100/10);
lcd.print (signal_level%10);
freqOld = current_freq;
}

if (search_mode == 1) {
if (Radio.process_search (buf, search_direction) == 1) {
search_mode = 0;
}
}

if (digitalRead(9) == HIGH) {
last_pressed = current_millis;
search_mode = 1;
search_direction = TEA5767_SEARCH_DIR_UP;
Radio.search_up(buf);
delay(600);
}

if (digitalRead(8) == HIGH) {
last_pressed = current_millis;
search_mode = 1;
search_direction = TEA5767_SEARCH_DIR_DOWN;
Radio.search_down(buf);
delay(600);
}

if (digitalRead(10) == HIGH) {
delay(50);
lcd.clear();
lcd.setCursor(0,0);
lcd.print(«Saving»);
EEPROM_float_write(0,current_freq);
delay(300);
lcd.clear();

}
delay(200);

}

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *