Здравствуйте товарищи, Ардуино знаю только поверхностно, но появилась необходимость в создании пульта ДУ и приемника.
Элементы:
arduino mini pro
Nrf24l01
Сервоприводы
Джойстик
Суть задумки
Пульт состоящий из Ардуино мини, передатчика и джойстика общается с приемником, на приемнике 2 сервопривода х у вращения, не получается заставить их вращаться, но при этом кнопка джойстика ещё должна переводить в запоминание сектора, например на 90°нажимаем кнопку, ведём до 120° и отпускаем, пока мы управляем джойстиком, все как обычно повороты в право в лево вверх вниз, но когда не трогаем джойстик, то включается память и серво начинают ходить по запомненному сектору туда обратно, по сути запоминать нужно только х.
Может ли кто помочь с програмной частью?
Буду очень благодарен
#include <SPI.h>
#include <RF24.h>
RF24 radio(9, 10); // CE, CSN пины для nRF24L01
const int joystickXPin = A; // Пин для оси X джойстика
const int joystickYPin = A1; // Пин для оси Y джойстика
const int buttonPin = 2; // Пин для кнопки джойстика
int savedAngleX = ; // Переменная для хранения запомненного угла X
int savedAngleY = ; // Переменная для хранения запомненного угла Y
bool buttonPressed = false; // Флаг для отслеживания состояния кнопки
struct DataPackage {
int angleX;
int angleY;
};
void setup() {
pinMode(buttonPin, INPUT_PULLUP); // Устанавливаем кнопку как вход с подтяжкой
Serial.begin(960); // Инициализация последовательного порта
radio.begin(); // Инициализация nRF24L01
radio.openWritingPipe(xFFFFE1LL); // Установите адрес для передачи
radio.setPALevel(RF24_PA_HIGH); // Установите уровень мощности
}
void loop() {
int joystickXValue = analogRead(joystickXPin); // Читаем значение оси X
int joystickYValue = analogRead(joystickYPin); // Читаем значение оси Y
// Преобразуем значения в угол (например, от до 180)
int angleX = map(joystickXValue,0 , 1023,0 , 180);
int angleY = map(joystickYValue, 0, 1023, 0, 180);
// Проверяем состояние кнопки
if (digitalRead(buttonPin) == LOW && !buttonPressed) { // Если кнопка нажата
savedAngleX = angleX; // Запоминаем угол X
savedAngleY = angleY; // Запоминаем угол Y
buttonPressed = true; // Устанавливаем флаг
Serial.print("Углы запомнены: X=");
Serial.print(savedAngleX);
Serial.print(", Y=");
Serial.println(savedAngleY);
} else if (digitalRead(buttonPin) == HIGH) {
buttonPressed = false; // Сбрасываем флаг, когда кнопка отпущена
}
// Если джойстик не двигается (в пределах допустимого диапазона)
if (abs(joystickXValue - 512) < 50) { // 50 - это допустимый диапазон
angleX = savedAngleX; // Устанавливаем запомненный угол X
}
if (abs(joystickYValue - 512) < 50) { // 50 - это допустимый диапазон
angleY = savedAngleY; // Устанавливаем запомненный угол Y
}
// Отправляем данные
DataPackage data;
data.angleX = angleX;
data.angleY = angleY;
radio.write(&data, sizeof(data)); // Отправляем углы
Serial.print("Текущие углы: X=");
Serial.print(angleX);
Serial.print(", Y=");
Serial.println(angleY); // Печатаем текущие углы
delay(100); // Задержка для стабильности
}
Приемник
#include <RF24.h>
#include <Servo.h>
RF24 radio(9, 10); // CE, CSN пины для nRF24L01
Servo servoX; // Серво для оси X
Servo servoY; // Серво для оси Y
struct DataPackage {
int angleX;
int angleY;
};
int currentAngleX = ; // Текущий угол X
int currentAngleY = ; // Текущий угол Y
int savedAngleX = ; // Запомненный угол X
int savedAngleY = ; // Запомненный угол Y
unsigned long lastMoveTime = ; // Время последнего движения
const unsigned long moveInterval = 100; // Интервал движения по запомненному сектору
void setup() {
servoX.attach(3); // Подключаем сервопривод X к пину 3
servoY.attach(5); // Подключаем сервопривод Y к пину 5
Serial.begin(960); // Инициализация последовательного порта
radio.begin(); // Инициализация nRF24L01
radio.openReadingPipe(1, xFFFFE1LL); // Установите адрес для приема
radio.setPALevel(RF24_PA_HIGH); // Установите уровень мощности
radio.startListening(); // Начинаем слушать
}
void loop() {
if (radio.available()) { // Если есть доступные данные
DataPackage data;
radio.read(&data, sizeof(data)); // Читаем данные
// Устанавливаем углы для сервоприводов
currentAngleX = data.angleX;
currentAngleY = data.angleY;
// Запоминаем углы
savedAngleX = currentAngleX;
savedAngleY = currentAngleY;
Serial.print("Полученные углы: X=");
Serial.print(currentAngleX);
Serial.print(", Y=");
Serial.println(currentAngleY); // Печатаем полученные углы
} else {
// Если нет данных, движемся по запомненному сектору
if (millis() - lastMoveTime > moveInterval) {
servoX.write(savedAngleX);
servoY.write(savedAngleY);
lastMoveTime = millis(); // Обновляем время последнего движения
}
}
// Устанавливаем углы для сервоприводов
servoX.write(currentAngleX);
servoY.write(currentAngleY);
}```