вторник, 25 сентября 2012 г.

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

С этой статьи начинается публикация материалов из методички по языку программирования 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++;
    }
}

1 комментарий:

Related Posts Plugin for WordPress, Blogger...