Необходимо написать\дописать\переписать код для управления электронным задним переключателем передач велосипеда. Задний переключатель оснащен сервоприводом и двигает его туда суда для перекидывания цепи на нужную звезду. Используется Arduino Nano с подключенными к ней двумя кнопками: следущая передача и предыдущая передача.
На данный момент все стоит на байке и работает с простым кодом, в котором предопределены положения сервы для каждой передачи. Но что бы подкорректировать значение положения сервы для какой либо передачи, нужно каждый раз подключаться, редактировать, компиллировать и заливать скетч, что не очень удобно, особенно во время езды.
В общем нужен режим каллибровки добавить в мой код или написать новый, удовлетворяющий следующим требованиям:
Два режима работы: переключение передач и режим каллибровки текущей передачи.
В режиме переключения передач, должно происходить переключение между передачами, установкой сервопривода в определенное положение. Передач должно быть 7. Каждой передаче должна соответствовать своя переменная угла сервопривода, записанная в EEPROM:
1 передача = 1 градус
2 передача = 20 градус
3 передача = 30 градус
4 передача = 43 градус
5 передача = 65 градус
6 передача = 87 градус
7 передача = 102 градус
Переключение между передачами должно происходить при нажатии на кнопоки:
next_button (pin 2) - переключение на следущую передачу
prev_button (pin 3) - переключение на предыдущую передачу.
Для активации режима каллибровки trim_mode, необходимо нажать и удерживать 2000мс кнопки next_button и prev_button одновременно. В режиме каллибровки должна происходить корректировка значения переменной угла сервопривода включенной в данный момент передачи.
В режиме каллибровки, при каждом нажатии кнопки next_button, сервопривод должен сдвигаться на +1 градус от текущего положения и должно перезаписываться значение переменной угла текущей передачи в EEPROM на новое, увеличенное на 1, а при каждом нажатии на кнопку prev_button, сервопривод должен сдвигаться на минус 1 градус от текущего положения и должна перезаписываться переменная угла текущей передачи в EEPROM на новое, уменьшенное на 1.
Для выхода из режима каллибровки необходим опять нажать и удерживать 2000мс обе кнопки одноврпеменно.
После восстановления питания должна включаться передача, которая была включена до отключения.
Имеется рабочий код, который впринципе делает все как нужно, но режим калибровки активируется переключателем, а после перезагрузки откаллиброванные значения сбрасываются((
пример работы кода в симуляторе: https://wokwi.com/projects/358819634785752065
На данный момент все стоит на байке и работает с простым кодом, в котором предопределены положения сервы для каждой передачи. Но что бы подкорректировать значение положения сервы для какой либо передачи, нужно каждый раз подключаться, редактировать, компиллировать и заливать скетч, что не очень удобно, особенно во время езды.
В общем нужен режим каллибровки добавить в мой код или написать новый, удовлетворяющий следующим требованиям:
Два режима работы: переключение передач и режим каллибровки текущей передачи.
В режиме переключения передач, должно происходить переключение между передачами, установкой сервопривода в определенное положение. Передач должно быть 7. Каждой передаче должна соответствовать своя переменная угла сервопривода, записанная в EEPROM:
1 передача = 1 градус
2 передача = 20 градус
3 передача = 30 градус
4 передача = 43 градус
5 передача = 65 градус
6 передача = 87 градус
7 передача = 102 градус
Переключение между передачами должно происходить при нажатии на кнопоки:
next_button (pin 2) - переключение на следущую передачу
prev_button (pin 3) - переключение на предыдущую передачу.
Для активации режима каллибровки trim_mode, необходимо нажать и удерживать 2000мс кнопки next_button и prev_button одновременно. В режиме каллибровки должна происходить корректировка значения переменной угла сервопривода включенной в данный момент передачи.
В режиме каллибровки, при каждом нажатии кнопки next_button, сервопривод должен сдвигаться на +1 градус от текущего положения и должно перезаписываться значение переменной угла текущей передачи в EEPROM на новое, увеличенное на 1, а при каждом нажатии на кнопку prev_button, сервопривод должен сдвигаться на минус 1 градус от текущего положения и должна перезаписываться переменная угла текущей передачи в EEPROM на новое, уменьшенное на 1.
Для выхода из режима каллибровки необходим опять нажать и удерживать 2000мс обе кнопки одноврпеменно.
После восстановления питания должна включаться передача, которая была включена до отключения.
Имеется рабочий код, который впринципе делает все как нужно, но режим калибровки активируется переключателем, а после перезагрузки откаллиброванные значения сбрасываются((
Рабочий код:
#include <EEPROM.h>
#include <Servo.h>
Servo servo;
int gear_angles[] = {1, 20, 30, 43, 65, 87, 102};
int current_gear = 1;
int trim_mode = 4;
int next_button = 2;
int prev_button = 3;
void setup() {
servo.attach(9);
pinMode(next_button, INPUT_PULLUP);
pinMode(prev_button, INPUT_PULLUP);
pinMode(trim_mode, INPUT_PULLUP);
int saved_gear = EEPROM.read(0);
if (saved_gear > 0 && saved_gear <= 7) {
current_gear = saved_gear;
servo.write(gear_angles[current_gear - 1]);
}
}
void loop() {
if (digitalRead(trim_mode) == LOW) {
calibrateMode();
} else {
shiftMode();
}
}
void shiftMode() {
if (digitalRead(next_button) == LOW && current_gear < 7) {
current_gear++;
servo.write(gear_angles[current_gear - 1]);
}
if (digitalRead(prev_button) == LOW && current_gear > 1) {
current_gear--;
servo.write(gear_angles[current_gear - 1]);
}
EEPROM.write(0, current_gear);
delay(100);
}
void calibrateMode() {
int servo_angle = gear_angles[current_gear - 1];
if (digitalRead(next_button) == LOW) {
servo_angle++;
servo.write(servo_angle);
}
if (digitalRead(prev_button) == LOW) {
servo_angle--;
servo.write(servo_angle);
}
gear_angles[current_gear - 1] = servo_angle;
delay(100);
}