Задержка при использовании сервы

audel
Offline
Зарегистрирован: 01.03.2012

Доброго времени суток!! Господа, подскажите где копать. Собственно подключил к дуине серву (скетч из примеров) подстроил под себя углы, но мне необходимо делать задержку в интервалах работы сервы.

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

 

#include <Servo.h> 
 
Servo myservo;  // create servo object to control a servo 
                // a maximum of eight servo objects can be created 
int pos = 0;    // variable to store the servo position 


void setup() 
{ 
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object 
}
 
void loop()

{
  
  for(pos = 0; pos < 78; pos += 1)  // goes from 0 degrees to 180 degrees 
  {                                  // in steps of 1 degree 
    myservo.write(pos);              // tell servo to go to position in variable 'pos' 
    delay(20);                       // waits 15ms for the servo to reach the position 
  } 
  for(pos = 78; pos>=1; pos-=1)     // goes from 180 degrees to 0 degrees 
  {                                
    myservo.write(pos);              // tell servo to go to position in variable 'pos' 
    delay(20);                       // waits 15ms for the servo to reach the position 
  }
 
 // delay (70000);  
} 

 

polk
Offline
Зарегистрирован: 13.03.2011

А если делать myservo.detach(); перед долгим delay, а после myservo.attach(9); обратно ?

 

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

>А если делать myservo.detach(); перед долгим delay, а после myservo.attach(9); обратно ?

Я, в свое время, именно так и боролся с раздражающим "гудением" сервы. У меня серва, после снятия управляющего PWM (myservo.detach()) выключалась (сохряняя текущую позицию) и спокойно продолжала работать после повторного attach.

Если же это не поможет (вдруг разные сервы по разному реагируют, хотя вряд ли) - можно попробовать питать ее не напрямую, а через, например, через ULN2003. И вырубать ее именно "питание".

audel
Offline
Зарегистрирован: 01.03.2012

Большое спасибо, сегодня обязательно попробую и отпишусь

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

 Единственный минус при "отключения сервы". Если на ней висит какой-то груз, который пытается ее "провернуть". То после detach (или выключение питания) - он получает шанс это сделать. Если пересилит трение ее редуктора. Раз мы ее "выключили", то она больше не сопротивляется внешним силам. Так что если ей нужно "сопротивлятся" что-бы удержать текущую позицию, вариантов кроме "стоять гудеть" - нет. Для "удержания веса" - нужен ток.

Если же серва просто, например, повернула какую-то стрелочку. Открыла заслонку и т.п. То можно ее "спокойно" выключать. Когда ее задача просто "изменить позицию".

Mastino
Offline
Зарегистрирован: 03.12.2011

А зачем выключать? Если серв нормальный - ничего не дрожит, не гудит и не греется.

audel
Offline
Зарегистрирован: 01.03.2012

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

ustas
Offline
Зарегистрирован: 12.03.2012

Почему-то не получается.

Простой скетч:

#include <Servo.h> 
 
Servo myservo;  
 
void setup() 
{ 
  myservo.attach(9);  
} 
 
 
void loop() 
{ 
    myservo.write(0);         
    delay(10000);                       
    myservo.write(90);              
    delay(10000);                       
} 

Работает нормально. Но вот если я хочу его модифицировать вот так:

#include <Servo.h> 
 
Servo myservo;  
 
void setup() 
{ 
} 
 
 
void loop() 
{ 
  myservo.attach(9);  
    myservo.write(0);
  myservo.detach();    
    delay(10000);                       
  myservo.attach(9);  
    myservo.write(90);   
  myservo.detach();    
    delay(10000);                       
} 

Уже ничего не работает :(

Как правильно detach() использовать?

ustas
Offline
Зарегистрирован: 12.03.2012

 Пока писал пост - сам догадался: серве нужна задержка (она просто не успевает отрабатывать поворот и ее отрубают).

 

#include <Servo.h> 
 
Servo myservo;  
 
void setup() 
{ 
} 
 
 
void loop() 
{ 
  myservo.attach(9);  
    myservo.write(0);
    delay(500);
  myservo.detach();    
    delay(10000);                       
  myservo.attach(9);  
    myservo.write(90);  
    delay(500);
  myservo.detach();    
    delay(10000);                       
} 

 

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

 Я делал еще вычисления времени необходимого для поворота.

Методом тыка подобирал сколько занимает полный поворот. И по пропорции высчитывал сколько нужно для поворота на конретный угол плюс маленький запас на неточность.

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