Приемник для пульта дистанционного управления на Arduino и NRF24L01


В этой статье мы научимся делать приемник для пульта дистанционного управления (RC-приемник) на основе платы Arduino и модуле NRF24L01. Ранее на нашем сайте мы рассматривали создание RC-передатчика на основе платы Arduino. Теперь эти два устройства могут легко взаимодействовать, и мы можем использовать их для управления многими вещами по беспроводной связи. Мы рассмотрим как это все работает на нескольких примерах.

Приемник для пульта дистанционного управления на Arduino и NRF24L01

В первом примере мы будем использовать этот RC-приемник на Arduino  для управления простой машиной, состоящей из двух двигателей постоянного тока. Во втором примере я покажу вам, как управлять бесколлекторными двигателями (BLDC) и сервоприводами, которые являются обычными компонентами, встречающимися во многих коммерческих самолетах с дистанционным управлением, лодках, автомобилях и так далее. Если мы знаем, как ими управлять, мы можем легко модифицировать и управлять многими моделями с дистанционным управлением с помощью нашего собственного передатчика Arduino.

Примеры для радиоуправления

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

Необходимые компоненты

  1. Плата Arduino Pro Mini (купить на AliExpress).
  2. Модуль nRF24L01 + PA + LNA (купить на AliExpress).
  3. Регулятор напряжения AMS1117 3,3 В (купить на AliExpress).
  4. Штыревые разъемы «папа» + «мама».

Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158

Схема RC-приемника на Arduino

Для начала рассмотрим принципиальную схему данной системы. Радиосвязь в ней реализована на базе приемопередающих модулей NRF24L01.

Принципиальная схема приемника для пульта дистанционного управления на Arduino и NRF24L01

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

Принцип взаимодействия нашего приемника с произвольным передатчиком на основе модуля NRF24L01

Тем не менее, мозг этого RC-приемника — плата Arduino Pro Mini. Для питания мы можем использовать либо вывод VCC, к которому мы можем подключить 5 В, либо вывод RAW, к которому мы можем подключить от 6 до 12 В. Обратите внимание, что есть две версии Arduino Pro Mini, например, та, которую я использую здесь, которая работает при 5 В, а другая — при 3,3 В. С другой стороны, модуль NRF24L01 работает при 3,3 В, поэтому нам нужен регулятор напряжения. На этот раз я использую регулятор напряжения AMS1117, который выдает 3,3 В с входов, которые могут находиться в диапазоне от 5 В до 12 В.

Для связи с Arduino модуль NRF24L01 использует протокол SPI, а также два дополнительных цифровых контакта. Это означает, что у нас остается 9 цифровых контактов, которые можно использовать как выходные каналы, два из которых — контакты RX и TX. Стоит отметить, что эти контакты должны быть отключены от чего-либо, пока мы загружаем скетч на плату Arduino, поэтому я сделал возможным подключение или отключение через отдельные разъемы контактов. На самом деле, мы также можем использовать аналоговые входы как цифровые выходы, поэтому, хотя эта плата Arduino довольно мала, у нас есть много доступных выходов или каналов.

Проектирование печатной платы

Тем не менее, чтобы сохранить компактность этой схемы, я сделал собственную печатную плату с помощью бесплатного онлайн-программного обеспечения для проектирования схем EasyEDA. Здесь я разместил 8 каналов прямо рядом с шиной 5 В и заземлением, и поэтому мы можем напрямую подключать к ним сервоприводы и ECS. Канал номер 9 расположен в отдельной позиции, рядом с выводом VCC Arduino, поэтому мы можем использовать, например, ESC для питания Arduino с его функцией Battery Eliminator Circuit, которая обеспечивает 5 В. Конечно, мы могли бы использовать любые другие каналы для этой цели, поскольку вывод VCC также подключен к этим шинам 5 В.

Модель печатной платы для нашего проекта приемника в онлайн-редакторе EasyEDA

Что касается каналов номер 7 и 8, мы можем видеть здесь, как они прерываются этими штыревыми разъемами. Если мы хотим их использовать, нам просто нужно соединить два штырька вместе. Разъем программирования расположен в правом верхнем углу, а конденсатор 100 мкФ служит как для регулятора напряжения, так и для модуля NRF24L01. В левом нижнем углу печатной платы я разместил аналоговые штырьки.

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

Версии печатной платы для плат Arduino Pro Mini с различным расположением контактов

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

Файлы Gerber:

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

Сборка печатной платы

У нас качество изготовленных печатных плат оказалось отличное, и все точно такое же, как в проекте.

Изготовленная печатная плата для нашего приемника

Теперь мы можем двигаться дальше и собирать печатную плату. Сначала нам нужно припаять штыревые разъемы платы Arduino. Удобный способ сделать это — использовать макетную плату, чтобы вставить в нее штыревые разъемы, и тогда плата будет надежно закреплена во время пайки. Как я уже говорил ранее, в зависимости от вашей платы, штыревые разъемы могут немного отличаться, так что имейте это в виду при их пайке.

Припаивание штыревых разъемов на нашу печатную плату

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

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

Установка штыревых разъемов на плате

Регулятор напряжения — это компонент поверхностного монтажа, поэтому я использовал клей Blue-Tack, чтобы закрепить его на месте во время пайки. Наконец, как только мы припаяем два конденсатора, мы можем прикрепить модуль NRF24L01 к соответствующим штыревым разъемам.

Модули NRF24L01 для нашего проекта

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

Для программирования приемника или подключения Arduino Pro Mini к компьютеру можно использовать интерфейс USB-последовательный UART, который можно подключить к программному разъему.

Программирование платы Arduino Pro Mini через интерфейс UART

В меню инструментов Arduino IDE нам необходимо выбрать плату Arduino Pro или Pro Mini, выбрать нужную версию процессора, выбрать порт и выбрать метод программирования «USBasp».

Выбор метода программирования «USBasp» в Arduino IDE

Итак, теперь мы можем загружать коды в плату Arduino.

Пример 1 – Машинка с дистанционным управлением на базе Arduino

Хорошо, теперь мы можем двигаться дальше и рассмотреть первый пример.

Машинка с дистанционным управлением на базе Arduino

Это простая машина, состоящая из двух двигателей постоянного тока напряжением 12 В. На этот раз мы будем использовать наш новый RC приемник на Arduino для управления ей. Для управления двигателями постоянного тока мы используем драйвер двигателя L298N, а для питания мы используем 3 литий-ионных аккумулятора, которые обеспечивают около 12 В.

Схема машины с дистанционным управлением на базе Arduino

Необходимые для этого примера компоненты:

  • Драйвер L298N
  • 12 В двигатель постоянного тока с высоким крутящим моментом
  • Двигатель постоянного тока с пластиковой шиной колеса
  • Макетная плата и соединительные провода

Итак, соединения действительно просты, 12 В, поступающие от батарей, идут на контакт 12 В на нашем приемнике, а шесть контрольных контактов драйвера идут на 6 каналов. Здесь мы должны отметить, что для того, чтобы иметь возможность управлять скоростью двигателей, нам нужно подать сигнал ШИМ на контакты Enable A и Enable B драйвера. В нашем приемнике каналы номер 2, 3, 6 и 9 могут выводить сигналы ШИМ, поэтому в этом случае я подключил контакты Enable драйвера к каналам номер 2 и 6.

Давайте теперь посмотрим на код Arduino.

Описание работы кода: Итак, сначала нам нужно включить SPI и библиотеку RF24, определить несколько пинов, радиообъект и структуру данных, где мы будем хранить входящие данные от передатчика. В разделе настройки нам нужно определить выводы пинов и инициализировать радиосвязь. Для получения более подробной информации о том, как это работает и что делает каждая из этих линий, вы можете ознакомиться с моим подробным руководством по NRF24L01.

В разделе цикла мы постоянно проверяем, получаем ли мы данные, и если да, то считываем эти входящие данные. Если мы быстро взглянем на код передатчика, то увидим, какие данные он отправляет приемнику. Он считывает данные со всех своих контроллеров, джойстиков, потенциометров и кнопок, и отправляет эти данные как единый пакет приемнику.

Итак, как только мы прочитаем эти данные, мы можем делать с ними все, что захотим. В этом случае мы будем использовать значение оси Y джойстика 1 для управления дроссельной заслонкой и значение оси X для управления рулевым управлением. Я поместил эти данные в отдельные переменные дроссельной заслонки и рулевого управления. Значения, которые мы получаем от джойстиков, находятся в диапазоне от 0 до 255. Таким образом, если мы опустим джойстик вниз, мы соответствующим образом установим управляющие контакты водителя, чтобы автомобиль двигался назад, и будем использовать значение дроссельной заслонки для управления скоростью движения. Тот же принцип применим для движения вперед, влево и вправо. Внизу кода мы можем отметить пользовательскую функцию resetData(), которая сбрасывает все значения до их начальных значений по умолчанию, поэтому в случае потери радиосвязи машина замедлит движение.

Пример 2 – Управление сервоприводами и бесколлекторными двигателями

Хорошо, теперь мы можем перейти ко второму примеру — управлению сервоприводами и бесколлекторными двигателями с помощью этого радиоуправляемого приемника на Arduino.

Управление сервоприводами и бесколлекторными двигателями с помощью радиоуправляемого приемника на Arduino

Для управления бесколлекторными (BLDC) двигателями нам нужен ESC, или электронный контроллер скорости. Arduino взаимодействует с ESC с помощью всего одного контакта. Для управления ESC Arduino посылает определенный сигнал ШИМ на ESC, и с его помощью ESC управляет скоростью двигателя. ESC с тем же подключением обеспечивает 5 В через свою функцию схемы выпрямителя батареи, поэтому мы можем питать наш приемник с его помощью.

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

Схема для управления сервоприводами и бесколлекторными двигателями с помощью радиоуправляемого приемника на Arduino

Необходимые для этого примера компоненты можно получить по ссылкам ниже:

Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158

Входные сигналы для управления как сервоприводами, так и бесколлекторными двигателями с использованием ESC практически одинаковы. Они используют специальный сигнал ШИМ 50 Гц, который можно легко сгенерировать с помощью библиотеки Arduino Servo.

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

С другой стороны, в примере я использовал два других сервопривода MG996R, которые не сожгли Arduino, я полагаю, потому что они не вызывали таких высоких скачков. Также я использовал этот пример с 4 меньшими сервоприводами S90, и у него не было никаких проблем.

Итак, после получения данных от передатчика, мы преобразуем значения от 0 до 255 в значения от 0 до 180 для управления сервоприводами с помощью функции write(). Аналогичным образом мы преобразуем данные для управления ESC в значения от 1000 до 2000. В этом примере мы управляем этим ESC из средней точки джойстика номер 1, в верхнее положение, поэтому мы преобразуем значения из середины, 127 до 255, в значения от 1000 до 2000. С помощью функции Servo Library writeMicroseconds() мы отправляем сигнал ШИМ на ESC и таким образом можем управлять скоростью бесщеточного двигателя от минимума до максимума.

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

Пример 3 – Управление моделью радиоуправляемой машины

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

Управление моделью радиоуправляемой машины

Однако, поскольку это дешевая RC-машинка, управление цифровое, или включено или выключено, до максимального положения влево и вправо и максимальной скорости. Независимо от этого, я разобрал машинку, чтобы посмотреть, что внутри и как я могу реализовать RC-приемник Arduino для управления ею.

Радиоуправляемая машина в разобранном виде

Как только я раскрыл электронные компоненты, я заметил, что два двигателя на самом деле являются простыми двигателями постоянного тока, работающими от 5 В. Даже передний двигатель, который управляет ограниченными движениями рулевого управления, является простым двигателем постоянного тока непрерывного вращения.

Итак, судя по всему, мы уже знаем, как управлять двигателями постоянного тока, поэтому заменить эту плату на наш самодельный приемник Arduino будет довольно просто. В дополнение к нашему приемнику нам просто нужен драйвер двигателя, способный управлять двумя двигателями одновременно. Для этой цели есть множество вариантов, даже тот, который мы использовали в первом примере, драйвер L298N.

Драйвер L298N для управления двигателями в нашем случае

Однако он слишком большой для этого приложения, поэтому я выбрал драйвер двигателя MX1508. Это простой драйвер двух двигателей постоянного тока с управлением по схеме H-bridge и ШИМ. Он имеет 4 управляющих входных контакта, 4 контакта для двигателей и 2 контакта для питания.

Принцип управления двумя двигателями с помощью драйвера MX1508

Я отпаял соединения моторов от платы RC-машины и припаял их к драйверу. С обратной стороны я припаял контакты питания, и теперь осталось подключить этот драйвер к приемнику. Питание для этой RC-машины поступает от Ni-Cd аккумулятора 4,8 В, расположенного в нижней части машины.

Установка драйвера двигателя MX1508 внутрь радиоуправляемой машины

Итак, используя соединительные провода, я подключил эти контакты к контакту VCC Arduino, а также подключил 4 входных контакта управления драйвера к 4 цифровым каналам. Как я уже сказал, этот драйвер поддерживает управление ШИМ, поэтому для двигателя B, или заднего двигателя, я использовал каналы ШИМ номер 2 и 3.

Схема для управления радиоуправляемой машинкой с помощью нашего RC приемника

Код для этой радиоуправляемой машины очень похож на первый пример.

Мы используем данные, поступающие от джойстиков, для управления дроссельной заслонкой и рулевым управлением радиоуправляемой машины. Для движения назад мы используем функцию analogWrite(), чтобы отправить сигнал ШИМ водителю на вывод Input3, в то время как вывод input4 удерживаем на низком уровне. Для движения вперед мы делаем это наоборот. Если джойстик остается посередине, мы даем команду водителю затормозить или остановить двигатели. Тот же принцип используется для рулевого двигателя, хотя здесь нам не нужно использовать функцию analogWrite(), так как нам не нужно контролировать скорость этого двигателя.

После загрузки этого скетча в Arduino мне пришлось пересобрать радиоуправляемую машинку. Я поместил маленький драйвер во внутренний корпус и закрепил остальные детали винтами. Я снова соединил приемник с драйвером и поместил его под внешний корпус машинки, в котором было достаточно места для приемника.

Установка наших электронных компонентов внутрь корпуса машины

Итак, мы не только модифицировали эту RC-машину для управления с помощью нашего DIY RC-передатчика, но и улучшили ее, добавив управление PWM, так что теперь мы также можем контролировать скорость машины. В случае, если RC-модель, которую вы хотите модифицировать, имеет сервоприводы и бесщеточные двигатели вместо двигателей постоянного тока, вы можете следовать методу, описанному во втором примере.

Видео, демонстрирующее работу проекта

Источник статьи

(Проголосуй первым!)
Загрузка...
143 просмотров

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *