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

Создание надежного FM-радио с компонентами SparkFun и Arduino

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

SparkFun FM Tuner Basic Breakout - Si4703 × 1
SparkFun Speaker - 0.5 Вт (8 Ом) — отличный динамик для небольшого радиопроекта × 1
Adafruit Monochrome 0.96" 128x64 OLED graphic display — компактный дисплей с высокой контрастностью × 1
Texas Instruments LM386 - Audio Amplifier - DIP-8 — популярный операционный усилитель для батарейных аудиопроектов × 1
Arduino Nano R3 × 1
Adafruit Membrane 1x4 Keypad × 2
Adafruit 4-channel I2C bi-directional logic level converter × 1
Telescopic antenna FM for F connector × 1
kenable Panel mount F type screw × 1

О проекте

В детстве я собирал радиоприемники на АМ-волнах, но никогда не получалось сделать FM-радио — это было слишком сложно. Сейчас можно купить готовый FM-тюнер на чипе, но эти чипы выполнены в поверхностном монтаже и сложны для любителя. К счастью, SparkFun выпускает плату расширения для чипа Silicon Laboratories Si4703, которая выводит все контакты. Я покажу, как построить полноценное FM-радио на этой плате и управлять тюнером через Arduino по двухпроводному интерфейсу управления. SparkFun предоставляет полную библиотеку, что упрощает программирование.

Одновременно я добавил компактный OLED-дисплей с высокой контрастностью и очень низким потреблением. И, наконец, покажу, как собрать качественный моно-аудиоусилитель из минимума деталей. Готовое радио работает от трёх АА-батареек очень долго.

SparkFun FM Tuner Basic Breakout и I2C-шина

Базовая плата расширения проста в использовании. Сначала припаяйте pin-разъем для работы с макетной платой. См. распиновку ниже. Один метр тонкого провода, припаянный к контакту ANT, служит антенной.

У Si4703 есть двухпроводной интерфейс — последовательная шина для управления тюнером от Arduino. Точнее, это шина I2C (Inter-integrated circuit), использующая две двунаправленные линии:

Дополнительно есть линия сброса (RST). В Si4703 SDA называется SDIO, а SCL — SCLK. Во всех Arduino есть встроенный I2C. На нашей шине Arduino выступает мастером, а Si4703 и OLED-дисплей — ведомыми.

Напряжения на I2C-шине и выбор Arduino

Напряжения Si4703 и OLED-дисплея на I2C-шине — 3.3 В. SparkFun в своем руководстве рекомендует использовать 3.3-вольтовый Arduino (Arduino Pro Mini), но у него нет USB-разъема, а частота 8 МГц — половина от Uno или Nano. Мои тесты показали: это слишком медленно для управления OLED-дисплеем. Я хотел сохранить дисплей, поэтому выбрал Arduino Nano (16 МГц) с 5-вольтовым уровнем сигналов на I2C и использовал двунаправленные логические преобразователи уровня (I2C-shifters) для подключения к 3.3-вольтовой шине дисплея и радиочипа. Нужно преобразовать три сигнала: SDA, SCL и RST. Пришлось использовать два преобразователя (в описании ссылка на 4-канальный — сэкономит провода).

Nano почти идентичен Uno, но в более компактном корпусе. Можно использовать и Uno — так я делал при первичных тестах. У обоих есть USB и они легко работают в Arduino IDE.

Схемы: подключение Arduino к радио и дисплею

Рассмотрим разводку вокруг Nano и детали I2C-подключений. (Если нет точки — провода просто пересекаются).

Проект питание от трёх АА-батареек (4.5 В). Батареи подключены прямо к пину 5V Arduino Nano, минуя стабилизатор. Так Nano счастливо работает от 3 АА-батареек. ВНИМАНИЕ! Всегда отключайте батареи перед подключением Nano через USB к компьютеру! Иначе 5 В от компьютера закоротятся с батареями. На этапе тестов питайте схему от USB без батареек! Для надежности используйте шесть АА-батареек (9 В) и подключите плюс к пину VIN (вместо 5V) Nano. Тогда управление питанием Nano автоматически отключит батареи при подключении USB. (Можно использовать «Крону» 9 В, но она прослужит всего пару часов).

Arduino SDA (A4) и SCL (A5) подключены к 5-вольтовой стороне I2C-преобразователя. Кроме того, используем D2 как сигнал RST. На 3.3-вольтовой стороне преобразователя подключаем SDIO, SCLK и RST Si4703. Для OLED-дисплея достаточно подключить SDA и SCL (мой дисплей с banggood.com был двухцветным: жёлтые верхние строки и синие, без пина RST).

Все компоненты подключаем к выходу 3.3 В Nano и к земле. Преобразователь уровня также требует 5 В на стороне высокого напряжения.

Пины D5–D12 подключены к двум клавиатурам. Нажатие кнопки замыкает вход на землю.

Низковольтный аудиоусилитель на LM386

Для моно-усилителя использовал чип LM386. Он существует с 70-х — усилитель мощности для низковольтных потребительских применений. Коэффициент усиления внутренне задан как 20, чтобы минимизировать внешние детали, но добавление внешнего резистора и конденсатора между пинами 1 и 8 позволяет увеличить усиление до 200. Мы работаем с минимальным усилением 20 — этого более чем достаточно для динамика 8 Ом.

Схема аудиоусилителя:

Слева — I2C-соединения с Arduino. Аудиовыходы подключаются так: резистор R4 к LOUT, R5 к ROUT. Два сигнала суммируются в MONO. На плате расширения уже есть выходные конденсаторы, добавлять не нужно. R2 и R3 образуют делитель напряжения для снижения уровня сигнала на входе усилителя. Можно заменить их на потенциометр для ручной регулировки громкости, но мы хотим цифровое управление. Уровень выхода Si4703 можно повышать по I2C ступенчато от 1 до 15. С помощью R2/R3 подбираем под усилитель экспериментально: увеличение R3 повышает громкость.

Схема взята прямо из даташита. C2 должен быть не менее 220 мкФ. Меньшие значения ослабят басы. Для усиления басов см. даташит. Собирайте на макетке, экспериментируйте с добавлением/удалением компонентов: C3 должна быть близко к чипу. C3 и C1 — опциональны.

Много видео на YouTube про LM386, многие жалуются на плохой звук. Чаще всего причина — неправильная разводка земли. В схеме видно, как входная земля отделена от выходной — это критично. Они встречаются только на пине 4 (земля чипа). Подробнее — видео JohnAudioTech (и второе — полный проект на LM386).

LM386N-1 требует минимум 4 В и выдает несколько сотен мВт. Работаю от 3 АА-батареек (4.5 В), громкость регулируется от 1 до 10 — звук отличный. При таком низком питании важно использовать динамик 8 Ом (не 4 Ом). На громкости 15 появляются искажения. Для большей громкости повысьте питание до 9 В.

Прототипирование

Настоятельно рекомендую сначала собрать весь проект на двух макетках. Arduino, I2C-преобразователь и OLED — на одной; Si4703 и аудиоусилитель — на другой, чтобы минимизировать акустические помехи. В первом прототипе Si4703 был рядом с Arduino, длинные провода к аудиочасти вызывали искажения.

Arduino питайте от USB с регулируемым выходом 3.3 В для дисплея и радиочипа. LM386 питайте от батареек (4.5–9 В).

Программный код

Необходимые библиотеки:

#include <SparkFunSi4703.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

Если не знаете, как устанавливать библиотеки — см. руководство. Библиотека SparkFun здесь, она дает высокоуровневые функции для общения с Si4703 без погружения в детали. Библиотеки Adafruit для дисплея с туториалом — здесь.

Определения:

// Кнопки управления радио
#define volDown 9
#define volUp 10
#define channelDown 11
#define channelUp 12

// Чип Si4703
#define resetPin 2
#define SDIO A4
#define SCLK A5
Si4703_Breakout radio(resetPin, SDIO, SCLK);
#define SI4703Address 0x10 // I2C-адрес Si4703

Использование #define делает код читаемее. Один раз определив volDown как пин 9, далее пишете просто volDown.

Секция setup:

int channel;
int volume;

void setup() {
  pinMode(volDown, INPUT_PULLUP);
  pinMode(volUp, INPUT_PULLUP);
  pinMode(channelUp, INPUT_PULLUP);
  pinMode(channelDown, INPUT_PULLUP);

  radio.powerOn();
  channel = 882; // 88.2 МГц
  radio.setChannel(channel);
  volume = 4;
  radio.setVolume(volume);
}

Пины 9–12 настроены как входы с внутренними pull-up резисторами. Уровень HIGH до нажатия кнопки (нажатие = LOW).

Библиотека SparkFun упрощает управление: powerOn(), setChannel(), setVolume().

Основной цикл опрашивает кнопки и действует соответственно:

void loop() {
  // Громкость вниз
  if (digitalRead(volDown) == LOW) {
    if (volume > 0) volume--;
    radio.setVolume(volume);
    UpdateDisplay();
    delay(100);
  }
  // Громкость вверх
  if (digitalRead(volUp) == LOW) {
    if (volume < 15) volume++;
    radio.setVolume(volume);
    UpdateDisplay();
    delay(100);
  }
  // Канал вниз
  if (digitalRead(channelDown) == LOW) {
    channel = radio.seekDown();
    UpdateDisplay();
    delay(100);
  }
  // Канал вверх
  if (digitalRead(channelUp) == LOW) {
    channel = radio.seekUp();
    UpdateDisplay();
    delay(100);
  }
}

Полный код ниже включает четыре кнопки для предустановленных станций и весь код обновления OLED-дисплея, который занимает почти всю доступную RAM. Про библиотеку SSD1306 — отличный туториал Adafruit. Библиотека не может определить размер экрана программно — нужно указать его после установки Adafruit_SSD1306.h. Откройте файл библиотеки, прочитайте комментарии и отредактируйте соответственно.

В коде есть «продвинутая» функция измерения уровня батареи по сравнению с внутренним 1.1-вольтовым референсом AVR. Поскольку работаем от батарей, нет стабильного 5-вольтового референса. Подробнее: Secret Arduino Voltmeter и форум Gammon.

От макетного прототипа к готовому радио

Если дошли до сюда — у вас рабочий прототип на двух макетках. Переносим схему на две платы перфборд и помещаем в корпус. Если не делали этого — не бойтесь, ошибиться невозможно, навыки приходят в процессе. Коллин из Adafruit сделал два вводных видео: Breadboards & perfboards и Perfboard prototyping.

Решил разместить Nano с I2C-преобразователями (нужны два, см. выше) на одной перфборде:

Для изготовления этой перфборды следовал руководству, рекомендую изучить внимательно: How to Prototype without using printed circuit boards. Особенно важен Шаг 3: план разводки! Планирование — ключ к успеху. Советы: я использовал черный провод 22 AWG — слишком толстый и неудобный. Возьмите тонкий «Wire Wrapping Wire» (30 AWG) разных цветов. И берите перфборд побольше! Сделал pin-разъемы и соединил части Dupont-проводами.

Si4703 и аудиоусилитель разместите вместе на второй перфборде. Маленький туториал для LM386 как вдохновение: From Schematics to Veroboard. Но советую использовать панельку для LM386! Альтернативно — видео JohnAudioTech с полным проектом LM386 и хорошей разводкой, разделяющей силовые и сигнальные земли.

Нужен корпус. Коллин показывает, как это сделать. Понравилась идея с малярным скотчем для разметки отверстий. Купил малярный скотч (не слишком липкий). Кроме скотча и дрели — термоклей. Просто клеим динамик, перфборды, батарейный отсек в корпус и соединяем Dupont-проводами. Итог:

Корпус купил немного маловатый. Квадратное отверстие для дисплея на передней панели вырезал канцелярским ножом изнутри (чтобы снаружи не было следов). Неэлегантно, но работает. Приклеил дисплей термоклеем. Разметил динамик, просверлил множество отверстий 3 мм для звука и приклеил динамик сзади.

На фото виден провод-антенна. Затем купил панельный F-разъем и телескопическую FM-антенну. Хотя антенна всего 50 см, прием отличен, а маленький динамик звучит удивительно хорошо. Самое удивительно — батареи не менял ни разу, хотя слушаю радио уже много дней.

Другие радиопроекты

Вдохновился видео Great Scott, который позже сделал красивый деревянный корпус. Ближе по деталям — Si4703 Pocket FM Radio от John Owen: он использует плату SparkFun, внимательно изучите его описание. Исходный код для моно-режима и измерения напряжения батареи взял у него.

Код

FM-radio
Репозиторий GitHub с исходным кодом для Arduino Nano:
https://github.com/Notthemarsian/FM-radio

Схемы

Fritzing diagrams FM radio
Оба оригинальных файла Fritzing и картинки/PDF:
https://github.com/Notthemarsian/FM-radio/tree/master/Fritzing%20diagrams

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

  1. Сборка высококачественного аудиоусилителя класса B в схеме Push-Pull с ОУ TL082
  2. Гистерезисный генератор на 555 — сборка классического RC-мультивибратора
  3. Схемы кристаллических и транзисторных радиоприёмников: от простых детекторов к интегрированным AM/FM приёмник…
  4. Основы радио: как генерируются и передаются электромагнитные волны
  5. Эволюция и инженерия радиотехнологии: от Маркони до наших дней
  6. Распространение радиоволн «земля-земля»: понимание влияния на беспроводные каналы
  7. UnifiedWater v1: полный набор датчиков качества воды на Arduino MKR GSM
  8. Wi‑Fi интернет-радио на Raspberry Pi и Arduino: стриминг станций со всего мира
  9. Водонепроницаемая FM-радио для душа на Arduino Nano, RDA5807, Nokia LCD и PAM8403
  10. Атомный радиосенсор определяет направление сигнала для чистой связи