Доброго времени суток! Реализована связь между ардуино 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);
}
}
}
‘’’