## Программирование Lego NXT в TRIKStudio

### Подключение робота

Первое, что необходимо сделать для программирования Lego NXT – переключить TRIKStudio в режим поддержки Lego NXT. Это делается в окне "Настройки", вкладка "Роботы":

#### Подключение по USB

Задайте в окне настроек робота подключение по USB, нажмите "ОК".

Нажмите кнопку "Подключиться" на панели инструментов.

В случае, если драйвер для работы с NXT по USB не установлен на компьютер или установлен некорректно (как это часто бывает в случае с официальным драйвером Lego Fantom на последних версиях Windows), TRIK Studio предложит установить собственный драйвер. Следуйте дальнейшим инструкциям, которые будут даны в процессе установки. Официальный драйвер NXT также совместим с TRIK Studio, см. раздел"Установка драйвера Lego Fantom".

В окне вывода должно появиться сообщение об успешном подключении, после этого робот готов к работе.

#### Подключение по Bluetooth

Робот подключается к компьютеру по Bluetooth как обычное Bluetooth-устройство, поэтому, во-первых, никаких специальных драйверов робота для подключения не требуется, во-вторых, процесс подключения сильно зависит как от операционной системы, так и от драйверов конкретного Bluetooth-адаптера. Ниже приведены инструкции по настройке подключения для Windows Vista с использованием встроенных в ОС драйверов для Generic Bluetooth Radio.

1. Включить робот
2. В "панели управления" операционной системы надо найти значок "Устройства Bluetooth"
3. Нажать "Добавление беспроводного устройства"
4. Выбрать в появившемся окне устройство "NXT"
5. Нажать на роботе оранжевую кнопку, подтвердив пароль 1234 на Bluetooth-соединение
6. В появившемся на компьютере окне ввести код 1234 и нажать "Далее"
7. Нажать "Закрыть"
8. Правой кнопкой мыши кликнуть по значку устройства, выбрать пункт меню "Свойства"
9. В появившемся окне перейти на вкладку "Службы" и запомнить номер последовательного порта (например, COM7)
10. Закрыть окно и панель управления, теперь робот подключен как Bluetooth-устройство, надо настроить TRIKStudio
11. Запустить TRIKStudio, открыть окно настроек робота
12. Выбрать подключение по Bluetooth и реальный робот
13. В разделе "Настройки Bluetooth" указать номер COM-порта, который был написан во вкладке "Службы" (например, COM7)
14. Нажать "ОК"

А вот так выполняется подключение в Windows 8.1 со стандартным драйвером Bluetooth. Сначала на панели, появляющейся у правого края экрана надо выбрать "Параметры":

Там выбираем "Изменение параметров компьютера":

В появившемся окне выбираем "Компьютер и устройства":

Там выбираем "Bluetooth" и находим в списке Bluetooth-устройств устройство с именем NXT (заполнение списка может занять некоторое время):

Жмём кнопку "Связать", на роботе в это время должен отобразиться ввод пароля Bluetooth-соединения. Можно оставить пароль по умолчанию и нажать оранжевую кнопку. После этого окно ввода пароля должно появиться и на компьютере. Пароль по умолчанию – 1234:

Если всё было сделано правильно, рядом с именем устройства должна появиться надпись "Подключено":

После этого можно проделать следующие пункты:

1. Запустить TRIKStudio, открыть окно настроек робота
2. Выбрать подключение по Bluetooth и реальный робот
3. В разделе "Настройки Bluetooth" выбрать один из COM-портов из выпадающего списка (например, COM7)
4. Нажать "ОК"
5. Попробовать выполнить подключение к роботу с посощью кнопки "Подключиться" на панели инструментов
6. Если подключение не удалось, попробовать другой COM-порт в настройках

См. также раздел Диалог настроек робота.

### Установка драйвера Lego Fantom

Для управления роботом прямыми командами по USB и для загрузки программ на робот потребуются драйвера из поставки конструктора. Скачать их отдельно можно с сайта Lego: http://www.lego.com/ru-ru/mindstorms/downloads, "Загрузить драйвер NXT Fantom". Если при установке возникнут проблемы, можно в распакованном архиве с драйвером перейти в папку "NXT Fantom Drivers\NXT Fantom Drivers\Windows\1.2\1.2.0\Products", выбрать там нужный драйвер и запустить соответствующий .msi-файл вручную (например, для 64-битной Windows 8.1 это "NXT Fantom Drivers\NXT Fantom Drivers\Windows\1.2\1.2.0\Products\LEGO_NXT_Driver_64\NXT_D02\LegoMindstormsNXTdriver64.msi"). Информацию об установке драйвера NXT можно уточнить на сайте Lego или в сторонних источниках, авторы данной документации не связаны с Lego и не могут влиять на то, как Lego распространяет драйвера. После установки драйверов TRIK Studio сможет подключаться к роботу.

### Установка драйвера NXT вручную

В случае, если по какой-либо причине автоматическая установка драйвера TRIK Studio была неудачной, Вы можете попробовать установить драйвер вручную. Здесь будет описан процесс установки драйвера на Windows 8.1, на других версиях Windows последовательность действий аналогична. Прежде всего, следует помнить, что устройство NXT может находиться в двух режимах: прошитом и со стертой прошивкой (в таком случае NXT будет издавать повторяющиеся звуковые сигналы, "тикать"). Следует также иметь в виду, что в течение всего времени выполнения инструкций данного раздела устройство NXT должно быть включено и подключено к компьютеру. Откройте диспетчер устройств Windows и найдите в нем секцию с неизвестными устройствами (их количество может быть разным на разных компьютерах):

Следующее, что следует сделать — запомнить идентификаторы поставщика и устройства NXT в том режиме, в котором он в данный момент находится. В случае, если NXT не прошит и "тикает", идентификатором поставщика является 03EB, идентификатором устройства — 6124. Для прошитого NXT такими идентификаторами будут 0694 для производителя и 0002 для устройства.
Далее необходимо найти устройство с такими идентификаторами. Для этого последовательно сверяйте идентификаторы каждого неизвестного устройства в диспетчере устройств. Идентификаторы можно посмотреть в окне свойств устройства, для этого кликните правой кнопкой мыши по устройству, выберите пункт Свойства, в открывшемся окне кликните на вкладку Сведения и в раскрывающемся списке свойств выберите ИД оборудования:

Значение свойства для устройства NXT должно содержать строку вида USB\VID_<ИД производителя>&PID_<ИД оборудования>, где вместо <ИД производителя> и <ИД оборудования> стоят запомненные на предыдущем шаге числа.
Если такого устройства не нашлось в секции неизвестных устройств, следует проверить другие секции, в первую очередь, не установлено ли устроство Bossa Program Port в секции Порты (COM и LPT). Если такое устройство есть, следует удалить его драйвер и начать процесс установки с начала, перевоткнув в компьютер устройство NXT.

Как только устройство NXT найдено, можно установить на него драйвер WinUSB. Для этого закройте окно со свойствами устройства, если оно открыто, кликните правой кнопкой мыши по найденному на предыдущем шаге устройству и выберите пункт Обновить драйверы.... В открывшемся окне выберите пункт "Выполнить поиск драйверов на этом компьютере":

Далее нажмите "Выбрать драйвер из списка уже установленных драйверов":

Нужный нам драйвер находится в категории "Устройства USB":

В списке "Изготовитель" выберите "WinUsb Device" и пункт с таким же названием в списке "Модель":

Появится предупреждающее сообщение Windows о том, что устройство может не работать с данным драйвером. Подтвердите свой выбор:

Сам процесс установки обычно проходит довольно быстро, после чего будет показано окно с оповещением об успешной установке драйвера. Это означает, что среда TRIK Studio готова к работе с NXT. Следует иметь в виду, что другое ПО на компьютере, работающее с NXT, скорее всего, перестанет работать с ним, так как теперь драйвером устройства NXT в системе является WinUSB, а не Lego Fantom. Аналогичную процедуру следует проделать при переводе NXT в другой режим (его прошивке или удалении прошивки клавишей "reset").

### Прошивка робота

TRIK Studio в качестве среды выполнения сгенерированных программ использует прошивку nxtOSEK (http://lejos-osek.sourceforge.net/), совместимую по формату команд и внешнему виду интерфейса с штатной прошивкой, но позволяющую запускать программы на C с библиотекой ECRobot. Перед тем, как загружать на робот сгенерированные программы, робот необходимо прошить (сделать это надо только один раз для каждого робота, если не используется сторонних средств, загружающих на робот свои прошивки).

Так же, как и для подключения по USB, прошивка робота требует установленных драйверов. Первое, что требуется сделать – перевести робот в режим прошивания, для этого надо включить робот, подключить его к компьютеру по USB, после чего чем-нибудь тонким (скрепкой, стержнем от ручки) нажать на кнопку Reset сзади робота и подержать 4 секунды (подробнее об этом см. в инструкции по эксплуатации робота, поставляемой вместе с конструктором). Если всё сделано правильно, робот будет характерно тикать. После этого необходимо нажать на кнопку "Прошить" и подождать, пока система сообщит об удачном завершении прошивания робота. После этого робот можно выключить и снова включить, загрузится новая прошивка.

### Блоки Lego NXT

Специализированные блоки для Lego NXT делятся на несколько категорий:

- Действия – блоки, выполняющие какое-либо действие на роботе: включение моторов, проигрывание звука и т.д.
- Ожидания – блоки, ждущие наступления какого-либо события: определённых показаний датчиков, нажатия на кнопку и т.д.
- Рисования на дисплее – блоки, используемые для вывода графики и текста на экран.

#### Действия

Название элемента | Пиктограмма | Описание
Гудок |  | Проиграть на роботе звук с фиксированной частотой. Имеется один параметр — ждать ли завершения проигрывания звука или сразу же перейти к следующему блоку. Допустимые значения — Истина и Ложь.
Играть звук |  | Проиграть на роботе звук с заданной частотой и длительностью. Аналогичен блоку "Гудок", но позволяет задавать параметры звука. Имеется параметр, определяющий, ждать ли завершения проигрывания звука или сразу же перейти к следующему блоку.
Моторы вперёд |  | Включить моторы по заданным портам с заданной мощностью. Порты задаются буквами A, B или C, разделенными запятыми. Мощность задается в процентах числом от -100 до 100, если задано отрицательное значение, мотор включается в режиме реверса. Так, на картинке изображена команда включения моторов на портах A и B с мощностью 100%. Кроме того, моторы имеют разные режимы работы: режим торможения и режим скольжения (отображаемые красным или зелёным прямоугольником на блоке соответственно). Режимы влияют на то, как двигатель отрабатывает команду — режим торможения стопорит двигатель при отключении, режим скольжения позволяет двигателю прокручиваться по инерции.
Моторы назад |  | Включить моторы в режиме реверса по заданным портам с заданной мощностью. Параметры аналогичны параметрами блока "Моторы вперёд".
Моторы стоп |  | Выключить моторы по заданным портам.
Сбросить показания энкодера |  | Сбросить показания количества оборотов моторов.

#### Ожидания

Название элемента | Пиктограмма | Описание
Ждать сенсор касания |  | Ждать, пока не сработает датчик касания. Параметром указывается номер порта, к которому подключен датчик. Допустимые значения: 1, 2, 3, 4.
Ждать сонар |  | Ждать, пока расстояние, возвращаемое ультразвуковым сенсором расстояния, не будет сравнимо с указанным в значении параметра "Расстояние" (расстояние задается в сантиметрах, от 0 до 255). Еще один парамер — номер порта, к которому подключен датчик расстояния. Также параметром указывается операция, которая будет использоваться для сравнения с введенным расстоянием. Так, при выполнении приведенного блока выполнение программы остановится до тех пор, пока значение, возвращаемое сонаром, не будет больше, чем 40 см.
Ждать цвет |  | Ждать, пока сенсор цвета в режиме распознавания цветов не вернет указанный цвет.
Ждать энкодер |  | Ждать, пока показания счетчика количества оборотов на заданном моторе не достинут указанного в значении параметра "Предел оборотов".
Ждать интенсивность цвета |  | Ждать, пока значение, возвращаемое сенсором цвета на указанном порту, не будет сравнимо с указанным в значении параметра "Интенсивность" (задается в процентах). Еще один парамер — номер порта, к которому подключен сенсор цвета. Также параметром указывается операция, которая будет использоваться для сравнения с введенной интенсивностью. Так, при выполнении приведенного блока выполнение программы остановится до тех пор, пока значение, возвращаемое соответствующим сенсором цвета, не будет больше, чем 60 процентов.
Ждать свет |  | Ждать, пока значение, возвращаемое сенсором света на указанном порту, не будет сравнимо с указанным в значении параметра "Проценты". Еще один парамер — номер порта, к которому подключен сенсор цвета. Также параметром указывается операция, которая будет использоваться для сравнения со значением параметра "Проценты". Так, при выполнении приведенного блока выполнение программы остановится до тех пор, пока значение, возвращаемое соответствующим сенсором света, не будет больше, чем 60 процентов.
Ждать сенсор звука |  | Ждать, пока громкость, считанная микрофоном на заданном порту, не будет выше или ниже заданного значения.
Ждать нажатия кнопки |  | Ждать, пока не будет нажата указанная кнопка на корпусе робота. Обратите внимание, в режиме генерации в C доступны только кнопки 'Ввод' и 'Вправо'!

#### Рисование на дисплее

Блоки рисования на дисплее работают только при прошивке программы на робот или в двумерной модели, при интерпретации программы по Bluetooth или USB они работать не будут в силу ограничений в системе прямых команд робота.

Название элемента | Пиктограмма | Описание
Нарисовать прямоугольник |  | Нарисовать на экране прямоугольник. В качестве параметров указываются координаты левого верхнего угла, ширина и высота прямоугольника.
Нарисовать точку |  | Нарисовать на экране точку в указанных координатах.
Нарисовать линию |  | Нарисовать на экране отрезок. В качестве параметров блоку указываются концы отрезка.
Нарисовать круг |  | Нарисовать на экране круг с заданным центром и заданным радиусом.
Напечатать текст |  | Печатает заданную строку в заданном месте на экране робота. Значение свойства "Текст" по умолчанию трактуется как строка в чистом виде, оно так и будет выведено на экран. Чтобы система считала, что это выражение на текстовом языке (это может быть полезно, например, при отладке значения переменных), поставьте галочку "Вычислять" в редакторе свойств.
Очистить экран |  | Стереть всё, что нарисовано на экране.

Описание блоков, общих для всех конструкторов, можно посмотреть в разделе Создание программ/Создание блоков.

### Сенсорные переменные

Название | Описание
encoderA, encoderB, encoderC | Показания экодера на порту A, B или C соответственно.
buttonEnter, buttonEscape, buttonLeft, buttonRight | Состояние кнопок на корпусе робота: кнопки "Ввод", "Отмена", "Влево", "Вправо" соответственно. 0 соответствует ненажатой кнопке, 1 – нажатой. Обратите внимание, в режиме генерации в C доступны только кнопки 'Enter' и 'Right'!
sensor1, sensor2, sensor3, sensor4 | Показания датчиков на портах 1, 2, 3, 4 соответственно.

### Текстовое программирование

Текстовое программирование для Lego NXT осуществляется на языке C с использованием макросов и функций из библиотеки ECRobot. Общая структура программы такова:

- Сначала идёт подключение заголовочных файлов, используемых в программе (стандартные заголовочные файлы C и заголовочные файлы ECRobot)
- Затем идёт объявление констант и переменных, используемых в программе
- За ними описываются функции ecrobot_device_initialize и ecrobot_device_terminate, первая вызывается при запуске программы, вторая - при прекращении её работы. В них обычно выполняется инициализация и деинициализация датчиков, энкодеров и других устройств робота. По умолчанию в ecrobot_device_initialize инициализируется генератор случайных чисел.
- За ними идёт описание функции user_1ms_isr_type2, которая вызывается каждую миллисекунду.
- Затем идёт описание задачи, которая запускается на исполнение при старте программы: TASK(OSEK_Task_Number_0). Здесь, собственно, и выполняется большая часть программирования.

Пример пустой, но содержащей все необходимые разделы программы приведён ниже:

    #include <string.h>
    #include "kernel.h"
    #include "kernel_id.h"
    #include "ecrobot_interface.h"
    #include "trik_studio_utils.h"
    #include <time.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <stdarg.h>
    #include <math.h>

    U32 __interpretation_started_timestamp__ = 0;
    static const float pi = 3.14159265;

    void ecrobot_device_initialize(void)
    {
    	srand(systick_get_ms());

    }

    void ecrobot_device_terminate(void)
    {

    }

    /* nxtOSEK hook to be invoked from an ISR in category 2 */
    void user_1ms_isr_type2(void)
    {

    }

    /* Main task */
    TASK(TASK_MAIN)
    {
    	__interpretation_started_timestamp__ = systick_get_ms();

    	TerminateTask();
    }

Полное описание (на английском) функций, доступных при программировании доступно по ссылке http://lejos-osek.sourceforge.net/api.htm. См. также http://lejos-osek.sourceforge.net/index.htm. В качестве примеров можно использовать код, генерируемый по диаграммам самой средой TRIKStudio.

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

Для Lego NXT существует несколько вариантов выполнения программ:

- пошаговая интерпретация диаграммы с посылкой команд в робота по Bluetooth или USB, или моделированием поведения робота с помощью двумерной модели
- прошивка и дальнейшее автономное исполнение программы на роботе без связи с компьютером.

#### Интерпретация по Bluetooth

Чтобы запустить программу на выполнение, необходимо нажать кнопку "Выполнить" панели "Интерпретатор" или меню "Инструменты":

После этого интерпретатор ищет блок "Начало", с которого и начинается выполнение программы. Если такой блок на диаграмме не найден, будет выдано сообщение об ошибке. Для каждого функционального блока должна существовать ровно одна исходящая связь, по которой выполнение программы перейдет к следующему блоку. В противном случае будет выдано сообщение об ошибке.

Для того, чтобы остановить выполнение программы, нужно нажать кнопку "Прервать выполнение" панели "Интерпретатор" или меню "Инструменты".

#### Прошивка в робота

Для прошивки программ в робота в TRIKStudio необходим дополнительный пакет инструментов, называемый NXTTools. Его может быть нужно доустановить с помощью менеджера пакетов (TRIKStudio/maintenance.exe), если он не был установлен изначально. Наличие NXTTools можно проверить по наличию кнопок "Генерировать код", "Прошить" и "Загрузить программу" на панели инструментов. Если кнопки есть, NXTTools установлен, если нет, загружать программу на робот нельзя:

Для того, чтобы запускать программы на роботе, вместо стандартной операционной системы Lego Mindstorms NXT 2.0 необходимо использовать прошивку nxtOSEK, которая является расширением стандартной системы, позволяющим сохранять программы с компьютера по USB и запускать их на роботе. Чтобы записать в робота прошивку nxtOSEK, необходимо подключить его по USB к компьютеру, перевести робота в режим перезагрузки (нажать и удерживать 4 секунды кнопку Reset на задней панели управляющего блока робота) и нажать в TRIKStudio кнопку "Прошить" панели инструментов "Взаимодействие с роботом":

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

Когда прошивка успешно перезаписана, робот готов к загрузке на него и выполнению программ. Для этого нужно убедиться, что робот корректно подключен по USB к компьютеру и находится во включенном состоянии. После этого нужно нажать кнопку "Загрузить" панели инструментов "Взаимодействие с роботом". В редакторе диаграмм откроется дополнительная вкладка, на которой будет показан код на Си-подобном языке, поддерживаемом операционной системой nxtOSEK. Этот код будет скомпилирован в исполняемую программу и загружен в робота. При неудачном завершении операции будет выдано информационное сообщение, описывающее проблему.