Пульт управления движущимся объектом

Здравствуйте форумчане, есть задача создать пульт управления движущимся объектом. Для поворота используется сервопривод. Управление движением происходит с помощью аналогового джойстика. Плавное смещение рычага джойстика вперед-назад плавно регулирует скорость вращения двигателя, а смещение влево-вправо – поворот в соответствующую сторону сервопривода. Все режимы работы пульта «вперед», «назад», «влево», «вправо», «стоп» должны визуализироваться светодиодными индикаторами или изображениями на дисплее.

Я реализовал схему в симуляторе и написал код
Работает он некорректно заданию, помогите пожалуйста исправить ошибки
Спасибо!

#include <Servo.h>
#include <Stepper.h>
#include <LiquidCrystal.h>

// Пины для подключения джойстика
const int joyX = A0;
const int joyY = A1;
const int joyButton = 2;

// Пины для подключения шагового двигателя
const int stepPin = 9;
const int dirPin = 8;

// Пины для подключения сервопривода
const int servoPin = 10;

// Пины для подключения дисплея LCD
const int rs = 12;
const int en = 11;
const int d4 = 5;
const int d5 = 4;
const int d6 = 3;
const int d7 = 6;

// Количество шагов на оборот для шагового двигателя
const int stepsPerRevolution = 200;

// Объекты для управления шаговым двигателем, сервоприводом и дисплеем LCD
Stepper stepper(stepsPerRevolution, dirPin, stepPin);
Servo servo;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

// Переменные для хранения показаний джойстика
int joyValueX = 0;
int joyValueY = 0;

// Переменная для хранения состояния кнопки джойстика
int joyButtonState = 0;

void setup() {
  // Настройка пинов
  pinMode(joyButton, INPUT_PULLUP);
  
  // Инициализация дисплея LCD
  lcd.begin(16, 2);
  
  // Инициализация сервопривода
  servo.attach(servoPin);
  
  // Настройка скорости шагового двигателя
  stepper.setSpeed(100);
}

void loop() {
  // Чтение показаний джойстика
  joyValueX = analogRead(joyX);
  joyValueY = analogRead(joyY);
  
  // Чтение состояния кнопки джойстика
  joyButtonState = digitalRead(joyButton);
  
  // Расчет скорости и направления движения шагового двигателя
  int speed = map(joyValueY, 0, 1023, 0, 100);
  int direction = (joyValueY > 500) ? HIGH : LOW;
  
  // Управление шаговым двигателем
  stepper.setSpeed(speed);
  digitalWrite(dirPin, direction);
  
  // Управление сервоприводом
  int angle = map(joyValueX, 0, 1023, 0, 180);
  servo.write(angle);
  
  // Вывод сообщений на дисплей LCD
  lcd.clear();
  
  if (joyValueY < 500) 
  {
    lcd.print("Forward");
    stepper.step(stepsPerRevolution / 4);
  } 
  else if (joyValueY > 550) 
  {
    lcd.print("Backward");
    stepper.step(-stepsPerRevolution / 4);
  } 
  else 
  {
    lcd.print("Stop");
    stepper.step(0);
  }
  
  lcd.setCursor(0, 1);
  
  if (joyValueX < 500) {
    lcd.print("<-");
  } 
  else if (joyValueX > 550) {
    lcd.print("->");
  } 
  else 
  {
    lcd.print(" ");
  }
}

Какие ошибки ?

а конкретнее? В чем некорректность? Или вы полагаете, что те кто захотят помочь - должны будут сначала собрать тестовый макет , чтобы увидеть, как он работает?

Я совсем забыл прикрепить ссылку на симулятор где была бы видна некорректность
Словом малое время активности, что наверное обусловлено количеством шагов двигателя, биение дисплея (не знаю как правильно сформулировать), а так же я не задействовал потенциометр и драйвер шагового двигателя ( не понял куда и как правильно подключать выходы управляющие размером микрошага MS1,MS2,MS3

clear() не нужен. Выводите информацию только тогда, когда изменилось состояние органа управления. И надпечатывайте её поверх старой.
Тогда “биения” не будет.
Микрошаг подключается или на GND или на VCC. Мне кажется, что для данного драйвера их можно просто оставить болтаться в воздухе для фуллстепа.

Спасибо вам
Вечером обязательно уделю время данным замечаниям
Скажите пожалуйста, если я верно помню, то в одном из положений аналогово джойстика схема останавливается, в положении Forward (вперед) вроде бы, с чем может быть это связанно?

“Вроде бы” - не подходит.
Для локализации ошибки необходимо понять при каких условиях она возникает.

Например: при “Forward” двигатель встал. Что происходит при этом? Вызывается такая-то функция. С какими параметрами она вызывается? Положим, со speed. Какое реальное значение передаётся в функцию? speed = 0,. Т.е. движение с нулевой скоростью. Это есть остановка. Далее уже думаете - а с чего бы переменная приняла значение 0 и должно ли оно быть таковым по условиям задачи.

Спасибо вам за участие
Я исправил некоторые аспекты, но пока что не получается заставить схему работать при движении вперед

Теперь движение вперед не останавливает работу схемы
Спасибо вам

1 лайк