Популярный и дешевый модуль FM-радио TEA5767 — первый модуль, который я взял для изучения.
В моем прототипе FM радио с Arduino и LCD Nokia 5110, кроме самого модуля 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)
- Индикатор питания — синий светодиод
- Мягкое отключение звука
- Режим ожидания
- Автоматический режим поиска радиостанций
- Режим поиска радиостанции (следующий или предыдущий)
Распиновка выводов TEA5767
Блок-схема FM-радио на TEA5767
Дополнительно я использовал:
1. Модуль RTC с добавленной памятью EEPROM (название модуля: Precise DS3231 AT24C32 RTC clock), управляемый по шине I2C (адрес по умолчанию для DS3231 — 0x68, а для AT24C32 — 0x57). Я использовал модуль RTC, чтобы считывать время и температуру окружающей среды (модуль также измеряет температуру).
В EEPROM я помещаю данные, которые нужно использовать после повторного включения радио, например, частоту последней выбранной радиостанции. Выбор внешней памяти был продиктован большей надежностью (количеством возможных операций записи в память). Можно также использовать память самого микроконтроллера.
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 и его восстановление после повторного включения радио
- Установка чувствительности автоматического поиска станций (опция в меню)




Прототип
Отправной точкой была поддержка радиомодуля, описанная в статье «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, который дает большие возможности влиять на конечный эффект, отображаемый на ЖК-экране.
Работа ИК-пульта также оказалась проблематичной из-за двух разных кодов для одной и той же кнопки, хотя это скорее вопрос аппаратного обеспечения.
Исходный код
Сама программа включает более 1200 строк. В первую очередь я постарался сохранить читабельность и снизить потребление оперативной памяти.
На практике, если я использую радио в своем городе, я ставлю свои любимые частоты и выбираю уже из них. Реализованный поиск каналов (все, предыдущий, следующий) для меня избыточен, тем более что его эффективность не впечатляет. Найденные каналы также не запоминаются / не сохраняются.
Код также включает поддержку последовательного порта, который я использовал для программирования системы и отправки информации на терминал ПК (в виде отладчика).
Из-за проблем с объемом памяти, описанных выше, код также включает поддержку проверки использования ОЗУ на основе библиотеки MemoryFree.
Скачать файлы проекта (83,4 KiB, скачано: 164)

Привет! При проверке скетча выдает ошибку. Что можно посмотреть? Спасибо!
Удалось мне залить, пишет «Мало памяти, программа может работать не правильно». У меня NANO
Подключил дисплей и 3231 — полная тишина. Что не так?