Помогите разобраться с питанием в проекте.

Тема в разделе "Arduino & Shields", создана пользователем Aref, 4 апр 2014.

  1. Aref

    Aref Нуб

    Я почти не разбираюсь в электрике, тем не менее умудрился собрать робота. По началу он хорошо работал даже от одного аккумулятора на 8.4v, потом я поставил еще один такой же аккумулятор отдельно для ардуины для стабильности, но начались проблемы - то не работают моторы, то сервы ведут себя так, словно им не хватает питания - или не поворачивают или поворачивают не до конца или повернут на несколько секунд как надо, но потом словно "обвисают", сокращая нужный угол поворота. Моторы при этом не работают вообще. По отдельности моторы и сервы работают. Первое время они работали вместе даже на одном аккумуляторе. Я хочу разобраться, почему теперь такое происходит.

    У меня робот, который состоит из:

    2 аккумулятора 8.4v NiMH 3800mAh
    2 уз-дальномера HC-SR04
    2 электромотора на колеса как на изображении
    [​IMG]
    4 серво (2шт HXT900 и 2шт RDS3115)
    3 стабилизатора для понижения напряжения на LM2596
    1 драйвер моторов на L298N
    1 ардуино Уно
    1 v5.0 Sensor Shield

    I.Ардуина питается от одного аккумулятора со стабилизатором, настроенным на 7 вольт. К ней подключены 2 дальномера; логика драйвера моторов - все через v5.0 Sensor Shield.

    II.Другой аккумулятор питает сервы и электромоторы.

    а.Электромоторы питаются от стабилизатора в 4 вольта (этого хватает, чтобы ехать медленно, мне не нужна большая скорость) через шидлу моторов L298N где убрана перемычка для раздельного питания.

    б.Сервы также питаются от этого второго аккумулятора через еще один стабилизатор LM2596, подключенный к v5.0 Sensor Shield. Питаются 6ю вольтами, для раздельного питания с v5.0 Sensor Shield перемычка убрана. В общем, второй аккумулятор питает через стабилизаторы моторы на 4v и сервы на 6v. Сам аккумулятор на 8.4v, но при полной зарядке мультимер выдает все 9v. Сервы так же рассчитаны на работу от 6 до 4.8v


    Все это вместе я пытаюсь запустить вот этим кодом.

    Код (Text):
    #include <Servo.h>

    // моторы
    #define D1 7      
    #define M1 8      
    #define D2 13    
    #define M2 12    
    #define ENA 10
    #define ENB 9
    // дальномеры
    #define Trig1 14
    #define Echo1 15
    #define Trig2 17
    #define Echo2 18
    //сервы
    #define SERVO1 3
    #define SERVO2 11
    #define SERVO3 6
    #define SERVO4 5


    Servo head;
    Servo claw;
    Servo claw2;
    Servo claw3;


    void setup()
    {
      head.attach(SERVO1);

      claw.attach(SERVO2);
      claw2.attach(SERVO3);
      claw3.attach(SERVO4);
      head.write(0);
      delay(1000);
      head.write(160);
      delay(1000);
      head.write(79);
      delay(1000);
      claw2.write(130);
      delay(3000);
      claw.write(43);
      delay(3000);
      claw3.write(143);
      delay(1000);
      claw3.write(69);
      delay(1000);
      claw3.write(80);

      pinMode(Trig1, OUTPUT);
      pinMode(Echo1, INPUT);

      pinMode(Trig2, OUTPUT);
      pinMode(Echo2, INPUT);


      pinMode(D1, OUTPUT);
      pinMode(M1, OUTPUT);
      pinMode(D2, OUTPUT);
      pinMode(M2, OUTPUT);


    }

    unsigned int impulseTime=0;
    unsigned int distanceUP_sm=0;
    unsigned int distanceDOWN_sm=0;


    void loop()
    {
    // замер расстояния 1го дальномера
      digitalWrite(Trig2, HIGH);
      delayMicroseconds(10);
      digitalWrite(Trig2, LOW);
      impulseTime = pulseIn(Echo2, HIGH);
      distanceDOWN_sm = impulseTime/58;
      delay(60);
    // замер 2го дальномера
      digitalWrite(Trig1, HIGH);
      delayMicroseconds(10);
      digitalWrite(Trig1, LOW);
      impulseTime = pulseIn(Echo1, HIGH);
      distanceUP_sm = impulseTime/58;
      delay(60);
    // если больше 10см - движение
      if (distanceUP_sm >= 10 && distanceDOWN_sm >= 10)
      {
        digitalWrite(D1, 1);
        digitalWrite(M1, 0);
        digitalWrite(D2, 1);
        digitalWrite(M2, 0);
        analogWrite(ENB, 254);
        analogWrite(ENA, 254);
      }
    // иначе - стоп
      else {
        analogWrite(ENA, 0);
        analogWrite(ENB, 0);
      }
    }
    Все это когда-то работало и робот двигался. Потом встала необходимость подрегулировать скорость одного мотора для прямой езды и воспользоваться PWM-пинами http://forum.amperka.ru/threads/l298n-проблема-регулировки-скорости.2871/ Врядли это как-то связано, но мало ли. Такое впечатление, что если дело не в питании, то какие-то глюки в сигналах от ардуины. И еще, сервы неплохо выполняют инструкции из void setup(), но как мне кажется обвисание происходит на void loop(), когда дело доходит до сигнала на двигатели. Помогите выяснить в чем дело. Выходное напряжение от стабилизаторов при всем при этом на показаниях мультимера если и скачет, то не больше чем на 0.1 и то редко.
     
    Последнее редактирование: 4 апр 2014
  2. Aref

    Aref Нуб

    С сервами я разобрался - моя глупая ошибка в распиновке. Теперь они работают хорошо. Но вот в комбинации с сервами не запускаются моторы. По отдельности моторы и сервы работают. От ардуины на питание логики мотор-шилд попадает 4.5 вольт при подключенных сервах. Без серв - 5вольт и моторы крутятся. Получается, что дело в недостаточном питании логики мотор-шилд от ардуины, которое образуется при подключение серв. Только вот из-за чего так происходит, ведь сервы и сами моторы (не логику мотор-шилд) я питаю от отдельного аккумулятора?
     
    Последнее редактирование: 5 апр 2014
  3. Megakoteyka

    Megakoteyka Оракул Модератор

    Земли питания объединены?
     
  4. Aref

    Aref Нуб

    Хороший вопрос. Наверное, причина тут. Только как это лучше сделать? Соединить между собой черные провода (минус) на входах (или всетаки выходах) 2х стабилизаторов, питающих сервы и моторы от одного аккумулятора? Соединить между собой черные провода 2х аккумуляторов? Или другие варианты? В этом я не разбираюсь, подскажите.
     
  5. vasilp

    vasilp Нерд

    Соединить все минуса кроме аккумуляторов..
     
  6. Megakoteyka

    Megakoteyka Оракул Модератор

    На мотор-шилдах обычно есть джампер для объединения земель. Посмотрите описание своего шилда повнимательней. И форум поройте - тут вопросы питания обсуждались весьма подробно.
     
  7. Aref

    Aref Нуб

    Джамперы у меня сняты как с L298N, так и с v5.0 Sensor Shield. Как я понимаю, они снимаются для раздельного питания логики от моторов\серв. Попробовал одеть эти джамперы - результат тот же - не работают моторы. Не работают они и когда на логику мотор-шилда поступает все 5 вольт, но подключены сервы. Сейчас буду разбираться с общей землей.
     
  8. Aref

    Aref Нуб

    Как смог набросал схему подключения.
    [​IMG]
    вот схема arduino sensor shield v5
    [​IMG]
    И на всякий случай код
    Код (Text):
    // 2 моторa
    #define D1 7        
    #define M1 8        
    #define D2 1      
    #define M2 0      
    #define ENA 10
    #define ENB 9
    // 2 дальномера
    #define Trig2 18
    #define Echo2 19
    #define Trig1 14
    #define Echo1 15
    // 4 серво
    #define SERVO1 3
    #define SERVO2 11
    #define SERVO3 5
    #define SERVO4 6
    #include <Servo.h>
    Servo head;
    Servo claw;
    Servo claw2;
    Servo claw3;



    void setup(){
     
      pinMode(D1, OUTPUT);
      pinMode(M1, OUTPUT);
      pinMode(D2, OUTPUT);
      pinMode(M2, OUTPUT);
     
      pinMode(Trig1, OUTPUT);
      pinMode(Echo1, INPUT);
      pinMode(Trig2, OUTPUT);
      pinMode(Echo2, INPUT);
     
      head.attach(SERVO1);
      claw.attach(SERVO2);
      claw2.attach(SERVO3);
      claw3.attach(SERVO4);
     
      head.write(0);
      delay(1000);
      head.write(160);
      delay(1000);
      head.write(79);
      delay(1000);
     
      claw2.write(170);
      delay(1000);
     
      claw.write(43);
      delay(1000);
     
      claw3.write(69);
      delay(1000);
      claw3.write(80);
     
      delay(1000);
    }

    unsigned int impulseTime=0;
    unsigned int distanceUP_sm=0;
    unsigned int distanceDOWN_sm=0;

    void loop()
    {
      // замер одного дальномера
      digitalWrite(Trig2, HIGH);
      delayMicroseconds(10);
      digitalWrite(Trig2, LOW);
      impulseTime = pulseIn(Echo2, HIGH);
      distanceDOWN_sm = impulseTime/58;
      delay(100);
      // замер другого
      digitalWrite(Trig1, HIGH);
      delayMicroseconds(10);
      digitalWrite(Trig1, LOW);
      impulseTime = pulseIn(Echo1, HIGH);
      distanceUP_sm = impulseTime/58;
      delay(100);
      // если на обоих больше 10см - движение
      if (distanceUP_sm >= 10 && distanceDOWN_sm >= 10)
      {
        digitalWrite(D1, 1);
        digitalWrite(M1, 0);
        digitalWrite(D2, 1);
        digitalWrite(M2, 0);
        analogWrite(ENB, 254);
        analogWrite(ENA, 254);
      }
      // иначе - стоп
    else {
        analogWrite(ENA, 0);
        analogWrite(ENB, 0);
      }
    }
     
  9. Aref

    Aref Нуб

    И подключение мотор-шилды на всякий случай
    [​IMG]