ДО курс по робототехнике

5 апреля 2013 г.

NXC: Управление моторами

(C)
С этой статьи начинается публикация материалов из методички по языку программирования Not eXactly C, подготовленной в рамках учебных курсов Нижегородского Института Информационных Технологий.
В NXC существует около 40 команд для работы с моторами. Их условно можно разделить на команды управления движением, команды остановки, команды опроса датчиков и состояния моторов.

В данной статье рассматриваются команды управления движением.

Пример 1. OnFwd(), OnRev()
Данный пример предназначен для рассмотрения семейств команд OnFwd(), OnRev(), OnFwdSync(), OnRevSync() и его цель - проверить на то, что послеOnFwd() управление сразу передается на следующую команду.

task main() {
    /*
    Даже если команда "движение вперед" задана до команды "движение назад",
    робот едет сразу назад, поскольку OnFwd() сразу передает управление
    следующей команде.
    */

    OnFwd(OUT_AB, 50);
    OnRev(OUT_AB, 50);
}

Пример 2. OnFwdSync(), OnRevSync()
Этот пример подобен предыдущему, только использует другие команды того же семейства. Он выполняет проверку на то, что после OnFwdSync()управление сразу передается на следующую команду.
task main() {
    /*
    Даже если команда "движение вперед" задана до команды "движение назад",
    робот едет сразу назад, поскольку OnFwdSync() сразу передает управление
    следующей команде.
    */

    //        Двигатели
    //           |    мощность
    //           |    |   распределение нагрузки между моторами
    //           |    |   |
    OnFwdSync(OUT_AB, 50, 0);
    OnRevSync(OUT_AB, 50, 0);
}

Пример 3. RotateMotor()
Здесь рассматривается команда управления моторами, принадлежащая другому семейству: RotateMotor(), RotateMotorEx(). Цель пример - показать отличие от предыдущего семейства команд - RotateMotor()передает управление к следующей команде только после того, как мотор передвинется на заданное количество градусов.
task main() {
    /*
    RotateMotor() работает как функция в "обычном" ее понимании - управление
    к следующей команде происходит только после полного выполнения текущей.
    */

    //        Двигатели
    //           |      мощность
    //           |      |   угол поворота оси мотора в градусах
    //           |      |   |
    RotateMotor(OUT_AB, 50, 360);
    RotateMotor(OUT_AB, 50, -360);
}

Пример 4. RotateMotorEx()
Функция RotateMotorEx() является одной из самых мощных функций управления моторами из-за больщого количества параметров, которые она может контролировать. Эта функция, как и предыдущая, также передает управление к следующей команде только после того, как мотор передвинется на заданное количество градусов.
task main() {
    /*
    RotateMotorEx() работает как функция в "обычном" ее понимании -
    управление к следующей команде происходит только после полного
    выполнения текущей.
    */

    //          Двигатели
    //             |      мощность
    //             |      |   угол поворота оси мотора в градусах
    //             |      |   |    распределение движения между моторами
    //             |      |   |    |  синхронизация моторов
    //             |      |   |    |  |     включать торможение после
    //             |      |   |    |  |     |  окончания движения или
    //             |      |   |    |  |     |  останавливаться своим ходом
    RotateMotorEx(OUT_AB, 50, 360, 0, true, true);
    RotateMotorEx(OUT_AB, 50, -360, 0, true, true);
}

Пример 5. RotateMotor() и циклы
Вызов RotateMotor() (а также и RotateMotorEx) в цикле приводит к серии отрывистых движений.
task main() {
    /*
    Переход к следующей итерации цикла происходит только после выполнения
    "движение тележки", поэтому в итоге тележка двигается прерывисто,
    неоднородно.
    */

    int i = 0;
    while (i < 3) {
        RotateMotor(OUT_AB, 50, 360);
        i++;
    }
}

Пример 6. OnFwd() и циклы
В отличие от RotateMotor(), вызов OnFwd() (так же как и OnRev, OnFwdSync, OnRevSync) в цикле позволяет почти одновременно с движением проверять состояние системы (значения переменных, датчиков, таймеров), т.е. движение не будет прерываться на время проверки.
task main() {
    /*
    Приведенную ниже конструкцию можно условно описать словами следующим 
    образом:
    - начинаем двигаться
    - проверяем i
    - все еще двигаемся
    - проверяем i
    - все еще двигаемся
    . . .
    - цикл закончился.
    
    Поскольку команды серии (OnFwd) передают управление сразу следующей
    команде, переход к следующей итерации осуществляется сразу после начала
    движения. Останова двигателей при этом не происходит, т.е. ощущение
    от движения – плавность, беспрерывность.
    */

    int i = 0;
    while (i < 10000) {
        OnFwd(OUT_AB, 50);
        i++;
    }
}

Комментариев нет:

Отправить комментарий