Arduino 4WD RC-машина: полный список деталей и инструкция по сборке
Компоненты и расходные материалы
| Компонент | Количество |
|---|---|
| Arduino UNO | 2 |
| Трансивер nRF24L01+ (с антенной RP-SMA, PA+LNA) | 2 |
| Funduino Joystick Shield V1.A | 1 |
| Драйвер двигателей L298N (Dual H-Bridge) | 2 |
| Комплект шасси 4WD Smart Robot Car | 1 |
| Светодиоды (разные цвета) | 3 |
| Резистор 220 Ом | 2 |
| Макетная плата | 2 |
| Аккумуляторы 18650 | 2 |
| Пауэрбанк | 1 |
| Перемычки (набор) | 1 |
Инструменты
- Паяльник
Среда разработки
- Arduino IDE
О проекте
Идея
Управляемая с джойстика 4WD-машина на Arduino с радиоканалом nRF24L01+. Дальность до 1 км в прямой видимости. Простая сборка, доступная для начинающих.
1. Пульт управления (Joystick Controller)
Используется Funduino Joystick Shield — накладка на Arduino UNO с:
- Двухосевым джойстиком (X/Y: 0–1023)
- 7 кнопками (4 большие, 2 маленькие, кнопка джойстика)
- Интерфейсами: nRF24L01, Nokia 5110 LCD, Bluetooth, I2C
- Питанием 3.5–5 В
Радиомодуль: nRF24L01+ с усилителем (PA+LNA), 2.4 ГГц, до 1000 м, 2 Мбит/с, 125 каналов, CRC, внешняя антенна.
Назначение кнопок в скетче:
- Вверх (Up) — гудок (buzzer)
- Вправо (Right) — передний фара (LED + 220Ω)
- Влево (Left) — задние габариты (2 LED + 220Ω)
- Остальные — не используются
2. Тестирование джойстика
Показаны скриншоты Serial Monitor: спокойное состояние X≈499, Y≈502; отклонения по осям.
3. Автомобиль (4WD RC Car)
Два Arduino UNO: один на машине (приёмник), второй в пульте (передатчик). На машине — 2 драйвера L298N (по 2 двигателя каждый), 3 LED, питание от 18650/пауэрбанка.
Сборка и подключение
Схема подключения приведена в изображении. Важно: перед загрузкой кода отключите перемычки от пинов 0 и 1 (RX/TX) на Arduino UNO.
После включения обоих блоков: джойстик вперёд/назад — движение вперёд/назад; влево/вправо — поворот.
Исходный код
Car_nRF24.ino (приёмник на машине)
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#define CE_PIN 6
#define CSN_PIN 8
const uint64_t pipe = 0xE8E8F0F0E1LL;
#define light_Front A4 // пин 18
#define light_Back A5 // пин 19
#define horn_Buzz 7
#define ENA_m1 3 // PWM правых моторов
#define ENB_m1 5
#define ENA_m2 9 // PWM левых моторов
#define ENB_m2 10
// L298N #1 (правые моторы)
#define IN_11 0
#define IN_12 1
#define IN_13 2
#define IN_14 4
// L298N #2 (левые моторы)
#define IN_21 14 // A0
#define IN_22 15 // A1
#define IN_23 16 // A2
#define IN_24 17 // A3
RF24 radio(CE_PIN, CSN_PIN);
int joystick[6];
int speedRight = 0, speedLeft = 0;
int xAxis, yAxis;
int buttonUp, buttonRight, buttonDown, buttonLeft;
void setup() {
pinMode(light_Front, OUTPUT);
pinMode(light_Back, OUTPUT);
pinMode(horn_Buzz, OUTPUT);
pinMode(ENA_m1, OUTPUT); pinMode(ENB_m1, OUTPUT);
pinMode(ENA_m2, OUTPUT); pinMode(ENB_m2, OUTPUT);
pinMode(IN_11, OUTPUT); pinMode(IN_12, OUTPUT);
pinMode(IN_13, OUTPUT); pinMode(IN_14, OUTPUT);
pinMode(IN_21, OUTPUT); pinMode(IN_22, OUTPUT);
pinMode(IN_23, OUTPUT); pinMode(IN_24, OUTPUT);
radio.begin();
radio.openReadingPipe(1, pipe);
radio.startListening();
}
void loop() {
if (radio.available()) {
radio.read(joystick, sizeof(joystick));
xAxis = joystick[0];
yAxis = joystick[1];
buttonUp = joystick[2];
buttonRight = joystick[3];
buttonDown = joystick[4];
buttonLeft = joystick[5];
// Кнопки (активный LOW из-за INPUT_PULLUP)
digitalWrite(horn_Buzz, buttonUp == HIGH ? LOW : HIGH);
digitalWrite(light_Front, buttonRight == HIGH ? LOW : HIGH);
digitalWrite(light_Back, buttonLeft == HIGH ? LOW : HIGH);
// Y-ось: вперёд/назад
if (yAxis < 470) { // назад
digitalWrite(IN_11, LOW); digitalWrite(IN_12, HIGH);
digitalWrite(IN_13, HIGH); digitalWrite(IN_14, LOW);
digitalWrite(IN_21, HIGH); digitalWrite(IN_22, LOW);
digitalWrite(IN_23, LOW); digitalWrite(IN_24, HIGH);
speedRight = map(yAxis, 470, 0, 0, 255);
speedLeft = map(yAxis, 470, 0, 0, 255);
} else if (yAxis > 550) { // вперёд
digitalWrite(IN_11, HIGH); digitalWrite(IN_12, LOW);
digitalWrite(IN_13, LOW); digitalWrite(IN_14, HIGH);
digitalWrite(IN_21, LOW); digitalWrite(IN_22, HIGH);
digitalWrite(IN_23, HIGH); digitalWrite(IN_24, LOW);
speedRight = map(yAxis, 550, 1023, 0, 255);
speedLeft = map(yAxis, 550, 1023, 0, 255);
} else {
speedRight = 0; speedLeft = 0;
}
// X-ось: поворот
if (xAxis < 470) { // влево
int xMapped = map(xAxis, 470, 0, 0, 255);
speedLeft = max(0, speedLeft - xMapped);
speedRight = min(255, speedRight + xMapped);
} else if (xAxis > 550) { // вправо
int xMapped = map(xAxis, 550, 1023, 0, 255);
speedLeft = min(255, speedLeft + xMapped);
speedRight = max(0, speedRight - xMapped);
}
// Порог запуска моторов
if (speedLeft < 70) speedLeft = 0;
if (speedRight < 70) speedRight = 0;
analogWrite(ENA_m1, speedRight);
analogWrite(ENB_m1, speedRight);
analogWrite(ENA_m2, speedLeft);
analogWrite(ENB_m2, speedLeft);
}
}
Joystick_nRF24.ino (передатчик в пульте)
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#define CE_PIN 9
#define CSN_PIN 10
#define xAxis A0
#define yAxis A1
const uint64_t pipe = 0xE8E8F0F0E1LL;
RF24 radio(CE_PIN, CSN_PIN);
int joystick[6];
int buttonUp = 2, buttonRight = 3, buttonDown = 4, buttonLeft = 5;
void setup() {
Serial.begin(9600);
radio.begin();
radio.openWritingPipe(pipe);
radio.stopListening();
pinMode(buttonUp, INPUT_PULLUP);
pinMode(buttonRight, INPUT_PULLUP);
pinMode(buttonDown, INPUT_PULLUP);
pinMode(buttonLeft, INPUT_PULLUP);
}
void loop() {
joystick[0] = analogRead(xAxis);
joystick[1] = analogRead(yAxis);
joystick[2] = digitalRead(buttonUp);
joystick[3] = digitalRead(buttonRight);
joystick[4] = digitalRead(buttonDown);
joystick[5] = digitalRead(buttonLeft);
radio.write(joystick, sizeof(joystick));
delay(20);
// Отладка в Serial Monitor
Serial.print("X = "); Serial.print(joystick[0]);
Serial.print(" Y = "); Serial.print(joystick[1]);
Serial.print(" Up = "); Serial.print(joystick[2]);
Serial.print(" Right = "); Serial.print(joystick[3]);
Serial.print(" Down = "); Serial.print(joystick[4]);
Serial.print(" Left = "); Serial.println(joystick[5]);
}
Схемы
- Файл схемы для Fritzing:
rc_car_tp3A7JlpYw.fzz - Изображение схемы
Производственный процесс
- Цифровые кости на Arduino: генератор случайных чисел с LCD-дисплеем и кнопкой
- DIY USB-геймпад на Arduino: собственный высокопроизводительный контроллер
- Превращаем старую радиоуправляемую машину в джойстик-контролируемый болид на Arduino
- Строим Iron Man на Arduino: компоненты, сенсоры и пошаговый гайд
- Find Me: Умный поисковик вещей на Arduino и Bluetooth
- Сборка функционального 3D-печатного манипулятора на Arduino: пошаговое руководство
- DIY-контроллер увлажнителя на Arduino с реле: безопасная работа с высоким напряжением
- Умный счетчик парковки: Отслеживание машин в реальном времени (Arduino, Processing, PHP)
- NeoPixel Matrix Pong на Arduino Nano: неоновая игра Pong на матрице 15×10
- Своё рулевое управление (джойстик) для игр на Arduino