Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Сделай сам FM-радио в стиле ретро с модулем TEA5767

Компоненты и расходные материалы

Arduino Nano R3
× 1
FM-радиомодуль TEA5767
× 1
Аналоговые счетчики от старого радио
× 2
Стандартный ЖК-экран Adafruit - 16x2, белый на синем
× 1
стереопотенциометр 10k log
× 1
Модуль звукового усилителя класса D 2x3 Вт
× 1
Динамик:3 Вт, 4 Ом
× 2
Динамик:0,25 Вт, 8 Ом
× 2
Поворотный энкодер с кнопкой
× 1
Кнопочный переключатель SparkFun, 12 мм
× 4
Конденсатор емкостью 1 мкФ
× 2
LED (общий)
× 3

Приложения и онлайн-сервисы

IDE Arduino

Об этом проекте

В основе этого проекта лежит код Родольфо Броко Манина (RodLophus на GitHub), который содержит красивую аналоговую шкалу на ЖК-экране 16x2. Я изменил его код, добавив два аналоговых измерителя для измерения силы и частоты сигнала, светодиод «стерео» и светодиод «автоматический / ручной поиск». Кроме того, в качестве ретро-детали я добавил четыре ключа памяти, частоты которых предопределены в коде, так что радиоприемник приобретает полностью старинный вид. Аудиовыходы TEA5767 через стереопотенциометр подключены к модулю усилителя мощности класса D мощностью 2x3 Вт, чего для этого вполне достаточно. К усилителю подключены два 2-полосных динамика с достаточной мощностью. Высокочастотный динамик отделен от низко-среднечастотного динамика конденсатором 1 мФ. Аналоговые измерители от старого неисправного радио, но вы можете использовать любой измеритель, а полное отклонение стрелки будет регулироваться подстроечными потенциометрами. Устройство питается от двух последовательно соединенных литиевых батарей через стабилизатор 7805, поэтому у нас есть стабилизированный источник 5 В.

Здесь вы можете найти библиотеку TEA5767 Arduino. Принципиальная схема и код приведены ниже.

Позвольте мне упомянуть, что стрелка частотомера обновляется последовательно для каждого 1 МГц, что, я думаю, является следствием библиотеки, но если кто-то найдет решение для плавного движения стрелки, я с радостью приму это. Прием отличный, особенно для местных FM-станций с сильным сигналом, в то время как на более слабых станциях требуется переключение стерео / моно из-за частых прерываний стерео в моно и наоборот. В следующем обновлении кода я планирую вставить переключатели «стерео / моно» и «отключение звука».

Вся сборка помещена в соответствующую коробку, на которой установлена ​​телескопическая антенна, так что у нас есть готовый FM-стереоприемник в красивом ретро-стиле.

Код

  • код
код Arduino
 / * Простой радиотюнер с использованием Arduino Leonardo и модуля Philips TEA5767 (версия Arduino Uno) Примечания:------ Максимальное напряжение питания TEA5767 составляет 5 В. Убедитесь, что ваш Arduino не потребляет более 5 В. TEA5767 не обновляет индикатор уровня сигнала при чтении. Уровень сигнала будет обновляться только при смене станции. - Если у вас возникнут какие-то сбои на кодировщике или на кнопке, используйте демпферную сеть, например:Arduino pin> ---- + ---- / \ / \ / \ / ---------> Кодировщик или контакт переключателя | Резистор 100 Ом ----- ----- конденсатор 47 нФ | --- GND Соединения:------------ Энкодер (с "толкаемым" переключателем вала):Кнопка ---> Контакт 2 Arduino Контакт A энкодера ---> Контакт 3 Arduino Контакт B "---> Вывод Arduino 4- ЖК-дисплей:D7 ---> Вывод Arduino 8D6 ---> Вывод Arduino 9D5 ---> Вывод Arduino 10D4 ---> Вывод Arduino 11RS ---> Вывод Arduino 13RW ---> GNDE ----> Вывод Arduino 12VO ---> Резистор 2k2 на GND (контраст) - Модуль TEA5756:Вид сверху:+ - 10--9--8--7--6- + | + ------ + ++ || | ЧАЙ | || || | 5767 | || || + ------ + ++ | + - 1--2--3--4--5- + 1 ----> Arduino SDA2 ----> Arduino SCL3 ----> GND5 ----> + 5V6 ----> GND7 ----> Аудиовыход (правый канал) 8 ----> Аудиовыход (левый канал) 10 ---> Антенна Спасибо за ваш интерес. Удачи! [email protected]*/#include  #include  // Получите библиотеку TEA5767 по адресу https://github.com/andykarpov/TEA5767#include  // Кодировщик pins # define ENCODER_SW 2 #define ENCODER_A 3 # define ENCODER_B 4 #define button_freq1 A0 #define button_freq2 A1 #define button_freq3 A2 #define button_freq4 A3 // Пользовательские символы # define SCALE_CLEAR 5 // Шкала радиоблока #define STEREO_CHylized_S 6 // S "#define STEREO_CHAR_T 7 // Стилизованный" T "// Флаги глобального статуса # define ST_AUTO 0 // Автоматический режим (переключается кнопкой) #define ST_STEREO 1 // Радиомодуль обнаружил стереопилот # define ST_GO_UP 2 // Энкодер поворачивается по часовой стрелке #define ST_GO_DOWN 3 // Энкодер вращается против часовой стрелки #define ST_SEARCH 4 // Радиомодуль выполняет автоматический поискconst int LED =0; int analogsignal =0; int analogscale =0; int Stereoled =0; TEA5767 Radio; плавающая частота =88; состояние байта =0; LiquidCrystal lcd (13, 12, 11, 10, 9, 8); / ******************** *********************** \ * updateScale () * * Перемещает "стрелку" по шкале радио * \ ********* ********************************* / void updateScale () {int lcdBase =(частота - 88) * 4; // Индекс пикселей столбца ЖК-дисплея (0 <=lcdBase <=(16 * 5)) if (lcdBase> 79) lcdBase =79; int lcdMajor =lcdBase / 5; // Индекс символа ЖК-дисплея (0 <=lcdMajor <=15) int lcdMinor =lcdBase% 5; // Индекс столбца пикселя ЖК-дисплея внутри символа (0 <=lcdMinor <=4) if (lcdMajor> 0) {// Стрелка переключателя находится не в крайнем левом положении:// очистите символ слева (чтобы стереть предыдущий позиция neddle) lcd.setCursor (lcdMajor - 1, 0); lcd.write (SCALE_CLEAR); } else lcd.setCursor (lcdMajor, 0); lcd.write (lcdMinor); if (lcdMajor <15) // Не в крайнем правом положении:очистить символ справа lcd.write (SCALE_CLEAR);} / ********************** ******** \ * isrEncoder () * * Перехват прерываний кодировщика * \ *************************** ** / void isrEncoder () {задержка (50); // Отключение (для дрянных кодировщиков) if (digitalRead (ENCODER_B) ==HIGH) {bitWrite (status, ST_GO_UP, 1); } else bitWrite (status, ST_GO_DOWN, 1);} / **************************** \ * isrSwitch () * * Catch переключение прерываний * \ **************************** / void isrSwitch () {delay (50); // Устранение колебаний if (bitRead (status, ST_AUTO)) bitWrite (status, ST_AUTO, 0); else bitWrite (status, ST_AUTO, 1);} / ******************* \ * Настройка Arduino () * \ *********** ******** / void setup () {Serial.end (); pinMode (button_freq1, ВХОД); digitalWrite (button_freq1, LOW); pinMode (button_freq2, ВХОД); digitalWrite (button_freq2, LOW); pinMode (button_freq3, ВХОД); digitalWrite (button_freq3, LOW); pinMode (button_freq4, ВХОД); digitalWrite (button_freq4, LOW); pinMode (светодиод, ВЫХОД); pinMode (6, ВЫХОД); pinMode (7, ВЫХОД); pinMode (5, ВЫХОД); int i; byte NeedChar [8]; // Стилизованный S-байт stereoChar1 [8] ={0b01111, 0b11000, 0b11011, 0b11101, 0b11110, 0b11000, 0b01111, 0b00000}; lcd.createChar (STEREO_CHAR_S, stereoChar1); // Стилизованный T-байт stereoChar2 [8] ={0b11110, 0b00011, 0b10111, 0b10111, 0b10111, 0b10111, 0b11110, 0b00000}; lcd.createChar (STEREO_CHAR_T, stereoChar2); // Набираем фоновый байт шкалы scaleChar [8] ={0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00100, 0b10101, 0b10101}; lcd.createChar (SCALE_CLEAR, scaleChar); // Создаем собственный символ для представления всех (5) возможных позиций иглы для (int j =0; j <5; j ++) {for (i =0; i <8; i ++) NeedleChar [i] =scaleChar [i ] | (0b10000>> j); lcd.createChar (j, NeedleChar); } lcd.begin (16, 2); lcd.clear (); // Рисуем фон шкалы циферблата для (i =0; i <16; i ++) lcd.write (SCALE_CLEAR); pinMode (ENCODER_SW, INPUT); digitalWrite (ENCODER_SW, HIGH); pinMode (ENCODER_A, INPUT); digitalWrite (ENCODER_A, HIGH); pinMode (ENCODER_B, INPUT); digitalWrite (ENCODER_B, HIGH); attachInterrupt (0, isrSwitch, RISING); attachInterrupt (1, isrEncoder, RISING); // Инициализируем радиомодуль Wire.begin (); Radio.init (); Radio.set_frequency (частота);} / ****************** \ * Arduino Loop () * \ *************** *** / void loop () {unsigned char buf [5]; int стерео; int signalLevel; int searchDirection; int i; я =0; // Обновление индикатора Авто / Ручной lcd.setCursor (12, 1); lcd.write (bitRead (статус, ST_AUTO)? 'A':'M'); if bitRead (status, ST_AUTO) // Автоматический / ручной светодиодный индикатор {digitalWrite (LED, LOW); } else {digitalWrite (LED, ВЫСОКИЙ); } if (Radio.read_status (buf) ==1) {// Получить частоту радиоданных =floor (Radio.frequency_available (buf) / 100000 + .5) / 10; стерео =Radio.stereo (buf); // 0 <=Radio.signal_level <=15 signalLevel =(Radio.signal_level (buf) * 100) / 15; analogsignal =map (signalLevel, 0,100,0,255); analogscale =map (частота, 88,114,0,255); Stereoled =map (стерео, 0,7,1,0,255); analogWrite (5, аналоговый сигнал); // Счетчик сигналов analogWrite (6, analogscale); // частотомер analogWrite (7, стерео); // Стерео светодиод // Обновляем радио-циферблат updateScale (); // Индикатор уровня сигнала lcd.setCursor (0, 1); lcd.write (183); // Японский иероглиф, похожий на антенну :) if (signalLevel <100) lcd.write (''); lcd.print (signalLevel); lcd.write ('%'); // Индикатор частоты lcd.setCursor (6, 1); если (частота <100) lcd.write (''); lcd.print (частота, 1); // Индикатор моно / стерео lcd.setCursor (14, 1); если (стерео) {lcd.write (STEREO_CHAR_S); lcd.write (STEREO_CHAR_T); } еще lcd.print (""); } if (bitRead (status, ST_SEARCH)) {// Выполняет ли радио автоматический поиск? если (Radio.process_search (buf, searchDirection) ==1) {bitWrite (статус, ST_SEARCH, 0); }} if (digitalRead (button_freq2) ==HIGH) {// кнопки "памяти" if (частота> 94,8) {частота =94,8; Radio.set_frequency (частота); bitWrite (статус, ST_GO_DOWN, 0); } else {частота =94,8; Radio.set_frequency (частота); bitWrite (статус, ST_GO_UP, 0); } precrtajScale (); } if (digitalRead (button_freq1) ==HIGH) {если (частота> 92) {частота =92; Radio.set_frequency (частота); bitWrite (статус, ST_GO_DOWN, 0); } else {частота =92; Radio.set_frequency (частота); bitWrite (статус, ST_GO_UP, 0); } precrtajScale ();} if (digitalRead (button_freq3) ==HIGH) {if (частота> 97) {частота =97; Radio.set_frequency (частота); bitWrite (статус, ST_GO_DOWN, 0); } else {частота =97; Radio.set_frequency (частота); bitWrite (статус, ST_GO_UP, 0); } precrtajScale (); } if (digitalRead (button_freq4) ==HIGH) {if (частота> 101,2) {частота =101,2; Radio.set_frequency (частота); bitWrite (статус, ST_GO_DOWN, 0); } else {частота =101,2; Radio.set_frequency (частота); bitWrite (статус, ST_GO_UP, 0); } precrtajScale ();} // Энкодер поворачивается по часовой стрелке (+) if (bitRead (status, ST_GO_UP)) {if (bitRead (status, ST_AUTO) &&! bitRead (status, ST_SEARCH)) {// Режим автоматического поиска (только обрабатывается, если радиостанция в данный момент не выполняет поиск) bitWrite (status, ST_SEARCH, 1); searchDirection =TEA5767_SEARCH_DIR_UP; Radio.search_up (buf); задержка (50); } else {// Режим ручной настройки if (frequency <108) {frequency + =0.1; Radio.set_frequency (частота); }} bitWrite (статус, ST_GO_UP, 0); } // Энкодер поворачивается против часовой стрелки (-) if (bitRead (status, ST_GO_DOWN)) {if (bitRead (status, ST_AUTO) &&! BitRead (status, ST_SEARCH)) {// Режим автоматического поиска (обрабатывается, только если радио в данный момент поиск не выполняется) bitWrite (status, ST_SEARCH, 1); searchDirection =TEA5767_SEARCH_DIR_DOWN; Radio.search_down (buf); задержка (50); } else {// Режим ручной настройки if (частота> 88) {частота - =0,1; Radio.set_frequency (частота); }} bitWrite (статус, ST_GO_DOWN, 0); }} void precrtajScale () {int i; lcd.clear (); для (i =0; i <16; i ++) lcd.write (SCALE_CLEAR);} 

Схема


Производственный процесс

  1. Проектирование с помощью сети Bluetooth:чип или модуль?
  2. DIY Virtual Alike Термостат NEST с узлом-RED
  3. API датчика окружающей среды с RPi
  4. Простой детектор детского плача своими руками с Raspberry Pi
  5. Самодельные простейшие часы Numitron IV9 с Arduino
  6. Модуль импорта в Python с примерами
  7. Захват капель воды с помощью Arduino
  8. Скейтборд виртуальной реальности «Сделай сам»
  9. FM-радио для душевой кабины на базе Arduino
  10. Как связать Arduino Mega с GPS-модулем NEO-6M