Программирование LEGO NXT роботов на языке NXC - Более интересная программа

Материал из roboforum.ru Wiki
Перейти к: навигация, поиск

Автор: Daniele Benedettelli

Перевод: © Ботов Антон aka =DeaD=, 2009

Эксклюзивно для www.roboforum.ru
копирование на другие ресурсы и публикация перевода
без разрешения его автора запрещены

Более интересная программа

Наша первая программа была не сильно впечатляющая. Так что давайте попробуем сделать её более интересной. Мы будем делать это в несколько шагов, показывая некоторые важные возможности изучаемого языка программирования NXC.

Учимся делать повороты

Вы можете заставить робота поворачиваться путём остановки или включении в обратном направлении одного из двух моторов. Вот пример того, как это можно сделать. Введите его, загрузите полученную программу в робота и запустите. Робот должен проехать немного вперед, после чего повернуться на 90 градусов вправо.

task main()
{
OnFwd(OUT_AC, 75);
Wait(500);
OnRev(OUT_C, 75);
Wait(360);
Off(OUT_AC);
}

Вам может потребоваться попробовать немного другие числа, вместо 360 указанного во втором операторе Wait(), чтобы сделать 90 градусный поворот. Это зависит от типа поверхности по которой перемещается робот. Чтобы не отыскивать в больших программах такие числа, которые могут потребовать настройки существует возможность дать этому числу имя и определить его в начале программы. В языке NXC вы можете определять постоянные значения (константы) так, как показано в следующей программе:

#define MOVE_TIME 500
#define TURN_TIME 360
task main()
{
OnFwd(OUT_AC, 75);
Wait(MOVE_TIME);
OnRev(OUT_C, 75);
Wait(TURN_TIME);
Off(OUT_AC);
}

Первые две строки определяют две константы. Теперь их можно использовать везде в программе вместо этих чисел. Использование констант хорошо по двум причинам: оно делает программы более читаемыми и более удобно менять значения констант, чем искать во всей программе где еще у вас время поворота было прописано как 360 тысячных секунды. Обратите внимание, что BricxCC обозначает операторы define отдельным цветом. Как мы увидим в главе 6, вы можете подобным образом определять не только константы.

Повторяем команды

Теперь давайте попробуем написать программу, которая заставить робота проехать по квадрату. Проехать по квадрату означает: проехать вперед, повернуться на 90 градусов, снова проехать вперед, снова повернуть на 90 градусов и так далее. Мы можем просто написать 4 раза кусок указанного выше кода, но значительно проще это можно сделать с использованием оператора цикла (repeat).

#define MOVE_TIME 500
#define TURN_TIME 360
task main()
{
  repeat(4)
  {
    OnFwd(OUT_AC, 75);
    Wait(MOVE_TIME);
    OnRev(OUT_C, 75);
    Wait(TURN_TIME);
  }
  Off(OUT_AC);
}

Число внутри скобок оператора цикла указывает сколько раз повторить операторы в следующих за оператором фигурных скобках. Обратите внимание, что в приведенной выше программе мы сместили операторы внутри цикла вправо. Это не является обязательным, но делает программу более легко читаемой.

В качестве окончательного примера давайте заставим робота 10 раз проехать по квадрату:

#define MOVE_TIME 500
#define TURN_TIME 360
task main()
{
  repeat(10)
  {
    repeat(4)
    {
      OnFwd(OUT_AC, 75);
      Wait(MOVE_TIME);
      OnRev(OUT_C, 75);
      Wait(TURN_TIME);
    }
  }
  Off(OUT_AC);
}

Теперь у нас один оператор цикла внутри другого. Это называется “вложенный” оператор цикла. Вы можете делать операторы цикла любого уровня вложенности. Внимательно посмотрите на фигурные скобки и отступы, использованные в программе. Задача начинается с первой фигурной скобки и заканчивается последней. Первый оператор цикла начинается содержит операторы внутри второй и пятой фигурных скобок. Вложенный в него оператор цикла содержит операторы между третьей и четвертой фигурной скобкой. Как вы видите фигурные скобки всегда идут парами и кусок программы между ними выделяется отступом слева.

Добавляем комментарии

Чтобы сделать вашу программу еще более читаемой, неплохо бы добавить в неё комментарии. Когда мы пишем в строке // всё что после этих символов компилятор будет считать комментарием и проигнорирует. Длинный комментарий на несколько строк можно размещать между символами /* и */. BricxCC выделяет комментарии отдельным цветом в текстовом редакторе. Полный код программы с комментариями выглядит так:

/* 10 SQUARES
This program make the robot run 10 squares
*/
#define MOVE_TIME 500 // Time for a straight move
#define TURN_TIME 360 // Time for turning 90 degrees
task main()
{
  repeat(10) // Make 10 squares
  {
    repeat(4)
    {
      OnFwd(OUT_AC, 75);
      Wait(MOVE_TIME);
      OnRev(OUT_C, 75);
      Wait(TURN_TIME);
    }
  }
  Off(OUT_AC); // Now turn the motors off
}

Подводим итоги

В этой главе вы освоили использование операторов цикла и использование комментариев. Так же вы увидели зачем используются вложенные фигурные скобки и отступы. С имеющимися на этом этапе знаниями вы уже можете писать программы под управлением которых робот будет двигаться по практически каким угодно траекториям. Рекомендуется перед переходом к следующей главе попробовать самостоятельно запрограммировать робота для движения по разным интересным траекториям. Для этого можете попробовать варьировать программы из этой или предыдущей главы.