дергается серво. в чем причина?

Тема в разделе "Arduino & Shields", создана пользователем Толик Иванов, 3 янв 2016.

  1. Толик Иванов

    Толик Иванов Administrator Администратор

    у меня есть серво на 9 пине, есть условие при выполнении которого серва должна повернуться в позицию 45, в противном случае вернуться обратно в 0.
    Код (C++):
    if(){

    pos=45;
    myservo.write(pos);
    } else {
      pos=0;
    myservo.write(pos);
    }
    после того как серво провернулась на 45 градусов и остановилась, он периодически подергивается.
    если возвращается в 0 то тоже незначительно дергается.
    на угол поворота это не влияет но шум посторонний издает.
    необходимо чтоб она поворачивалась и замерла на месте до изменения результатов условия.
    в чем может быть проблема и как ее решить?
     
  2. DrProg

    DrProg Вечный нерд

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

    Для начала попробуйте настройки attach покрутить, не доверяйте слепо дефолтным. Если не получится, рисуйте схему сюда и характеристики компонентов.
     
    Tomasina, Толик Иванов и ИгорьК нравится это.
  3. Onkel

    Onkel Гуру

    сброс предделителя нужно обязательно делать перед включением отсчета времени импульса , и посмотреть, не играется ли кто еще в программе с предделителем и (или) таймером.
     
  4. Толик Иванов

    Толик Иванов Administrator Администратор

    у меня в программе стоит повышение частоты шим с помощью вот этой строки в сетапе:
    TCCR0B = TCCR0B & B11111000 | B00000001;
    из этой таблицы: https://arduino-info.wikispaces.com/Arduino-PWM-Frequency

    повышал частоту чтоб шим не пищал на вентиляторе и из таблицы видно что повысить должно только на 5 и 6 пинах, а серва подключена к 9му. из-за этого может дергаться?
     
    Последнее редактирование: 3 янв 2016
  5. DrProg

    DrProg Вечный нерд

    Нет, причина в другом. Пробовали то, о чем я писал ввше?
     
    ИгорьК нравится это.
  6. Толик Иванов

    Толик Иванов Administrator Администратор

    схема самая обычная. подключил к 9 пину и два провода на питание.
    Ваше предложение по поводу настройки attach, я возможно толком изучить не смог, так как не альо по английски. нашел вариант на русском :
    http://arduino.ru/Reference/Library/Servo/attach
    где есть такой вот Синтаксис
    servo.attach(pin)
    servo.attach(pin, min, max)

    я так понимаю что под настройкой attach Вы имеете ввиду именно указание значений мин и макс?
    или настройка кроется гдето более глубоко? например в библиотеке серво?
     
  7. Толик Иванов

    Толик Иванов Administrator Администратор

    попробывал после myservo.write(); поставить делей на пару секунд
    так во время делей серва не дергается. но после делей начинает опять дергаться.
    скажу что работает серва с датчиками температуры и в зависимости от их показаний открывает или закрывает дверцу с серво.
    Код (C++):
    void loop() {
       myservo.write(pos);
       ds.requestTemperatures(); // считываем          температуру с датчиков
     
       tcurentin = ds.getTempC(sensor1);
       tcurentout = ds.getTempC(sensor2);

       if(tcurentin>tmin&&servoActive==0){
        pos= 45;
        servoActive=1;
    }

    if(tcurentin<tmin&&servoActive==1) {
        pos= 0;                              
        servoActive=0;
    }
     
  8. Onkel

    Onkel Гуру

    а может показания температуры дергаются, вот и серва дергается? введити минимальную дельту, меньшую шума. Показания температуры посмотрите, например выведя в терминал.
     
  9. Толик Иванов

    Толик Иванов Administrator Администратор

    у меня показатели выводятся на дисплей, серва в 45 при 23,например, а обратно при 21. два градуса разницы специально чтоб не дергалась, но и дерганья не из 0 к 45 а просто, шестерни то напрягаются то отпускаются. пробывал сделать зависимость от времени
    если секунды равны 20 то серва в 45 если секунды равны 50 то серва в 0.
    ничего не получилось
    так же дергается... пробывал без увеличения частоты шим. тоже не помогло.
     
  10. Onkel

    Onkel Гуру

    а при чем тут шим? посылайте импульс на серву не постоянно, а только при изменении положения. Ну и с предделителем, как я советовал, посмотрите - сбрасывается ли он?
     
  11. Толик Иванов

    Толик Иванов Administrator Администратор

    так тоже делал, записывал значение только после изменения. После записи неравномерно дергается, как будто чтото дает микро сигналы и они долбят серво.
     
  12. Onkel

    Onkel Гуру

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

    Onkel Гуру

    пы сы перед вызовом функции meservo... попробуйте (пример если функция использует таймер 2)

    TCNT2=0; // Cбрасываем счетчик таймера
    GTCCR|=0x02;// сбрасываем предделитель таймера. ОЧЕНЬ ВАЖНО!!!

    ну и не знаю, может какие префиксы надо в ide ардуины поставить, чтобы эти команды были выполнены. Если myservo(.... использует другие таймеры,то команды должны быть для других таймеров.
     
  14. EvilGrym

    EvilGrym Нуб

    Господа!
    Ардуино это слаботочная платка. Сервопривод это суть коллекторный двигатель . Пусковой ток у него на грани короткого замыкания. Ардуино тупо не выдает нужный ток для того чтобы надежно стронуть рульмашинку и перевести её в надлежащее положение. При пуске идет просадка по напряжению и всю систему начинает глючить.

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

    Короче, подводя итог: Рульмашинка ( она же сервопривод) должны питаться от мощного источника, а от ардуины получать только сигнал. ( вот прям щас сижу и долблюсь с милипусечной рульмашинкой TowerPro Micro Servo SG90) При питании от ардуино её плющит, таращит и колбасит в разные стороны мелкой дрожью как алконафта с бодунищща. Запитал от UBEC HobbyWing 3A MAX 5A - проблема исчезла. Работает как положено.
     
  15. ИгорьК

    ИгорьК Гуру

    Хороший труд, "опыт, сын ошибок трудных". Интересно, вы читали вики?
     
    issaom, parovoZZ и ДеКодер нравится это.
  16. avrorel

    avrorel Нерд

    Сам столкнулся с такой проблемой когда в одной программе была работа с сервой и "умными" светодиодами на ws2812, сначала использовал библиотеку adafruit neopixel, серва дергалась после поворота на любой градус, стоило убрать из кода работу со светодиодами и все было в порядке (питания хватало), перешел на FastLed, проблема на время исчезла. Начал работать с аналоговым считыванием, опять начало дергаться именно когда вызывается функция аналогового считывания, уже думал повесить полевик на какой-нибудь пин и после каждого поворота обрубать питание серве. Но что-то подобное можно сделать программно используя функцию
    Код (C++):
    myservo.detach();
    . И затем перед каждым поворотом опять подключать пин ардуины на серву
    Код (C++):
    myservo.attach(9);
    .
    В общем виде выглядит как-то так,
    Код (C++):
    void loop() {
        myservo.attach(9);   // на 9м пине
        myservo.write(60);   // поворот сервы
        myservo.detach();    // отключение сервы
    }
    Так же конечно можно покопаться в файле Arduino\libraries\Servo\src\avr\ServoTimers.h и переназначить таймер (смотря какая ардуино), но это уже совсем другая история.
     
    NikitOS и Daniil нравится это.
  17. NikitOS

    NikitOS Король шутов Администратор

    А к чему все это?