Не поворачивает и дребезжит сервопривод mg996r

Тема в разделе "Моторы, сервоприводы, робототехника", создана пользователем VladimirSob, 21 окт 2020.

  1. VladimirSob

    VladimirSob Нуб

    Здравствуйте.

    Хотел бы задать вопрос по сервоприводам MG996R кругового вращения – есть проблема при повороте, то есть при servo.write(180) серво просто дребезжит, если поворачивать в другую сторону (servo.write(0)) все работает отлично. Методом проб и ошибок обнаружил, что сервоприводы (3 штуки, приобретал в разных магазинах, от смонтировал два) поворачиваются только при значениях servo.write(101-103) и то, на разных сервах по разному (один более-менее работает при 103 другой уже дребезжит при 103 ).
    То есть:
    0-89 – поворачивает как надо,
    90 – стоит (удержание),
    91-100 – дребезг,
    101-103 – более-менее работает,
    104-180 – дребезг.

    Я не могу понять, почему так? Также, если отключить от сети сервы и дать им "остыть", после включение даже при 101-103 не хотят работать - просто дребезг.

    Мой код:
    Код (C++):
    #include <Servo.h>

    unsigned long timing;

    Servo servoTop;
    Servo servoBottom;

    int joyX = 0;
    int joyY = 1;

    int servoVal;

    void setup()
    {
      Serial.begin(9600);
      pinMode(joyX, INPUT);
      pinMode(joyY, INPUT);


      servoTop.attach(3);
      servoBottom.attach(5);
    }

    void loop()
    {
    servoVal = analogRead(joyX);
    if(servoVal < 517)
    {
      servoTop.write(103);
    }
    else if(servoVal > 518)
    {
      servoTop.write(86);
    }
    else
    {
      servoTop.write(90);
    }

    servoVal = analogRead(joyY);
    if(servoVal < 503)
    {
      servoBottom.write(102);
    }
    else if(servoVal > 503)
    {
      servoBottom.write(85);
    }
    else
    {
      servoBottom.write(90);
    }

    }
    Видео работы:


    Заранее спасибо!
     
  2. b707

    b707 Гуру

    прелестная конструкция:
    Код (C++):
    if(servoVal < 503)
    {
      servoBottom.write(102);
    }
    else if(servoVal > 503)
    {
      servoBottom.write(85);
    }
    else
    {
      servoBottom.write(90);
    }
    Я бы сказал бескомпромиссная :) Допустимо только 503, шаг влево шаг вправо - приравнивается к побегу :)
    Автор. а вы значения. что идут с аналогового пина - проверяли? Этот код у вас просто умучает сервы непрерывными дерганиями...
    Думаю, потому они у вас и подгорают. что вы их с частотой сотни раз в секунду гоняете между 85 и 102 градусами...

    Вы о гистерезисе слышали что-нить? - найдите в гугле, почитайте... примените к своему коду
     
  3. VladimirSob

    VladimirSob Нуб

    Здравствуйте. Спасибо за ответ.
    Да, знаю, быдло-код, но только эта "конструкция" дала хоть какой-то результат.
    Сначала я пробивал отсюда:


    К сожалению, не сработало :( И значения с ан. пинов проверял.
     
  4. b707

    b707 Гуру

    причем тут быдло-код? Какого результата вы не могли достичь?
    Вы сути ответа не поняли. У вас проблема не в коде, а в логике. Слово гистерезис в словарике нашли?
    Не надо реагировать на любое изменение аналогового сигнала - так вы получаете постоянное "елозенье" серв вокруг нулевой точки. задайте какие-то диапазоны пошире...
    Или вы в принципе в этом коде ничего не понимаете и просто копируете в скетч незнакомые слова?
     
    Последнее редактирование: 22 окт 2020
  5. parovoZZ

    parovoZZ Гуру

    сова правильно говорит:
    Программа в МК реализует определённый алгоритм работы. Прежде, чем что-то программировать, необходимо составить этот алгоритм. Если его нет, то и браться за программирование не нужно.