From 64151d9c2fe7ac3ebf6fdc42f8e2dfd45f44b098 Mon Sep 17 00:00:00 2001 From: kislovdm Date: Mon, 21 Apr 2025 22:56:34 +0300 Subject: [PATCH] comments --- README.md | 54 +++++++++++++++++++++++- src/main.cpp | 113 ++++++++++++++++++++++++--------------------------- 2 files changed, 106 insertions(+), 61 deletions(-) diff --git a/README.md b/README.md index b937ddf..dcba927 100644 --- a/README.md +++ b/README.md @@ -1 +1,53 @@ -# baby_car_esc_controller +# Контроллер ESC для детской машинки + +## Описание +Проект представляет собой контроллер электронного регулятора скорости (ESC) для детской машинки. Контроллер позволяет управлять скоростью движения машинки двумя способами: +1. Через пульт дистанционного управления (приёмник) +2. Через педаль с плавным разгоном и ограничением максимальной скорости + +## Основные функции +- Управление скоростью двигателя через ESC +- Двойной режим управления (пульт/педаль) +- Плавный разгон при нажатии на педаль +- Регулировка максимальной скорости через потенциометр +- Автоматическое определение нейтрального положения +- Индикация работы через светодиод + +## Технические характеристики +- Напряжение питания: 12V +- Максимальный ток: 30A +- Поддержка LiPo аккумуляторов +- Защита от перегрева +- Защита от короткого замыкания + +## Подключение пинов +### Основные пины +- LED_PIN (13): Светодиод для индикации работы +- ESC_PIN (9): Пин подключения ESC +- RECEIVER_ESC_PIN (5): Пин подключения приёмника +- PEDAL_PIN (6): Пин подключения педали +- MAX_SPEED_POTENTIOMETER_PIN (A0): Пин потенциометра регулировки скорости + +### Константы управления +- ESC_NEUTRAL_POSITION: 1500 мкс (нейтральное положение ESC) +- ESC_NEUTRAL_POSITION_THRESHOLD: 40 мкс (порог определения нейтрали) +- PEDAL_MAX_THROTTLE: 1700 мкс (максимальная скорость с педали) +- ACCELERATION_SPEED: 100 (скорость разгона) +- PEDAL_SHIFT_FROM_NEUTRAL: 50 (смещение от нейтрали при нажатии педали) + +## Установка и настройка +1. Подключите ESC к аккумулятору +2. Подключите двигатель к ESC +3. Подключите приёмник к RECEIVER_ESC_PIN +4. Подключите педаль к PEDAL_PIN +5. Подключите потенциометр к MAX_SPEED_POTENTIOMETER_PIN +6. Выполните калибровку ESC согласно инструкции + +## Безопасность +- Не превышайте максимальное напряжение питания +- Следите за температурой ESC +- Используйте только рекомендованные аккумуляторы +- Храните и заряжайте аккумуляторы в безопасном месте + +## Лицензия +MIT License diff --git a/src/main.cpp b/src/main.cpp index f27c48a..5864b26 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,62 +1,62 @@ #include #include -#include // servo library -#include +#include // библиотека для управления ESC +#include // библиотека для обработки дребезга кнопки педали -#define LED_PIN 13 // Дефолтный светодиод для индикации работы - -#define DEBUG 0 +// Определение пинов +#define LED_PIN 13 // Светодиод для индикации работы +#define DEBUG 0 // Флаг отладки (0 - выключен, 1 - включен) #define ESC_PIN 9 // Пин подключения ESC #define RECEIVER_ESC_PIN 5 // Пин подключения приёмника -#define PEDAL_PIN 6 // Пин, куда подключена педаль машины -#define MAX_SPEED_POTENTIOMETER_PIN A0 // Пин потенциометра регулировки скорости с педали +#define PEDAL_PIN 6 // Пин подключения педали +#define MAX_SPEED_POTENTIOMETER_PIN A0 // Пин потенциометра регулировки максимальной скорости -#define ESC_NEUTRAL_POSITION 1500 -#define ESC_NEUTRAL_POSITION_THRESHOLD 40 -#define PEDAL_MAX_THROTTLE 1700 -#define ACCELERATION_SPEED 100 -#define PEDAL_SHIFT_FROM_NEUTRAL 50 +// Константы управления ESC +#define ESC_NEUTRAL_POSITION 1500 // Нейтральное положение ESC (микросекунды) +#define ESC_NEUTRAL_POSITION_THRESHOLD 40 // Порог определения нейтрального положения +#define PEDAL_MAX_THROTTLE 1700 // Максимальная скорость с педали +#define ACCELERATION_SPEED 100 // Скорость разгона (количество шагов) +#define PEDAL_SHIFT_FROM_NEUTRAL 50 // Смещение от нейтрали при нажатии педали -GyverOS<5> OS; // указать макс. количество задач -Servo esc; // servo name -Bounce2::Button pedal_button = Bounce2::Button(); -int pedal_state = 0; +// Создание объектов +GyverOS<5> OS; // Создание планировщика задач +Servo esc; // Объект для управления ESC +Bounce2::Button pedal_button = Bounce2::Button(); // Объект для обработки педали +int pedal_state = 0; // Состояние педали (для плавного разгона) -// обработчики задач +// Функция репликации сигнала с приёмника на ESC void replicate_receiver_for_esc() { - // выводит свой период в порт - // if (DEBUG){ - // static uint32_t ms; - // Serial.println(millis() - ms); - // ms = millis(); - // } + // Чтение сигнала с приёмника int current_receiver_esc_value = pulseIn(RECEIVER_ESC_PIN, HIGH, 25000); - if (current_receiver_esc_value == 0) - { - current_receiver_esc_value = ESC_NEUTRAL_POSITION; + if (current_receiver_esc_value == 0) { + current_receiver_esc_value = ESC_NEUTRAL_POSITION; // Если сигнал потерян, устанавливаем нейтраль } - //work mode + // Индикация работы digitalWrite(LED_PIN, !digitalRead(LED_PIN)); - if (abs(current_receiver_esc_value - ESC_NEUTRAL_POSITION) < ESC_NEUTRAL_POSITION_THRESHOLD) - { - if (DEBUG){ - Serial.println("Receiver ESC in neutral."); // Print the value of + // Проверка на нейтральное положение приёмника + if (abs(current_receiver_esc_value - ESC_NEUTRAL_POSITION) < ESC_NEUTRAL_POSITION_THRESHOLD) { + if (DEBUG) { + Serial.println("Receiver ESC in neutral."); } - if (pedal_button.isPressed()){ + + // Обработка нажатия педали + if (pedal_button.isPressed()) { + // Увеличение состояния педали для плавного разгона pedal_state++; - if (pedal_state > ACCELERATION_SPEED){ + if (pedal_state > ACCELERATION_SPEED) { pedal_state = ACCELERATION_SPEED; } - //read max speed settings + // Чтение настройки максимальной скорости с потенциометра int rotate_value = analogRead(MAX_SPEED_POTENTIOMETER_PIN); int max_speed_ms = map(rotate_value, 0, 1023, ESC_NEUTRAL_POSITION, PEDAL_MAX_THROTTLE); + // Расчет текущей скорости с учетом разгона int pedal_esc_state = PEDAL_SHIFT_FROM_NEUTRAL + map(pedal_state, 0, ACCELERATION_SPEED, ESC_NEUTRAL_POSITION, max_speed_ms); - if (DEBUG){ + if (DEBUG) { Serial.print("Pedal is pressed; state: "); Serial.print(pedal_state); Serial.print(" max speed value: "); @@ -65,17 +65,17 @@ void replicate_receiver_for_esc() { Serial.println(pedal_esc_state); } esc.writeMicroseconds(pedal_esc_state); - }else{ + } else { + // Сброс состояния педали и установка нейтрали pedal_state = 0; esc.writeMicroseconds(ESC_NEUTRAL_POSITION); } - } - else - { + } else { + // Если приёмник не в нейтрали, используем его сигнал напрямую pedal_state = 0; - if (DEBUG){ - Serial.print("Receiver ESC channel 2:"); // Print the value of - Serial.println(current_receiver_esc_value); // each channel + if (DEBUG) { + Serial.print("Receiver ESC channel 2:"); + Serial.println(current_receiver_esc_value); } esc.writeMicroseconds(current_receiver_esc_value); } @@ -85,34 +85,27 @@ void setup() { Serial.begin(9600); pinMode(LED_PIN, OUTPUT); - //attach receiver - pinMode(RECEIVER_ESC_PIN, INPUT); // Set our input pins as such + // Настройка приёмника + pinMode(RECEIVER_ESC_PIN, INPUT); - //attach pedal - pedal_button.attach(PEDAL_PIN, INPUT_PULLUP); // USE EXTERNAL PULL-UP + // Настройка педали + pedal_button.attach(PEDAL_PIN, INPUT_PULLUP); pedal_button.interval(5); pedal_button.setPressedState(LOW); - //attach max speed potentiometer + // Настройка потенциометра pinMode(MAX_SPEED_POTENTIOMETER_PIN, INPUT); - //attach esc + // Настройка ESC esc.attach(ESC_PIN); - esc.writeMicroseconds(ESC_NEUTRAL_POSITION); // Turn the motor from the android app + esc.writeMicroseconds(ESC_NEUTRAL_POSITION); - // подключаем задачи (порядковый номер, имя функции, период в мс) + // Подключение задачи репликации сигнала (выполняется каждые 40 мс) OS.attach(0, replicate_receiver_for_esc, 40); } void loop() { - // put your main code here, to run repeatedly: - OS.tick(); // вызывать как можно чаще, задачи выполняются здесь - - //check bounce - pedal_button.update(); - - // OS.getLeft() возвращает время в мс до ближайшей задачи - // на это время можно усыпить МК, например при помощи narcoleptic или GyverPower - // для примера просто поставим delay на это время - delay(OS.getLeft()); + OS.tick(); // Выполнение задач планировщика + pedal_button.update(); // Обновление состояния педали + delay(OS.getLeft()); // Ожидание до следующей задачи } \ No newline at end of file