Дребезг при работе сервомашинки

sedeca
Offline
Зарегистрирован: 16.07.2012

И вновь проблемма. Задача прежняя. Две сервомашинки отрабатывают по очереди. Управляю ими с помощью ардуино уно. Ардуно запитанно напрямую от аккумулятора Li ION 7.4 В 1400 мАч. От этого же аккумулятора через стабилизатор L7805 запитанны машинки. При работе программы сервомашинка отрабатывающая горизонталь чудит. А именно при работе вертикальной сервомашинки, горизонтальная дребезжит (дергается) хотя управляющего на ней нет. Система таким макаром с дребезжащей горизонталью отрабатывает четверть цикла и уходит в разнос. Сервы вращаются нерперывно вобщем колапс. Думал дело в питании, но вертикальная сервушка работает на ура а горизонталь чудит. Менял сервушки менял плату результат тот же. От совета товарища maksim не откажусь. Программа ниже:

#include <Servo.h> 

Servo myservov;  // создаём объект для контроля сервы (вертикаль)
Servo myservog;  // создаём объект для контроля сервы (горизонталь)

int posv = 0;    // переменная для хранения позиции сервы (вертикаль)
int posg = 0;    // переменная для хранения позиции сервы (горизонталь)
int PhotoPin=9;  // переменная для фотопина

void setup() 
{ 
  myservog.attach(6);  // серва горизонтали подключена у 6-му пину
  myservov.attach(8);  // серва вертикали подключена у 7-му пину
  pinMode(PhotoPin, OUTPUT); // девятый пин на выход (управление фото)
  pinMode (13, OUTPUT);
  
 /////////////////////установки при включении//////////////////////
  delay(5000);                            // задержка при включении
  ///////////////////////главный цикл/////////////////////////////////
  myservog.write(10);                    // горизонтальную серву повернули на 10 градусов
  delay(1000);                           // ждем 1 с

  vertical();
  //////////////////////////////////////////////////////////////////
  myservog.write(20);                    // горизонтальную серву повернули на 20 градусов
  delay(1000);                           // ждем 1 с

  vertical();
  //////////////////////////////////////////////////////////////// 
  myservog.write(30);                    // горизонтальную серву повернули на 30 градусов
  delay(1000);                           // ждем 1 с

 vertical();
  //////////////////////////////////////////////////////////////// 
  myservog.write(40);                    // горизонтальную серву повернули на 40 градусов
  delay(1000);                           // ждем 1 с

  vertical();
  //////////////////////////////////////////////////////////////// 
  myservog.write(50);                    // горизонтальную серву повернули на 50 градусов
  delay(1000);                           // ждем 1 с

  vertical();
  //////////////////////////////////////////////////////////////// 
  myservog.write(60);                    // горизонтальную серву повернули на 60 градусов
  delay(1000);                           // ждем 1 с

  vertical();
  //////////////////////////////////////////////////////////////// 
  myservog.write(70);                    // горизонтальную серву повернули на 70 градусов
  delay(1000);                           // ждем 1 с

  vertical();
  //////////////////////////////////////////////////////////////// 
  myservog.write(80);                    // горизонтальную серву повернули на 80 градусов
  delay(1000);                           // ждем 1 с

  vertical();
  //////////////////////////////////////////////////////////////// 
  myservog.write(90);                    // горизонтальную серву повернули на 90 градусов
  delay(1000);                           // ждем 1 с

  vertical();
  ////////////////////////////////////////////////////////////////
  myservog.write(100);            // горизонтальную серву повернули на 100 градусов
  delay(1000);                           // ждем 1 с

  vertical();
  //////////////////////////////////////////////////////////////// 
  myservog.write(110);               // горизонтальную серву повернули на 110 градусов
  delay(1000);                           // ждем 1 с

  vertical();
  ////////////////////////////////////////////////////////////////  
  myservog.write(120);               // горизонтальную серву повернули на 120 градусов
  delay(1000);                           // ждем 1 с

  vertical();
  ////////////////////////////////////////////////////////////////
  myservog.write(130);               // горизонтальную серву повернули на 130 градусов
  delay(1000);                           // ждем 1 с

 vertical();
  ////////////////////////////////////////////////////////////////
  myservog.write(140);               // горизонтальную серву повернули на 140 градусов
  delay(1000);                           // ждем 1 с

 vertical();
  ////////////////////////////////////////////////////////////////
  myservog.write(150);               // горизонтальную серву повернули на 150 градусов
  delay(1000);                           // ждем 1 с

 vertical();
  //////////////////////////////////////////////////////////////// 
  myservog.write(160);               // горизонтальную серву повернули на 160 градусов
  delay(1000);                           // ждем 1 с

  vertical();
  //////////////////////////////////////////////////////////////// 
    for(posg = 160; posg>=0; posg-=1)      // вернули горизонтальную серву в 0 градусов
  {                                
    myservog.write(posg);               
    delay(50);                     
  }  
digitalWrite (13, HIGH);               // зажгли светодиод
delay(60000);                          // горит минуту  
digitalWrite (13, LOW);                // тухнет 
delay(60000);                          // ждем минуту  
} 

void loop() {

}

void vertical()
{  for(posv = 0; posv < 160; posv += 20)  // вертикальную серву с шагом 20 прогнали до 160 град
  {                                     
    myservov.write(posv);               // 
    delay(1000);                        // ждём 1000 с пока серва займёт новое положение
    //shoot();
  } 
    for(posv = 160; posv>=0; posv-=20)      // вернули горизонтальную серву в 0 градусов
  {                                
    myservov.write(posv);               
    delay(50);                     
  }   
} 
  void shoot()
{
 digitalWrite(PhotoPin, HIGH);   // включает светодиод
 delay(1000);                  // ждет секунду
 digitalWrite(PhotoPin, LOW);    // выключает светодиод
 delay(1000);     
 digitalWrite(PhotoPin, HIGH);   // включает светодиод
 digitalWrite(PhotoPin, LOW);    // выключает светодиод
 delay(2000);     
}

 

sedeca
Offline
Зарегистрирован: 16.07.2012

 Поправка. В разнос система уходить перестала а вот дребезг остался.

leshak
Offline
Зарегистрирован: 29.09.2011

> хотя управляющего на ней нет

Вы ошибаетесь. Есть. И серва все время пытается "удерживать заданную позицию". Что-бы его действительно убрать и серва выключилась, нужно сделать myservog.detach();

Ну и, естественно, не забыть потом, опять сделать attach, перед тем как опять ее решим поворачивать.

И еще, немного не понятно. Зачем вы набивали такую простыню стороки 20-98? Почему не циклом? Тем более что в строках 116-121 вы показали что явно знаете "как это делать".

sedeca
Offline
Зарегистрирован: 16.07.2012

 

myservog.attach(6);
myservog.write(10); // горизонтальную серву повернули на 10 градусов
delay(1000); // ждем 1 с
myservog.detach();
vertical();

leshak ваш метод возмутителен. Серва отказалась от дальнейшего сотрудничества. )

 

leshak
Offline
Зарегистрирован: 29.09.2011

 Вы бы лучше, вместо возмущения, целиком код свой показали. Метод проверен на себе (вообщем-то и нашел такое решение, когда меня самого раздражал звук работающей сервы стоящей в одном положении). Да и на форуме этот совет другим помогал уже не один раз.

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

sedeca
Offline
Зарегистрирован: 16.07.2012

Все сработало на ура. В мир иной пока отошел только я.

maksim
Offline
Зарегистрирован: 12.02.2012

sedeca пишет:
myservog.attach(6);
myservog.write(10); // горизонтальную серву повернули на 10 градусов
delay(1000); // ждем 1 с
myservog.detach();
vertical();

leshak ваш метод возмутителен. Серва отказалась от дальнейшего сотрудничества. )

Я так понимаю в цикл ничего не свернули и detach() поставили только на первые 10 градусов.... отсюда и не работает. 

leshak вам все правильно говорит - сверните в цикл.

А дергаться она может из-за того что ваша маленькая серва вращает весь вес головки с фотоаппаратом и естественно не может справться с такой инерцией, да еще и к тому же серва аналоговая. И как раз один из способов с этим бороться - это убирать в нужный момент управляющий сигнал detach(), а когда опять нужно повернуть серву включать управляющий сигнал myservog.attach(6), как вам и написал выше leshak.

Ardfun
Offline
Зарегистрирован: 22.05.2016

А можно ли избежать отработки сервы при включении, то есть когда включаешь питание серва немного дергается на пару градусов а потом назад, то возможно ли чтобы при включении серва стояла на месте?

vvadim
Offline
Зарегистрирован: 23.05.2012

подключайте питание после формирования управляющего сигнала

Сергей П
Сергей П аватар
Offline
Зарегистрирован: 16.12.2016
#include <Servo.h>

  Servo servo;

  int pult=6;
  int flag=0;

  void setup() {
    
  pinMode(pult, INPUT);
  servo.attach(7);
  servo.write(0);
  }
  void loop() {

  if(digitalRead(pult)==HIGH&&flag==0){
   servo.write(90);
   flag=1;
  }
  if(digitalRead(pult)==LOW&&flag==1)  {
   servo.write(0);
   flag=0;
  }
  }

 

Сергей П
Сергей П аватар
Offline
Зарегистрирован: 16.12.2016

vvadim пишет:

подключайте питание после формирования управляющего сигнала

 

Здравствуйте! можно об этом  подробнее....

mexanic38
Offline
Зарегистрирован: 26.02.2018

У меня тоже были проблемы с дребезгом сервомотора.

Решил проблему так, прежде чем шевельнуть серву, спроси у нее, совпадает ли ее положение сейчас с новым.

если да, то откючить,если нет то включить и повернуть/

 if(ser==(servo.read()))
 {
 servo.detach();//откл сервопривод
}
else
{
 servo.attach(12);//ВКЛ сервопривод
}
Morroc
Offline
Зарегистрирован: 24.10.2016

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