#include <Servo.h> // Подключение библиотеки для управления моторами
#include <Adafruit_NeoPixel.h> // Подключение библиотеки для управления светодиодами

Servo left_motor; // Объявление объекта для левого мотора
Servo right_motor; // Объявление объекта для правого мотора
Servo brushless_motor; // Объявление объекта для бесколлекторного мотора

#define REVERSE_LEFT_FB 1 // Реверс переднего/заднего хода левого мотора (1 - нормальный, -1 - реверс)
#define REVERSE_LEFT_LR 1 // Реверс левого/правого поворота левого мотора (1 - нормальный, -1 - реверс)
#define REVERSE_RIGHT_FB 1 // Реверс переднего/заднего хода правого мотора (1 - нормальный, -1 - реверс)
#define REVERSE_RIGHT_LR -1 // Реверс левого/правого поворота правого мотора (1 - нормальный, -1 - реверс)

#define LEFT_DC_MOTOR_PIN 4 // Пин, к которому подключен управляющий сигнал левого ходового мотора
#define RIGHT_DC_MOTOR_PIN 5 // Пин, к которому подключен управляющий сигнал правого ходового мотора
#define BRUSHLESS_MOTOR_PIN 12 // Пин, к которому подключен управляющий сигнал бесколлекторного мотора

#define PIN 14 // Пин, к которому подключен управляющий сигнал для светодиодов
#define NUMPIXELS 10 // Количество светодиодов в ленте

// Объявление объекта для управления светодиодами
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
uint32_t color; // Переменная для хранения цвета

void setup() {
left_motor.attach(LEFT_DC_MOTOR_PIN); // Привязка пина к объекту левого мотора
right_motor.attach(RIGHT_DC_MOTOR_PIN); // Привязка пина к объекту правого мотора
brushless_motor.attach(BRUSHLESS_MOTOR_PIN); // Привязка пина к объекту бесколлекторного мотора

brushless_motor.writeMicroseconds(1000); // Калибровка бесколлекторного мотора - задаем минимальное значение сигнала
pixels.begin(); // Инициализация объекта управления светодиодами
RemoteXY_Init(); // Инициализация библиотеки для управления роботом через пульт
}

void loop() {
RemoteXY_Handler(); // Обработка входящих данных от пульта управления

// Проверка, подключен ли пульт к роботу
if (RemoteXY.connect_flag) {
// Сигнал управления левым мотором, диапазон от 1000 до 2000
int left_motor_value = map((REVERSE_LEFT_FB * RemoteXY.joystick_01_y + REVERSE_LEFT_LR * RemoteXY.joystick_01_x), -100, 100, 1000, 2000);

// Сигнал управления правым мотором, диапазон от 1000 до 2000
int right_motor_value = map((REVERSE_RIGHT_FB * RemoteXY.joystick_01_y + REVERSE_RIGHT_LR * RemoteXY.joystick_01_x), -100, 100, 1000, 2000);

// Сигнал управления бесколлекторным мотором, диапазон от 1000 до 2000
int brushless_motor_value = map(RemoteXY.slider_01, 0, 100, 1000, 2000);

// Ограничение значений в диапазоне от 1000 до 2000 для моторов ходовой
left_motor_value = constrain(left_motor_value, 1000, 2000);
right_motor_value = constrain(right_motor_value, 1000, 2000);

// Установка значений для управления моторами
left_motor.writeMicroseconds(left_motor_value);
right_motor.writeMicroseconds(right_motor_value);
brushless_motor.writeMicroseconds(brushless_motor_value);

// Установка зеленого цвета светодиодов
color = pixels.Color(0, 150, 0);
} else {
// Отключение моторов при потере сигнала
left_motor.writeMicroseconds(1500); // Остановка левого мотора
right_motor.writeMicroseconds(1500); // Остановка правого мотора
brushless_motor.writeMicroseconds(1000); // Остановка бесколлекторного мотора

// Установка красного цвета светодиодов
color = pixels.Color(150, 0, 0);
}

// Переменная для поочередного изменения цвета светодиодов
static int counter = 0;
if (counter > NUMPIXELS) {
pixels.clear(); // Очистка всех светодиодов
counter = 0; // Сброс счетчика
} else {
counter++; // Увеличение счетчика для следующего светодиода
}

pixels.setPixelColor(counter, color); // Установка цвета для текущего светодиода
pixels.show(); // Отображение изменений на светодиодах
}

Made on
Tilda