Андрей Смирнов
Время чтения: ~17 мин.
Просмотров: 0

Создаем fm-радио на основе платы arduino pro mini

Программирование 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, что вы повернули ручку настройки, и что необходимо обновить данные на дисплее.

Ардуино код для Мастера

Код для нашего ведущего Ардуино (т.е. мастера):

Разбираем код Мастера

QNH — авиационный термин. Это один из факторов коррекции, который при применении к альтиметру позволит ему точно считывать высоту над уровнем моря в текущем местоположении.

Варьируется ото дня ко дню и даже от часа к часу. Пилоты должны устанавливать этот коэффициент каждый раз при полете для калибровки своих альтиметров. Если пилоты не могут этого добиться, например, во время полета над океаном, они все используют 1013, то все их высотомеры считывают используя один и тот же эталон. Это позволяет им летать на разных высотах, чтобы избежать столкновения. Его можно получить на погодных сайтах.

Например, вот для Кейптауна — см. ссылку.

Вам не обязательно это делать. Но без скорректированного значения высоты в вашем местоположении, оно будет неверным (так как вы должны учитывать местные изменения атмосферного давления) и может даже отображаться отрицательным. Фактическое давление и температура все равно будут верны.

Запускает один из 125 каналов. Передатчик и приемник должны иметь один и тот же адрес.

Устанавливает уровень мощности передатчика. Высокий уровень может вызвать проблемы с нестабильностью, если питание 3,3 В осуществляется по длинным проводам. Лучше всего вставить через него конденсатор 100 мкФ, но для более долгого срока службы батареи лучше использовать низкочастотный конденсатор.

Говорит модулю вести себя как передатчик и наоборот:

говорит ему вести себя как приемник.

Передаваемые данные выводятся локально на последовательный монитор (если он подключен), а также передаются на приемник.

Строки:

посылают символ степени на последовательный монитор (для некоторых ПК это может отличаться).

Если вы используете ЖК-дисплей, вы можете сделать это с помощью:

Наконец, передает содержимое массива данных

Обратите внимание, что ему необходимо знать, сколько байт отправить и получит это

Актуальность вопроса

Скетч Arduino для радиочастотного приемника 433 МГц

Подключите приемник Arduino к компьютеру и загрузите следующий код:

// Подключаем библиотеку RadioHead Amplitude Shift Keying
#include <RH_ASK.h>
// Подключаем библиотеку SPI Library 
#include <SPI.h> 
 
// Создаем объект управления смещением амплитуды
RH_ASK rf_driver;

void setup()
{
    // Инициализируем объект ASK
    rf_driver.init();
    // Настройка Serial Monitor
    Serial.begin(9600);
}
 
void loop()
{
    // Установить размер буфера ожидаемого сообщения
    uint8_t buf;
    uint8_t buflen = sizeof(buf);
    // Проверка правильности размера полученного пакета
    if (rf_driver.recv(buf, &buflen))
    {
      
      // Сообщение получено с правильной контрольной суммой
      Serial.print("Message Received: ");
      Serial.println((char*)buf);         
    }
}

Как и код передатчика, код приемника начинается с подключения библиотек RadioHead и SPI и создания объекта ASK.

#include <RH_ASK.h>
#include <SPI.h> 
RH_ASK rf_driver;

В setap() мы инициализируем объект ASK, а также настраиваем последовательный монитор, так как мы будем просматривать наше полученное сообщение.

rf_driver.init();
Serial.begin(9600);

В функции loop() мы создаем буфер размером передаваемого сообщения. В нашем случае это 11, помните? Вам нужно будет настроить это, чтобы соответствовать длине вашего сообщения. Обязательно укажите все пробелы и знаки препинания, поскольку все они считаются символами.

uint8_t buf;
uint8_t buflen = sizeof(buf);

Далее мы вызываем функцию recv(). Это включает приемник, если он еще не включен. Если доступно сообщение, оно копирует сообщение в свой первый буфер параметров и возвращает true, иначе возвращает false. Если функция возвращает true, код вводит оператор if и печатает полученное сообщение на мониторе последовательного порта.

if (rf_driver.recv(buf, &buflen))
{
  Serial.print("Message Received: ");
  Serial.println((char*)buf);         
}

Затем мы возвращаемся к началу цикла и делаем все заново.

После загрузки скетча откройте серийный монитор. Если все в порядке, вы должны увидеть ваше сообщение.

Цели первого шага модели

Шаг 2. Электроника

Прежде всего, начнем с электронике, которая является основой нашего радио Ардуино. Сейчас используется Arduino Nano, но позже мы будем использовать Arduino Pro Mini для более низкого энергопотребления. Схема всех наших соединений:

Вакансии

Программирование аппаратно-программных средств arduino, разработка чертежей в SolidWorks.

Далее, как и в любом проекте (не только радио) мы собираем все детали вместе и тестируем до того, как поместим всё в корпус.

Если мы включим проект, то увидим, что на дисплее Nokia в течение нескольких секунд отображается заставка, а затем радиостанция загружает из памяти EEPROM предыдущую радиостанцию, которую мы слушали. Мы можем изменить частоту и громкость соответственными ручками. Проект работает нормально. Теперь нужно сделать проект меньше по размеру, чтобы уместить его в корпус. Для этого мы собираемся использовать Arduino Pro Mini. Плата очень маленькая по размеру, а также предлагает более низкое энергопотребление. Мы также собираемся использовать маленькую макетную плату для пайки некоторых компонентов на ней. Но перед этим нужно разработать корпус в Fusion 360 — бесплатное, но чрезвычайно мощное программное обеспечение.

Распиновка передатчика и приемника 433 МГц

Давайте посмотрим на распиновку модулей передатчика и приемника RF 433 МГц.

DATA — принимает цифровые данные для передачи.

VCC — обеспечивает питание передатчика. Это может быть любое положительное постоянное напряжение от 3,5 до 12 В. Обратите внимание, что РЧ-выход пропорционален напряжению питания, т.е. чем выше напряжение, тем больше будет дальность.

GND — минус питания.

Антенна — это разъем для внешней антенны. Как обсуждалось ранее, вам понадобится припаять кусок  проволоки длинной 17,3 см к этому контакту для улучшения дальности.

  • DATA — выводит полученные цифровые данные. Два центральных штифта внутренне связаны между собой, поэтому вы можете использовать любой из них для вывода данных.
  • VCC — обеспечивает питание приемника. В отличие от передатчика, напряжение питания для приемника должно быть 5 В.
  • GND — минус питания.
  • Антенна — это разъем для внешней антенны, который часто не обозначен. Это накладка в левом нижнем углу модуля, рядом с маленькой катушкой. Опять же, можно припаять кусок провода  длинной 17,3 см к этому контакту для улучшения дальности.

Добавление дисплея

Теперь, когда у нас есть устройство ввода, нам необходима возможность отображать настройки радиоприемника. Я не смог придумать ничего лучше, чем использовать дисплей от старых мобильных телефонов Nokia 5110/3310.

Дисплей Nokia 5110/3310

При работе с этим дисплеем необходимо учитывать два важных момента. Во-первых, существует несколько разновидностей этих дисплеев, и у них могут быть разные распиновки. Вы должны проверить распиновку на своем дисплее, убедиться, что он на самом деле работает от 3,3 В, и проверить правильность подключения к Arduino Pro Mini. Во-вторых, поскольку все входы/выходы Arduino используют напряжение 3,3 В, мне не пришлось использовать понижающие резисторы, которые вы обычно видите, когда эти дисплеи используются 5-вольтовыми платами Arduino, например, Uno.

Подключение дисплея Nokia 5110/3310 к Arduino
Вывод дисплея / Назначение Вывод 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) и выключения звука (если активно).

Разумеется, эта информация постоянно обновляется, чтобы показывать изменения в настройках или вводе с клавиатуры.

Шаг 4. Печатаем корпус

Проект состоит из 7 частей. Сначала печатаем мелкие детали. Последняя — большая часть корпуса, оказалась сложной для печати. По какой-то причине сопло забивалось каждый раз, когда предпринимались попытки её распечатать. Пришлось перепробовать множество настроек, меняя скорость, отвод, высоту слоя, температуру. Ничего не получалось. Было заменено сопло на 0,5 мм. Тогда же возник вопрос — можно ли возобновить печать неисправной детали после замены забитого сопла? После поиска в Интернете обнаружилось, что это возможно.

Следующее, что нужно было сделать — удалить материал с отпечатков, отшлифовать и отполировать лаком для дерева. Также была применена деревянная шпаклевка ко всем деталям для исправления всех недостатков. После высыхания шпаклевки снова шлифуем детали и наносим лак для дерева. Использован лак для орехового дерева для темных частей и лак для дуба для светлых. Нужно дать им высохнуть на один день

Характеристики nRF24L01 Arduino

nRF24L01 один из самых популярных беспроводных модулей для интернета вещей (IoT). Модули стоят недорого, но на их основе можно организовать многоканальную защищенную связь между контроллерами Ардуино и устройствами. Один модуль способен поддерживать связь сразу с шестью приемниками или передатчиками, т.е. можно объединить сразу семь устройств в общую радиосеть на частоте 2,4 ГГц.

Выполнить передачу данных между Arduino по радиоканалу будет намного проще, если у вас плата подключена к отдельному компьютеру или ноутбуку. Тогда сделать отладку скетча будет намного проще и быстрее. До передачи данных по радиоканалу через nRF24L01+, лучше всего проверить каждый модуль скетчем для сканирования — тогда вы будете уверены в правильности подключения и работоспособности модулей.

Характеристики и описание радио модуля nRF24L01+ мы рассматривали уже ранее. Если сканирование модуля и радио частот прошло успешно, то проблем со связью между двумя Ардуино по радиоканалу у вас не будет. Для начала мы будем передавать данные с датчика уровня воды (протечки воды), но можно использовать и любой другой аналоговый датчик, например датчик температуры на основе LM35.

IR технология

Самый дешевый способ для удаленного управления устройством в видимой доступности с помощью инфракрасного излучения. Почти всей аудио и видео техникой можно управлять таким образом. Благодаря широкому распространению необходимые компоненты довольно дешевы, что делает эту технологию идеальной для нас, любителей использовать ИК-пульта для наших собственных проектов.

Инфракрасное излучение на самом деле нормальный свет с определенным цветом. Мы, люди, не можем видеть этот цвет, потому что его длина волны 950 нм, что ниже видимого спектра. Это одна из причин, почему ИК выбран для нужд телемеханики, мы хотим использовать его, но мы не заинтересованы его видеть. Хотя мы не можем видеть инфракрасный свет, излучаемый от пульта дистанционного управления, но это не означает, что мы не можем сделать его видимым.

Видеокамера или цифровой фотоаппарат «видит» инфракрасный свет, как вы можете видеть на видео ниже. Даже самые дешевые сотовые телефоны имеют встроенные камеры. Просто наведите пульт на такую ??камеру, нажмите любую кнопку, и вы увидите светодиодные мерцания.

RF контролируемая схема самолета

На фиг.1 показана принципиальная схема стороны передатчика самолета, управляемого РЧ, а на фиг.2 показана принципиальная схема стороны приемника. Цепи построены вокруг Arduino Uno (board1 и board2), пары радиочастотных модулей 433 МГц (TX1 и RX1), модуля ESC (электронного регулятора скорости), трех серводвигателей (M1-M3), двигателя BLDC (M4) и несколько других компонентов.

Сторона передатчика приводится в действие батареей 9 В PP3, а сторона приемника – батареей 11,1 В LiPo, которая используется для питания бесщеточного двигателя постоянного тока (двигателя BLDC) через модуль ESC.

Плата Arduino1 получает питание от батареи 9 В PP3, а плата Arduino 2 – от батареи 11,1 В на соответствующие входные контакты Vin.

На стороне передатчика находятся четыре потенциометра, которые используются для передачи различных сигналов управления на сторону приемника через радиочастотные модули. Управляющие сигналы, принимаемые приемником, обрабатываются микроконтроллером в Arduino, который, в свою очередь, управляет двигателем BLDC, серводвигателями руля направления, элероном и лифтом самолета.

Arduino Uno доска

Arduino – это платформа для создания прототипов электроники с открытым исходным кодом, основанная на гибком, простом в использовании аппаратном и программном обеспечении. Он предназначен для художников, дизайнеров, любителей и всех, кто заинтересован в создании интерактивных объектов или сред.

Рис. 2: Схема самолета, управляемого РЧ (сторона приемника)Рис. 3: РЧ-модули 433 МГцРис. 4: Бесщеточный двигатель постоянного тока

Arduino Uno – плата на базе микроконтроллера ATmega328. Он состоит из 14 выводов цифрового ввода / вывода, шести аналоговых входов, USB-соединения для программирования встроенного микроконтроллера, разъема питания, разъема ICSP и кнопки сброса.

Он работает с кварцевым генератором 16 МГц и содержит все необходимое для поддержки микроконтроллера. Он очень прост в использовании, поскольку пользователю просто нужно подключить его к компьютеру с помощью USB-кабеля или подключить к нему с помощью адаптера переменного тока в постоянный или батареи, чтобы начать работу. Микроконтроллер на плате программируется с использованием языка программирования Arduino и среды разработки Arduino.

РЧ-модули 433 МГц

Это недорогие радиостанции, работающие на частоте 433 МГц (см. Рис. 3). Эти радиостанции доступны в отдельном передатчике и приемнике или в одной модели приемопередатчика. Рабочее напряжение для передатчика составляет от 1,5 до 12 В, а для приемника от 3 до 5 В. Дальность передачи составляет от 30 до 150 м, в зависимости от напряжения питания и типа используемого модуля.

Сторона передатчика

Контакт 12 платы 1 соединен с контактом данных 2 радиочастотного передатчика (TX1). Выводы от A0 до A3 платы 1 соединены с четырьмя 10k предустановками (от VR1 до VR4). VR1, VR2, VR3 и VR4 используются для управления BLDC (см. Рис. 4), рулем направления, элероном и лифтом соответственно.

Рис. 5: модуль ESCРис. 6: Детали самолета RC (любезно предоставлено: dduino.blogspot.in)

Сторона получателя

Контакт 11 платы 2 соединен с контактами данных (6 и 7) радиочастотного приемника (RX1). Контакты 12, 10, 8 и 9 платы соединены с сигнальным контактом серводвигателей M1 (руль высоты), M2 (руль направления), M3 (элерон) и модуля ESC (см. Рис. 5) соответственно. Некоторые из основных частей тела типичного самолета RC показаны на рисунке 6.

Мотор BLDC используется в качестве пропеллерной системы самолета. Пропеллер или воздушный винт преобразуют вращательное движение от двигателя для обеспечения движущей силы. Это самая важная часть самолета. Пропеллер установлен на лицевой стороне самолета.

Руль используется для управления самолетом, который движется через воздушную среду, контролируя направление, в котором направлен самолет. Это плоская плоскость или лист материала, прикрепленный шарнирами к корме, хвосту или после конца корабля.

Элерон представляет собой шарнирную поверхность управления полетом, обычно прикрепленную к задней кромке каждого крыла самолета. Элероны используются попарно для управления самолетом по крену или движением вокруг продольной оси самолета.

Лифты – это поверхности управления полетом, обычно сзади самолета, которые контролируют продольную высоту самолета. Положение лифта контролирует, направлен ли нос самолета вверх или вниз и, таким образом, движется вверх или вниз. Лифты обычно крепятся на петлях к неподвижной или регулируемой задней поверхности.

Входной провод питания ESC соединен с аккумулятором 11,1 В. Три выходных провода ESC соединены с трехфазными входами двигателя BLDC (M4).

Программирование режима работы радиореле.

У китайцев да и на других сайтах по этому поводу какая-то муть написана. Пока методом тыка не догадаешься нифига не запрограммируешь по такой инструкции.

На самом деле все просто:

Нажимаем на кнопочку и удерживаем на плате радиореле (там она одна), пока светодиод на плате не начнет мигать.

Затем уже нажимаем кнопку на радиокнопке (радиопульте). Причем нажимаем ее быстро и столько раз в зависимости какой хотим установить режим работы радиореле.

Работа BMP280

BMP280 поставляется в различных типах в зависимости от того, где вы его покупаете. Имейте в виду, так как некоторые из них являются устройствами с 5 В, а некоторые — с 3.3 В. Кроме того, некоторые — SPI или I2C, а некоторые — нет. В этой статье будет использована версия I2C 3.3 В. Эта, хотя и 3 В, соответствует 5 В на выводах данных. Мы используем I2C версию, так как NRF24L01 использует шину SPI.

BMP280

Диапазон давления составляет от 300 до 1100 гПа, что примерно на 500 м ниже уровня моря до 9 км в высоту и между 950 и 1050 гПа, а точность высоты +/-1 м, что довольно неплохо. Диапазон температур составляет от 40 до 85 °C с точностью +/-1 °C и 0,5 при 25.

На некоторых устройствах адрес I2C установлен на 0x77, а на других — на 0x76. На официальном сайте Arduino есть полезный сканер адресов по этой ссылке. Если он не найдет адрес, проверьте проводку.

Шаг 5. Собираем всё вместе

Следующим шагом была задача сжатия электроники, чтобы она поместилась в корпусе. Поскольку уже были смоделированы все детали в Fusion 360, то была уверенность, что это не сложно реализовать. На фото выше и на схеме на одном из предыдущих шагов видно, что каждая деталь имеет свое специфическое положение в корпусе.

Все комплектующие нашего FM-радио Ардуино спаяны согласно схеме, которая была приложена выше. Сначала паяется Arduino Pro Mini и загружается в неё код, используя программатор FTDI. Следующий шаг — создание источника питания для схемы. Использовался аккумуляторный шилд Wemos, очень удобный, который может заряжать аккумулятор 18650 и повышать его напряжение до 5 В. Снимаем разъем аккумулятора с шилда и припаиваем провода от разъема аккумулятора 18650. Далее припаиваем переключатель к выходу 5V.

Затем паяем все остальные детали одну за другой. Это примерно на пару часов работы. На этот раз не используется аудиокабель на аудиовыходе радиомодуля FM, но вместо этого припаиваются провода внизу платы. Сигнал теперь может идти в усилитель для усиления. Также добавляем конденсатор 330 мкФ к шине питания на макетной плате. Это дополнение уменьшило шум на радиосигнале. После того, как все пайки будут сделаны, можно протестировать проект.

Последний пункт этого шага — собрать всё вместе, части корпуса и части электроники. Сначала приклеиваем решетку радиоприемника, а затем приклеиваем сетку. После клеим дисплей обычным клеем, а динамик горячим клеем. Далее горячим клеем закрепляем держатель батареи, выключатель и зарядное устройство. Затем модуль усилителя, поворотный энкодер и, наконец, макетную плату.

Датчик атмосферного давления bmp280

Датчик BMP280 был разработан также фирмой Bosh как более продвинутая модель своего предшественника BMP180. Данная модификация, в отличие от bmp180, может работать по двум интерфейсам (SPI и I2C), а также 3 режима работы:

  1. NORMAL – в данном режиме модуль просыпается с определённой периодичностью, выполняет необходимые измерения и снова засыпает. Частота измерений задаётся программным путём, а результат считывается при необходимости;
  2. SLEEP – режим максимально пониженного энергопотребления;
  3. FORCED – этот режим позволяет будить модуль подачей внешнего управляющего сигнала. После выполнения измерений, модуль автоматически переходит в режим пониженного энергопотребления.

Помимо способности измерять показания атмосферного давления,BMP280 может также определять температуру окружающей среды, что является очень хорошим бонусом.

Все производимые вычисления могут быть отфильтрованы настраиваемым программным фильтром. На рисунке показан внешний вид модуля bmp280  его электрическая схема и распиновка выводов.

Характеристики датчика bmp280

Модель bmp280 обладает такими техническими характеристиками:

  1. Размер 2 х 2,5 х 0,95 мм;
  2. Уровень давления 300-1100 гПа;
  3. Температурный диапазон от 0 до 65 С;
  4. Поддерживает интерфейс I2C и SPI;
  5. Аккумулятор 1,7 В – 3,6 В;
  6. Потребляемый ток 2,7 мкА

Схема подключения датчика BMP280 к плате Arduino по протоколу SPI

Для работы с датчиком нужна специальная библиотека. В нашем случае это библиотека Adafruit_BMP280  которая специально заточена для работы с датчиком BMP280.

В библиотеке есть методы которые дают возможность пользователю выбрать способ подключения, а также настроить период и точность измерений при том или ином режиме работы.

Для того чтобы начать работу с BMP280 нужно скачать и установить библиотеку Adafruit_BMP280 , подключить сам заголовочный файл Adafruit_BMP280.h, а также ещё два файла Wire.h и SPI.h, которые нужны для доступа к необходимым интерфейсам.

Программа для работы с датчиком BMP280

В этом примере следует обратить внимание на число 1013.25 в функции bmp.readAltitude(). Это значение давления над уровнем моря конкретной местности, где располагается в данный момент модуль

Значение можно узнать в интернете.

Рейтинг автора
5
Материал подготовил
Максим Иванов
Наш эксперт
Написано статей
129
Ссылка на основную публикацию
Похожие публикации