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

Тема в разделе "Arduino & Shields", создана пользователем Fat_Avocado, 13 ноя 2016.

  1. Fat_Avocado

    Fat_Avocado Нуб

    Добрый день.

    Пытаюсь сделать гексапода на 18 сервах. Использую Ардуино Уно и шилд от Амперки этот:
    http://amperka.ru/product/arduino-multiservo-shield
    При подключении лап (6 лап по 3 серва) каждая отдельно работает нормально. Подключая до 4 лап одновременно тоже проблем нет. Причем любые.
    Но если включаю все 6, они все начинают хаотично двигаться в случайном направлении

    Подскажите, что может быть проблемой

    Спасибо
     
  2. rkit

    rkit Гуру

    Недостаток питания.
     
  3. Fat_Avocado

    Fat_Avocado Нуб

    Напряжение поднять? Или нужно аккум мощнее с тем же напряжением?
    Я пальчиковые аккумуляторы использую
     
  4. rkit

    rkit Гуру

    Измерить, для начала.
     
  5. Fat_Avocado

    Fat_Avocado Нуб

    5,0 В от пальчиковых аккумуляторов. Их 4шт
     
  6. rkit

    rkit Гуру

    Советую прочитать что такое электрический ток, и усвоить основные законы. Без этого далеко не уедете.
     
  7. qwone

    qwone Гик

    Код (C++):
    /*
    #1 Серва1 упр. выв -> 2 , 3, 4,  5,  6    (servo_pin[])
                   +5В -> +5В
                   GND -> GND

       резистор  нижний выв   -> GND
                 средний выв  -> A0, A1, A2, A3, A4    (R_pin[])
                 верхний выв  -> +5
    */

    //#1
    uint8_t i = 0 ;
    const int number_of_servo = 5;
    const int servo_pin[]  = { 2 ,  3,  4,   5,   6 } ;
    uint16_t servo_value[] = { 544, 544, 544, 544, 544 } ; // величина на серве 544-2400 мкс.
    uint8_t  servo[]       = {   0,   0,   0,   0,   0 } ;
    const int R_pin[]      = {  A0,  A1,  A2,  A3,  A4 } ; // нога резистора

    void setup() {
      //#1
      for (i = 0; i < number_of_servo; i++) {
        pinMode      (servo_pin[i], OUTPUT);
        digitalWrite (servo_pin[i], servo[i] = 0);
      }
      i = 0;
    }
    void loop() {
      //#1 3 миллисекунд обслуживание сервы 1
      static uint32_t past_1 = 0 ;
      if  (servo[i] && (micros() - past_1 >= servo_value[i]))
        digitalWrite (servo_pin[i], servo[i] = 0);
      if (micros() - past_1 >= 3000)  {   // если прошло 3000 микросек
        i = (i + 1) % number_of_servo;
        past_1 = micros() ;
        digitalWrite (servo_pin[i], servo[i] = 1);
        servo_value[i] = map (analogRead(R_pin[i]), 0, 1023, 544, 2400);
      }
    }