Собираем управляемый arduino радиоприемник с am на св/кв и fm в укв диапазоне
Содержание
- 1 Шаг 3. Проектирование корпуса
- 2 Схема соединения
- 3 Подключение Arduino
- 4 Добавление клавиатуры
- 5 Основная схема
- 6 Схема подключения nRF24L01 к Ардуино
- 7 Шаг 4. Печатаем корпус
- 8 Программирование Si4844-A10
- 9 Программирование Arduino
- 10 Замечания по программе
- 11 Добавление дисплея
- 12 Шаг 5. Собираем всё вместе
- 13 Шаг 2. Электроника
- 14 Итоговый результат
Шаг 3. Проектирование корпуса
Поскольку мы собираемся спроектировать сложный корпус и собираемся использовать множество деталей, мы сначала должны смоделировать каждую деталь в Fusion 360. Таким образом, мы будем уверены, что каждая деталь будет идеально подходить и корпус достаточный, чтобы вместить все внутри. Ушло около недели, чтобы научиться моделировать детали в Fusion 360, а затем смоделировать всё остальное. Еще неделя ушла на разработку корпуса в Fusion 360. Скачать все файлы вы можете ниже:
Результат того стоил. Дизайн выглядит фантастически, а все детали отлично располагаются внутри корпуса. Еще одна интересная особенность, которую предлагает Fusion 360 — это возможность создавать высококачественные рендеры вашего дизайна с использованием различных материалов и видеть, как проект будет выглядеть в реальности.
Схема соединения
Подключите радиоприемник RDA5807M к Arduino UNO, как показано ниже.
Вы можете использовать одножильный провод или телевизионную/радиоантенну для данного ресивера в качестве антенны. Rout (правый аудиовыход) и Lout (левый аудиовыход) модуля RDA5807M можно подключить через гнездовой разъем аудиоразъема 3,5 мм. Для этого вы можете сделать дополнительный кабель, как я сделал на картинке ниже.
Используя макет, подключите OLED, как показано ниже, и соедините три кнопки последовательно, используя резисторы по 10 кОм. Кнопки подключены к аналоговому выводу A0 Arduino. Дисплей OLED и модуль FM-приемника используют те же SDA и SCL, что и Arduino.
Когда все оборудование подключено примерно так должно выглядеть ваше устройство:
Подключение Arduino
Еще одна вещь, которую надо решить до включения схемы для тестирования, – это взаимодействие с Arduino. Здесь я решил использовать плату Arduino Pro Mini 3В/8МГц. Это небольшая плата Arduino, полностью работающая на напряжении 3,3 В и совместимая с Si4448-A10, что является главным преимуществом. Небольшой размер платы – второе преимущество. Подключение к Si4448-A10 осуществляется по четырем линиям, как описано ниже:
Arduino (3.3 В) | Si4844-A10 |
---|---|
A5/SCL | SCLK |
A4/SDA | SDIO |
D2 | INT |
D12 | RST |
Кроме того, используется стандартный преобразователь USB/TTL для подключения Arduino к компьютеру для программирования. Таким образом, у Arduino также будут задействованы выводы TX, RX и GND. Так вы сможете программировать и тестировать Si4844-A10 «внутрисхемно», что облегчает разработку и экспериментирование. Когда всё будет завершено, это подключение может быть убрано для автономной работы нового радиоприемника. Питание платы радио и платы Arduino должно осуществляться внешним стабилизированным источником питания на 3,3 В. Не пытайтесь запитывать их от преобразователя USB/TTL, даже если у него есть выходной вывод 3,3 В – нельзя полагаться, что он обеспечит необходимый ток для питания и Arduino, и Si4844-A10.
Добавление клавиатуры
Для управления радиоприемником нам необходимо устройство ввода. Для наших целей достаточно простой мембранной клавиатуры. Их легко подключить к Arduino. Ниже приведена иллюстрация назначения выводов клавиатуры (где строки, а где столбцы), которую использовал я, вы должны убедиться, что ваша клавиатура аналогична.
Простая мембранная клавиатура
Клавиатура | Arduino |
---|---|
Строка 1 | D8 |
Строка 2 | D9 |
Строка 3 | D10 |
Строка 4 | D11 |
Столбец 1 | D13 |
Столбец 2 | D14 |
Столбец 3 | D15 |
В программном обеспечении я использовал библиотеку от Марка Стэнли и Александра Бревига, которая выпущена под лицензией GNU General Public License. Для проекта мы сопоставим функции с кнопками, как показано ниже.
Назначение кнопок для управления радиоприемником
Назначение кнопок клавиатуры:
- AM: переключить в режим AM (средние волны), диапазон 22;
- FM: переключить в режим FM (ультракороткие волны), диапазон 8;
- SW: переключить в режим SW (короткие волны), диапазон 31.
Обратите внимание, что стандартные диапазоны для изменения режима настраиваются в программе и легко могут быть изменены. Кроме того, текущие значения громкости и тона будут перенесены в новый режим
Vol+ / Vol- : Увеличить или уменьшить громкость на один шаг. Есть 64 уровня громкости. Поскольку в проекте используются колонки со встроенным усилителем, эти кнопки не сильно важны, но их наличие всё равно радует;
Band+/Band- : Изменение диапазона на один шаг, но из числа доступных в текущем режиме;
B/T+ / B/T- : Увеличить или уменьшить тон на один шаг. Я признаю, что несколько вольно использую термин «тон». Для режима FM это увеличит или уменьшит уровень низких частот от 0 (макс. бас) до 8 (макс. высокий). Для режимов AM/SW это установит канальный фильтр от 1 до 7. Фильтры составляют 1.0 кГц, 1.8 кГц, 2.0 кГц, 2.5 кГц, 2.83 кГц, 4.0 кГц и 6.0 кГц соответственно
Также обратите внимание, что для простоты и удобства программирования (т.е. лени) в режимы AM/SW могут быть добавлены уровни 0 и 8, но они не будут отличаться от уровней 1 и 7 соответственно;
Mute: Включить или выключить звук на выходе.
Основная схема
Схема радиоприемника
На рисунке 1 представлена основная схема радиоприемника, взятая и адаптированная из технического описания Silicon Labs Si4844 и рекомендаций по применению. Для приема в диапазоне КВ я использовал ферритовую антенну от старого портативного приемника. Q1 – усилитель для СВ/УКВ, здесь я так же использовал телескопическую антенну от старого приемника. Стоит заметить, что руководство по проектированию, приведенное выше, дает несколько альтернатив и различные подходы к антеннам.
Переменный резистор (VR1) является критичным элементом схемы, поскольку он будет использоваться для настройки частоты приемника (ручка настройки). Рекомендуется использовать линейный потенциометр. Для аудиовыхода я решил использовать пару «экономичных» аудиоколонок со встроенным усилителем, которые у меня остались от старого компьютера. Разумеется, можно использовать простой стереоусилитель.
Возможно, наиболее сложная часть сборки – это работа с микросхемой в корпусе SSOP-24. Если у вас нет опыта работы с SMD микросхемами, возможно, самым простым способом будет использование переходной платы. У меня была переходная плата SSOP-28; немного пайки, и с микросхемой стало можно работать, как с микросхемой в DIP корпусе. Другими потенциально трудными компонентами для работы является пара из ферритового фильтра (бусинки) и конденсатора. Эти компоненты также можно припаять на переходную плату, чтобы работать с ними как с DIL элементом.
SMD компоненты, припаянные на переходные платы
Компонент | Описание |
---|---|
B1 | Ферритовый фильтр (бусинка) 2,5 кОм (100 МГц) |
C1,C2,C5 | Неполярный конденсатор 4,7 мкФ |
C3,C4 | Конденсатор 22 пФ |
C6,C7,C9 | Конденсатор 0,1 мкФ |
C8 | Неполярный конденсатор 47 мкФ |
C10,C11 | Конденсатор 0,47 мкФ |
C12,C14 | Конденсатор 33 нФ |
C13 | Конденсатор 33 пФ |
C15 | Конденсатор 10 пФ |
IC1 | Радиоприемник Si4844-A10 |
Q1 | NPN транзистор SS9018 |
R1, R2 | Резистор 2,2 кОм |
R3 | Резистор 1 кОм |
R4,R7 | Резистор 100 кОм |
R5 | Резистор 10 Ом |
R6 | Резистор 120 кОм |
R8 | Резистор 100 Ом |
L1 | Индуктивность 270 нГн |
VR1 | Линейный потенциометр 100кОм |
Y1 | Кварцевый резонатор 32,768 кГц |
ANT1 | Ферритовая антенна |
ANT2 | Телескопическая/штыревая антенна |
Схема подключения nRF24L01 к Ардуино
Модуль работает по интерфейсу SPI, соответственно подключать модуль nRF24L01 следует к определенным портам микроконтроллера (не забывайте, что у Arduino Mega интерфейс SPI находится на других портах). Для наладки связи между двумя Ардуино, потребуется, как минимум два беспроводных радио модуля. Одну плату нужно настроить, как приемник сигнала (receiver), а вторую, как передатчик (transmitter).
Для занятия нам понадобятся следующие детали:
- плата Arduino Uno / Arduino Nano / Arduino Mega;
- радио модуль;
- провода «папа-мама».
Радиомодуль nRF24L01 datasheet на русском
После подключения беспроводных модулей к микроконтроллеру, загрузите скетч.
Скетч для проверки радио модуля nRF24L01
#include <SPI.h> // библиотека для обмена данными по протоколу SPI #include <nRF24L01.h> // библиотека для nRF24L01+ #include <RF24.h> // библиотека для радио модуля RF24 radio(9,10); // Для MEGA2560 замените на RF24 radio(9,53); const uint8_t num_channels = 128; uint8_t values; int serial_putc( char c, FILE * ) { Serial.write( c ); return c; } void printf_begin(void) { fdevopen( &serial_putc, 0 ); } void setup(void) { Serial.begin(9600); printf_begin(); radio.begin(); radio.setAutoAck(false); radio.startListening(); // включаем прием сигнала radio.printDetails(); // если правильно соединили, то увидите настройки модуля delay(10000); // задержка на 10 секунд radio.stopListening(); // выключаем прием сигнала int i = 0; // вывод заголовков всех 127 каналов while ( i < num_channels ) { printf("%x",i>>4); ++i; } printf("\n\r"); i = 0; while ( i < num_channels ) { printf("%x",i&0xf); ++i; } printf("\n\r"); } const int num_reps = 100; void loop(void) { memset(values, 0, sizeof(values)); int rep_counter = num_reps; while (rep_counter--) { int i = num_channels; while (i--) { radio.setChannel(i); radio.startListening(); // включаем прием сигнала delayMicroseconds(128); radio.stopListening(); // выключаем прием сигнала if ( radio.testCarrier() ) ++values; } } int i = 0; while ( i < num_channels ) { printf("%x", min(0xf, values & 0xf)); ++i; } printf("\n\r"); }
Пояснения к коду:
- Скетч выводит на последовательный порт информацию о модуле nRF24L01+;
- Далее выводится информация о всех частотах на которых работает модуль и информацию об их загруженности, выбирайте частоту для работы без помех;
Вывод характеристик nRF24L01+. Сканер и проверка модуля
Ардуино nRF24L01 сканирование радио частот
Если скетч успешно загрузился на Arduino NANO или UNO, но вы не видите похожую информацию на мониторе последовательного порта, то еще раз проверьте соединение платы с микроконтроллером (возможно где-то просто нет контакта). Возможно у вас модуль от другого производителя, тогда советуем вам ознакомиться с информацией на форуме: forum.amperka.ru/threads/nrf24l01-побеждаем-модуль.3205/.
nRF24L01. Сканирование радио каналов связи на помехи
Через 10 секунд после получения информации о характеристиках nRF24L01+ вы получите информацию о помехах на всех 127 каналах связи. Первые две строчки — это имена каналов, состоящие из двух символов на первой и второй строке (выделены красным квадратом). Далее идет информация о помехах. На скриншоте видно, что с 4 по 22 канал лучше не использовать для соединения устройств по радиосигналу.
Шаг 4. Печатаем корпус
Проект состоит из 7 частей. Сначала печатаем мелкие детали. Последняя — большая часть корпуса, оказалась сложной для печати. По какой-то причине сопло забивалось каждый раз, когда предпринимались попытки её распечатать. Пришлось перепробовать множество настроек, меняя скорость, отвод, высоту слоя, температуру. Ничего не получалось. Было заменено сопло на 0,5 мм. Тогда же возник вопрос — можно ли возобновить печать неисправной детали после замены забитого сопла? После поиска в Интернете обнаружилось, что это возможно.
Следующее, что нужно было сделать — удалить материал с отпечатков, отшлифовать и отполировать лаком для дерева. Также была применена деревянная шпаклевка ко всем деталям для исправления всех недостатков. После высыхания шпаклевки снова шлифуем детали и наносим лак для дерева. Использован лак для орехового дерева для темных частей и лак для дуба для светлых. Нужно дать им высохнуть на один день
Программирование Si4844-A10
По сути, Arduino посылает команды микросхеме радиоприемника по шине I2C, затем микросхема выполняет запрошенные действия и возвращает информацию о состоянии. Микросхема Si может работать в нескольких режимах, что позволяет настроить в ней точную частоту и нужные параметры. В этом проекте мы используем чип Si4844-A10 в режиме, который принимает предварительно определенные (или стандартные) диапазоны радиочастот с параметрами по умолчанию. Этот режим был выбран потому, что он легко дает доступ к базовому функционалу и при этом предлагает определенную степень настройки.
Вместо того, чтобы просто устанавливать значение «регистра» СВ/КВ/УКВ, в радиочипе может быть выбран один из 41 различных частотных диапазонов. Диапазоны 0–19 – ультракороткие волны (FM) 87–109 МГц; диапазоны 20–24 – средние волны (AM) 504–1750 кГц; диапазоны 25–40 – короткие волны 5,6–22,0 МГц (SW). Эти дипазоны различаются шириной, что может усложнить настройку. Более того, частотные диапазоны нескольких запрограммированных диапазонов равны или отличаются незначительно, но имеют различные параметры, например, предыскажения (УКВ/FM), ширина канала (СВ/AM), пороги разделения стереосигналов (УКВ/FM) и уровня принимаемого сигнала. Для полного понимания этого необходимо обратиться к техническому описанию и примечаниям к применению, где вы сможете увидеть таблицы диапазонов, а также все режимы, команды программирования и форматы ответов и статуса.
В данном проекте программное обеспечение будет обеспечивать доступ ко всем стандартным диапазонам, а также к управлению основными параметрами, включая изменение режима (AM/FM/SW), громкость, тон и отключение звука.
Программирование Arduino
Микросхема Si в этом проекте является ведомым устройство I2C, имеющим фиксированный адрес 0x11; при этом ведущим устройством (мастером) является плата Arduino. Однако скорость обмена информацией по I2C у этой микросхемы относительно медленная: максимальная поддерживаемая скорость 50 кГц. Кроме того, во время процедуры включения питания скорость не должна превышать 10 кГц. Чтобы удовлетворить эти требования, мы должны явно установить у Arduino скорость I2C, которая, как правило, слишком велика для Si4844-A10. К счастью, благодаря большому количеству документации по функциям I2C Arduino, мы можем легко выполнить необходимые изменения.
В принципе, скорость I2C для наших целей определяется в программном обеспечении Arduino двумя переменными. Эти переменные – это и . Биты 0 и 1 управляют предделителем, который работает со значением для установки скорости I2C. Скорость (тактовая частота) передачи по I2C рассчитывается по формуле:
Частота = Тактовая частота процессора / (16 + (2 * () * (предделитель))
Arduino Pro mini 3,3В работает на частоте 8 МГц. Чтобы установить скорость I2C на 10 кГц, мы используем значение 98 и установим предделитель в значение 4 (путем установки в 1 только бита 0 ). Таким образом,
8 000 000 / (16 + (2 * 98 * 4 )) = 10 000 или 10 кГц
Чтобы установить скорость I2C на 50 кГц, мы используем значение 18 и установим предделитель в значение 4 (путем установки в 1 только бита 0 ). Таким образом,
8 000 000 / (16 + (2 * 18 * 4)) = 50 000 или 50 кГц
Для более подробной информации смотрите документацию библиотеки для Arduino. Суть в том, что мы можем выполнить изменение скорости I2C всего парой строк кода, что вы можете увидеть в тестовой программе.
Еще один важный момент, связанный с программирование, заключается в том, что нам в коде нужно использовать подпрограмму внешнего прерывания. Мы используем на Arduino, и, когда Si4844-A10 установит уровень на этом выводе в 1, выполнится простая функция, которая «привязана» к этому прерыванию. Всё, что делает эта функция, это изменяет значение переменной флага, которая может быть проверена и изменена в других частях программы. Si4844-A10 будет запускать прерывания (т.е. подавать уровень логической единицы на вывод INT) при определенных условиях, в основном в случае изменения сопротивления потенциометра настройки. Так Si4844-A10 сообщает Arduino, что вы повернули ручку настройки, и что необходимо обновить данные на дисплее.
Замечания по программе
Функция определяет длину переменной в байтах, т.е. int имеет длину 2 байта, float — 4 байта и т.д.
На принимающей стороне у вас должны быть совпадающие типы данных, потому что на самом деле NRF24 посылает серию байт длиной .
Если попытаться вставить 2 байта в 1 байт в приемной стороне, то получится мусор.
При использовании массива можно отправить несколько фрагментов данных в одном сообщении при условии, что 32-байтовый предел не превышен. Вы можете отправлять данные любого типа, т.е. строки типа , целые числа (integer) или с плавающей точкой (float). Просто убедитесь, что приемник ожидает перехват одного и того же типа данных. В нашем примере, так как мы хотим использовать 3 десятичных значения, мы используем массив из 3 элементов с плавающей точкой. Максимальная длина одного сообщения — 32 байта. Таким образом, 3 элементам с плавающей запятой нужны 12 байт, что оставляет много свободного пространства.
Все контакты, кроме CE и CSN, должны быть подключены в соответствии с инструкциями. Однако, эти два контакта могут быть любыми удобными и объявлены как:
Добавление дисплея
Теперь, когда у нас есть устройство ввода, нам необходима возможность отображать настройки радиоприемника. Я не смог придумать ничего лучше, чем использовать дисплей от старых мобильных телефонов Nokia 5110/3310.
Дисплей Nokia 5110/3310
При работе с этим дисплеем необходимо учитывать два важных момента. Во-первых, существует несколько разновидностей этих дисплеев, и у них могут быть разные распиновки. Вы должны проверить распиновку на своем дисплее, убедиться, что он на самом деле работает от 3,3 В, и проверить правильность подключения к Arduino Pro Mini. Во-вторых, поскольку все входы/выходы Arduino используют напряжение 3,3 В, мне не пришлось использовать понижающие резисторы, которые вы обычно видите, когда эти дисплеи используются 5-вольтовыми платами Arduino, например, Uno.
Вывод дисплея / Назначение | Вывод Arduino или точка на схеме |
---|---|
1-RST | D3 |
2-CE | D4 |
3-DC | D5 |
4-DIN | D6 |
5-CLK | D7 |
6-VCC | Vcc (3.3v) |
7-LIGHT | GND |
8-GND | GND |
В программе я решил использовать библиотеку LCD5110_Basic, которая быстра и очень проста в использовании.
На рисунке ниже показан заполненный данными дисплей радиоприемника.
Дисплей Nokia 5110/3310 при использовании в радиоприемнике (на скриншоте некорректно показаны единицы измерения частоты mHz, в прошивке это исправлено MHz)
Начиная с левого верхнего угла, мы показываем:
- строка 1 – режим (AM/FM/SW) и номер диапазона;
- строка 2 – частотный диапазон;
- строка 3 – уровни громкости и баса/тембра;
- строка 4 – текущая частота (МГц или кГц);
- строка 1 – индикаторы стерео (только для FM) и выключения звука (если активно).
Разумеется, эта информация постоянно обновляется, чтобы показывать изменения в настройках или вводе с клавиатуры.
Шаг 5. Собираем всё вместе
Следующим шагом была задача сжатия электроники, чтобы она поместилась в корпусе. Поскольку уже были смоделированы все детали в Fusion 360, то была уверенность, что это не сложно реализовать. На фото выше и на схеме на одном из предыдущих шагов видно, что каждая деталь имеет свое специфическое положение в корпусе.
Все комплектующие нашего FM-радио Ардуино спаяны согласно схеме, которая была приложена выше. Сначала паяется Arduino Pro Mini и загружается в неё код, используя программатор FTDI. Следующий шаг — создание источника питания для схемы. Использовался аккумуляторный шилд Wemos, очень удобный, который может заряжать аккумулятор 18650 и повышать его напряжение до 5 В. Снимаем разъем аккумулятора с шилда и припаиваем провода от разъема аккумулятора 18650. Далее припаиваем переключатель к выходу 5V.
Затем паяем все остальные детали одну за другой. Это примерно на пару часов работы. На этот раз не используется аудиокабель на аудиовыходе радиомодуля FM, но вместо этого припаиваются провода внизу платы. Сигнал теперь может идти в усилитель для усиления. Также добавляем конденсатор 330 мкФ к шине питания на макетной плате. Это дополнение уменьшило шум на радиосигнале. После того, как все пайки будут сделаны, можно протестировать проект.
Последний пункт этого шага — собрать всё вместе, части корпуса и части электроники. Сначала приклеиваем решетку радиоприемника, а затем приклеиваем сетку. После клеим дисплей обычным клеем, а динамик горячим клеем. Далее горячим клеем закрепляем держатель батареи, выключатель и зарядное устройство. Затем модуль усилителя, поворотный энкодер и, наконец, макетную плату.
Шаг 2. Электроника
Прежде всего, начнем с электронике, которая является основой нашего радио Ардуино. Сейчас используется Arduino Nano, но позже мы будем использовать Arduino Pro Mini для более низкого энергопотребления. Схема всех наших соединений:
Далее, как и в любом проекте (не только радио) мы собираем все детали вместе и тестируем до того, как поместим всё в корпус.
Если мы включим проект, то увидим, что на дисплее Nokia в течение нескольких секунд отображается заставка, а затем радиостанция загружает из памяти EEPROM предыдущую радиостанцию, которую мы слушали. Мы можем изменить частоту и громкость соответственными ручками. Проект работает нормально. Теперь нужно сделать проект меньше по размеру, чтобы уместить его в корпус. Для этого мы собираемся использовать Arduino Pro Mini. Плата очень маленькая по размеру, а также предлагает более низкое энергопотребление. Мы также собираемся использовать маленькую макетную плату для пайки некоторых компонентов на ней. Но перед этим нужно разработать корпус в Fusion 360 — бесплатное, но чрезвычайно мощное программное обеспечение.
Итоговый результат
Нам очень повезло, что мы живем в эпоху, когда мы сами можем сделать все, что захотим. У нас есть инструменты и ресурсы для создания всего, что мы хотим, в течение нескольких недель и при низких затратах. Конечный результат стоит времени и усилий, которые вы вложили в него. Вы потратите много часов на этот проект, но узнаете много нового, получите драгоценный опыт и наработаете навыки и уверенность для создания еще более классных проектов.
Конечно, этот проект не идеален. Прием не очень хороший с той антенной, которая была использована. Если вы подключаете USB-кабель к порту зарядки, он действует как антенна и значительно улучшает прием. Кроме того, даже несмотря на то, что код проекта поддерживает кнопку поворотного регулятора для включения или выключения подсветки дисплея, мы не использовали эту функцию, потому что случайно приклеили поворотный регулятор так, чтобы кнопка не могла быть нажата. Конечно, есть много вещей, которые можно улучшить, но в целом проект получился очень познавательным.