Текущее время: 21 мар 2019, 14:42

Город ХОББИ

Занятие любимым хобби - это путь к счастливой жизни!

FM радио на Ардуино

Тут собраны различные проекты на Ардуино
Аватар пользователя
 
Сообщений: 711
Зарегистрирован: 27 мар 2013, 22:12

FM радио на Ардуино

Сообщение -=dp=- » 17 июл 2016, 14:16

FM радио на Ардуино.

Загорелся я идеей собрать FM радиоприемник на Ардуино.
Нашел в интернете отличные радиомодули RRD_102v2.0 с цифровым синтезатором частоты и решил попробовать сделать из него радиоприемник.
Купил кстати этот модуль FM приемника в Калининграде, вот тут http://newmar.ru/index.php?id_product=4 ... er=product
И так, приступим к изготовлению FM радио на Ардуино!

Для изготовления FM радиоприемника на Ардуино нам понадобятся следующие комплектующие:
Плата контроллера Ардуино (УНО, НАНО, Про мини)
LED дисплей 4x1 на чипе TM1637.
Радиомодуль RRD_102v2.0 на чипе RDA5807M.


Вложения
Arduino UNO.jpg
Ардуино УНО купить в Калининграде
Arduino UNO.jpg (14.34 KiB) Просмотров: 9767
LED TM1637.jpg
Дисплей для Ардуино
LED TM1637.jpg (22.29 KiB) Просмотров: 9767
РадиомодульRRD_102v2.0.jpg
ФМ радио на Ардуино
РадиомодульRRD_102v2.0.jpg (11.59 KiB) Просмотров: 9767

Аватар пользователя
 
Сообщений: 711
Зарегистрирован: 27 мар 2013, 22:12

Re: FM радио на Ардуино

Сообщение -=dp=- » 17 июл 2016, 14:28

Для индикации частоты FM радиоприемника я решил применить LED дисплей с чипом TM1637, с ним очень удобно работать, на борту у него 4 семисегментных индикатора и управляется он по I2C, то есть у Ардуины расходуется всего 2 цифровых входа :)
Модуль LED индикации кстати очень яркий, я выбрал зеленого цвета, а скоро в магазине появятся LED индикаторы и других цветов (Красный, Желтый, Синий, Белый, ну и Зеленый) ;)

Для подключения и работы с данным LED индикатором нам понадобится библиотека TM1637.h
Для управления радиомодулем RRD-102 V 2.0 на чипе RDA5807M вполне подходит встроенная в Ардуино IDE библиотека Wire.h

Собираем FM приемник на Ардуино по схеме ниже:
Ну а затем пишем программу (скетч) для прошивки контроллера Ардуино:

Код: выделить все
// FM Радио версия 1.0
// http://www.forklg.ru


#include <Wire.h>               // I2C-Library для управления радиомодулем RDA5807
// SDA приемника RDA5807 подключаем к аналоговому входу 4
// SCL приемника RDA5807 подключаем к аналоговому входу 5
#include "TM1637.h" // Библиотека для управления LED дисплеем TM1637
#define CLK 4     // вывод CLC дисплея
#define DIO 5     // вывод DIO дисплея
TM1637 disp(CLK,DIO);
double f_ini=100.000;// Стартовая частота настройки приемника RDA5807. (Можно изменить на нужную).

void setup()
{
  disp.set(7); // Устанавливаем яркость дисплея на максимум
  disp.init(D4056A); // Проводим инициализацию дисплея
  Wire.begin();   // Инициализация двухпроводной шины I2C.
  setFrequency(f_ini);  // Присваиваем значение частоты радиомодулю RDA5807
  pinMode(6, INPUT); // вход для подключения кнопки "Частота вниз"
  pinMode(7, INPUT);// вход для подключения кнопки "Частота вверх"
}

void loop()                 
{
float fin1=(f_ini*1000); // производим вычисления для отображения установленной частоты на дисплее
int fin2=fin1/100; // производим вычисления для отображения установленной частоты на дисплее
disp.display(fin2); // выводим значение частоты на дисплей
// проверяем нажатие кнопки "Частота вниз"
if (digitalRead(6) == HIGH){
// если кнопка "Частота вниз" нажата
f_ini=f_ini-0.1; // уменьшаем значение частоты на 0,1 МГц
 setFrequency(f_ini); // передаем новое значение частоты радиомодулю
};
// проверяем нажатие кнопки "Частота вверх"
if (digitalRead(7) == HIGH){
// если кнопка "Частота вверх" нажата
f_ini=f_ini+0.1;// увеличиваем значение частоты на 0,1 МГц
 setFrequency(f_ini);// передаем новое значение частоты радиомодулю
};
delay(500); // задержка 0,5 сек.
}
 

void setFrequency(double fmhz)  // Функция загрузки частоты настройки в модуль RDA5807.
{
  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.endTransmission();                // формируем I2C-Stop.
}





Выкладываю скетч и рабочую библиотеку для LED индикатора:


Вложения
Схема FM радио на Ардуино.jpg
Схема FM приемника на Ардуино УНО, НАНО, Про мини
FM_radio.rar
Скетч FM радио на Ардуино с комментариями
(1.27 KiB) Скачиваний: 911
TM1637.rar
Библиотека для LED индикатора TM1637.h
(7.1 KiB) Скачиваний: 677

Аватар пользователя
 
Сообщений: 711
Зарегистрирован: 27 мар 2013, 22:12

Re: FM радио на Ардуино

Сообщение -=dp=- » 17 июл 2016, 14:44

А вот и фотографии FM радиоприемника собранного на макетной плате.

Радиомодуль RRD-102 V 2.0 на чипе RDA5807M пришлось сначала припаять к небольшой макетной плате с штырьками, так как на плате радиомодуля расстояние между ножками меньше чем расстояние между штырьками и напрямую штырьки к нему не припаяешь.

А, да , я решил все таки делать радиоприемник на Ардуино НАНО, но схема и скетч точно такие же, просто у Ардуино нано немного другое расположение выводов, но номера выводов полностью соответствуют УНО, так что ничего в скетче переделывать не потребуется. :ugeek:


Вложения
1.jpg
Ардуино радио
2.jpg
Радио на Ардуино
3.jpg
Радиоприемник на Ардуино

Аватар пользователя
 
Сообщений: 711
Зарегистрирован: 27 мар 2013, 22:12

Re: FM радио на Ардуино

Сообщение -=dp=- » 17 июл 2016, 14:52

Выкладываю видео ФМ радиоприемника на Ардуино https://youtu.be/k1x7pesaivw



 
Сообщений: 14
Зарегистрирован: 02 янв 2016, 16:11

Re: FM радио на Ардуино

Сообщение IROBOT » 09 окт 2016, 18:46

Решил повторить Ваш проект,но ардуино 1.6.9 сразу выдала ошибку на эту строчку disp.init(D4056A); Вообщем пробую библиотечку DIGITAL TUBE.Вот скетч ,но показания частоты не правильные.В чем ошибка?
Код: выделить все
// FM Радио версия 1.0
// http://www.forklg.ru


#include <Wire.h>               // I2C-Library для управления радиомодулем RDA5807
// SDA приемника RDA5807 подключаем к аналоговому входу 4
// SCL приемника RDA5807 подключаем к аналоговому входу 5
#include "TM1637.h" // Библиотека для управления LED дисплеем TM1637
#define CLK 4     // вывод CLC дисплея
#define DIO 5     // вывод DIO дисплея
TM1637 tm1637(CLK,DIO);
double f_ini=102.200;// Стартовая частота настройки приемника RDA5807. (Можно изменить на нужную).

void setup()
{
 tm1637.init();
  tm1637.set(BRIGHT_TYPICAL);//BRIGHT_TYPICAL = 2,BRIGHT_DARKEST = 0,BRIGHTEST = 7;
  Wire.begin();   // Инициализация двухпроводной шины I2C.
  setFrequency(f_ini);  // Присваиваем значение частоты радиомодулю RDA5807
  pinMode(6, INPUT); // вход для подключения кнопки "Частота вниз"
  pinMode(7, INPUT);// вход для подключения кнопки "Частота вверх"
}

void loop()                 
{
float fin1=(f_ini*1000); // производим вычисления для отображения установленной частоты на дисплее
int fin2=fin1/100; // производим вычисления для отображения установленной частоты на дисплее
tm1637.display(fin2); // выводим значение частоты на дисплей
// проверяем нажатие кнопки "Частота вниз"
if (digitalRead(6) == HIGH){
// если кнопка "Частота вниз" нажата
f_ini=f_ini-0.1; // уменьшаем значение частоты на 0,1 МГц
 setFrequency(f_ini); // передаем новое значение частоты радиомодулю
};
// проверяем нажатие кнопки "Частота вверх"
if (digitalRead(7) == HIGH){
// если кнопка "Частота вверх" нажата
f_ini=f_ini+0.1;// увеличиваем значение частоты на 0,1 МГц
 setFrequency(f_ini);// передаем новое значение частоты радиомодулю
};
delay(500); // задержка 0,5 сек.
}
 

void setFrequency(double fmhz)  // Функция загрузки частоты настройки в модуль RDA5807.
{
  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.endTransmission();                // формируем I2C-Stop.
}




 
Сообщений: 14
Зарегистрирован: 02 янв 2016, 16:11

Re: FM радио на Ардуино

Сообщение IROBOT » 11 окт 2016, 12:02

Переделал под экран 20х4 управляется по i2c
Код: выделить все
// FM Радио версия 1.0
// http://www.forklg.ru


#include <Wire.h>               // I2C-Library для управления радиомодулем RDA5807
// SDA приемника RDA5807 подключаем к аналоговому входу 4
// SCL приемника RDA5807 подключаем к аналоговому входу 5

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4);

double f_ini=107.900;// Стартовая частота настройки приемника RDA5807. (Можно изменить на нужную).

void setup()
{
lcd.init();                      // initialize the lcd
  lcd.init();
  // Print a message to the LCD.
  lcd.backlight();
  lcd.setCursor(4,0);
lcd.print("FM RADIO");
  Wire.begin();   // Инициализация двухпроводной шины I2C.
  setFrequency(f_ini);  // Присваиваем значение частоты радиомодулю RDA5807
  pinMode(3, INPUT); // вход для подключения кнопки "Частота вниз"
  pinMode(4, INPUT);// вход для подключения кнопки "Частота вверх"
  Serial.begin(9600);
}

void loop()                 
{
float fin1=(f_ini*1000); // производим вычисления для отображения установленной частоты на дисплее
int fin2=fin1/100; // производим вычисления для отображения установленной частоты на дисплее

Serial.print("frequency    ");
Serial.println(fin2);
lcd.setCursor(2,1);
lcd.print("Fraq:");
lcd.print(fin2);
lcd.print("MHz");
// проверяем нажатие кнопки "Частота вниз"
if (digitalRead(6) == HIGH){
// если кнопка "Частота вниз" нажата
f_ini=f_ini-0.1; // уменьшаем значение частоты на 0,1 МГц
 setFrequency(f_ini); // передаем новое значение частоты радиомодулю
};
// проверяем нажатие кнопки "Частота вверх"
if (digitalRead(7) == HIGH){
// если кнопка "Частота вверх" нажата
f_ini=f_ini+0.1;// увеличиваем значение частоты на 0,1 МГц
 setFrequency(f_ini);// передаем новое значение частоты радиомодулю
};
delay(500); // задержка 0,5 сек.
}
 

void setFrequency(double fmhz)  // Функция загрузки частоты настройки в модуль RDA5807.
{
  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.endTransmission();                // формируем I2C-Stop.
}




Аватар пользователя
 
Сообщений: 711
Зарегистрирован: 27 мар 2013, 22:12

Re: FM радио на Ардуино

Сообщение -=dp=- » 12 окт 2016, 13:14

Незнаю, у меня с LED индикатором работает отлично, но вот автопоиск надо реализовывать.
У данного FM радиомодуля есть функция определения уровня принимаемого сигнала, вот к ней как раз можно и привязаться.



 
Сообщений: 14
Зарегистрирован: 02 янв 2016, 16:11

Re: FM радио на Ардуино

Сообщение IROBOT » 20 окт 2016, 13:38

Димон писал(а):Незнаю, у меня с LED индикатором работает отлично, но вот автопоиск надо реализовывать.
У данного FM радиомодуля есть функция определения уровня принимаемого сигнала, вот к ней как раз можно и привязаться.

Да люди на тиньке 13 делают приемник и одна из конопок это поиск -сканирование.В даташите надо смотреть команду




Вернуться в Проекты на Ардуино

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1