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

Тема в разделе "Моторы, сервоприводы, робототехника", создана пользователем Hank Hill, 22 сен 2018.

  1. Hank Hill

    Hank Hill Нерд

    Добрый день,

    Манипулятор приводится в действие несколькими сервоприводами, иногда работающими одновременно. Штатные хвосты сервоприводов я удлинил проводом «витая пара»: по две жилы витой пары к каждому сигнальному проводу. Провода питания серв удлинил достаточно толстым проводом. Все провода от сервоприводов к контролеру спрятал в одну змеиную шкуру.

    Столкнулся с такой проблемой. Две сервы открывают / закрывают схват, при этом крутиться они должны одновременно , но в разные стороны: одна увеличивает угол, вторая – уменьшает. На команду, например, открыть схват, они начинают двигаться рывками, одна свою конечную позицию пролетает, вторая – не доходит до нее, и вместо того, чтобы остановится каждая в своей заданной точке, продолжают биться в конвульсиях.

    Проверил работу скеча на таким образом.

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

    Как это «лечится»? Развести провода манипулятора у меня нет возможности: хочется иметь один аккуратный провод от контроллера к манипулятору.

    Сервы питаются от контроллера, более двух одновремнно ни когда не работают.

    Пробовал подключать сервоприводы при помощи такого кабеля http://neokt.ru/ru/katalog/rca-shag-1-27-mm-tsvetnoj-tajvan/rca-10-v-roznitsu-metrami , а не витой пары – ситуация аналогичная сервы крутятся рывками и не туда.

    На всякий случай привожу скеч.

    Большое спасибо за ранее.
    Код (C++):
    #include <Servo.h>
                                  // определяем объекты левого сервопривода и его параметры
    Servo graber_right_brown;                  
    int right_open_pos = 35;
    int right_close_pos = 85;
    const int serv_pin_right_brown=10;
                                  // определяем объекты правого сервопривода и его параметры
    Servo graber_left_green;
    int left_open_pos = 120;
    int left_close_pos = 70;
    const int serv_pin_left_green=6;

    int incomingByte = 0;         // variable to store value read from COM port
     
    int  curr_pos ;               // variable to store current position of graber, where Zero is the value for position "open" and 1 will be used for position 'closed'

    void setup() {
        Serial.begin(9600);     // setting up COM-port exchannge at 9600 bods speed
         // attaching servos to assigned pins
             graber_right_brown.attach(serv_pin_right_brown);
             graber_left_green.attach(serv_pin_left_green);
           
             graber_right_brown.write(right_open_pos);                  
             graber_left_green.write(left_open_pos);

             curr_pos = 0;
       }

    void loop() {

    // checking if there is a command in COM port. If a command is there  executing received command
            if (Serial.available() > 0)
                {
                  incomingByte = Serial.read(); // read the incoming byte:
                 
                if (incomingByte == '2' && curr_pos == 0)  {   // received comand CLOSE when graber is open        
                 
                 graber_right_brown.write(right_close_pos);                  
                 graber_left_green.write(left_close_pos);  
                        delay(200);
                  curr_pos = 1;
                        Serial.print("Current position is ");
                        Serial.println(curr_pos);
                  }    
                 
                  if (incomingByte == '8' && curr_pos == 1)   {   // received comand OPEN when graber is closed                            
                           graber_right_brown.write(right_open_pos);                  
                           graber_left_green.write(left_open_pos);
                           delay(200);
                           curr_pos = 0;
                        Serial.print("Current position is ");
                        Serial.println(curr_pos);
                         
                 }
                 delay(3000);
         }
    }
     
  2. Витой пары и этого хлипкого шлейфа для питания моторов недостаточно. Вы вообще просчитывали питание?
     
  3. Hank Hill

    Hank Hill Нерд

    питание идет по проводам диаметром 1мм., через витую пару только сигнал
     
  4. parovoZZ

    parovoZZ Гуру

    Со стороны серв провода нагрузить резистором 1 кОм.
     
    Hank Hill нравится это.
  5. Звучит как взрыв на макаронной фабрике вместо проводки. Возратный путь сигнала должен пролегать рядом с самим сигналом, а не по другому проводу непонятно где. И я не услышал ответа на тему просчета питания, так что оно не просчитано, так что берете мультиметр и проверяете, не проваливается ли, когда 2 серво нагружены.
     
  6. Hank Hill

    Hank Hill Нерд

    все провода или только какие-то отдельные (плюс , минус, сигнальный) ?
    что значит "со стороны серв"?
     
  7. parovoZZ

    parovoZZ Гуру

    На сигнальные, чтобы снивелировать воздействие помехи от соседнего провода.

    Это как?
     
  8. это буквально так, как написано
     
  9. Hank Hill

    Hank Hill Нерд

    Спасибо! Действительно, помогло