Сервоприводы не работают должным образом с джойстиком
Итак, я работал над проектом, в котором я использовал модуль джойстика для управления двумя сервоприводами одновременно. Джойстик управляет сервоприводами таким образом, что когда джойстик перемещается по оси x, оба сервопривода перемещаются в одном направлении, но когда джойстик перемещается по оси y, сервоприводы перемещаются в разных направлениях. У меня есть эта программа:
#include <Servo.h>
Servo servo1;
Servo servo2;
int joyx = 0;
int joyy = 5;
int joyval;
int joyvalx;
int joyvaly;
void setup() {
Serial.begin(9600);
servo1.attach(3);
servo2.attach(5);
}
void loop() {
Serial.println(joyvalx + "," + joyvaly);
int x = analogRead(joyx);
int y = analogRead(joyy);
if(x != joyvalx){
joyval = map(x, 0, 1023, 0, 180);
servo1.write(joyval);
servo2.write(joyval);
}
if (y != joyvaly){
joyval = map(y, 0, 1023, 0, 180);
servo1.write(joyval);
servo2.write(1023-joyval);
}
}
Однако сервоприводы, похоже, работают неправильно. Один сервопривод работает нормально, а другой просто застревает. Кроме того, если я использую код только для одного направления (ось x или y), удалив код для другого, то оба сервопривода работают хорошо. Я не могу понять проблему. Если кто-то понимает, пожалуйста, помогите мне.
@Faiq Irfan, 👍2
1 ответ
Лучший ответ:
Проблема, как указал jsotola, в том, что ваш код очень быстро записывает совершенно разные значения в сервоприводы. Вы не объединяете два значения с джойстика, а просто перезаписываете предыдущее значение сервопривода. Так что это не может работать.
Как я понимаю ваше описание, вы хотите, чтобы ось x перемещала оба сервопривода на одинаковую величину в одном направлении (в единстве), в то время как ось y определяет разницу в положении между ними. Если вы перемещаете ось y в одну сторону, первый сервопривод немного повернет по часовой стрелке, а другой немного против часовой стрелки. Когда вы затем перемещаете ось x, оба сервопривода будут перемещаться в соответствующем направлении, сохраняя при этом разницу в положении.
Лучше сначала написать формулу, как вы будете рассчитывать каждое положение сервопривода из заданных значений джойстика. Вышеуказанное поведение можно описать этими формулами:
servo_1_value = mapped_x + mapped_y;
servo_2_value = mapped_x - mapped_y;
Теперь вам нужно соответствующим образом сопоставить значения джойстика:
mapped_x = map(x, 0, 1023, 0, 180);
mapped_y = map(y, 0, 1023, -90, 90);
Обратите внимание, что вам следует изменить параметры для отображения y
на нужные вам значения. В приведенном выше коде они установлены на максимум (это означает, что перемещение оси y в любой конец фактически отключит ось x, поскольку сервопривод не может двигаться дальше 0 или 180 градусов).
Вам не нужно проверять, изменилось ли значение. Но если вы действительно хотите, вам следует проверить вычисленные значения для каждого сервопривода отдельно. Что-то вроде этого:
if(servo_1_value != old_servo_1_value){
servo1.write(servo_1_value);
}
if(servo_2_value != old_servo_2_value){
servo2.write(servo_2_value);
}
Но вам на самом деле не нужно проверять наличие изменений здесь.
- Как заставить сервопривод вращаться на угол больше 180°
- Подключение Arduino к сервоприводу с внешним источником питания
- Мой сервопривод не работает плавно
- Бесполезная проводка коробки и код
- Почему сервопривод не перемещается по углам должным образом
- Микро сервопривод не работает с Arduino UNO
- поворот позиционного серводвигателя более чем на 180 градусов
- Почему loop() останавливается?