Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

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

Инструменты

Среда разработки

О проекте

Идея

Управляемая с джойстика 4WD-машина на Arduino с радиоканалом nRF24L01+. Дальность до 1 км в прямой видимости. Простая сборка, доступная для начинающих.

1. Пульт управления (Joystick Controller)

Используется Funduino Joystick Shield — накладка на Arduino UNO с:

Радиомодуль: nRF24L01+ с усилителем (PA+LNA), 2.4 ГГц, до 1000 м, 2 Мбит/с, 125 каналов, CRC, внешняя антенна.

Назначение кнопок в скетче:

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]);
}

Схемы

Производственный процесс

  1. Цифровые кости на Arduino: генератор случайных чисел с LCD-дисплеем и кнопкой
  2. DIY USB-геймпад на Arduino: собственный высокопроизводительный контроллер
  3. Превращаем старую радиоуправляемую машину в джойстик-контролируемый болид на Arduino
  4. Строим Iron Man на Arduino: компоненты, сенсоры и пошаговый гайд
  5. Find Me: Умный поисковик вещей на Arduino и Bluetooth
  6. Сборка функционального 3D-печатного манипулятора на Arduino: пошаговое руководство
  7. DIY-контроллер увлажнителя на Arduino с реле: безопасная работа с высоким напряжением
  8. Умный счетчик парковки: Отслеживание машин в реальном времени (Arduino, Processing, PHP)
  9. NeoPixel Matrix Pong на Arduino Nano: неоновая игра Pong на матрице 15×10
  10. Своё рулевое управление (джойстик) для игр на Arduino