Заставить серводвигатели двигаться более плавно с помощью джойстика? - PullRequest
0 голосов
/ 25 февраля 2019

Так что я делаю штуковину типа «турель», используя два серводвигателя, управляемых джойстиком.Код, который я запускаю, работает, однако он очень резкий и не очень хорошо перемещается, особенно по диагональным линиям.Мой код выглядит следующим образом:

#include <Servo.h>
#define LASER 11

int x = 0;

Servo servo_1;  // create servo object to control a servo
Servo servo_2;

// Arduino pin numbers
const int SW_pin = 2; // digital pin connected to switch output
const int X_pin = 0; // analog pin connected to X output
const int Y_pin = 1; // analog pin connected to Y output

int butt;
int joy_val;

void setup() {
  pinMode(SW_pin, INPUT);
  digitalWrite(SW_pin, HIGH);
  servo_1.attach(9);// attaches the servo on pin 9 to the servo object
  servo_2.attach(10);
  pinMode(LASER, OUTPUT);
  digitalWrite(LASER, HIGH);
  Serial.begin(9600);
}

void loop() {
  joy_val = analogRead(X_pin); // reads the value of joystick (between 0-1023)
  joy_val = map(joy_val, 0, 1023, 0, 180); // servo value between 0-180
  servo_1.write(joy_val); // sets the servo position according to the joystick value
  delay(150);

  joy_val = analogRead(Y_pin); // reads the value of joystick (between 0-1023)
  joy_val = map(joy_val, 0, 1023, 0, 180); // servo value between 0-180
  servo_2.write(joy_val); // sets the servo position according to the joystick 
value
  delay(150);
  delay(15);

  butt = digitalRead(SW_pin);

  if (butt == LOW){
    x = true;
  }

  if (x == true){
    digitalWrite(LASER, LOW);
    Serial.print(x);
  }
}

Я был бы очень признателен за любой совет или помощь, я довольно новичок в Arduino:)

1 Ответ

0 голосов
/ 26 февраля 2019

Сервоприводы маленькие и легкие и пытаются перемещаться в положение, о котором вы им говорите, как можно быстрее.Джойстики также могут очень быстро менять значения, и они также могут быть затруднены.В результате ваши сервоприводы постоянно совершают множество маленьких быстрых движений, которые могут сделать револьверную головку дергающейся.

Я могу придумать два варианта, и вы можете сделать оба:

  1. Сглаживание входов джойстика с помощью фильтрации нижних частот.Обычно это просто означает использование средневзвешенного значения текущих и предыдущих значений.Идея состоит в том, чтобы устранить плохие показания или два, которые могут произойти из-за грязных контактов в потенциометре.

  2. Сгладьте движение.Вместо того, чтобы немедленно пытаться переместить сервоприводы непосредственно в текущие позиции джойстиков, переместите их в направлении целевой позиции.На каждой итерации цикла они будут приближаться к целевой позиции вместо того, чтобы пытаться прыгнуть туда почти мгновенно.

Для # 2 есть пара подходов, которые мне нравится использовать.

Один из них - просто использовать средневзвешенное значение текущей позиции сервопривода и целевой позиции.Если вы перемещаете джойстик на значительное расстояние, турель будет быстро поворачиваться, но замедляться по мере приближения к целевому положению.

Другой способ - использовать физическую модель.Представьте себе создание вектора силы, который указывает от текущего положения сервоприводов к целевому положению джойстиков и пропорционален расстоянию между ними.Примените эту силу к текущей точке.Также примените «силу трения», которая противостоит скорости текущей точки.Численно интегрируйте скорость и положение в петле.Если вы внезапно переместите джойстик в новое положение, турель будет ускоряться к нему, а затем замедляться по мере приближения к нему.Регулировка констант, используемых для вычисления сил, позволит вам контролировать, насколько «тяжелым» кажется механизм.

...