Программирование LEGO NXT роботов на языке NXC - Первая программа — различия между версиями

Материал из roboforum.ru Wiki
Перейти к: навигация, поиск
(Подводим итоги)
(Первая программа: по мелочи: знаки, кое-где обороты и т.д.)
 
Строка 2: Строка 2:
  
 
=Первая программа=
 
=Первая программа=
В этой главе я покажу как написать очень простую программу. Мы будем программировать робота, чтобы он 4 секунды ехал вперед, потом 4 секунды ехал назад, а потом остановился. Это будет выглядеть не очень впечатляюще, но вы сможете на этом примере получить представления об простейших способах программирования. Кроме того вы сможете понять, насколько это просто. Но, прежде чем писать программу, нам нужно собрать робота.
+
В этой главе я покажу, как написать очень простую программу. Мы запрограммируем робота на движение 4 секунды вперед, 4 - назад и остановку в конце. Не очень впечатляюще, но на этом примере вы сможете получить представления об простейших способах программирования. Кроме того, вы сможете понять, насколько это просто. Но, прежде чем писать программу, нам нужно собрать робота.
  
 
==Постройка робота==
 
==Постройка робота==
Робот, которого мы будем использовать в этом курсе - Tribot, это первый колёсный робот которого инструкция к NXT предлагает вам собрать после покупки набора. Единственное отличие будет заключаться в том, что вы должны подключить правый мотор в порт A, левый мотор в порт C, а мотор захвата в порт B.
+
Робот, которого мы будем использовать в этом курсе - Tribot - первый колёсный робот, которого инструкция к NXT советует собрать после покупки набора. Единственное отличие будет заключаться в том, что вы должны подключить правый мотор в порт A, левый мотор в порт C, а мотор захвата в порт B.
  
 
[[Изображение:Lego_NXT_Tribot.jpg]]
 
[[Изображение:Lego_NXT_Tribot.jpg]]
  
Убедитесь, что вы правильно установили драйверы Mindstorms NXT Fantom Drivers, которые
+
Убедитесь, что вы правильно установили драйверы Mindstorms NXT Fantom Drivers,  
поставлялись с набором.
+
поставляемые с набором.
  
 
==Запуск Bricx Command Center==
 
==Запуск Bricx Command Center==
Мы будем писать программы используя Bricx Command Center. Запустите его двойным щелчком по иконке BricxCC (я предполагаю, что вы уже установили BricxCC. Если нет, загрузите его с сайта (см. введение), и установите его в любой удобный вам каталог). Программа попросит вас предоставить ей возможность подключиться к роботу. Включите робота и нажмите "ОК". Программа (скорее всего) автоматически найдёт робота. После чего интерфейс пользователя будет выглядеть так, как показано ниже (но без закладки с текстовым окном).
+
Мы будем писать программы используя Bricx Command Center. Запустите его двойным щелчком по иконке BricxCC (я предполагаю, что вы уже установили BricxCC. Если нет, загрузите его с сайта (см. введение) и установите его в любой удобный вам каталог). Программа попросит предоставить ей возможность подключиться к роботу. Включите робота и нажмите "ОК". Программа (скорее всего) автоматически найдёт робота. Ниже приведено избражение интерфейса пользователя, появляющееся после успешного завершения синхронизации (закладки с текстовым окном быть не должно).
  
 
[[Изображение:BricxCCScreenShot1.jpg]]
 
[[Изображение:BricxCCScreenShot1.jpg]]
  
Интерфейс выглядит как стандартный текстовый редактор с обычным меню и кнопками для открытия и сохранения файлов, печати, редактирования и т.п. Но среди них есть несколько специальных меню для компилирования программ и загрузки их в робота, а также для получения информации от робота. Пока вы можете не обращать на них внимание. Мы планируем сейчас написать новую программу. Так что нажимайте кнопку "New File" чтобы открыть новое пустое окно с текстовым редактором.
+
Интерфейс выглядит как стандартный текстовый редактор с обычным меню, кнопками для открытия и сохранения файлов, печати, редактирования и т.п. Однако среди них есть несколько специальных меню для компилирования программ и загрузки их в робота, а также для получения отладочной информации; пока вы можете не обращать на них внимание. Сейчас мы хотим написать новую программу, так что нажимайте кнопку "New File" для создания нового окна с текстовым редактором.
  
 
==Написание программы==
 
==Написание программы==
Строка 34: Строка 34:
 
На первый взгляд выглядит немного сложно, так что давайте разберемся в ней.
 
На первый взгляд выглядит немного сложно, так что давайте разберемся в ней.
  
Программы NXC состоят из задач ("task"). Наша программа содержит всего одну задачу с именем "main". Каждая программа должна содержать задачу с именем "main", которая будет исполняться роботом. Вы узнаете больше о задачах в главе 6. Задача состоит из набора команд, называемых также операторами. Операторы заключены в фигурные скобки, чтобы было ясно, что они принадлежат этой задаче. Каждый оператор заканчивается точкой с запятой. Это позволяет понять где кончается один оператор и начинается следующий. В целом задача обычно выглядит следующим образом:
+
Программы NXC состоят из задач ("task"). Наша программа содержит всего одну задачу с именем "main". Любая программа на языке NXC должна содержать задачу с именем "main", которая и будет исполняться роботом (о задачах мы поговорим подробнее в главе 6). Задача состоит из набора команд - операторов. Операторы заключены в фигурные скобки для того, чтобы была ясна их принадлежность к конкретной задаче. Каждый оператор заканчивается точкой с запятой. Это позволяет понять, где кончается один оператор и начинается следующий. В целом задача обычно выглядит следующим образом:
 
<code language="cpp">
 
<code language="cpp">
 
  task main()
 
  task main()
Строка 47: Строка 47:
 
  OnFwd(OUT_A, 75);
 
  OnFwd(OUT_A, 75);
  
Этот оператор говорит роботу включить выход "A", это в нашем случае мотор, подключенный к порту "А" модуля NXT, на движение вперёд.. Число следующее за указанием порта устанавливает скорость мотора в 75% от максимальной.
+
Этот оператор говорит роботу включить выход "A" модуля NXT. Это означает, что мотор, подключенный нами ранее, будет двигать модель вперед. Число, следующее за указанием порта, устанавливает скорость мотора в 75% от максимальной.
  
 
  OnFwd(OUT_C, 75);
 
  OnFwd(OUT_C, 75);
  
Такой же оператор, но теперь включаем мотор "C". После этих двух операторов оба мотора вращаются и робот едет вперёд.
+
Тот же оператор, но теперь включаем мотор "C". После выполнения этих операторов оба мотора вращаются, и робот едет вперёд.
  
 
  Wait(4000);
 
  Wait(4000);
  
Теперь время немного подождать. Этот оператор говорит нам подождать 4 секунды. Аргумент, которым является число в скобках, указывается в 1/1000 секунды, так что мы можем с большой точностью сказать программе сколько нужно ждать. Следующие 4 секунды программа будет ждать, а робот с включенными двигателями ехать вперед.
+
Теперь время немного подождать. Этот оператор говорит нам подождать 4 секунды. Аргумент, которым является число в скобках, указывается в 1/1000 секунды, так что мы можем с большой точностью указать программе необходимую задержку. Следующие 4 секунды программа будет ждать, а робот с включенными двигателями ехать вперед.
  
 
  OnRev(OUT_AC, 75);
 
  OnRev(OUT_AC, 75);
  
Робот проехал вперед достаточно далеко, так что мы скажем ему ехать в обратном направлении, т.е. назад. Обратите внимание, что мы можем установить режим работы обоих моторов сразу используя аргумент OUT_AC. Мы вполне могли таким же образом заменить одним первые два оператора задачи.
+
Робот проехал вперед достаточно далеко, так что мы скажем ему ехать в обратном направлении, т.е. назад. Обратите внимание, что мы можем установить режим работы обоих моторов сразу используя аргумент OUT_AC; таким же образом можно заменить первые два оператора задачи.
  
 
  Wait(4000);
 
  Wait(4000);
Строка 67: Строка 67:
 
  Off(OUT_AC);
 
  Off(OUT_AC);
  
И наконец выключаем оба мотора.
+
И наконец, выключаем оба мотора.
  
Вот и вся программа. Она включает на 4 секунды оба мотора на движение вперед, затем на 4 секунды на движение назад и в конце выключает их.
+
Вот и вся программа. Она включает на 4 секунды оба мотора на движение вперед, затем назад и в конце выключает их.
  
Вы наверное заметили при написании программы автоматическое выделение фрагментов кода разными цветами. Эти цвета и стили используемые текстовым редактором можно настраивать, если они вам кажутся неудобными.
+
Вы, наверное, заметили при написании программы автоматическое выделение фрагментов кода разными цветами. Эти цвета и стили используемые текстовым редактором можно настроить, если они вам кажутся неудобными.
  
 
==Запуск программы==
 
==Запуск программы==
После написания программы, нам потребуется её скомпилировать (превратить её в двоичные коды, которые робот может разобрать и выполнить) и переслать полученные двоичные коды в робота используя USB-кабель или Bluetooth-донгл (сокращенно - загрузить программу в робота).
+
После написания программы нам потребуется её скомпилировать (превратить её в двоичные коды, которые робот может разобрать и выполнить) и переслать полученные двоичные коды в робота, используя USB-кабель или Bluetooth-донгл (сокращенно: загрузить программу в робота).
  
 
[[Изображение:BricxCCScreenShot2.jpg]]
 
[[Изображение:BricxCCScreenShot2.jpg]]
Строка 80: Строка 80:
 
На этой панели расположены кнопки, которые позволяют (слева направо) компилировать программу, загружать её в робота, запускать выполнение программы на роботе и останавливать его.
 
На этой панели расположены кнопки, которые позволяют (слева направо) компилировать программу, загружать её в робота, запускать выполнение программы на роботе и останавливать его.
  
Нажмите вторую кнопку и, если вы не сделали ошибок при написании программы, она корректно скомпилируется и загрузится в робота (если при написании программы вы допустили ошибки, об этом будет выдано сообщение, см. более подробно ниже).
+
Нажмите вторую кнопку, и, если вы не сделали ошибок при написании программы, она корректно скомпилируется и загрузится в робота (если вы допустили ошибки, об этом будет выдано сообщение, см. более подробно ниже).
  
 
Теперь мы можем запустить нашу программу на выполнение. Чтобы сделать это зайдите в меню "My Files" на модуле, "Software files", и запустите ("run") программу с названием "1_simple". Помните: файлы программ в файловой системе NXT имеют такие же имена, как и исходные NXC-файлы.
 
Теперь мы можем запустить нашу программу на выполнение. Чтобы сделать это зайдите в меню "My Files" на модуле, "Software files", и запустите ("run") программу с названием "1_simple". Помните: файлы программ в файловой системе NXT имеют такие же имена, как и исходные NXC-файлы.
  
Кроме того, чтобы ваша программа после загрузки запустилась автоматически вы можете использовать комбинацию клавиш CTRL+F5 или после загрузки программы на робота нажать зелёную кнопку запуска программы.
+
Кроме того, ваша программа может запускаться автоматически после загрузки. Используйте комбинацию клавиш CTRL+F5 или после загрузки программы на робота нажмите зелёную кнопку запуска программы.
  
 
Делает ли робот то, что мы запрограммировали? Если нет, проверьте соединения проводов.
 
Делает ли робот то, что мы запрограммировали? Если нет, проверьте соединения проводов.
  
 
==Ошибки в программе==
 
==Ошибки в программе==
Когда вы набираете программы существует вероятность допустить ошибки. Компилятор сообщает обо всех обнаруженных им ошибках внизу окна в котором вы писали программу, как это показано на этом изображении:
+
Когда вы набираете программы, существует вероятность допустить ошибки. Компилятор сообщает обо всех обнаруженных им ошибках внизу окна, в котором вы писали программу, как это показано на рисунке:
  
 
[[Изображение:BricxCCScreenShot3.jpg]]
 
[[Изображение:BricxCCScreenShot3.jpg]]
  
Он автоматически выделяет первую ошибку (мы неправильно написали наименование мотора). Когда у вас выдалось несколько ошибок, вы можете щёлкнуть на интересующем вас сообщении об ошибке и перейти к соответствующему месту программы. Обратите внимание, что часто ошибки в начале программы могут повлечь ошибки в других местах. Так что лучше исправлять только первые несколько ошибок и пытаться скомпилировать программу еще раз. Так же заметим, что подсветка синтаксиса помогает избежать ошибок при разработке. Например, в последней строке мы написали Of вместо Off. Так как это неизвестная команда, она не подсвечена.
+
Он автоматически выделяет первую ошибку (неправильное написание наименования мотора). Когда у вас выдалось несколько ошибок, вы можете щёлкнуть на интересующем вас сообщении об ошибке и перейти к соответствующему месту программы. Обратите внимание, что часто ошибки в начале программы могут повлечь ошибки в других местах. Так что лучше исправлять только первые несколько ошибок, после чего скомпилировать программу еще раз. Так же заметим: подсветка синтаксиса помогает избежать ошибок при разработке. Например, в последней строке мы написали Of вместо Off. Так как это неизвестная команда, она не подсвечена.
  
Могут быть ошибки, которые не обнаруживаются компилятором. Если мы указали OUT_B в управлении мотором этом может заставить вращаться не тот мотор, который нам нужен. Если ваш робот ведёт себя не так, как вы запланировали, скорее всего вы что-то неправильно написали в управляющей им программе.
+
Могут быть ошибки, которые не обнаруживаются компилятором. Если мы указали OUT_B в управлении мотором, то будет вращаться не тот двигатель, который нам нужен. Если ваш робот ведёт себя не так, как вы запланировали, скорее всего вы что-то неправильно написали в управляющей им программе.
  
 
==Изменяем скорость==
 
==Изменяем скорость==
Как вы заметили, робот перемещается достаточно быстро. Чтобы изменить его скорость вам потребуется изменить второй параметр внутри круглых скобок. Скорость вращения моторов задаётся числом между 0 и 100. 100 это самая большая скорость, 0 это полная остановка (сервопривод NXT будет удерживать положение). Вот новая версия нашей программы, под управлением которой робот будет перемещаться медленно:
+
Как вы заметили, робот перемещается достаточно быстро. Чтобы изменить его скорость, вам потребуется изменить второй параметр внутри круглых скобок. Скорость вращения моторов задаётся числом между 0 и 100: 100 - это самая большая скорость, 0 - полная остановка (сервопривод NXT будет удерживать положение). Вот новая версия нашей программы, под управлением которой робот будет перемещаться медленно:
 
<code>
 
<code>
 
  task main()
 
  task main()
Строка 111: Строка 111:
  
 
==Подводим итоги==
 
==Подводим итоги==
В этой главе вы написали свою первую программу на языке NXC, используя среду разработки BricxCC. Теперь вы должны знать как вводить программу, как загружать её в робота и как запускать её выполнение на роботе. BricxCC может делать многие другие вещи. Чтобы получить о них больше информации - прочитайте документацию поставляемую с этим пакетом. Этот обучающий курс в первую очередь направлен на освоение языка NXC и затрагивает только те функции BricxCC без которых мы не можем обойтись.
+
В этой главе вы написали свою первую программу на языке NXC, используя среду разработки BricxCC. Теперь вы умеете набирать программу, загружать её в робота и запускать её выполнение. BricxCC может делать многие другие вещи, чтобы получить о них больше информации, прочитайте документацию поставляемую с этим пакетом. Этот обучающий курс в первую очередь направлен на освоение языка NXC и затрагивает только те функции BricxCC, без которых мы не можем обойтись.
  
 
Также вы освоили некоторые важные аспекты языка NXC. Прежде всего вы узнали, что каждая программа имеет задачу с именем "main", которая будет выполняться роботом. Также вы изучили 3 простые команды для управления двигателями:
 
Также вы освоили некоторые важные аспекты языка NXC. Прежде всего вы узнали, что каждая программа имеет задачу с именем "main", которая будет выполняться роботом. Также вы изучили 3 простые команды для управления двигателями:
OnFwd(), OnRev() и Off(). И наконец, вы узнали оператор Wait().
+
OnFwd(), OnRev() и Off(). И наконец, вы узнали об операторе Wait().

Текущая версия на 14:28, 29 мая 2009

Автор: Daniele Benedettelli

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

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

Первая программа

В этой главе я покажу, как написать очень простую программу. Мы запрограммируем робота на движение 4 секунды вперед, 4 - назад и остановку в конце. Не очень впечатляюще, но на этом примере вы сможете получить представления об простейших способах программирования. Кроме того, вы сможете понять, насколько это просто. Но, прежде чем писать программу, нам нужно собрать робота.

Постройка робота

Робот, которого мы будем использовать в этом курсе - Tribot - первый колёсный робот, которого инструкция к NXT советует собрать после покупки набора. Единственное отличие будет заключаться в том, что вы должны подключить правый мотор в порт A, левый мотор в порт C, а мотор захвата в порт B.

Lego NXT Tribot.jpg

Убедитесь, что вы правильно установили драйверы Mindstorms NXT Fantom Drivers, поставляемые с набором.

Запуск Bricx Command Center

Мы будем писать программы используя Bricx Command Center. Запустите его двойным щелчком по иконке BricxCC (я предполагаю, что вы уже установили BricxCC. Если нет, загрузите его с сайта (см. введение) и установите его в любой удобный вам каталог). Программа попросит предоставить ей возможность подключиться к роботу. Включите робота и нажмите "ОК". Программа (скорее всего) автоматически найдёт робота. Ниже приведено избражение интерфейса пользователя, появляющееся после успешного завершения синхронизации (закладки с текстовым окном быть не должно).

BricxCCScreenShot1.jpg

Интерфейс выглядит как стандартный текстовый редактор с обычным меню, кнопками для открытия и сохранения файлов, печати, редактирования и т.п. Однако среди них есть несколько специальных меню для компилирования программ и загрузки их в робота, а также для получения отладочной информации; пока вы можете не обращать на них внимание. Сейчас мы хотим написать новую программу, так что нажимайте кнопку "New File" для создания нового окна с текстовым редактором.

Написание программы

Теперь введите текст программы:

task main()
{
OnFwd(OUT_A, 75);
OnFwd(OUT_C, 75);
Wait(4000);
OnRev(OUT_AC, 75);
Wait(4000);
Off(OUT_AC);
}

На первый взгляд выглядит немного сложно, так что давайте разберемся в ней.

Программы NXC состоят из задач ("task"). Наша программа содержит всего одну задачу с именем "main". Любая программа на языке NXC должна содержать задачу с именем "main", которая и будет исполняться роботом (о задачах мы поговорим подробнее в главе 6). Задача состоит из набора команд - операторов. Операторы заключены в фигурные скобки для того, чтобы была ясна их принадлежность к конкретной задаче. Каждый оператор заканчивается точкой с запятой. Это позволяет понять, где кончается один оператор и начинается следующий. В целом задача обычно выглядит следующим образом:

task main()
{
statement1;
statement2;
…
}

Наша программа содержит 6 операторов. Давайте разберем их по очереди:

OnFwd(OUT_A, 75);

Этот оператор говорит роботу включить выход "A" модуля NXT. Это означает, что мотор, подключенный нами ранее, будет двигать модель вперед. Число, следующее за указанием порта, устанавливает скорость мотора в 75% от максимальной.

OnFwd(OUT_C, 75);

Тот же оператор, но теперь включаем мотор "C". После выполнения этих операторов оба мотора вращаются, и робот едет вперёд.

Wait(4000);

Теперь время немного подождать. Этот оператор говорит нам подождать 4 секунды. Аргумент, которым является число в скобках, указывается в 1/1000 секунды, так что мы можем с большой точностью указать программе необходимую задержку. Следующие 4 секунды программа будет ждать, а робот с включенными двигателями ехать вперед.

OnRev(OUT_AC, 75);

Робот проехал вперед достаточно далеко, так что мы скажем ему ехать в обратном направлении, т.е. назад. Обратите внимание, что мы можем установить режим работы обоих моторов сразу используя аргумент OUT_AC; таким же образом можно заменить первые два оператора задачи.

Wait(4000);

Снова ждём 4 секунды.

Off(OUT_AC);

И наконец, выключаем оба мотора.

Вот и вся программа. Она включает на 4 секунды оба мотора на движение вперед, затем назад и в конце выключает их.

Вы, наверное, заметили при написании программы автоматическое выделение фрагментов кода разными цветами. Эти цвета и стили используемые текстовым редактором можно настроить, если они вам кажутся неудобными.

Запуск программы

После написания программы нам потребуется её скомпилировать (превратить её в двоичные коды, которые робот может разобрать и выполнить) и переслать полученные двоичные коды в робота, используя USB-кабель или Bluetooth-донгл (сокращенно: загрузить программу в робота).

BricxCCScreenShot2.jpg

На этой панели расположены кнопки, которые позволяют (слева направо) компилировать программу, загружать её в робота, запускать выполнение программы на роботе и останавливать его.

Нажмите вторую кнопку, и, если вы не сделали ошибок при написании программы, она корректно скомпилируется и загрузится в робота (если вы допустили ошибки, об этом будет выдано сообщение, см. более подробно ниже).

Теперь мы можем запустить нашу программу на выполнение. Чтобы сделать это зайдите в меню "My Files" на модуле, "Software files", и запустите ("run") программу с названием "1_simple". Помните: файлы программ в файловой системе NXT имеют такие же имена, как и исходные NXC-файлы.

Кроме того, ваша программа может запускаться автоматически после загрузки. Используйте комбинацию клавиш CTRL+F5 или после загрузки программы на робота нажмите зелёную кнопку запуска программы.

Делает ли робот то, что мы запрограммировали? Если нет, проверьте соединения проводов.

Ошибки в программе

Когда вы набираете программы, существует вероятность допустить ошибки. Компилятор сообщает обо всех обнаруженных им ошибках внизу окна, в котором вы писали программу, как это показано на рисунке:

BricxCCScreenShot3.jpg

Он автоматически выделяет первую ошибку (неправильное написание наименования мотора). Когда у вас выдалось несколько ошибок, вы можете щёлкнуть на интересующем вас сообщении об ошибке и перейти к соответствующему месту программы. Обратите внимание, что часто ошибки в начале программы могут повлечь ошибки в других местах. Так что лучше исправлять только первые несколько ошибок, после чего скомпилировать программу еще раз. Так же заметим: подсветка синтаксиса помогает избежать ошибок при разработке. Например, в последней строке мы написали Of вместо Off. Так как это неизвестная команда, она не подсвечена.

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

Изменяем скорость

Как вы заметили, робот перемещается достаточно быстро. Чтобы изменить его скорость, вам потребуется изменить второй параметр внутри круглых скобок. Скорость вращения моторов задаётся числом между 0 и 100: 100 - это самая большая скорость, 0 - полная остановка (сервопривод NXT будет удерживать положение). Вот новая версия нашей программы, под управлением которой робот будет перемещаться медленно:

task main()
{
OnFwd(OUT_AC, 30);
Wait(4000);
OnRev(OUT_AC, 30);
Wait(4000);
Off(OUT_AC);
}

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

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

Также вы освоили некоторые важные аспекты языка NXC. Прежде всего вы узнали, что каждая программа имеет задачу с именем "main", которая будет выполняться роботом. Также вы изучили 3 простые команды для управления двигателями: OnFwd(), OnRev() и Off(). И наконец, вы узнали об операторе Wait().