ARDUINO Нужно переписать\дописать\написать новый код для управления сервой(РЕШЕНО)

huimija

✩✩✩✩✩✩✩
10 Мар 2023
2
1
Необходимо написать\дописать\переписать код для управления электронным задним переключателем передач велосипеда. Задний переключатель оснащен сервоприводом и двигает его туда суда для перекидывания цепи на нужную звезду. Используется 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мс обе кнопки одноврпеменно.

После восстановления питания должна включаться передача, которая была включена до отключения.


Имеется рабочий код, который впринципе делает все как нужно, но режим калибровки активируется переключателем, а после перезагрузки откаллиброванные значения сбрасываются((
Рабочий код:
#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);
}
пример работы кода в симуляторе: https://wokwi.com/projects/358819634785752065
 

PiratFox

★★★★★✩✩
13 Фев 2020
1,723
481
пример работы кода в симуляторе
В симуляторе такое работает, а вот в железе ИМХО будут глюки. В коде нет программного подавления дребезга кнопок.
после перезагрузки откаллиброванные значения сбрасываются
Разумеется так и есть. Библиотека EEPROM никак не задействована. Вообще, @Bruzzer прав. Похоже, это учебная задача. Так почему бы Вам не попробовать написать всё самому? Ведь Вы же взяли где-то этот код.
 
Изменено:

PiratFox

★★★★★✩✩
13 Фев 2020
1,723
481
Вообще-то этого недостаточно. Впрочем, дело Ваше, мне без разницы.
 

huimija

✩✩✩✩✩✩✩
10 Мар 2023
2
1
Избыточное цитирование, см. Правила. Отредактируй или сообщение будет удалено
В симуляторе такое работает, а вот в железе ИМХО будут глюки. В коде нет программного подавления дребезга кнопок.

Разумеется так и есть. Библиотека EEPROM никак не задействована. Вообще, @Bruzzer прав. Похоже, это учебная задача. Так почему бы Вам не попробовать написать всё самому? Ведь Вы же взяли где-то этот код.
По-поводу дребезга - в живую тоже все нормально работает.
Так я уже устал пытаться написать всё самому. Если бы я мог написать всё самостоятельно, я бы тут тему не создавал.. Код, который я привел в пример, была написана нейросетью. Все попытки заставить нейросеть написать код точно под мои хотелки, не увенчались успехом..