Управление аналоговой педалькой с пульта
This commit is contained in:
+43
-13
@@ -3,11 +3,14 @@
|
|||||||
#include <Servo.h> // библиотека для управления ESC
|
#include <Servo.h> // библиотека для управления ESC
|
||||||
#include <Bounce2.h> // библиотека для обработки дребезга кнопки педали
|
#include <Bounce2.h> // библиотека для обработки дребезга кнопки педали
|
||||||
|
|
||||||
|
const int NUM_READ = 5; // количество усреднений для средних арифм. фильтров
|
||||||
|
|
||||||
// Определение пинов
|
// Определение пинов
|
||||||
#define LED_PIN 13 // Светодиод для индикации работы
|
#define LED_PIN 13 // Светодиод для индикации работы
|
||||||
#define DEBUG 0 // Флаг отладки (0 - выключен, 1 - включен)
|
#define DEBUG 0 // Флаг отладки (0 - выключен, 1 - включен)
|
||||||
#define ESC_PIN 9 // Пин подключения ESC
|
#define ESC_PIN 9 // Пин подключения ESC
|
||||||
#define RECEIVER_ESC_PIN 5 // Пин подключения приёмника
|
#define RECEIVER_ESC_PIN 5 // Пин подключения приёмника
|
||||||
|
#define RECEIVER_SPEED_CONTROL_PIN 6 // Пин с приёмника для канала с регулировкой максимальной скорости
|
||||||
#define PEDAL_PIN 5 // Пин подключения педали
|
#define PEDAL_PIN 5 // Пин подключения педали
|
||||||
#define MAX_SPEED_POTENTIOMETER_PIN A0 // Пин потенциометра регулировки максимальной скорости
|
#define MAX_SPEED_POTENTIOMETER_PIN A0 // Пин потенциометра регулировки максимальной скорости
|
||||||
|
|
||||||
@@ -27,6 +30,41 @@
|
|||||||
// Создание объектов
|
// Создание объектов
|
||||||
GyverOS<5> OS; // Создание планировщика задач
|
GyverOS<5> OS; // Создание планировщика задач
|
||||||
Servo esc; // Объект для управления ESC
|
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
|
// Функция репликации сигнала с приёмника на ESC
|
||||||
void replicate_receiver_for_esc() {
|
void replicate_receiver_for_esc() {
|
||||||
@@ -47,11 +85,8 @@ void replicate_receiver_for_esc() {
|
|||||||
|
|
||||||
// Обработка нажатия педали
|
// Обработка нажатия педали
|
||||||
int pedal_state = analogRead(PEDAL_ANALOG_PIN);
|
int pedal_state = analogRead(PEDAL_ANALOG_PIN);
|
||||||
if (abs(pedal_state - PEDAL_MIN) > PEDAL_THRESHOLD) {
|
pedal_state = runMiddleArifmOptim(pedal_state);
|
||||||
// Чтение настройки максимальной скорости с потенциометра
|
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, PEDAL_MIN, PEDAL_MAX, 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);
|
||||||
|
|
||||||
@@ -64,7 +99,7 @@ void replicate_receiver_for_esc() {
|
|||||||
Serial.println(pedal_esc_state);
|
Serial.println(pedal_esc_state);
|
||||||
}
|
}
|
||||||
esc.writeMicroseconds(pedal_esc_state);
|
esc.writeMicroseconds(pedal_esc_state);
|
||||||
} else {
|
} else { // Педаль отпущена
|
||||||
// Сброс состояния педали и установка нейтрали
|
// Сброс состояния педали и установка нейтрали
|
||||||
esc.writeMicroseconds(ESC_NEUTRAL_POSITION);
|
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() {
|
void setup() {
|
||||||
Serial.begin(9600);
|
Serial.begin(9600);
|
||||||
pinMode(LED_PIN, OUTPUT);
|
pinMode(LED_PIN, OUTPUT);
|
||||||
|
|
||||||
// Настройка приёмника
|
// Настройка приёмника
|
||||||
pinMode(RECEIVER_ESC_PIN, INPUT);
|
pinMode(RECEIVER_ESC_PIN, INPUT);
|
||||||
|
pinMode(RECEIVER_SPEED_CONTROL_PIN, INPUT);
|
||||||
|
|
||||||
// Настройка аналоговой педали
|
// Настройка аналоговой педали
|
||||||
pinMode(PEDAL_ANALOG_PIN, INPUT);
|
pinMode(PEDAL_ANALOG_PIN, INPUT);
|
||||||
@@ -102,7 +132,7 @@ void setup() {
|
|||||||
|
|
||||||
// Подключение задачи репликации сигнала (выполняется каждые 40 мс)
|
// Подключение задачи репликации сигнала (выполняется каждые 40 мс)
|
||||||
OS.attach(0, replicate_receiver_for_esc, 40);
|
OS.attach(0, replicate_receiver_for_esc, 40);
|
||||||
//OS.attach(0, pedal_test, 240);
|
OS.attach(1, read_max_speed, 1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
void loop() {
|
void loop() {
|
||||||
|
|||||||
Reference in New Issue
Block a user