Сервоприводы сошли с ума

Fat_Avocado
Offline
Зарегистрирован: 13.11.2016

Всем привет.

 

Я пытаюсь сделать гексапода на 18 сервах.

Создал класс, в котором работает 3 сервы (1 нога)

Дальше в самой программе вызываю только движение конкретной ноги.

По отдельности каждая нога работает. Любые 4 тоже.Но когда запускаю все 6 - они сходят с ума и начинают хаотично двигаться в разные стороны

Спасибо

AmateurFF
Offline
Зарегистрирован: 02.02.2015

Пожалуйста.

Fat_Avocado
Offline
Зарегистрирован: 13.11.2016

Намек понял)) 

Озвучиваю вопрос - может это быть из-за того что одаю всего 4,8В? Поднять до 6?

 

Спасибо

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

Fat_Avocado пишет:

Намек понял)) 

нет, код показать

Fat_Avocado
Offline
Зарегистрирован: 13.11.2016
#include <Wire.h>
#include <Multiservo.h>
 
 
class Leg {
  public:
 int period = 6000;
 int servo1angle = 40;
 int servo2angle = 45;
 int servo3angle = 60;
  float servo1koef = period/3/servo1angle;
    float servo2koef = period/3/servo2angle;
    float servo3koef = period/3/servo3angle;
 
   Multiservo servo1;
  Multiservo servo2;
  Multiservo servo3;
  
  
  void attach(int pin1) {
 
   servo1.attach(pin1);
    servo2.attach(pin1-1);
    servo3.attach(pin1-2);
    servo1.write(90);
    servo2.write(90);
    servo3.write(90);
 
 
  }
 
 void Update(int per) {
   int dir = -(((per%2000)/1000)*(-2)+1);
    if (((millis()-per)%period>=0)&&((millis()-per)%period<period*1/6))  //leg up
 {
    servo1.write (90-dir*((millis()-per)%period/servo1koef));
    servo3.write (90+dir*((millis()-per)%period/servo3koef));
      
    }
    if (((millis()-per)%period>=0)&&((millis()-per)%period<period*1/3))
    {
      servo2.write (90+dir*((millis()-per)%period/servo2koef)); 
    }
        if (((millis()-per-period*1/6)%period>=0)&&((millis()-per-period*1/6)%period<period*1/6)) { //leg down
        
   servo1.write(90-dir*(servo1angle-(millis()-per)%period/servo1koef));
   servo3.write(90+dir*(servo3angle-(millis()-per)%period/servo3koef));
        }
        if (((millis()-per-period*1/3)%period>=0)&&((millis()-per-period*1/3)%period<period*1/3))
    {
      servo2.write (90+dir*(servo2angle*2-(millis()-per)%period/servo2koef)); 
    }
  }
  
  };  
Leg leg1;
Leg leg2;
Leg leg3;
Leg leg4;
Leg leg5;
Leg leg6;
 
 
void setup () {
 
  leg1.attach(2);
 //leg2.attach(5);
//leg3.attach(8);
 // leg4.attach(11);
//leg5.attach(14);
  //leg6.attach(17);
  
}
void loop (){
  
  leg1.Update(1*6000/6);
  leg2.Update(4*6000/6);
  leg3.Update(5*6000/6);
  leg4.Update(2*6000/6);
  leg5.Update(3*6000/6);
  leg6.Update(6*6000/6);
  
 
  
}
Fat_Avocado
Offline
Зарегистрирован: 13.11.2016

Когда в void setup убираю "//" на всех сервах - начинается ад. Если выбрать любые 4 - работают нормально

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Это Ардуина не может всеми управлять, буквально не успевает формировать управляющие на все сервы сигналы. 

Fat_Avocado
Offline
Зарегистрирован: 13.11.2016

У меня шилд стоит на 24 сервы. Использую только 18.