From 6c8b21f72e3d8fb3031ae4a8d7fe70c13ab6ab29 Mon Sep 17 00:00:00 2001 From: kislovdm Date: Sun, 29 Jun 2025 15:54:21 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A3=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=B0=D0=BD=D0=B0=D0=BB=D0=BE=D0=B3=D0=BE?= =?UTF-8?q?=D0=B2=D0=BE=D0=B9=20=D0=BF=D0=B5=D0=B4=D0=B0=D0=BB=D1=8C=D0=BA?= =?UTF-8?q?=D0=BE=D0=B9=20=D1=81=20=D0=BF=D1=83=D0=BB=D1=8C=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main.cpp | 56 ++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 43 insertions(+), 13 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 765be65..605e2fe 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3,11 +3,14 @@ #include // библиотека для управления ESC #include // библиотека для обработки дребезга кнопки педали +const int NUM_READ = 5; // количество усреднений для средних арифм. фильтров + // Определение пинов #define LED_PIN 13 // Светодиод для индикации работы #define DEBUG 0 // Флаг отладки (0 - выключен, 1 - включен) #define ESC_PIN 9 // Пин подключения ESC #define RECEIVER_ESC_PIN 5 // Пин подключения приёмника +#define RECEIVER_SPEED_CONTROL_PIN 6 // Пин с приёмника для канала с регулировкой максимальной скорости #define PEDAL_PIN 5 // Пин подключения педали #define MAX_SPEED_POTENTIOMETER_PIN A0 // Пин потенциометра регулировки максимальной скорости @@ -27,6 +30,41 @@ // Создание объектов GyverOS<5> OS; // Создание планировщика задач Servo esc; // Объект для управления ESC +int max_speed_ms = 1700; + +// оптимальное бегущее среднее арифметическое +int runMiddleArifmOptim(int newVal) { + static int t = 0; + static int vals[NUM_READ]; + static int average = 0; + if (++t >= NUM_READ) t = 0; // перемотка t + average -= vals[t]; // вычитаем старое + average += newVal; // прибавляем новое + vals[t] = newVal; // запоминаем в массив + return ((int)average / NUM_READ); +} + +// Чтение максимальной скорости +void read_max_speed() { + // Чтение настройки максимальной скорости с потенциометра + int current_receiver_speed_value = pulseIn(RECEIVER_SPEED_CONTROL_PIN, HIGH, 25000); + if (current_receiver_speed_value == 0) { + if (DEBUG){ + Serial.println("No signal from speed control channel. Switching back to potentiometer"); + } + int rotate_value = analogRead(MAX_SPEED_POTENTIOMETER_PIN); + max_speed_ms = map(rotate_value, 0, 1023, ESC_NEUTRAL_POSITION, PEDAL_MAX_THROTTLE); + } else { + // нет движения назад + current_receiver_speed_value = map(current_receiver_speed_value, 990, 2000, ESC_NEUTRAL_POSITION, 1900); + max_speed_ms = current_receiver_speed_value; + } + + if (DEBUG){ + Serial.print("Max speed: "); + Serial.println(max_speed_ms); + } +} // Функция репликации сигнала с приёмника на ESC void replicate_receiver_for_esc() { @@ -47,11 +85,8 @@ void replicate_receiver_for_esc() { // Обработка нажатия педали int pedal_state = analogRead(PEDAL_ANALOG_PIN); - if (abs(pedal_state - PEDAL_MIN) > PEDAL_THRESHOLD) { - // Чтение настройки максимальной скорости с потенциометра - int rotate_value = analogRead(MAX_SPEED_POTENTIOMETER_PIN); - int max_speed_ms = map(rotate_value, 0, 1023, ESC_NEUTRAL_POSITION, PEDAL_MAX_THROTTLE); - + pedal_state = runMiddleArifmOptim(pedal_state); + if (abs(pedal_state - PEDAL_MIN) > PEDAL_THRESHOLD) { //Педаль нажата // Расчет текущей скорости с учетом разгона int pedal_esc_state = PEDAL_SHIFT_FROM_NEUTRAL + map(pedal_state, PEDAL_MIN, PEDAL_MAX, ESC_NEUTRAL_POSITION, max_speed_ms); @@ -64,7 +99,7 @@ void replicate_receiver_for_esc() { Serial.println(pedal_esc_state); } esc.writeMicroseconds(pedal_esc_state); - } else { + } else { // Педаль отпущена // Сброс состояния педали и установка нейтрали esc.writeMicroseconds(ESC_NEUTRAL_POSITION); } @@ -77,18 +112,13 @@ void replicate_receiver_for_esc() { } } -void pedal_test() { - int pedal_state = analogRead(PEDAL_ANALOG_PIN); - Serial.print("pedal_state: "); - Serial.println(pedal_state); -} - void setup() { Serial.begin(9600); pinMode(LED_PIN, OUTPUT); // Настройка приёмника pinMode(RECEIVER_ESC_PIN, INPUT); + pinMode(RECEIVER_SPEED_CONTROL_PIN, INPUT); // Настройка аналоговой педали pinMode(PEDAL_ANALOG_PIN, INPUT); @@ -102,7 +132,7 @@ void setup() { // Подключение задачи репликации сигнала (выполняется каждые 40 мс) OS.attach(0, replicate_receiver_for_esc, 40); - //OS.attach(0, pedal_test, 240); + OS.attach(1, read_max_speed, 1000); } void loop() {