Педаль заменена на аналог, теперь скорость регулируется плавно

This commit is contained in:
kislovdm
2025-06-28 10:53:31 +03:00
parent f92e534cda
commit 6d203331ce
+19 -19
View File
@@ -8,9 +8,15 @@
#define DEBUG 0 // Флаг отладки (0 - выключен, 1 - включен)
#define ESC_PIN 9 // Пин подключения ESC
#define RECEIVER_ESC_PIN 5 // Пин подключения приёмника
#define PEDAL_PIN 6 // Пин подключения педали
#define PEDAL_PIN 5 // Пин подключения педали
#define MAX_SPEED_POTENTIOMETER_PIN A0 // Пин потенциометра регулировки максимальной скорости
// Аналоговая педаль
#define PEDAL_ANALOG_PIN A5
#define PEDAL_MIN 175
#define PEDAL_MAX 880
#define PEDAL_THRESHOLD 30
// Константы управления ESC
#define ESC_NEUTRAL_POSITION 1500 // Нейтральное положение ESC (микросекунды)
#define ESC_NEUTRAL_POSITION_THRESHOLD 40 // Порог определения нейтрального положения
@@ -21,8 +27,6 @@
// Создание объектов
GyverOS<5> OS; // Создание планировщика задач
Servo esc; // Объект для управления ESC
Bounce2::Button pedal_button = Bounce2::Button(); // Объект для обработки педали
int pedal_state = 0; // Состояние педали (для плавного разгона)
// Функция репликации сигнала с приёмника на ESC
void replicate_receiver_for_esc() {
@@ -42,19 +46,14 @@ void replicate_receiver_for_esc() {
}
// Обработка нажатия педали
if (pedal_button.isPressed()) {
// Увеличение состояния педали для плавного разгона
pedal_state++;
if (pedal_state > ACCELERATION_SPEED) {
pedal_state = ACCELERATION_SPEED;
}
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);
// Расчет текущей скорости с учетом разгона
int pedal_esc_state = PEDAL_SHIFT_FROM_NEUTRAL + map(pedal_state, 0, ACCELERATION_SPEED, ESC_NEUTRAL_POSITION, max_speed_ms);
int pedal_esc_state = PEDAL_SHIFT_FROM_NEUTRAL + map(pedal_state, PEDAL_MIN, PEDAL_MAX, ESC_NEUTRAL_POSITION, max_speed_ms);
if (DEBUG) {
Serial.print("Pedal is pressed; state: ");
@@ -67,12 +66,9 @@ void replicate_receiver_for_esc() {
esc.writeMicroseconds(pedal_esc_state);
} else {
// Сброс состояния педали и установка нейтрали
pedal_state = 0;
esc.writeMicroseconds(ESC_NEUTRAL_POSITION);
}
} else {
// Если приёмник не в нейтрали, используем его сигнал напрямую
pedal_state = 0;
if (DEBUG) {
Serial.print("Receiver ESC channel 2:");
Serial.println(current_receiver_esc_value);
@@ -81,6 +77,12 @@ 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);
@@ -88,10 +90,8 @@ void setup() {
// Настройка приёмника
pinMode(RECEIVER_ESC_PIN, INPUT);
// Настройка педали
pedal_button.attach(PEDAL_PIN, INPUT_PULLUP);
pedal_button.interval(5);
pedal_button.setPressedState(LOW);
// Настройка аналоговой педали
pinMode(PEDAL_ANALOG_PIN, INPUT);
// Настройка потенциометра
pinMode(MAX_SPEED_POTENTIOMETER_PIN, INPUT);
@@ -102,10 +102,10 @@ void setup() {
// Подключение задачи репликации сигнала (выполняется каждые 40 мс)
OS.attach(0, replicate_receiver_for_esc, 40);
//OS.attach(0, pedal_test, 240);
}
void loop() {
OS.tick(); // Выполнение задач планировщика
pedal_button.update(); // Обновление состояния педали
delay(OS.getLeft()); // Ожидание до следующей задачи
}