Модуль KY-023 путает функционал по осям x, y

Доброго времени суток! Реализована связь между ардуино uno (управляющая) и wemos d1 mini (принимающая) с помощью радиомодулей nrf. К передающей плате подключен модуль джойстика KY-023, к передающей - двигатель и сервомотор. При включении все работает нормально, но при попадании стика ky-023 в крайнее диагональное положение (примерно между осью x и y) происходит самопроизвольное смена функционала осей ( грубо говоря x меняется с y местами, соответственно путается управление исполнительными механизмами)
С чем может быть связано? Спасибо

Код ардуино uno
‘’’ #include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <EEPROM.h>

RF24 radio(9, 10); // Подключите модуль NRF24L01 к пинам 9 и 10
int joyPinX = A0; // Подключите выход джойстика к пину A0
int joyPinY = A1; // Подключите выход джойстика по оси Y к пину A1
int servoValueY = 90; // Начальное положение сервопривода (90 градусов)
int ledPin = 4; // Подключите светодиод к пину 4

// …

void loop() {
// Считываем значение с джойстика и фильтруем его
int rawValueX = analogRead(joyPinX);
int rawValueY = analogRead(joyPinY);

// …

// Отправляем скорость мотора и угол сервопривода по NRF24L01
radio.write(&motorSpeed, sizeof(motorSpeed));
radio.write(&servoValueY, sizeof(servoValueY));

// Обработка кнопки для управления светодиодом на принимающей плате
if (digitalRead(ledPin) == LOW) {
delay(50); // Задержка для стабилизации сигнала кнопки
if (digitalRead(ledPin) == LOW) {
// Если кнопка была кратковременно нажата (после задержки)
radio.write(“TOGGLE_LED”, sizeof(“TOGGLE_LED”)); // Отправляем команду на принимающую плату
}
}
}
‘’’

Код wemos
‘’’
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <Servo.h>

RF24 radio(D0, D1); // Подключите модуль NRF24L01 к пинам D3 и D4
int motorPin = D8; // Подключите мотор к пину D1
int receivedMotorSpeed = 0; // Переменная для хранения принятой скорости мотора
Servo servo; // Создаем объект для управления сервоприводом
int servoPin = D2; // Подключите сервопривод к пину D1
int receivedServoValueY = 90; // Переменная для хранения принятого угла сервопривода
int ledPin = D3; // Подключите светодиод к пину D3

bool isLedOn = false; // Флаг состояния светодиода

// …

void setup() {
// …

// Инициализируем состояние светодиода
digitalWrite(ledPin, isLedOn ? HIGH : LOW);
}

void loop() {
// Проверяем наличие данных от передающей платы
if (radio.available()) {
char command[11];
radio.read(&receivedMotorSpeed, sizeof(receivedMotorSpeed));
radio.read(&receivedServoValueY, sizeof(receivedServoValueY));
radio.read(&command, sizeof(command));

// Устанавливаем принятую скорость мотора
analogWrite(motorPin, receivedMotorSpeed);

// Инвертируем значение угла сервопривода
receivedServoValueY = 180 - receivedServoValueY;

servo.write(receivedServoValueY);

// Обработка команды для управления светодиодом
if (strcmp(command, "TOGGLE_LED") == 0) {
  isLedOn = !isLedOn;
  digitalWrite(ledPin, isLedOn ? HIGH : LOW);
}

}
}
‘’’

Вставьте код нормально, пожалуйста.

С ошибкой в программе.

Начальные апострофы НА ОТДЕЛЬНОЙ СТРОКЕ!
Ребят с этим надо, что то делать…
Каждый второй не отдупляет…

и обратные, а не прямые.

И чтобы три штуки подряд!

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <EEPROM.h>

RF24 radio(9, 10); // Подключите модуль NRF24L01 к пинам 9 и 10
int joyPinX = A0; // Подключите выход джойстика к пину A0
int joyPinY = A1; // Подключите выход джойстика по оси Y к пину A1
int servoValueY = 90; // Начальное положение сервопривода (90 градусов)
int ledPin = 4; // Подключите светодиод к пину 4

// ...

void loop() {
  // Считываем значение с джойстика и фильтруем его
  int rawValueX = analogRead(joyPinX);
  int rawValueY = analogRead(joyPinY);

  // ...

  // Отправляем скорость мотора и угол сервопривода по NRF24L01
  radio.write(&motorSpeed, sizeof(motorSpeed));
  radio.write(&servoValueY, sizeof(servoValueY));

  // Обработка кнопки для управления светодиодом на принимающей плате
  if (digitalRead(ledPin) == LOW) {
    delay(50); // Задержка для стабилизации сигнала кнопки
    if (digitalRead(ledPin) == LOW) {
      // Если кнопка была кратковременно нажата (после задержки)
      radio.write("TOGGLE_LED", sizeof("TOGGLE_LED")); // Отправляем команду на принимающую плату
    }
  }
}
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <Servo.h>

RF24 radio(D0, D1); // Подключите модуль NRF24L01 к пинам D3 и D4
int motorPin = D8; // Подключите мотор к пину D1
int receivedMotorSpeed = 0; // Переменная для хранения принятой скорости мотора
Servo servo; // Создаем объект для управления сервоприводом
int servoPin = D2; // Подключите сервопривод к пину D1
int receivedServoValueY = 90; // Переменная для хранения принятого угла сервопривода
int ledPin = D3; // Подключите светодиод к пину D3

bool isLedOn = false; // Флаг состояния светодиода

// ...

void setup() {
  // ...

  // Инициализируем состояние светодиода
  digitalWrite(ledPin, isLedOn ? HIGH : LOW);
}

void loop() {
  // Проверяем наличие данных от передающей платы
  if (radio.available()) {
    char command[11];
    radio.read(&receivedMotorSpeed, sizeof(receivedMotorSpeed));
    radio.read(&receivedServoValueY, sizeof(receivedServoValueY));
    radio.read(&command, sizeof(command));

    // Устанавливаем принятую скорость мотора
    analogWrite(motorPin, receivedMotorSpeed);
    
    // Инвертируем значение угла сервопривода
    receivedServoValueY = 180 - receivedServoValueY;

    servo.write(receivedServoValueY);

    // Обработка команды для управления светодиодом
    if (strcmp(command, "TOGGLE_LED") == 0) {
      isLedOn = !isLedOn;
      digitalWrite(ledPin, isLedOn ? HIGH : LOW);
    }
  }
}

Код для передающей и принимающей платы соответственно

В корне неверная работа с модулями.
Модули не передают переменные. Они не понимают что они передают и принимают. Одна из посылок теряется и вся очерёдность летит к чёрту. Передатчик посылает скорость мотора, а приёмник ловит положение сервы.
Тут два пути:

  1. Посылаем всю информацию единым пакетом
  2. Каждый отдельный параметр имеет свой идентификатор.
    Проще и правильней первый путь.
    Читаем параметры, запихиваем в массив и отправляем.
1 лайк

Благодарю! Буду исправлять

а я уже давно об этом, в наше время такие задачи перестают быть тривиальными :wink:

Хотел написать про соринку и бревно, но запятую, смотрю, уже сами поставили. Ещё бы заглавные, орфографию и знаки препинания :slightly_smiling_face:.
Может в тексте знак “>” всё же поменять на "</> " . Глядишь понятней станет.