Проблема набегания

Тема в разделе "Arduino & Shields", создана пользователем exposity, 12 июл 2013.

  1. exposity

    exposity Нуб

    Здравствуйте, столкнулся с проблемой набегания при работе робота, помогите разобраться. Значит, есть голова робота, она крепится на вал мотора, по замыслу голова должна вращаться по часовой стрелке 2 сек., потом пауза, 2 сек. против часовой. Вроде все просто, но через час-два голова практически выворачивается наизнанку, такое сильное набегание. В чем может быть проблема?

    Код который я использую:

    #define SPEED_LEFT 6
    #define SPEED_RIGHT 5
    #define DIR_LEFT 7
    #define DIR_RIGHT 4

    void go(int speed, bool reverseLeft, bool reverseRight, int duration)
    {
    analogWrite(SPEED_LEFT, speed);
    analogWrite(SPEED_RIGHT, speed);
    digitalWrite(DIR_LEFT, reverseLeft ? LOW : HIGH);
    digitalWrite(DIR_RIGHT, reverseRight ? LOW : HIGH);
    delay(duration);
    }

    void setup()
    {
    for(int i = 5; i <= 8; i++)
    pinMode(i, OUTPUT);
    }

    void loop()
    {
    // Вращение
    go(255, 0, false, true, 5000);

    // Пауза
    go(0, 0, true, false, 1000);

    // Вращение
    go(255, 0, true, false, 5000);

    // Пауза
    go(0, 0, false, false, 1000);
    }
     
  2. Unixon

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

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

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

    Код (C):

    void loop()
    {
     go(255, 0, false, true, 5000); // Вращение
     go(0, 0, true, false, 1000); // Пауза
     go(255, 0, true, false, 5132); // 5000 Вращение + 132 коррекция
     go(0, 0, false, false, 1000); // Пауза
    }
     
    nailxx нравится это.
  3. nailxx

    nailxx Официальный Нерд Администратор

    Ну а полностью проблема решается установкой энкодера: оптического и магнитного, который будет точно говорить, что голова вот сейчас находится в своём крайнем положении