Создание многофункционального Arduino RC-передатчика: пошаговое руководство DIY
В этом уроке мы научимся строить DIY Arduino RC-передатчик. Мне часто требуется беспроводное управление для моих проектов, поэтому я создал этот многофункциональный радиоконтроллер, который можно использовать практически для всего. Вы можете посмотреть следующее видео или прочитать письменный урок ниже. Теперь я могу беспроводно управлять любым Arduino-проектом с небольшими изменениями на стороне приёмника. Этот передатчик также можно использовать как любой коммерческий RC-передатчик для управления RC-игрушками, машинками, дронами и т.д. Для этого нужен простой Arduino-приёмник, который генерирует соответствующие сигналы для управления этими устройствами. Я объясню, как всё работает, на примерах управления Arduino-роботом-машиной, Arduino-муравьиным роботом из предыдущего видео и управлении бесколлекторным двигателем через ESC и сервоприводами. Радиосвязь этого контроллера основана на трансивере NRF24L01, который с усилительным антенным обеспечивает стабильную дальность до 700 метров в открытом пространстве. Контроллер имеет 14 каналов: 6 аналоговых входов и 8 цифровых. На борту: два джойстика, два потенциометра, два тумблера, шесть кнопок и внутренний измерительный блок (акселерометр и гироскоп MPU6050), который позволяет управлять устройствами наклоном контроллера. Начнём со схемы. Мозгом контроллера является Arduino Pro Mini, питаемый от двух LiPo-батарей (около 7,4 В). Их можно подключить напрямую к пину RAW, где встроенный стабилизатор снижает напряжение до 5 В. Существует две версии Pro Mini: 5 В и 3,3 В. Модуль NRF24L01 строго требует 3,3 В от выделенного источника. Поэтому используется стабилизатор 3,3 В (HT7333 или AMS1117), преобразующий 7,4 В в 3,3 В. Рядом с модулем ставится развязывающий конденсатор для стабильности питания и радиосвязи. NRF24L01 общается с Arduino по SPI, а MPU6050 — по I2C. Все аналоговые и цифровые пины Pro Mini задействованы, поэтому пайка перемычками была бы хаотичной. Я спроектировал собственную PCB в EasyEDA с учётом эргономики: плата удобно держать двумя руками, все органы управления под пальцами. Края скруглены, есть отверстия 3 мм для крепления. Пины программирования выведены на верхнюю сторону. Пины RX/TX используются для кнопок джойстиков, но их нужно отключать при прошивке — для этого предусмотрены джамперы. Важно: Убедитесь, что версия Arduino Pro Mini соответствует PCB или адаптируйте дизайн. На фото сравнение трёх версий плат. Ссылка на файлы проекта PCB (три версии в отдельных вкладках). После завершения дизайна сгенерировал Gerber-файлы и заказал платы у JLCPCB (спонсор видео). Выбрал чёрный цвет маски. Качество отличное, всё соответствует проекту. Начинаем с пайки pin-распайок Arduino Pro Mini. Удобно вставить их в макетную плату для фиксации. У моей версии по 5 пинов с каждой стороны, один GND оставлен свободным для трассировок. Pro Mini припаян напрямую, излишки ножек обрезаны. Рядом ставится MPU6050. Пайка стабилизатора 3,3 В с конденсатором и конденсатора у NRF24L01. Модуль NRF24L01 бывает трёх версий — подойдёт любая. Далее: пины программирования, RX/TX, питание, выключатель. Потенциометры требовали удлинения ножек pin-распайками. Ручки потенциометров подстрижены для установки колпачков. Потенциометры припаяны позже, при сборке корпуса. Установлены тумблеры и джойстики. Кнопки также удлинены pin-распайками. Хотел оставить PCB видимой — выбрал прозрачный акрил 4 мм (под защитной плёнкой синеватый). Корпус — две пластины по форме PCB, крепящиеся сверху и снизу. Вырезал металлической пилой, довёл напильником. Отверстия 3 мм для крепления с засечками под болты. Для тумблеров и потенциометров — сверло 6 мм, для джойстиков — фрезёр 25 мм. Сборка: снимаем плёнку, крепим потенциометры на верхнюю пластину, вставляем болты с дистанционными кольцами 11 мм, соединяем с PCB, допаиваем потенциометры. На нижнюю пластину крепим держатель батареи, затягиваем четыре болта. Подключаем батарею, надеваем колпачки, ручки джойстиков, антенну. Готово! Для прошивки Pro Mini нужен USB-UART адаптер, подключаемый к разъёму программирования сверху. В Arduino IDE: Tools → Board: Arduino Pro or Pro Mini, правильный процессор, порт, Programmer: USBasp. Подключаем библиотеки SPI, RF24 (радио) и Wire (I2C для MPU6050). Определяем цифровые входы, переменные, объект radio и адрес связи. Структура данных (макс. 32 байта — лимит буфера NRF24L01): В setup() инициализируем MPU6050, настраиваем акселерометр (±8g) и гироскоп (1000 dps). Можно вызвать calculate_IMU_error() для калибровки. Инициализация радио: 250 Кбит/с, низкая мощность (PA_LOW), автоACK выключен. Включаем внутренние pull-up резисторы на всех цифровых входах. Устанавливаем начальные значения (джойстики в центре = 127, кнопки = 1 — не нажаты). В loop() читаем аналоговые входы (A0–A3, A6, A7), маппим 0–1023 в 0–255 (байт). Читаем цифровые входы (при нажатии — LOW из-за pull-up). Отправляем структуру radio.write(). Если тумблер 1 включен (LOW), используем данные IMU вместо джойстика 1. Углы -90..+90° маппятся в 0..255. Полный код передатчика (с функциями calculate_IMU_error() и read_IMU() для комплементарного фильтра) приведён в оригинале. Библиотека RF24: TMRh20/RF24. Простая схема приёмника на Arduino + NRF24L01. Настройки радио идентичны передатчику, модуль переводится в режим приёма radio.startListening(). В loop() проверяем radio.available(), читаем данные в ту же структуру. Если данных нет более 1 секунды — сбрасываем значения на дефолт (защита от неконтролируемого поведения, напр. дрон с газом). Приём данных и использование значений джойстика 1 для управления движением. Код аналогичен приёмнику выше с добавлением логики управления моторами. Чтение данных и вызов функций движения: вперёд, назад, влево, вправо, укус, атака и т.д. Стандартные RC-приёмники не совместимы с NRF24L01. Нужен свой приёмник на Arduino + NRF24L01, генерирующий PWM/PPM для серв и ESC. Сервы: библиотека Servo, углы 0–180°. ESC: та же библиотека, импульсы 1000–2000 мкс (50 Гц). Надеюсь, урок был полезен. Задавайте вопросы в комментариях и смотрите мою коллекцию Arduino-проектов.Обзор


Схема Arduino RC-передатчика

Необходимые компоненты
Проектирование печатной платы




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







Корпус из акрила








Программирование


Код передатчика
#include <SPI.h> #include <nRF24L01.h> #include <RF24.h> #include <Wire.h>
#define jB1 1 // Кнопка джойстика 1
#define jB2 0 // Кнопка джойстика 2
#define t1 7 // Тумблер 1
#define t2 4 // Тумблер 2
#define b1 8 // Кнопка 1
#define b2 9 // Кнопка 2
#define b3 2 // Кнопка 3
#define b4 3 // Кнопка 4
const int MPU = 0x68; // Адрес MPU6050 по I2C
float AccX, AccY, AccZ; float GyroX, GyroY, GyroZ;
float accAngleX, accAngleY, gyroAngleX, gyroAngleY;
float angleX, angleY;
float AccErrorX, AccErrorY, GyroErrorX, GyroErrorY;
float elapsedTime, currentTime, previousTime;
int c = 0;
RF24 radio(5, 6); // nRF24L01 (CE, CSN)
const byte address[6] = "00001"; // Адрес// Max size of this struct is 32 bytes - NRF24L01 buffer limit
struct Data_Package {
byte j1PotX; byte j1PotY; byte j1Button;
byte j2PotX; byte j2PotY; byte j2Button;
byte pot1; byte pot2;
byte tSwitch1; byte tSwitch2;
byte button1; byte button2; byte button3; byte button4;
};
Data_Package data;void initialize_MPU6050() {
Wire.begin();
Wire.beginTransmission(MPU);
Wire.write(0x6B); Wire.write(0x00); Wire.endTransmission(true);
Wire.beginTransmission(MPU);
Wire.write(0x1C); Wire.write(0x10); Wire.endTransmission(true);
Wire.beginTransmission(MPU);
Wire.write(0x1B); Wire.write(0x10); Wire.endTransmission(true);
}radio.begin();
radio.openWritingPipe(address);
radio.setAutoAck(false);
radio.setDataRate(RF24_250KBPS);
radio.setPALevel(RF24_PA_LOW);
pinMode(jB1, INPUT_PULLUP); pinMode(jB2, INPUT_PULLUP);
pinMode(t1, INPUT_PULLUP); pinMode(t2, INPUT_PULLUP);
pinMode(b1, INPUT_PULLUP); pinMode(b2, INPUT_PULLUP);
pinMode(b3, INPUT_PULLUP); pinMode(b4, INPUT_PULLUP);data.j1PotX = map(analogRead(A1), 0, 1023, 0, 255);
data.j1PotY = map(analogRead(A0), 0, 1023, 0, 255);
data.j2PotX = map(analogRead(A2), 0, 1023, 0, 255);
data.j2PotY = map(analogRead(A3), 0, 1023, 0, 255);
data.pot1 = map(analogRead(A7), 0, 1023, 0, 255);
data.pot2 = map(analogRead(A6), 0, 1023, 0, 255);data.j1Button = digitalRead(jB1);
data.j2Button = digitalRead(jB2);
data.tSwitch2 = digitalRead(t2);
data.button1 = digitalRead(b1);
data.button2 = digitalRead(b2);
data.button3 = digitalRead(b3);
data.button4 = digitalRead(b4);radio.write(&data, sizeof(Data_Package));if (digitalRead(t1) == 0) {
read_IMU();
}
data.j1PotX = map(angleX, -90, +90, 255, 0);
data.j1PotY = map(angleY, -90, +90, 0, 255);Код приёмника

/* Receiver Code */
#include <SPI.h> #include <nRF24L01.h> #include <RF24.h>
RF24 radio(10, 9); const byte address[6] = "00001";
// ... та же структура Data_Package ...
void setup() { Serial.begin(9600); radio.begin(); radio.openReadingPipe(0, address);
radio.setAutoAck(false); radio.setDataRate(RF24_250KBPS); radio.setPALevel(RF24_PA_LOW);
radio.startListening(); resetData(); }
void loop() {
if (radio.available()) { radio.read(&data, sizeof(Data_Package)); lastReceiveTime = millis(); }
if (millis() - lastReceiveTime > 1000) { resetData(); }
// Печать в Serial Monitor для проверки
}
void resetData() { /* дефолтные значения */ }Управление Arduino-роботом-машиной

Управление Arduino Ant Robot (шестиног)

Управление ESC и сервоприводами (коммерческие RC-устройства)


/* Receiver - ESC and Servo Control */
#include <SPI.h> #include <nRF24L01.h> #include <RF24.h> #include <Servo.h>
RF24 radio(10, 9); const byte address[6] = "00001";
// ... структура Data_Package ...
Servo esc; Servo servo1; Servo servo2;
void setup() { /* radio init */ esc.attach(9); servo1.attach(3); servo2.attach(4); }
void loop() {
if (millis() - lastReceiveTime > 1000) { resetData(); }
if (radio.available()) { radio.read(&data, sizeof(Data_Package)); lastReceiveTime = millis(); }
servo1.write(map(data.j2PotX, 0, 255, 0, 180));
servo2.write(map(data.j2PotY, 0, 255, 0, 180));
esc.writeMicroseconds(map(data.pot1, 0, 255, 1000, 2000));
}
Производственный процесс
- Казу: от древнего мирлитона к современной пластиковой игрушке — история, производство и будущее
- Сделай свой LUMAZOID: DIY Arduino музыкальный визуализатор
- Сборка домашней машины для написания домашних заданий (плоттер-писатель)
- Умный вольтметр на Arduino и смартфоне — простое DIY-проект
- Компактная метеостанция: Arduino Nano + ESP8266, BMP280, OLED / Nokia 5110 LCD
- Сборка DIY VR-скейтборда на Arduino, Google Cardboard и Bluetooth
- DIY Arduino Radionics EMR Treatment Device — радионическое устройство
- DIY 2D гоночный симулятор движения на Arduino Nano и сервоприводах SG90
- Создание портативного RFID-замка на Arduino — пошаговое руководство
- Самодельный 3-осевой станок с ЧПУ (VMC): постройте точную фрезерную машину