Вибрация сервопривода.

AiR_WiZArD
Offline
Зарегистрирован: 27.03.2017


Написал скетч для манипулятора, все работает, сервы крутятся. Однако после запуска серво двигатели начинают вибрировать и вся конструкция шатается. Как можно стабилизировать программно? Питание от 2х банок 18600 соединеных последовательно.

Скетчик:

#include <Servo.h>;
const int pinX = A4;
const int pinY = A5;
Servo Osnova;
Servo Val1;
Servo Val2;
int Val1Data;
int Val2Data;
const int OsnovaData = A3;

void setup() {
  Val1.attach(14);
  Val2.attach(15);
  Osnova.attach(16);
  pinMode(pinX, INPUT);
  pinMode(pinY, INPUT);
  pinMode(OsnovaData, INPUT);
  Serial.begin(9600);
  Osnova.write(90);
  Val1Data = 90;
  Val2Data = 90;
}

void loop() {
  int Z = analogRead(OsnovaData);
  int X = analogRead(pinX);
  int Y = analogRead(pinY);
  X = X / 400;
  Y = Y / 500;
  Z = Z * 10 / 56;
  Serial.print(Val2Data);
  Serial.print("\t");
  Serial.print(Z);
  Serial.print("\t");
  Serial.println(Val1Data);
  if (X == 0 & Val1Data < 160) {
    Val1Data++;
  } else if (X == 2 & Val1Data > 0) {
    Val1Data--;
  }
  if (Y == 0 & Val2Data < 180) {
    Val2Data++;
  } else if (Y == 2 & Val2Data > 0) {
    Val2Data--;
  }
  Osnova.write(Z);
  Val1.write(Val1Data);
  Val2.write(Val2Data);
  delay(20);
}

 

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

а так? delay(1488);

md750
Offline
Зарегистрирован: 30.03.2017

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

AiR_WiZArD
Offline
Зарегистрирован: 27.03.2017

Сервы самые дешевые, SG90

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Хотите избавиться от вибрации - избавляйтесь от библиотеки servo.h.

md750
Offline
Зарегистрирован: 30.03.2017

Не соглашусь, что причиной вибрации "дрожжания" серво является библиотека. sg90 самые китайские аналоговые сервомашинки. Они в принципе имеют люфты плохо совместимые со внутренним энкодером.

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

AiR_WiZArD
Offline
Зарегистрирован: 27.03.2017

Колебаний значений нет, проверил. Пляшет только основа (ось Z), остольные только вибрируют. Если зафиксировать манипулятор в одном положении, то все затихает, но стоит только подергать стик и покрутить потенциометр - все начинает трясти.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

md750 пишет:

Не соглашусь, что причиной вибрации "дрожжания" серво является библиотека.

Ну, соглашаться или нет - это личное дело каждого.

Реальное же состояние дел заключается в том, что даличие двух обстоятельств:

- пограшность позиционирования сервы,

- принцип работы библиотеки servo,

приводят к вибрации.

Достаточно устранить хотя бы одно из двух указанных обстоятельств, чтобы дрожание прекратилось.

Фактически из двух способов устранения дрожания один является программным, а другой - аппаратным. 

Т.е. программно устранить вибрацию можни лишь, отказавшись от библиотеки.

md750
Offline
Зарегистрирован: 30.03.2017

AiR_WiZArD пишет:

Колебаний значений нет, проверил. Пляшет только основа (ось Z), остольные только вибрируют. Если зафиксировать манипулятор в одном положении, то все затихает, но стоит только подергать стик и покрутить потенциометр - все начинает трясти.

В статике может не быть колебани значений, вопрос в динамике. Если построить график по изменению входных данных, то  он может плавно нарастать/уменьшаться либо с "зубцами" на графике. Они скорее всего есть. В коде ни каких сглаживаний входных параметров нет. По этому напрашивается предположение о нестабильности входных значений, которые можно подавить каким либо программным алгоритмом.

При вычислении угла поворота вы оперируете углом поворота, т.е. 180 значениями, если использовать ширину импульса примерно от 1000 до 2000, то точность управления будет выше примерно раз в 5 соответсвенно рывки/погрешности при установке угла будут болле точно соответствовать входным данным. Возможно для аналоговой сервы это не актуально, но для цифровой будет в самый раз.

Как можно избавиться от дрожжания серв отказом от использовании штатной библиотеки я не знаю.

Возвращаясь к самой серве. В разных источника данные по крутящему моменту отличаются от 1.3 до 2 кгсм. Я проверял несколько серв кулпенных в разное время у разных поставщиков, максимум, что удалось получить 1кг при 6 вольтах и токе 0.7А с последующим выбрасыванием серв, т.к. пластиковые шестерни заминались на этих нагрузках и появлялись большые люфты в редукторе. Реально сервы работали при нагрузке до 0.5 кг, при нагрузках выше начиналась "вибрация", т.к. серве не хватало момента для передачи усилия.

AiR_WiZArD
Offline
Зарегистрирован: 27.03.2017

Нагрузка маленькая, около 100г. Убрать рывки получилось отключением сервы во время бездействия.

if (ZOld == Z) {
    Val3.attach(0);
  } else {
    Val3.attach(16);
    Val3Data = Z;
  }

Но вот как решить проблему с другими... Там все сложнее. Отключать нельзя, держать ничего не будет, а с дребежанием мириться не хочется.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

дребезжание это потому что нагрузка поворачивает серву, а серва пытается ее удержать