Библиотека плавного сервоуправления

Кто-нибудь знает о библиотеке Arduino для плавного управления сервоприводом?

У меня есть особенно быстрый сервопривод, которым легко управлять с помощью встроенной библиотеки Arduino Servo. Однако библиотека не поддерживает пропорциональное управление. Вы указываете положение, и сервопривод немедленно переходит в это положение так быстро, как только может. С моим сервоприводом это создает невероятно быстрые рывки.

Я нашел несколько алгоритмов интерполяции плавного движения сервопривода путем генерации небольших пошаговых изменений сигнала с течением времени. Мне удалось преобразовать это в какой-то код Arduino, и, хотя движение стало намного медленнее, оно все равно очень дерганное.

Я искал чистую реализацию Arduino, но ничего не нашел. Кто-нибудь знает о реализации? Мне трудно поверить, что никто раньше не сталкивался с такой проблемой управления сервоприводом на Arduino.

, 👍1


3 ответа


5

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

Кроме того, добавив конденсатор емкостью 100 мкФ между 5 В и GND, конденсатор поможет снизить внезапный скачок, который может возникнуть, когда сервопривод начинает вращаться впервые. Этот скачок вызван тем, что сервопривод запрашивает больше тока, когда сервопривод не движется.

#include <Servo.h>   //сервобиблиотека
Servo myservo;       //сервообъект
int previousAngle = 0;

const int potPin = A3; //контакт датчика

void setup() {
  myservo.attach(9);  //вывод данных сервопривода
  pinMode(potPin, INPUT); //контакт датчика как вход
}

void loop() {
  int val = analogRead(potPin);
  int angle = map(val, 0, 1023, 0, 180);

  if(angle>previousAngle)
  {
    for(int i=previousAngle; i<=angle; i++)
    {
      myservo.write(i); //повернуть сервопривод на 1 градус
      delay(10);        // задержка для плавности
    }
  }

  if(angle<previousAngle)
  {
    for(int i=previousAngle; i>=angle; i--)
    {
      myservo.write(i); //повернуть сервопривод на 1 градус
      delay(10);        // задержка для плавности
    }
  }

  previousAngle = angle;
}
,

Я думаю, что этот код должен работать с else if. Я сам создал тему, где я сделаю 4 кода сервопривода для робота-манипулятора, работающего правильно, отдавая вам должное за исходный код, конечно. Тем не менее вы получаете +1 за это и предложение конденсатора., @George Eco


5

Выполнив поиск под другим углом (используя ключевое слово "easing"), я нашел эту отличную библиотеку. По-видимому, эта задача более известна как «сервозамедление», а не сглаживание. Я протестировал его с сервоприводом для хобби, и он делает именно то, что мне нужно.

,

1

Искал в сети плавное движение сервоприводов, я нашел эту запись год назад.

В конце концов я создал для этой задачи новую библиотеку под названием ServoEasing.

,