Популярный и дешевый модуль FM-радио TEA5767 — первый модуль, который я взял для изучения.

В моем прототипе системы, кроме самого TEA5767 использованы и другие необходимые модули:
- Arduino Pro Mini с ATmega328 для управления
- Усилитель мощности звука PAM8403, который усиливает выходной (от модуля TEA5767) аудиосигнал и передает его на динамики
- Цифровой регулятор громкости PT2257
- Источник питания (3,3 В)
- ЖК-дисплей от Nokia 5110 (3310) с интерфейсом SPI
- ИК-пульт дистанционного управления NEC для беспроводного радиоуправления
Характеристики модуля TEA5767
Ниже приведены основные особенности модуля TEA5767 :
- Напряжение питания: 2,5…5 В
- Диапазон частот: 76…108 мГц
- Размер модуля: 31х30 мм
- Имеет диод для защиты от обратной полярности
- Наличие датчика фильтрации выходной мощности
- Интерфейс: I2C (адрес 0x60)
- Индикатор питания — синий светодиод
- Мягкое отключение звука
- Режим ожидания
- Автоматический режим поиска радиостанций
- Режим поиска радиостанции (следующий или предыдущий)
Распиновка выводов
Блок-схема FM-радио

Дополнительно я использовал:
1. Модуль RTC с добавленной памятью EEPROM (название модуля: Precise DS3231 AT24C32 RTC clock), управляемый по шине I2C (адрес по умолчанию для DS3231 — 0x68, а для AT24C32 — 0x57). Я использовал модуль RTC, чтобы считывать время и температуру окружающей среды (модуль также измеряет температуру).
В свою очередь, в EEPROM я помещаю данные, которые нужно использовать после повторного включения радио, например, частоту последней выбранной радиостанции. Выбор внешней памяти был продиктован большей надежностью (количеством возможных операций записи в память). Можно также использовать память ATmega.
2. Модуль с регулятором громкости PT2257, который позволяет осуществлять цифровое управление громкостью динамика через шину I2C (адрес по умолчанию 0x88).
Этот модуль можно не устанавливать и использовать только модуль усилителя PAM8403 со встроенным потенциометром, (фото такого модуля можно найти в моей статье, посвященной усилителю PAM8403). Лично меня, правда, смущало наличие этого аналогового элемента, и я сосредоточился на управлении пультом;).
3. Модуль FT232 (на схеме не показан) для программирования Arduino и связи с терминалом на ПК.
Подключение показано на рисунке ниже. Чтобы не слишком путаться, линии I2C (SDL и SDC) я не соединял. При практической реализации, конечно, их следует связывать вместе.
Подключение (схемы) аудиоусилителя PAM8403 и регулятора громкости PT2257 описано в других статьях (см. PAM8403 и PT2257). Связь между микроконтроллером и модулями осуществляется по шине I2C, а с ЖК-дисплея — через программно реализованный SPI.
Что касается вопросов сборки и самого модуля TEA5767, то у него нестандартная компоновка контактных площадок. Я использовал слегка изогнутые позолоченные контакты, а сам макет был перевернут (первое изображение слева), потому что на этой стороне были контактные площадки большего размера.
Функциональность всей схемы
- Нет аналоговых компонентов
- ИК-пульт дистанционного управления
- Выбор станции из списка предустановок
- Показать название станции из списка предустановок
- Возможность поиска станций (без сохранения): следующая, предыдущая, все со всего диапазона VHF (опции доступны на уровне меню)
- Показывать время каждые 5 секунд
- Отображение по запросу (функция доступна кнопкой дистанционного управления) дата, время, температура окружающей среды
- Показывает мощность FM-сигнала и громкость динамика (фактически — подавление US PT2257)
- Отображение типа сигнала: стерео (ST), моно (MN)
- Отключение звука (mute)
- Выключение (режим ожидания)
- Восстановить список предустановленных станций по умолчанию (полезно после поиска станций в диапазоне)
- Запоминание последнего установленного значения громкости (подавления) PT2257 и его восстановление после повторного включения радио
- Установка чувствительности автоматического поиска станций (опция в меню)

Название станции, частота, значки мощности сигнала, типа сигнала (стерео / моно), громкости

Данные с модуля RTC (время, дата, температура окружающей среды)

Периодически отображается время при воспроизведении радио

Меню
Прототип
Отправной точкой была поддержка радиомодуля, описанная в статье «Complete FM Radio с использованием Arduino, библиотеки TEA5767 и LCD Shield» и представленного там кода.
Основная модификация коснулась использования другого дисплея (с дополнительной информацией) и изменения способа управления на ИК-пульт. Я также значительно упростил выходные цепи, сохранив возможность цифрового управления громкостью.
Идея обработки кода на основе состояний также осталась, хотя сам код сильно изменился из-за других / новых модулей.
Во-вторых, в оригинальной версии у меня закружилась голова от большого количества кнопок, из-за которых постоянно терялся.
Оценка работы TEA5767
Слабый встроенный автоматический поиск станций. На практике работает только жонглирование запрограммированными станциями (частотами). Возможно из-за плохой антенны в виде 30 см кабеля.
С другой стороны, здесь нет драмы, потому что на практике я слушаю заранее определенные станции на других радиостанциях (например, по телефону).
Сам радиомодуль мог бы иметь регулятор громкости выходного сигнала и поддержку RDS, тем более что у конкурентов есть такие особенности.
Используемые библиотеки
Модуль FM-радио TEA5767: TEA5767
ЖК-дисплей: Adafruit-PCD8544-Nokia-5110-LCD-library, Adafruit-GFX-Library
ИК-модуль: Arduino-IRremote
Регулятор громкости PT2257: Evc_pt2257
DS3231 + EEPROM: Arduino-DS3231, AT24CX
Использование вышеуказанных библиотек не вызывало серьезных проблем. Самым сложным для понимания оказался принцип работы дисплея (отображение текста и иконок). Кроме того, его библиотеки занимают довольно много места в оперативной памяти.
С другой стороны, они дают возможность программной реализации интерфейса SPI, чем я воспользовался. Еще одно преимущество — обширный API, который дает большие возможности влиять на конечный эффект, отображаемый на ЖК-экране.
Работа ИК-пульта также оказалась проблематичной из-за двух разных кодов для одной и той же кнопки, хотя это скорее вопрос аппаратного обеспечения. Подробнее об этой проблеме в статье ИК-пульт дистанционного управления (NEC) с приемником HX1838. Поддержка в Arduino.
Исходный код
Сама программа включает более 1200 строк. В первую очередь я постарался сохранить читабельность и снизить потребление оперативной памяти.
На практике, если я использую радио в своем городе, я ставлю свои любимые частоты и выбираю уже из них. Реализованный поиск каналов (все, предыдущий, следующий) для меня избыточен, тем более что его эффективность не впечатляет. Найденные каналы также не запоминаются / не сохраняются.
Код также включает поддержку последовательного порта, который я использовал для программирования системы и отправки информации на терминал ПК (в виде отладчика).
Из-за проблем с объемом памяти, описанных выше, код также включает поддержку проверки использования ОЗУ на основе библиотеки MemoryFree.

