Управление аналоговой педалькой с пульта

This commit is contained in:
kislovdm
2025-06-29 15:54:21 +03:00
parent 6d203331ce
commit 6c8b21f72e
+43 -13
View File
@@ -3,11 +3,14 @@
#include <Servo.h> // библиотека для управления ESC
#include <Bounce2.h> // библиотека для обработки дребезга кнопки педали
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() {