С этой статьи начинается публикация материалов из методички по языку программирования Not eXactly C, подготовленной в рамках учебных курсов Нижегородского Института Информационных Технологий. |
В данной статье рассматриваются команды управления движением.
Пример 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++;
}
}
Спасибо из ТПУ ^_^
ОтветитьУдалить