# Справочный центр ТРИК

**Справочный центр ТРИК** — руководство по работе с бесплатной средой программирования роботов TRIK Studio. Открытый код TRIK Studio вы можете найти в нашем репозитории на [GitHub](https://github.com/trikset/trik-studio).

{% content-ref url="/pages/-M-BAHL5XljtzrGr8SVM" %}
[О TRIK Studio](/studio/about)
{% endcontent-ref %}

Также в справке описано взаимодействие TRIK Studio с поддерживаемыми платформами:

* [Контроллером ТРИК](/trik/about)
* [LEGO EV3](/ev3/about)
* [LEGO NXT](/nxt/about)
* [Квадрокоптером Геоскан Пионер](/pioneer/about)

<div align="center"><img src="/files/-M0-7vhzD5-0n86hHjNt" alt=""></div>


# О TRIK Studio

**TRIK Studio** — бесплатная среда программирования роботов.

<div align="center"><img src="/files/-M0-7vhzD5-0n86hHjNt" alt=""></div>

Она позволяет решать задачи как с помощью [визуального](/studio/programming-visual) программирования, так и [текстовых языков](/studio/programming-code).

{% tabs %}
{% tab title="Визуальное программирование" %}

<div align="center"><img src="/files/-M0-HUE0z-PuKi1WyabP" alt=""></div>
{% endtab %}

{% tab title="Текстовое программирование" %}
![](/files/-M0-HWV8hf-l6qxQZHQW)
{% endtab %}
{% endtabs %}

Отличительной особенностью TRIK Studio является [интерактивный режим имитационного моделирования](/studio/2d-model). Чтобы научиться программировать, необязательно иметь конструктор.

![](/files/-M0-Jq1sGsm2xlWy1p9M)

TRIK Studio — универсальное программное обеспечение для преподавания основ программирования. В ней предусмотрен переход [от диаграмм к текстовым языкам](/studio/programming-code#generation).

![](/files/-M0-JUTRdiw7ni2tG4lk)

### Поддерживаемые платформы <a href="#platforms" id="platforms"></a>

TRIK Studio поддерживает 4 платформы:

* [Контроллер ТРИК](/trik/about).
* [LEGO EV3](/ev3/about).
* [LEGO NXT 2.0](/nxt/about).
* [Квадрокоптер Геоскан Пионер](/pioneer/about).

## Скачать&#x20;

Последнюю версию TRIK Studio можно скачать на сайте [trikset.com](https://trikset.com/downloads#trikstudio).

{% content-ref url="/pages/-M0-Kubk53IOXwzPcScx" %}
[Как узнать версию TRIK Studio](/studio/about/version)
{% endcontent-ref %}

## Рекомендуемые системные требования

* Оперативная память: 4 ГБ или больше.
* Операционная система:
  * 64-разрядная Windows 10.
  * Ubuntu 16.04 и выше.
  * macOS 10.12 Sierra и выше.


# Как узнать версию TRIK Studio

Версия TRIK Studio отображается в заголовке окна.

![](/files/-M1bPEw47hOY2T4CXL-b)

А также на стартовой странице.

![](/files/-M1bPIaSj05ssFlo1agD)


# Начало работы и создание проекта

Создание нового проекта и запуск существующего

## Главное окно

После запуска **TRIK Studio** откроется стартовая страница, на которой будет отображена [версия](/studio/about/version) TRIK Studio, быстрый доступ к недавним проектам, а также кнопки для [открытия существующего проекта](/studio/start#open-project) и [создания нового](/studio/start#new-project).

![Стартовая страница TRIK Studio](/files/-M-BKn1_Et9wTc5aPQh0)

## Создание проекта <a href="#new-project" id="new-project"></a>

Для создания нового проекта нажмите кнопку «Создать проект» на стартовой странице TRIK Studio.

![](/files/-M0T-YVNnkmZ5dc5IA6h)

Или в [главном меню](/studio/interface/main-menu) выберите `Файл → Новый проект`.&#x20;

![](/files/-M0T0Tnkuu2QogDRcz5R)

Откроется окно с новой программой на визуальном языке программирования:

![](/files/-M2E9ayrdOG7JZkLiyWg)

О программировании на визуальном языке читайте в статье:

{% content-ref url="/pages/-M0Npqc4WgYQzryDW1qz" %}
[Программирование на визуальном языке](/studio/programming-visual)
{% endcontent-ref %}

Про создание новой текстовой программы читайте в статье:

{% content-ref url="/pages/-M0Npt6Rsejz5XCUWJsR" %}
[Программирование на текстовом языке](/studio/programming-code)
{% endcontent-ref %}

## Запуск существующего проекта <a href="#open-project" id="open-project"></a>

Для запуска существующего проекта нажмите кнопку «Открыть проект» на стартовой странице TRIK Studio.

![](/files/-M0T0n_hAXR7PAu-9azE)

Или в [главном меню](/studio/interface/main-menu) выберите `Файл → Открыть...`.&#x20;

![](/files/-M0T1QhU7L5luu6ZDFQW)

По умолчанию TRIK Studio ищет файлы в формате `*.qrs` или последнего открытого формата (например, `*.js`). Если требуется существующий проект в другом формате, выберите в выпадающем меню нужный формат (например, `*.py)` или `Все файлы (*.*)`.

![](/files/-M29YK4wdnZ5_EZnR5Pc)


# Интерфейс TRIK Studio

## Режимы TRIK Studio

Интерфейс TRIK Studio зависит от выбранного режима. TRIK Studio имеет два режима:

1. [**Режим редактирования**](/studio/interface#mode-edit)\
   Предназначен для создания диаграммы управления роботом и исполнения её на роботе в режиме генерации.<br>
2. [**Режим отладки**](/studio/interface#mode-debug)\
   Предназначен для исполнения и отладки программы на 2D-модели или в режиме интерпретации на реальном роботе.

### Переключение между режимами

Переключение режимов возможно тремя способами. С помощью:

1. Сочетаний клавиш `Ctrl+1` / `Ctrl+2`.
2. [Панели переключения режимов](/studio/interface#panel-mode-switching).
3. [Строки статуса](/studio/interface#status-bar).

## Режим редактирования <a href="#mode-edit" id="mode-edit"></a>

![Интерфейс TRIK Studio в режиме редактирования](/files/-M0Su-OprALGEN1yXk-R)

TRIK Studio в режиме редактирования имеет следующие элементы интерфейса:

* [Окно редактора / сцена](/studio/interface#editor-window)
* [Главное меню](/studio/interface#menu)
* [Панель «Файл»](/studio/interface#panel-file)
* [Панель «Правка»](/studio/interface#panel-edit)
* [Панель «Вид»](/studio/interface#panel-view)
* [Панель «Интерпретатор»](/studio/interface#panel-interpreter)
* [Панель «Генераторы»](/studio/interface#panel-generators)
* [Панель «Прочее»](/studio/interface#panel-other)
* [Панель переключения режимов](/studio/interface#panel-mode-switching)
* [Редактор свойств элементов](/studio/interface#panel-property-editor)
* [Настройки сенсоров](/studio/interface#panel-configure-devices)
* [Палитра (набор блоков для создания диаграмм)](/studio/interface#panel-palette)
* [Список переменных](/studio/interface#panel-variables)
* [Строка статуса](/studio/interface#status-bar)

### Окно редактора / сцена <a href="#editor-window" id="editor-window"></a>

Сцена отображает диаграмму и позволяет ее редактировать.

![Сцена](/files/-M0TPVSiESB1MTtjbkGL)

О создании нового проекта и работе с диаграммами читайте в статьях:

{% content-ref url="/pages/-M0-93-kqAJ-YB0Izejk" %}
[Начало работы и создание проекта](/studio/start)
{% endcontent-ref %}

{% content-ref url="/pages/-M2Cg4NSr84OpQjA\_hVf" %}
[Добавление и удаление блоков](/studio/programming-visual/blocks-add-delete)
{% endcontent-ref %}

Здесь же осуществляется отображение текущего исполняемого блока при интерпретации диаграмм.

![](/files/-MOYWNcFRJIblWkqQw6I)

### Главное меню <a href="#menu" id="menu"></a>

Главное меню **TRIK Studio** содержит набор базовых операций и настроек среды:

* [Файл](/studio/interface/main-menu#menu-file)
* [Правка](/studio/interface/main-menu#menu-edit)
* [Вид](/studio/interface/main-menu#menu-view)
* [Инструменты](/studio/interface/main-menu#menu-tools)
* [Настройки](/studio/interface/main-menu#menu-settings)
* [Справка](/studio/interface/main-menu#menu-about)

![Главное меню](/files/-M0T5VRcH0paLi-lomaB)

Подробнее смотрите в статье:

{% content-ref url="/pages/-M0Svs74pJEBrIN424XL" %}
[Главное меню TRIK Studio](/studio/interface/main-menu)
{% endcontent-ref %}

### Панель «Файл» <a href="#panel-file" id="panel-file"></a>

Панель «Файл» повторяет основные операции, доступные из меню «[Файл](/studio/interface/main-menu#menu-file)».

&#x20;<img src="/files/-M0TRucvlIfjg--R7FZd" alt="" data-size="line"> Создать новый проект.\
&#x20;<img src="/files/-M0TRomYB1HLsa4cArX2" alt="" data-size="line"> Открыть сохраненный проект.\
&#x20;<img src="/files/-M0TRs3g2PQ9doHlbjcZ" alt="" data-size="line"> Сохранить текущий проект.

### Панель «Правка» <a href="#panel-edit" id="panel-edit"></a>

<img src="/files/-M0TSC5RwwyN5X-YcCh6" alt="" data-size="line"> Отмена операции.\
&#x20;<img src="/files/-M0TSFwoXPzkrdbPn2cV" alt="" data-size="line">Повтор операции.

### Панель «Вид» <a href="#panel-view" id="panel-view"></a>

Панель «Вид» содержит кнопки, позволяющие масштабировать диаграммы.

<img src="https://thumb.tildacdn.com/tild3030-6165-4761-b762-383737303632/-/resize/65x/-/format/webp/image.png" alt="" data-size="original">Приблизить / отдалить.

Также масштабировать сцену можно с помощью:

1. Зажатия клавиши `Ctrl` и вращения колесика мыши.
2. Сочетания клавиш `Ctrl+=` и `Ctrl+-`.

### Панель «Интерпретатор» <a href="#panel-interpreter" id="panel-interpreter"></a>

![Инструменты панели «Интерпретатор»](https://thumb.tildacdn.com/tild3163-3937-4239-b738-616361666363/-/resize/195x/-/format/webp/image.png)

Панель «Интерпретатор» содержит команды запуска и остановки выполнения программы, кнопки переключения режимов интерпретации между двумерной моделью и реальным роботом, а также кнопку открытия [настроек робота](/studio/settings#robots), доступных из меню «Инструменты».&#x20;

При работе с реальным роботом в режиме интерпретации эта панель также содержит кнопку «Подключиться».

<img src="/files/-M0TWxWgx9KVeBfQbJrk" alt="" data-size="line"> Запуск выполнения программы.\ <img src="/files/-M0TX0G3FoWI7aMJI4Mk" alt="" data-size="line"> Остановка выполнения программы.\ <img src="/files/-M0TX5bS1yQoAY5cNCNc" alt="" data-size="line"> Двумерная модель.\ <img src="/files/-M0TX9rSQOMfgBTT3E5g" alt="" data-size="line"> Реальный робот.\ <img src="/files/-M0TXDYJbs_WF2a1oa2D" alt="" data-size="line"> Настройки робота.

### Панель «Генераторы» <a href="#panel-generators" id="panel-generators"></a>

{% hint style="info" %}
Команды на этой панели изменяются в зависимости от конфигурации программы.
{% endhint %}

Панель «Генераторы» содержит команды генерации кода и загрузки программы на контроллер.

![](https://thumb.tildacdn.com/tild3734-6135-4838-a161-633336393062/-/resize/96x/-/format/webp/image.png)

<img src="/files/-M0TXb7ok6PDNzhzCIJZ" alt="" data-size="line"> Генерировать код.\ <img src="/files/-M0TXep32vy7B9GFzAUH" alt="" data-size="line"> Загрузить программу.

### Панель «Прочее» <a href="#panel-other" id="panel-other"></a>

Панель «Прочее» может содержать различную информацию в зависимости от выбранной платформы.

Например, для [конструктора ТРИК](/trik/about) на данной панели отображается IP-адрес контроллера, к которому вы подключаетесь.

![](https://thumb.tildacdn.com/tild3736-3338-4131-b737-303964656239/-/resize/129x/-/format/webp/image.png)

### Панель переключения режимов редактирования и отладки <a href="#panel-mode-switching" id="panel-mode-switching"></a>

Панель переключения режимов отображает текущий режим TRIK Studio и позволяет переключаться между режимами редактирования и отладки.

<img src="/files/-M0TY1WonWoSm6Er3C0T" alt="" data-size="line"> Редактор.\ <img src="/files/-M0TY4iRvGypRauhlbad" alt="" data-size="line"> Отладка.

### Панель «Редактор свойств» <a href="#panel-property-editor" id="panel-property-editor"></a>

Редактор свойств используется для отображения и редактирования значений свойств выделенных объектов (блоков, связей).&#x20;

![Панель «Редактор свойств»](/files/-M0TpWdgHowDu1x_3n4D)

О работе с редактором смотрите статью:

{% content-ref url="/pages/-M0P0qQgiJrqVGvF1drs" %}
[Редактирование свойств элементов](/studio/programming-visual/editing-element-properties)
{% endcontent-ref %}

### Панель «Настройки сенсоров» <a href="#panel-configure-devices" id="panel-configure-devices"></a>

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

{% hint style="info" %}
Набор сенсоров зависит от выбранной платформы в настройках на вкладке «[Роботы](/studio/settings#robots)».
{% endhint %}

![Настройки сенсоров для контроллера ТРИК](https://thumb.tildacdn.com/tild6130-6533-4832-a631-656535393432/-/resize/354x/-/format/webp/_-8.png)

### Панель «Палитра» <a href="#panel-palette" id="panel-palette"></a>

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

{% hint style="info" %}

1. Состав палитры может меняться в зависимости от выбранной в [настройках](/studio/settings#robots) платформы.
2. Серым выделены блоки, недоступные в выбранной модели выполнения (2D-модели или на реальном роботе).
   {% endhint %}

![Панель «Палитра»](https://thumb.tildacdn.com/tild6465-6266-4364-b032-663531326133/-/resize/345x/-/format/webp/_-9.png)

О добавлении и удалении блоков на сцену в TRIK Studio читайте в статье:

{% content-ref url="/pages/-M2Cg4NSr84OpQjA\_hVf" %}
[Добавление и удаление блоков](/studio/programming-visual/blocks-add-delete)
{% endcontent-ref %}

### Панель «Переменные» <a href="#panel-variables" id="panel-variables"></a>

Список переменных, используемых при выполнении диаграммы с их текущими значениями, включая [сенсорные переменные](/studio/programming-visual/expression-syntax/sensory-variables). При исполнении в режиме интерпретации на двумерной модели или реальном роботе берутся с робота в реальном времени. В режиме генерации не используются.

![Панель «Переменные»](https://thumb.tildacdn.com/tild3136-3865-4436-b937-326431666135/-/resize/345x/-/format/webp/_-10.png)

### Строка статуса <a href="#status-bar" id="status-bar"></a>

Строка статуса отображает текущий режим TRIK Studio ([редактирования](/studio/interface#mode-edit) или [отладки](/studio/interface#mode-debug)) и позволяет переключаться между режимами. Для переключения достаточно кликнуть на строку статуса.

![Строка статуса](/files/-M0Tqdts93w01eJFU0Br)

## Режим отладки <a href="#mode-debug" id="mode-debug"></a>

Элементы интерфейса TRIK Studio в режиме отладки повторяют элементы в [режиме редактирования](/studio/interface#mode-edit), кроме окна редактора, панелей редактора свойств и палитры. Вместо этих элементов отображаются:

* [Окно «Двумерная модель»](/studio/interface#window-2-d-1)
* [Окно «Ошибки»](/studio/interface#window-error)
* [Панель «Настройки робота»](/studio/interface#panel-settings-robot)
* [Панель «Графики»](/studio/interface#panel-graphics)

![Режим отладки](/files/-M0TjmQsIOWiiEiiKq8J)

### Окно «Двумерная модель» <a href="#window-2-d" id="window-2-d"></a>

Окно «Двумерная модель» открывается, если в качестве режима исполнения программы выбрана 2D-модель.

![Окно 2D-модели](/files/-M0TkuQaKBiWFMX5GFUr)

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

Подробнее о 2D-модели читайте в статье:

{% content-ref url="/pages/-M0Now5ADLgit5TISAGo" %}
[2D-модель](/studio/2d-model)
{% endcontent-ref %}

{% hint style="info" %}
В режиме интерпретации и генерации программы на реальном роботе это окно не показывается, вместо него отображается исполняемая диаграмма.
{% endhint %}

### Панель «Настройки робота» <a href="#panel-settings-robot" id="panel-settings-robot"></a>

На панели настроек робота отображается вид контроллера и параметры робота, которые зависят от выбранной [платформы](/studio/about#platforms).

![Панель «Настройки робота»](/files/-M0TntWMAc1lWcMJe4-d)

#### Открытие панели «Настройки робота»

![](/files/-MOYWcPT76NyukBcCRZs)

### Окно «Ошибки» <a href="#window-error" id="window-error"></a>

В случае синтаксических и семантических ошибок в TRIK Studio появляется окно с соответствующими сообщениями.

Для просмотра блока, в котором допущена ошибка, необходимо кликнуть на сообщение.

![](/files/-MOYWlmLUv0U0uAJgq_b)

### Панель «Графики» <a href="#panel-graphics" id="panel-graphics"></a>

Окно «Графики» отображает в реальном времени значения, присылаемые датчиками.&#x20;

![](/files/-MOYWt94fbDl8Za7mNo4)

Подробнее читайте в статье:

{% content-ref url="/pages/-M0NoXwADIrMAqVhsOaG" %}
[Работа с графиками](/studio/interface/graphics)
{% endcontent-ref %}


# Главное меню TRIK Studio

Главное меню **TRIK Studio** содержит набор базовых операций и настроек среды:

* [Файл](/studio/interface/main-menu#menu-file)
* [Правка](/studio/interface/main-menu#menu-edit)
* [Вид](/studio/interface/main-menu#menu-view)
* [Инструменты](/studio/interface/main-menu#menu-tools)
* [Настройки](/studio/interface/main-menu#menu-settings)
* [Справка](/studio/interface/main-menu#menu-about)

![](/files/-MOVoICuVAIZFU87K0B_)

## Файл <a href="#menu-file" id="menu-file"></a>

* **Новый проект** — создать новый проект.
* **Недавние проекты** — открыть один из недавно использовавшихся проектов.
* **Новая диаграмма** — создать новую диаграмму в текущем проекте.
* **Открыть…** — открыть сохраненный проект. Проекты хранятся на диске в файлах с расширением `.qrs`.
* **Сохранить** — сохранить текущий проект.
* **Сохранить как…** — сохранить текущий проект в выбранное местоположение. Последующие сохранения будут производиться в выбранный файл.
* **Сохранить диаграмму как картинку…** — сохранить на диск текущее изображение на сцене.
* **Печать** — распечатать диаграмму или текст, используя стандартный диалог печати.
* **Выход** — выйти из программы.
* **Восстановить настройки по-умолчанию и** **выйти** — восстановить настройки по-умолчанию и выйти из программы.

![](/files/-MOVoN5rWXdV7sW3BWvN)

## Правка <a href="#menu-edit" id="menu-edit"></a>

* **Отменить** — отменить выполненное действие.
* **Повторить** — сделать снова отмененное действие.
* **Копировать** — копировать выбранный элемент.
* **Вставить** — вставить выбранный элемент.
* **Вырезать** — вырезать выбранный элемент.
* **Найти...** — открыть диалог поиска по проекту.
* **Найти и заменить** — открыть диалог поиска по проекту и заменить.

![](/files/-MOVoScUL6Grht9Apr-3)

## Вид <a href="#menu-view" id="menu-view"></a>

* **Приблизить** — увеличить масштаб сцены.
* **Отдалить** — уменьшить масштаб сцены.
* **Панели** — включить / выключить отображение различных окон.
* **На** **главную** — вернуться на главную.

![](/files/-MOVpSrCHUUm8qhitvDY)

## Инструменты <a href="#menu-tools" id="menu-tools"></a>

{% hint style="warning" %}
**Внимание!** Пункты в этом меню могут появляться и исчезать в зависимости от конфигурации программы.
{% endhint %}

* **Жесты мышью** — открыть вкладку со списком доступных жестов мышью (см. раздел «[Добавление блоков жестами мыши](/studio/programming-visual/blocks-add-delete#mouse-gesture)»).
* **Выполнить** — запустить выполнение отображаемой в данный момент диаграммы на роботе в режиме интерпретации (пункт отображается только в режиме интерпретации).
* **2D-модель** — переключить режим работы интерпретатора на двумерную модель.
* **Реальный робот** — переключить режим работы интерпретатора на управление реальным роботом по Wi-Fi, Bluetooth или USB в зависимости от используемой [платформы](/studio/about#platforms) и настроек соединения с роботом.
* **Настройки** — открыть окно настройки модели робота, с которой осуществляется работа в TRIK Studio (подробнее см. раздел «[Роботы](/studio/settings#robots)» в статье «[Настройки TRIK Studio](/studio/settings)»).
* **Сохранить как упражнение…** — сохранить текущую диаграмму и двумерную модель как упражнение для учащихся. В упражнении нельзя модифицировать некоторые части решения. Например, расположение объектов в двумерной модели или конфигурацию датчиков. Выбор этого пункта меню открывает диалог, в котором можно выбрать фиксируемые части (подробнее про упражнения см. в статье «[Упражнения](/studio/exercises)»)
* **Подпрограммы** — управление подпрограммами (подробнее см. в статье «[Подпрограммы](/studio/programming-visual/subprograms)»).
* **Генерировать код** — открыть вкладку со сгенерированным кодом, соответствующим текущей диаграмме и выбранному текстовому языку (этот пункт может выглядеть как «Генерировать код на JavaScript», «Генерировать код на Python», «Генерировать код на C» и т.д.). Код не загружается на робот и не исполняется, но может быть отредактирован и загружен позже.
* **Загрузить программу** — только сгенерировать код и загрузить на робот, не исполняя его.
* **Загрузить и выполнить программу** — сгенерировать код, соответствующий текущей диаграмме, загрузить его и исполнить на роботе.
* **Остановить робота** — прервать выполнение программы и послать роботу команды отключения моторов.
* **Подключиться** — установить соединение с роботом. Робот должен быть включен. Показывается только в том случае, если выбранный режим работы с роботом предполагает необходимость постоянного подключения (например, интерпретация программы по Bluetooth или Wi-Fi).

![](/files/-MOVpXjv2qyU0JkXBshV)

## Настройки <a href="#menu-settings" id="menu-settings"></a>

* **Настройки…** — открыть окно настроек среды TRIK Studio (см. статью «[Настройки TRIK Studio](/studio/settings)»).
* **Показать** **сетку** — включить/отключить отображение сетки на сцене.
* **Показать** **направляющие** — включить/отключить режим отображения вертикальных и горизонтальных направляющих линий для позиционирования объектов относительно друг друга.
* **Включить** **сетку** — включить/отключить режим автоматического выравнивания по сетке.
* **Включить** **направляющие** — включить/отключить режим вертикальных и горизонтальных направляющих линий для позиционирования блоков относительно друг друга.
* **Показать** **весь** **текст** — включить/отключить отображение всех свойств блока прямо на диаграмме. Если текст под блоками отключён, свойства можно просматривать и редактировать в редакторе свойств слева вверху.

![](/files/-MOVpbjq_vIrgBJF0zfD)

## Справка <a href="#menu-about" id="menu-about"></a>

* **Помощь** — открыть справку.
* **О программе** — просмотреть краткую информацию о TRIK Studio.
* **Открыть лог-файлы** — открыть папку с лог-файлами.
* **Проверить на наличие обновлений** — получить из интернета информацию о наличии новой версии среды или какого-либо из подключаемых модулей и запустить при необходимости автообновление.

![](/files/-MOVpgELqLLzBlFJMl1G)


# Работа с графиками

Если программа запущена в режиме интерпретации на роботе или в двумерной модели, можно посмотреть показания сенсоров робота на графике в [специальном окне](/studio/interface#panel-graphics).

![](/files/-M2EG6OwJhPcZ3SJppK6)

График масштабируется автоматически таким образом, чтобы кривая показаний помещалась по высоте целиком.

Из выпадающего списка снизу можно выбрать сенсор, значения с которого будут отображаться на графике.

![](/files/-M2EFPIadsdYBtuG4G9c)

При наведении курсора мыши на точку на графике отобразится значение в этой точке.

![](/files/-M2EFVxCIcaZ0hC01-Vb)

Справа от графика есть четыре кнопки для работы с ним:

| Кнопка                                                                                                                                      | Описание                                                                                                                                |
| ------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- |
| <img src="https://thumb.tildacdn.com/tild3562-3134-4334-b733-656135373766/-/resize/130x/-/format/webp/lupa.png" alt="" data-size="line">    | Изменение масштаба графика.                                                                                                             |
| <img src="https://thumb.tildacdn.com/tild3137-3366-4161-a439-333565313762/-/resize/130x/-/format/webp/error.png" alt="" data-size="line">   | Очистить график.                                                                                                                        |
| <img src="https://thumb.tildacdn.com/tild3230-3336-4439-a336-336265386165/-/resize/130x/-/format/webp/save_as.png" alt="" data-size="line"> | Экспорт показаний графика в формате `.csv` (comma-separated value). Экспортируются все показания выбранного датчика с начала их записи. |


# Как открыть настройки робота?

Настройки робота в TRIK Studio можно открыть двумя способами.

### Способ 1

С помощью кнопки на панели инструментов:

![](/files/-MOlAJ9rlXHVlrMBXHGC)

### Способ 2

1\. Выберите в [главном меню](/studio/interface/main-menu#menu-settings) `Настройки → Настройки...`.

![](/files/-MOlARVcjd3t5HKkyTzu)

2\. В открывшемся окне выберите вкладку «Роботы».

![](/files/-MOlAVf9rnRWQGctT9y4)


# Как изменить язык интерфейса TRIK Studio?

Изменить язык можно в настройках TRIK Studio.

1\. Выберите в [главном меню](/studio/interface/main-menu#menu-settings) `Настройки → Настройки...`.

![](/files/-MOlQZDpf-VFiQdFESU9)

2\. В открывшемся окне во вкладке «Поведение» выберите нужный язык. «<Системный язык>» означает, что язык будет определяться по текущему языку операционной системы.

![](/files/-MOlQfEaqARGVqAXpxGm)

3\. Нажмите «OK» и перезапустите TRIK Studio.


# Настройки TRIK Studio

## Окно настроек

Окно настроек TRIK Studio открывается выбором соответствующего пункта в [главном меню](/studio/interface/main-menu#menu-settings):`Настройки → Настройки...`.

![Пункт «Настройки» в главном меню](/files/-M0TJOFKD3vga4UKBKld)

Интерфейс окна с настройками содержит две панели:

1\. Панель со списком вкладок с настройками:

* [Поведение](/studio/settings#behavior).
* [Разное](/studio/settings#vkladka-raznoe).
* [Редактор](/studio/settings#editor).
* [Роботы](/studio/settings#robots).
* [Горячие клавиши](/studio/settings#shortcuts).

2\. Панель с полями для редактирования настроек текущей вкладки.\
\
Кнопки [«Импорт»](/studio/settings#import) и [«Экспорт»](/studio/settings#export) внизу окна позволяют сохранить текущие настройки в файл и загрузить его на другом компьютере.

![](/files/-M2I6w8bcRRJkrJqYKSR)

###

### Поведение <a href="#behavior" id="behavior"></a>

![Вкладка «Поведение»](/files/-M2I6w8bcRRJkrJqYKSR)

#### Пользовательский интрефейс

* **Язык** — язык среды. После изменения требуется перезапуск TRIK Studio. Настройка «<Системный язык>» означает, что язык будет определяться по текущему языку операционной системы.

#### Автоматизация

* **Автосохранение** — возможность включить или выключить автосохранение открытого проекта, а также задать интервал автосохранения в секундах.<br>
* **Жесты мышью** — включить или выключить механизм распознавания [жестов мышью](/studio/programming-visual/blocks-add-delete#mouse-gesture).<br>
* **Задержка после** **жеста** — временной отрезок системного ожидания между выполнением жеста мышью и его исполнением. Задержка позволяет рисовать жест в несколько штрихов. Значение указывается в миллисекундах.<br>
* **Проверять на наличие обновлений при старте** — связываться при запуске с сервером обновлений и запускать автообновление при необходимости.

#### Тач

* **Режим работы на тач-экране** — включить оптимизацию пользовательского интерфейса для сенсорных экранов.

#### Элементы интерфейса

* **Режим плавающих окон** — открепляет окна для свободного передвижения.

### Разное

![Вкладка «Разное»](/files/-M2I9jvFK56qkN5YtjTO)

#### Графика

* **Антиалиасинг** — режим рисования линий со сглаживанием, улучшает внешний вид диаграмм за счёт незначительного снижения скорости работы системы.

#### Прочее

* **Показывать сплешскрин** — включить/выключить отображение стартового экрана с логотипом TRIK Studio.
* **Длина списка недавних проектов** — сколько проектов показывать в пункте «Недавние проекты» меню [«Файл»](/studio/interface/main-menu#menu-file).

#### **Изображения**

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

#### Панель инструментов

* **Размер панели инструментов** — задать размер кнопок на панели инструментов.

### Редактор <a href="#editor" id="editor"></a>

![Вкладка «Редактор»](/files/-M2IAssjha_hAXkdLR79)

#### Шрифт

* **Использовать системный шрифт** — заменить шрифт для отображения надписей на диаграмме по умолчанию на один из шрифтов, установленных в системе. Размеры надписей на блоках заданы жёстко, поэтому изменение шрифта может привести к наползанию надписей друг на друга, однако можно экспериментировать.

#### **Сетка**

* **Показывать сетку** — отображать выравнивающую сетку на сцене редактора диаграмм.
* **Выравнивание по сетке** — осуществлять выравнивание блоков по сетке.
* **Показать направляющие** — отображать направляющие линии на сцене редактора диаграмм. Направляющие линии появляются, когда блок находится на одной горизонтали или вертикали с другим блоком, и помогают выравнивать блоки на сцене.
* **Выравнивание по направляющим** — осуществлять выравнивание блоков по направляющим.
* **Толщина сетки** — толщина линий сетки. Настраивается в зависимости от яркости монитора или проектора.
* **Размер ячейки** — размер одной ячейки сетки. Размер по умолчанию подобран так, чтобы блок накрывал четыре ячейки.

#### **Элементы**

* **Размер области масштабирования** — размер области, потянув за которую, можно изменить размер блока [«Комментарий»](/studio/programming-visual/blocks#comment).

#### **Связи**

* **Тип связей** — режим рисования связей на диаграмме.
  * **Ломаные линии** — связи рисуются как ломаные с точками излома, которые добавляются пользователем.
  * **Прямоугольные линии** — связи рисуются как ломаные линии, каждый сегмент которых параллелен осям координат. Точки излома в этом случае добавляются системой автоматически.
  * **Кривые Безье** — связи рисуются как гладкие кривые, кривизна которых может быть задана пользователем.
* **Отступ связей-петель** — насколько связь, входящая в тот же блок, из которого она исходит, должна отступать от блока.

#### **Встроенные линкеры**

* **Размер** — размер встроенного линкера, т.е. кружка рядом с блоком на диаграмме, осуществляющего создание связей между элементами (см. статью [«Связи между блоками»](/studio/programming-visual/connection-between-blocks)).
* **Отступ** — отступ встроенного линкера от пиктограммы блока.

#### **Палитра**

* **Представление** — выбор между режимом отображения иконок и названий или только иконок в палитре.
* **Количество иконок в строке** — количество иконок на строку палитры при выбранном режиме «Иконки».

### Роботы <a href="#robots" id="robots"></a>

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

![Вкладка «Роботы»](/files/-M2IEz5Wa4qFM7EY-_Gy)

#### Платформа

Конструктор, для которого пишутся программы в среде. От этой опции зависит список доступных блоков в [палитре](/studio/interface#panel-palette) и доступных действий на панели инструментов.

#### Модель робота

Выбор типа модели исполнения для выбранного конструктора. В большинстве случаев это 2D-модель или реальный робот, но для некоторых конструкторов одна из моделей может быть недоступной, в этом случае этот пункт в окне не отображается.

#### **Картинка робота в 2D**

Внешний вид робота в 2D-модели.

#### **Настройки соединения**

Специфичные для конструктора настройки подключения к роботу, такие как IP-адрес робота для ТРИК или COM-порт Bluetooth-соединения для Lego NXT. Если соединение в выбранном режиме не требуется, данный пункт не отображается.

#### **Настройки сторонних программ**

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

#### **Настройка сенсоров**

Здесь указывается, какие сенсоры подключены к портам робота.

#### **Загрузка и запуск программ**

* **Запуск после загрузки** — запускать программу сразу после загрузки её на робот или нет. Применимо только для некоторых режимов некоторых конструкторов (например, для Lego NXT в режиме генерации).

#### **Интервалы обновления графиков**

* **Сенсоры** — интервал в миллисекундах, после которого добавляется новая точка с показанием сенсора.
* **Масштабирование** — интервал в миллисекундах, после которого график автоматически изменяет свой масштаб, чтобы оптимально отобразить значения.
* **Текстовая информация** — интервал в миллисекундах, после которого на графике обновляются надписи со значениями.

### **Горячие клавиши** <a href="#shortcuts" id="shortcuts"></a>

Данная вкладка позволяет задать или изменить горячие клавиши для наиболее часто используемых действий. Для этого надо выбрать ячейку, соответствующую действию, и в строке «Сочетание» внизу окна нажать нужное сочетание клавиш.

Кнопка «Очистить» удаляет сочетание клавиш из ячейки.

![Вкладка «Горячие клавиши»](/files/-M2IJrW5BvF9bW9g_p9P)

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

{% content-ref url="/pages/-M0T6uYreguCcoj1KkU7" %}
[Горячие клавиши в TRIK Studio](/studio/shortcuts)
{% endcontent-ref %}

## Экспорт настроек <a href="#export" id="export"></a>

TRIK Studio позволяет экспортировать текущие настройки в файл для загрузки их на другом компьютере. Для этого необходимо нажать кнопку «Экспорт» внизу окна.

## Импорт настроек <a href="#import" id="import"></a>

TRIK Studio позволяет импортировать настройки из экспортированного ранее файла. Для этого необходимо нажать кнопку «Импорт» внизу окна и выбрать нужный файл `.ini`.


# 2D-модель

Интерактивный режим имитационного моделирования — отличительная особенность TRIK Studio. В нем команды не передаются роботу, а исполняются для виртуальной модели, отображающейся на экране. Для платформ [ТРИК](/trik/about), [Lego EV3](/ev3/about) и [Lego NXT](/nxt/about) — это трехколесная тележка.

![Трехколесная тележка для конструктора ТРИК](https://thumb.tildacdn.com/tild3334-3831-4364-a537-626466373232/-/resize/60x/-/format/webp/trik-robot.png)

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

![](/files/-M5Mc1SNy8LFJvmjQbbe)

При этом эмулируется работа большинства реальных датчиков конструктора. Например, датчика касания, ультразвукового датчика расстояния, датчиков цвета и света для NXT, компас и гироскоп для EV3, инфракрасного и ультразвукового датчиков расстояния, датчика касания и датчика освещённости для ТРИК.

![](/files/-M5Mdlk7MqkOxzLTeO6H)

Двумерная модель может иметь устройства, недоступные на реальном роботе. Например, возможность рисовать цветные линии маркером на полу. Внешний вид и набор устройств двумерной модели зависит от выбранной платформы.

Режим двумерной модели полезен для отладки программ и в случае отсутствия реального робота.

## Работа со сценой <a href="#work-with-scene" id="work-with-scene"></a>

| Комбинация клавиш | Описание действия               |
| ----------------- | ------------------------------- |
| Ctrl+Колесо мыши  | Увелечение / уменьшение сцены.  |
| Shift+Колесо мыши | Прокрутка сцены по горизонтали. |

Для переключения между режимами «Таскания сцены» и «Выделения» воспользуйтесь [контестным меню](/studio/2d-model#kontekstnoe-menyu).

## Окно двумерной модели <a href="#window" id="window"></a>

Для открытия окна 2D-модели необходимо нажать кнопку <img src="https://static.tildacdn.com/tild3766-6331-4436-a263-623265663033/2d-model.svg" alt="" data-size="original"> на панели инструментов или в [настройках](/studio/settings#robots) выбрать пункт «2D-модель».

![Режим двумерной модели для робота ТРИК](/files/-M56slFxZOloWbC-3Dsp)

Элементы окна 2D-модели:

* [Панель редактирования мира](/studio/2d-model#editor-world)
* [Сетка](/studio/2d-model#grid)
* [Линейка](/studio/2d-model#ruler)
* [Кнопка возврата на старт](/studio/2d-model#return-to-start)
* [Кнопка «Старт/стоп»](/studio/2d-model#start-stop)
* [Панель управления скоростью](/studio/2d-model#speed-control)
* [Настройки модели](/studio/2d-model#panel-nastroiki-modeli)
  * [Эмулятор экрана и кнопок робота](/studio/2d-model#emulyator-ekrana)
  * [Управление портами](/studio/2d-model#ports)
  * [Управление моторами](/studio/2d-model#panel-upravleniya-motorami)
  * [Управление физикой робота](/studio/2d-model#upravlenie-fizikoi-robota)
  * [Параметры модели](/studio/2d-model#parametry-modeli)
* [Всплывающее меню робота](/studio/2d-model#fast-settings)

## **Редактирование модели мира** <a href="#editor-world" id="editor-world"></a>

Редактирование модели мира осуществляется с помощью соответствующей панели.

|                                                                                                                                                         | Название                                   | Описание                                                                                                                                                                                                                                                                                                                                                                                                                                                 | Горячая клавиша |
| ------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :-------------: |
| <img src="https://thumb.tildacdn.com/tild3763-3237-4833-a164-393534336437/-/resize/65x/-/format/webp/57ef89a9ee81c1577fb1.png" alt="" data-size="line"> | **Курсор**                                 | Переключение в режим выбора.                                                                                                                                                                                                                                                                                                                                                                                                                             |        1        |
| <img src="https://thumb.tildacdn.com/tild3564-6138-4364-a232-326133336338/-/resize/65x/-/format/webp/2d_wall.png" alt="" data-size="line">              | **Стена**                                  | <p>Добавление на сцену препятствия в виде стены.</p><p></p><p>При добавлении с нажатой клавишей <code>Shift</code> стена помещается либо под прямым углом, либо под углом в 45<strong>°</strong> относительно границ окна. Отображается стена в виде «кирпичной» линии.<br><br>При касании такой линии датчиком касания или при попадании в зону действия датчиком расстояния происходит срабатывание сенсора. Робот не может проехать сквозь стену.</p> |        2        |
| <img src="https://thumb.tildacdn.com/tild3834-6235-4536-a330-626336613166/-/resize/65x/-/format/webp/can.png" alt="" data-size="line">                  | **Банка**                                  | Добавление на сцену препятствия в виде банки                                                                                                                                                                                                                                                                                                                                                                                                             |        3        |
| <p></p><p><img src="/files/-M4sxiS_RcmyFhBUiINS" alt="" data-size="line"></p><p></p>                                                                    | **Мяч**                                    | Добавление на сцену препятствия в виде мяча. При касании тележки он отскакивает на некоторое расстояние.                                                                                                                                                                                                                                                                                                                                                 |        4        |
| <img src="https://thumb.tildacdn.com/tild6331-3031-4161-b430-623435333135/-/resize/65x/-/format/webp/2d_ruler.png" alt="" data-size="line">             | **Линия**                                  | <p>Добавление на сцену прямой линии.</p><p></p><p>При добавлении линии с нажатой клавишей <code>Shift</code> линия помещается либо под прямым углом, либо под углом в 45<strong>°</strong> относительно границ окна.<br><br>На линию могут реагировать датчики света и цвета, расположенные на виртуальном роботе.</p><p></p><p>Можно <a href="/pages/-M0Now5ADLgit5TISAGo#editor-line">настраивать</a> цвет и толщину линии.</p>                        |        5        |
| <img src="https://static.tildacdn.com/tild6230-3232-4431-a636-383235306539/2d_bezier.svg" alt="" data-size="line">                                      | **Кривая Безье**                           | <p>Добавление на сцену линии с возможностью закругления.<br><br>На линию могут реагировать датчики света и цвета, расположенные на виртуальном роботе.<br><br>Можно <a href="/pages/-M0Now5ADLgit5TISAGo#editor-line">настраивать</a> цвет и толщину линии.</p>                                                                                                                                                                                          |        6        |
| <img src="https://static.tildacdn.com/tild6539-6166-4638-a465-643132613331/2d_rectangle.svg" alt="" data-size="line">                                   | **Прямоугольник**                          | <p>Добавление на сцену прямоугольника.<br><br>Можно <a href="/pages/-M0Now5ADLgit5TISAGo#editor-line">настраивать</a> цвет и толщину линий прямоугольника, а также цвет его заливки.</p>                                                                                                                                                                                                                                                                 |        7        |
| <img src="https://thumb.tildacdn.com/tild3038-3963-4733-b130-656566616134/-/resize/65x/-/format/webp/2d_ellipse.png" alt="" data-size="line">           | **Эллипс**                                 | <p>Добавление на сцену эллипса.<br><br>Можно <a href="/pages/-M0Now5ADLgit5TISAGo#editor-line">настраивать</a> цвет и толщину линий эллипса, а также цвет его заливки.</p>                                                                                                                                                                                                                                                                               |        8        |
| <img src="https://thumb.tildacdn.com/tild3363-6336-4332-b434-636563633334/-/resize/65x/-/format/webp/2d_pencil.png" alt="" data-size="line">            | **Стилус**                                 | <p>Рисование линии мышью.<br></p><p>На нарисованную линию могут реагировать датчики света и цвета, расположенные на виртуальном роботе.</p><p></p><p>Можно <a href="/pages/-M0Now5ADLgit5TISAGo#editor-line">настраивать</a> цвет и толщину линий.</p>                                                                                                                                                                                                   |        9        |
| <img src="/files/-M4szSQsE4pf9785VlvE" alt="" data-size="line">                                                                                         | [**Картинка**](/studio/2d-model#add-image) | Добавление на сцену готового фона.                                                                                                                                                                                                                                                                                                                                                                                                                       |                 |
| ![](/files/VM4vflX0Blnt2Hl0ZG6B)                                                                                                                        | **Text**                                   | Добавление [текстового поля](#tekstovoe-pole)                                                                                                                                                                                                                                                                                                                                                                                                            |        0        |

### Редактор линий, стилуса и эллипса <a href="#editor-line" id="editor-line"></a>

При выделении линии, кривой Безье, стилуса, прямоугольника или эллипса появляется всплывающее окно, позволяющее настраивать их цвет и толщину.

У инструментов эллипс и прямоугольник есть возможность закрасить внутреннюю область заданным цветом. Также можно редактировать размеры, форму и положение выделенных геометрических объектов.

![](/files/-M5MalKr6MyxrR1YPFj8)

### Работа с фоном <a href="#add-image" id="add-image"></a>

Помимо инструментов рисования различных геометрических объектов,  поддержана возможность загрузки нескольких готовых изображений из файла.

При включенной сетке изображения автоматически выравниваются по ней при перетаскивании.

![](/files/-MWeDAbl4o9-ZBICHe38)

Если выделить изображение, его можно будет переместить, изменить размеры и настроить следующие параметры:&#x20;

| Свойство                                                            | Описание                                                                                                                                                                                                  |
| ------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <img src="/files/-M5abBX5f9fcgm1j0YFF" alt="" data-size="original"> | **Картинка не будет включена в файл сохранения**. При открытии текущего проекта на другом компьютере или переименовании файла с картинкой изображение в 2D-модели пропадёт.                               |
| <img src="/files/-M5aaLqdYiDfB6rZg4GY" alt="" data-size="original"> | **Картинка будет запакована в проект.** Будьте внимательны, это значительно увеличит размер файла сохранения. Однако при открытии проекта на другом компьютере, изображение останется в двумерной модели. |
| <img src="/files/-M5abjd3kxIxy5D4QFkG" alt="" data-size="original"> | **Изображение будет на переднем плане.** Робот видит это изображение с помощью сенсоров.                                                                                                                  |
| <img src="/files/-M5acA6OXDX7O1Hzkwcq" alt="" data-size="original"> | **Изображение будет на заднем плане.** Робот не видит это изображение.                                                                                                                                    |
| <img src="/files/-M5acaP28Qp5uE8Eb0gz" alt="" data-size="original"> | **Изменить картинку...** Заменить изображение на выбранное через диалоговое окно.                                                                                                                         |

## Панель настройки модели

Для открытия панели с настройками нажмите кнопку справа от [сцены](/studio/interface#editor-window-1):

![](/files/-M0ToOtEaLULVrhG0vij)

На данной панели располагаются:

* [Эмулятор экрана](/studio/2d-model#emulyator-ekrana)
* [Панель управления портами](/studio/2d-model#ports)
* [Панель управления моторами](/studio/2d-model#motors)
* [Параметры управления физикой робота](/studio/2d-model#upravlenie-fizikoi-robota)
* [Параметры модели](/studio/2d-model#parametry-modeli)

### Эмулятор экрана

![](/files/-M4xZUpk0veLG8LwCP7y)

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

### Панель управления портами <a href="#ports" id="ports"></a>

Панель управления портами позволяет менять конфигурацию и расположение сенсоров модели робота.

![](/files/-M4t-iFc3zLtQmO6z0-4)\
\
Для каждого порта можно выбрать интересующий датчик, и он автоматически добавится на сцену.

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

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

#### Поворот и перемещение сенсоров

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

При вращении с нажатой клавишей `Shift` сенсор поворачивается либо под прямым углом, либо под углом в 45° относительно границ окна.

![](https://thumb.tildacdn.com/tild6161-6163-4135-a662-323663303030/-/resize/352x/-/format/webp/sensor-settings-in-2.png)

### Панель управления моторами

![](/files/-M51bt7N9Qyp3oy-BjNS)

Панель управления моторами позволяет задать, какой из портов моторов будет соответствовать левому и правому колесам.

### Управление физикой робота

<div align="left"><img src="/files/-M51bfhzJlgtHscDMbUZ" alt=""></div>

* **Реалистичная физика** точнее эмулирует силы, действующие на робота: он поворачивает при столкновении со стеной, разгоняется с ускорением и т. д.
* **Реалистичные сенсоры** — включить / выключить эмуляцию неточной работы сенсоров.
* **Реалистичные моторы** — включить / выключить эмуляцию неточной работы моторов.

### Параметры модели

![](/files/-M51b_d-ywJNm0I_hPrd)

Отображение параметров модели робота:

* диаметра колеса,
* высоты робота,
* ширины робота,
* массы робота.

## Контекстное меню

Также функции двумерной модели доступны при нажатии на правую кнопку мыши на сцене.

![](/files/-M4xgVYsI3I45GJXF_3m)

| Пункт меню                        | Описание                                                                                                            |
| --------------------------------- | ------------------------------------------------------------------------------------------------------------------- |
| **Режим таскания сцены**          | Позволяет перемещать сцену с роботом, стенами и линиями при клике и перетаскивании на свободный участок сцены.      |
| **Режим выделения**               | Позволяет выделять группу стен, линий и других частей модели при клике и перетаскивании на свободный участок сцены. |
| **Сохранить модель мира...**      | Сохранение нарисованной сцены в виде XML-файла, который потом может быть загружен и использован в другом проекте.   |
| **Загрузить модель мира…**        | Загрузка ранее сохранённой модели мира.                                                                             |
| **Очистить всё**                  | Удаление всех стен и цветных линий. Робот при этом остаётся на сцене.                                               |
| **Очистить пол от следов робота** | Удаление всех цветных линий, нарисованных маркером робота. Остальные элементы остаются на сцене.                    |

## Сетка <a href="#grid" id="grid"></a>

Включение отображения на сцене сетки и привязка стен к её узлам. Слайдер позволяет настроить размер сетки.

![](/files/-M57UedqglROvvpfTZFi)

## Панель управления скоростью <a href="#speed-control" id="speed-control"></a>

Панель управления скоростью позволяет задать скорость симуляции.

При выборе низкой скорости одной секунде модельного времени соответствует несколько секунд реального, при выборе высокой скорости — наоборот.

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

## Линейка <a href="#ruler" id="ruler"></a>

Линейка показывает расстояния на сцене, в сантиметрах (относительно размера робота).

## Кнопка возврата на старт <a href="#return-to-start" id="return-to-start"></a>

Кнопка возврата на старт устанавливает робота в исходное положение, задаваемое красным крестиком на сцене.

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

При добавлении с нажатой клавишей «Shift» стрелка крестика помещается либо под прямым углом, либо под углом в 4&#x35;**°** относительно границ окна.

![](/files/-M57VIHQR4ZCmjd6Af5Z)

## Кнопка «Старт / стоп» <a href="#start-stop" id="start-stop"></a>

&#x20;<img src="/files/-M5M_VSksM6NJQ36co5_" alt="" data-size="original"> Запуск программы.

<img src="/files/-M5M_YIzTxZLXV96tyTI" alt="" data-size="original"> Остановка программы.

## Всплывающее меню робота <a href="#fast-settings" id="fast-settings"></a>

![](/files/-M57W3l4er-c0aZG4ysE)

Всплывающее меню управления роботом появляется при его выделении.

| Элемент                     | Описание                                                                                                                       |
| --------------------------- | ------------------------------------------------------------------------------------------------------------------------------ |
| **Следование за роботом**   | При включённом режиме сцена автоматически перемещается, выставляя робот в центр, если он выезжает за границы видимого участка. |
| **Возврат робота**          | Возврат робота на исходную позицию, обозначаемую красным крестиком.                                                            |
| **Изменение толщины следа** | Изменение толщины следа, оставляемого роботом при рисовании маркером.                                                          |

## Текстовое поле

С помощью текстового поля удобно создавать виртуальные миры и описывать задание прям в них. Также можно использовать для комментариев или обозначения названий отдельных элементов. Редактировать поле можно с помощью html разметки, используя теги \<b>**жирный**\</b>, \<i>*курсив\</i>* и другие.

<figure><img src="/files/bsAWUq6Y7FTioWW8AeAP" alt=""><figcaption></figcaption></figure>

### Как работать с текстовым полем

1\)     В панели редактирование мира выберите иконку Text (прямоугольник с буквами ABC), либо используйте горячую клавишу 0.

2\)     Нажмите на удобное место на экране, должно появиться текстовое поле

3\)     Для редактирования текста необходимо нажать правой кнопкой мыши в центральную часть текстового поля (прямоугольник в центре, чуть выше блока с текстом)

4\)     Выбрать пункт «Редактор» в появившемся контекстном меню

5\)     Ввести необходимый текст

6\)     Снова правой кнопкой мыши нажать в центральную часть текстового поля

7\)     В появившемся контекстном меню выбрать пункт Save

<figure><img src="/files/hJg7lU0DUDRKeDMq0Nvt" alt=""><figcaption></figcaption></figure>

Чтобы редактировать текст можно использовать HTML разметку. Для того, чтобы она сработала необходимо использовать теги в виде <тег>ваш текст\</тег>

Доступные теги

| Тег      | Функция           |
| -------- | ----------------- |
| \<b>     | Жирный шрифт      |
| \<i>     | Курсив            |
| \<u>     | Подчеркивание     |
| \<s>     | Зачеркнутый тест  |
| \<sup>   | Надстрочный текст |
| \<sub>   | Подстрочный текст |
| \<big>   | Большой шрифт     |
| \<small> | Маленький шрифт   |

<figure><img src="/files/5lLsG5pKibv8WyCLjtmj" alt=""><figcaption></figcaption></figure>


# Гибкая настройка 2D-модели

Помимо создания [виртуального мира](/studio/2d-model#editor-world) роботов в TRIK Studio, можно делать более гибкую настройку при помощи редактирования XML-файла: указывать точнее расположения объектов, цвет, ширину и другие параметры.

Для начала необходимо [создать](/studio/2d-model/settings#create-xml) XML-файл виртуальной модели.

## Система координат в 2D-модели

В отладке 2D-модели оси расположены следующим образом:

![](/files/-M4t1v-f9eixDR6Bnk90)

{% hint style="warning" %}
**Внимание!** Одна клетка имеет размеры 17,5×17,5 сантиметров или 50×50 пикселей.
{% endhint %}

## Создание XML-файла <a href="#create-xml" id="create-xml"></a>

Для создания пустого XML-файла используйте стандартные средства вашей операционной системы.

Для сохранения нарисованной в TRIK Studio модели мира:

1. Перейдите в [режим 2D](/studio/2d-model).
2. Перейдите в [«Режим отладки»](/studio/interface#mode-debug).
3. Нажмите правой кнопкой мыши на сцену и в появившемся контекстном меню выберите «Сохранить модель мира…».\
   &#x20;<img src="/files/-M4tOW5byzlTRSMpVjOl" alt="" data-size="original">&#x20;
4. Укажите место сохранения и имя файла.

## Редактирование XML-файла <a href="#editor-xml" id="editor-xml"></a>

Откройте сохраненный XML-файл в любом текстовом редакторе. Например, [Notepad++](https://notepad-plus-plus.org/).

XML-файл состоит из тегов и атрибутов.

### Теги

Тег — это элемент языка разметки. Существует начальный (открывающий) и конечный (закрывающий) тег. Текст, содержащийся между начальным и конечным тегом, отображается и размещается в соответствии со свойствами, указанными в начальном теге.

Например:

```markup
<walls> <!-- начальный (открывающий) тег -->
     <wall begin="200:-200" id="{a3ede76b-1d7e-4c72-9ed4-08d8ea9af4bf}" end="200:150"/>
</walls> <!-- конечный (закрывающий) тег -->
```

### **Атрибуты**

Атрибуты — это свойства тега, дающие дополнительные возможности форматирования текста. Они записываются в виде сочетания «имя атрибута — значение». Текстовые значения заключаются в кавычки.

В вышеуказанном примере атрибутами являются:

`begin="200:-200"`\
`id="{a3ede76b-1d7e-4c72-9ed4-08d8ea9af4bf}"`\
`end="200:150"`

Самая простая виртуальная модель мира без объектов в формате `.xml` выглядит следующим образом:

{% code title="Простая виртуальная модель" %}

```markup
<?xml version='1.0' encoding='utf-8'?>
<root>
    <world>
        <background/>
        <walls/>
        <skittles/>
        <balls/>
        <colorFields/>
        <images/>
        <regions/>
    </world>
    <robots>
        <robot direction="0" id="trikKitRobot" position="0:0">
            <sensors/>
            <startPosition direction="0" id="{name}" y="25" x="25"/>
            <wheels left="M4###output###М4###" right="M3###output###М3###"/>
        </robot>
    </robots>
</root>
```

{% endcode %}

## Роботы

Для описания роботов имеются следующие теги:

| Тег                                                                                                    | Описание                                                                                                                                                                        |
| ------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [**robots**](/studio/2d-model/settings#less-than-robots-greater-than-less-than-robots-greater-than)    | Определяет робота на сцене. Используется как контейнер и должен содержать элемент [robot](/studio/2d-model/settings#less-than-robot-greater-than-less-than-robot-greater-than). |
| [**robot**](/studio/2d-model/settings#less-than-robot-greater-than-less-than-robot-greater-than)       | Добавляет робота на сцену. Может использоваться как контейнер.                                                                                                                  |
| [**sensors**](/studio/2d-model/settings#less-than-sensors-greater-than-less-than-sensors-greater-than) | Определяет датчики на роботе. Используется как контейнер.                                                                                                                       |
| [**sensor**](/studio/2d-model/settings#less-than-sensor-greater-than)                                  | Конфигурация портов датчиков.                                                                                                                                                   |
| [**startPosition**](/studio/2d-model/settings#less-than-startposition-greater-than)                    | Определяет стартовое положение робота.                                                                                                                                          |
| [**wheels**](/studio/2d-model/settings#wheels)                                                         | Конфигурация портов моторов.                                                                                                                                                    |

### \<robots>...\</robots>

Определяет робота на сцене. Используется как контейнер, атрибутов не имеет.

```markup
<robots>
     <robot id="trikKitRobot" position="0:0" direction="0">
</robots>
```

### \<robot>...\</robot>

Добавляет робота на сцену. Может использоваться как контейнер.

{% hint style="warning" %}
**Внимание!** В TRIK Studio нельзя добавить несколько роботов на сцену.
{% endhint %}

#### Атрибуты

| **Атрибут**           | Описание                                                                                                                                                   |
| --------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **direction="0″**     | Направление робота, которое можно регулировать, нажав на робота и потянув за стрелку.                                                                      |
| **position="x:y"**    | Положение робота, где x, y — положение левой верхней точки квадрата робота в [системе координат](/studio/2d-model/settings#sistema-koordinat-v-2d-modeli). |
| **id="trikKitRobot"** | Уникальный идентификатор.                                                                                                                                  |

#### Пример

```markup
<robot id="trikKitRobot" position="0:0" direction="0">
```

<div align="left"><img src="/files/-M4t4juAI4SgzI56XCGc" alt=""></div>

### \<sensors>...\</sensors>

Определяет датчики на роботе. Используется как контейнер, атрибутов не имеет.

```markup
<sensors>
     <sensor type="kitBase::robotModel::robotParts::Motor" direction="0" port="M4###output###JM4$$$D$$$4###" position="75:25"/>
</sensors>
```

### \<sensor/>

Конфигурация портов датчиков.

#### Атрибуты

| Атрибут                                                | Описание                                                                                                                                                   |
| ------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **position="x:y"**                                     | Положение датчика, где x, y — положение центральной точки квадрата датчика в [системе координат](/studio/2d-model/settings#sistema-koordinat-v-2d-modeli). |
| **direction="0″**                                      | Направление датчика, которое можно регулировать, нажав на датчик и потянув за стрелку.                                                                     |
| **port="A1###input######sensorA1"**                    | Порт, к которому подключен датчик.                                                                                                                         |
| **type="trik::robotModel::parts::TrikInfraredSensor"** | Тип подключенного сенсора.                                                                                                                                 |

Существует 5 видов датчиков для TRIK и 9 видов датчиков для EV3:

{% tabs %}
{% tab title="Датчики для ТРИК" %}

| Датчик                 | Описание                          |
| ---------------------- | --------------------------------- |
| **TrikSonarSensor**    | Ультразвуковой датчик расстояния. |
| **TrikLineSensor**     | Датчик линии.                     |
| **TrikLightSensor**    | Датчик освещённости.              |
| **TrikTouchSensor**    | Датчик касания.                   |
| **TrikInfraredSensor** | Инфракрасный датчик расстояния.   |
| {% endtab %}           |                                   |

{% tab title="Датчики для EV3" %}

| Датчик                 | Описание                    |
| ---------------------- | --------------------------- |
| **RangeSensor**        | Датчик расстояния.          |
| **TouchSensor**        | Датчик касания.             |
| **Ev3Gyroscope**       | Гиродатчик.                 |
| **LightSensor**        | Датчик света.               |
| **ColorSensorGreen**   | Датчик цвета (зелёный).     |
| **ColorSensorFull**    | Датчик цвета (распознания). |
| **ColorSensorBlue**    | Датчик цвета (синий).       |
| **ColorSensorRed**     | Датчик цвета (красный).     |
| **ColorSensorPassive** | Датчик цвета (пассивный).   |
| {% endtab %}           |                             |
| {% endtabs %}          |                             |

#### Пример

```markup
<sensor position="75:25" direction="0" port="A1###input###А1###sensorA1"
type="trik::robotModel::parts::TrikInfraredSensor"/>
```

<div align="left"><img src="/files/-M4t6VUo6TojdBo514XM" alt=""></div>

### \<startPosition/>

Определяет стартовое положение робота.

#### Атрибуты

| Атрибут           | Описание                                                                                                             |
| ----------------- | -------------------------------------------------------------------------------------------------------------------- |
| **id="{name}"**   | Уникальный идентификатор.                                                                                            |
| **direction="0″** | Направление робота, если нажать на кнопку «вернуть». Чтобы отрегулировать, нажмите на крестик и потяните за стрелку. |
| **x="25″**        | Положение по оси x в [системе координат](/studio/2d-model/settings#sistema-koordinat-v-2d-modeli).                   |
| **y="25″**        | Положение по оси y в [системе координат](/studio/2d-model/settings#sistema-koordinat-v-2d-modeli).                   |

#### Пример

```markup
<startPosition id="{7a326d25-82f4-4eb4-9b42-1e75576f35a4}" direction="0" x="25" y="25"/>
```

<div align="left"><img src="/files/-M4t6k9IOZsUTkUxQzut" alt=""></div>

### \<wheels/> <a href="#wheels" id="wheels"></a>

Конфигурация портов моторов.

#### Атрибуты

| **Атрибут**                     | Описание                                     |
| ------------------------------- | -------------------------------------------- |
| **left="M4###output###М4###"**  | Порт, к которому подключен левый двигатель.  |
| **right="M3###output###М3###"** | Порт, к которому подключен правый двигатель. |

#### Пример

{% tabs %}
{% tab title="Для TRIK" %}

```markup
<wheels left="M4###output###М4###" right="M3###output###М3###"/>
```

{% endtab %}

{% tab title="Для LEGO EV3" %}

```markup
<wheels left="B###output###В###" right="C###output###С###"/>
```

{% endtab %}
{% endtabs %}

## Объекты

&#x20;Для описания объектов имеются следующие теги:

| Тег                                                                         | Описание                                                                                                                                                                                  |
| --------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| walls                                                                       | Определяет стены. Используется как контейнер, атрибутов не имеет.                                                                                                                         |
| skittles                                                                    | Определяет банки. Используется как контейнер, атрибутов не имеет.                                                                                                                         |
| balls                                                                       | Определяет мячи. Используется как контейнер, атрибутов не имеет.                                                                                                                          |
| colorFields                                                                 | Определяет элементы, которые вы можете нарисовать (линию, кривую Безье, прямоугольник, эллипс, элементы, нарисованные с помощью стилуса). Используется как контейнер, атрибутов не имеет. |
| images                                                                      | Определяет вставленную картинку. Используется как контейнер, атрибутов не имеет.                                                                                                          |
| regions                                                                     | Определяет регионы. Используется как контейнер, атрибутов не имеет.                                                                                                                       |
| [wall](/studio/2d-model/settings#less-than-wall-greater-than)               | Добавляет стену.                                                                                                                                                                          |
| [skittle](/studio/2d-model/settings#less-than-skittle-greater-than)         | Добавляет банку.                                                                                                                                                                          |
| [ball](/studio/2d-model/settings#less-than-ball-greater-than)               | Добавляет мяч.                                                                                                                                                                            |
| [line](/studio/2d-model/settings#less-than-line-greater-than)               | Добавляет линию.                                                                                                                                                                          |
| [cubicBezier](/studio/2d-model/settings#less-than-cubicbezier-greater-than) | Добавляет кривую Безье.                                                                                                                                                                   |
| [rectangle](/studio/2d-model/settings#less-than-rectangle-greater-than)     | Добавляет прямоугольник.                                                                                                                                                                  |
| [ellipse](/studio/2d-model/settings#less-than-ellipse-greater-than)         | Добавляет эллипс.                                                                                                                                                                         |
| [stylus](/studio/2d-model/settings#less-than-stylus-greater-than)           | Определяет стилус на сцене. Используется как контейнер.                                                                                                                                   |
| [stylusLine](/studio/2d-model/settings#less-than-stylusline-greater-than)   | Позволяет рисовать произвольные фигуры с помощью стилуса.                                                                                                                                 |
| [region](/studio/2d-model/settings#less-than-region-greater-than)           | Позволяет добавлять регионы в на сцене.                                                                                                                                                   |

###

### \<wall>

Добавляет на сцену стену.

#### Атрибуты

| Атрибут         | Описание                                                                                                                           |
| --------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
| **id="{name}"** | Уникальный идентификатор.                                                                                                          |
| **begin="x:y"** | Начало стены, где x, y — положение начальной точки в [системе координат](/studio/2d-model/settings#sistema-koordinat-v-2d-modeli). |
| **end="x:y"**   | Конец стены, где x, y — положение конечной точки в [системе координат](/studio/2d-model/settings#sistema-koordinat-v-2d-modeli).   |

#### Пример

```markup
<wall id="{wall1}" begin="50:-50" end="250:-50"/>
```

<div align="left"><img src="https://thumb.tildacdn.com/tild6663-3261-4931-b236-333164353633/-/resize/413x/-/format/webp/2019-03-18_18-57-03.png" alt=""></div>

### \<skittle>

Добавляет банку на сцену.

#### Атрибуты

| Атрибут           | Описание                                                                     |
| ----------------- | ---------------------------------------------------------------------------- |
| **markerY="44″**  | Позиция, на которую встанет банка по оси Y, если нажать на кнопку «вернуть». |
| **markerX="220″** | Позиция, на которую встанет банка по оси X, если нажать на кнопку «вернуть». |
| **id="{name}"**   | Уникальный идентификатор.                                                    |
| **y="44″**        | Положение по оси Y.                                                          |
| **x="220″**       | Положение по оси X.                                                          |

#### Пример

```markup
<skittle rotation="0" id="{skittle1}" markerY="44" startRotation="0" x="220" y="44"
markerX="220"/>
```

<div align="left"><img src="https://thumb.tildacdn.com/tild3162-3532-4136-a166-346330343430/-/resize/148x/-/format/webp/2019-03-18_19-02-41.png" alt=""></div>

### \<ball>

Добавляет мяч на сцену.

#### Атрибуты

| Атрибут           | Описание                                                                   |
| ----------------- | -------------------------------------------------------------------------- |
| **markerY="169″** | Позиция, на которую встанет мяч по оси Y, если нажать на кнопку «вернуть». |
| **markerX="-18″** | Позиция, на которую встанет мяч по оси X, если нажать на кнопку «вернуть». |
| **id="{name}"**   | Уникальный идентификатор.                                                  |
| **y="169″**       | Положение по оси Y.                                                        |
| **x="-18″**       | Положение по оси X.                                                        |

#### Пример

```markup
<ball rotation="0" id="{ball1}" markerY="169" startRotation="0" x="-18" y="169" markerX="-18"/> 
```

<div align="left"><img src="https://thumb.tildacdn.com/tild6537-3061-4462-b664-646330373237/-/resize/164x/-/format/webp/2019-03-18_19-05-10.png" alt=""></div>

### \<line>

Добавляет линию на сцену.

#### Атрибуты

| Атрибут                  | Описание                                                                                                                                                                                                                             |
| ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| **begin="x:y"**          | Начало линии, где x, y — положение начальной точки в [системе координат](/studio/2d-model/settings#sistema-koordinat-v-2d-modeli).                                                                                                   |
| **end="x:y"**            | Конец линии, где x, y — положение конечной точки в [системе координат](/studio/2d-model/settings#sistema-koordinat-v-2d-modeli).                                                                                                     |
| **id="{name}"**          | Уникальный идентификатор.                                                                                                                                                                                                            |
| **stroke-width="6″**     | Ширина линии.                                                                                                                                                                                                                        |
| **fill="#ff000000″**     | Цвет заливки линии.                                                                                                                                                                                                                  |
| **fill-style="none"**    | Заливка. В данном случае этот атрибут не имеет смысла, т.к. линия всегда однородная.                                                                                                                                                 |
| **stroke-style="solid"** | <p>Вид линии.  Существует 5 видов линии:</p><ul><li>solid — сплошная;</li><li>dot — точечный пунктир;</li><li>dash — штриховой пунктир;</li><li>dashdot — штрихпунктир;</li><li>dashdotdot — штрихпунктир с двумя точками.</li></ul> |
| **stroke="#ff000000″**   | Цвет линии.                                                                                                                                                                                                                          |

#### Пример

```markup
<line stroke-width="6" fill-style="none" end="250:-50" id="{line1}" stroke-style="solid"
fill="#ff000000" stroke="#ff000000" begin="50:-50"/>
```

<div align="left"><img src="https://thumb.tildacdn.com/tild3131-3637-4536-b833-373734383231/-/resize/350x/-/format/webp/2019-03-18_19-17-05.png" alt=""></div>

### \<cubicBezier>

Добавляет кривую Безье.

#### Атрибуты

| Атрибут                  | Описание                                                                                                                                  |
| ------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------- |
| **cp1="x:y"**            | Маркер, задающий изгиб кривой.                                                                                                            |
| **cp2="x:y"**            | Маркер, задающий изгиб кривой.                                                                                                            |
| **stroke-style="solid"** | Вид кривой Безье. Виды кривой Безье аналогичны видам линии.                                                                               |
| **begin="x:y"**          | Начало кривой Безье, где x, y — положение начальной точки в [системе координат](/studio/2d-model/settings#sistema-koordinat-v-2d-modeli). |
| **end="x:y"**            | Конец кривой Безье, где x, y — положение конечной точки в системе координат.                                                              |
| **id="{name}"**          | Уникальный идентификатор.                                                                                                                 |
| **fill-style="none"**    | Заливка. В данном случае этот атрибут не имеет смысла, т.к. кривая Безье всегда однородная.                                               |
| **stroke-width="6″**     | Ширина кривой Безье.                                                                                                                      |
| **stroke="#ff000000″**   | Цвет заливки кривой Безье.                                                                                                                |
| **fill="#ff000000″**     | Цвет кривой Безье.                                                                                                                        |

#### Пример

```markup
<cubicBezier id="{cubicBezier1}" fill-style="none" stroke-width="6" end="-106.577:134.894"
begin="-112.95:-192.25" fill="#ff000000" cp1="-142.95:-192.25" cp2="17.0502:-192.25"
stroke="#ff000000" stroke-style="solid"/>
```

<div align="left"><img src="https://thumb.tildacdn.com/tild3039-3336-4136-b962-353831373133/-/resize/459x/-/format/webp/2019-03-18_19-44-30.png" alt=""></div>

###

### \<rectangle>

Добавляет прямоугольник.

#### Атрибуты

| Атрибут                  | Описание                                                                                                                                    |
| ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------- |
| **stroke-style="solid"** | Вид границ прямоугольника. Виды прямоугольника аналогичны видам линии.                                                                      |
| **begin="x:y"**          | Начало прямоугольника, где x, y — положение начальной точки в [системе координат](/studio/2d-model/settings#sistema-koordinat-v-2d-modeli). |
| **end="x:y"**            | Конец прямоугольника, где x, y — положение конечной точки в [системе координат](/studio/2d-model/settings#sistema-koordinat-v-2d-modeli).   |
| **id="{name}"**          | Уникальный идентификатор.                                                                                                                   |
| **fill-style="none"**    | Заливка. По умолчанию стоит «none». Заполненный прямоугольник будет со значением «solid».                                                   |
| **fill="#ff000000″**     | Цвет границ прямоугольника.                                                                                                                 |
| **stroke-width="6"**     | Ширина границ прямоугольника.                                                                                                               |
| **stroke="#ff000000″**   | Цвет заливки прямоугольника.                                                                                                                |

#### Пример

```markup
<rectangle stroke-width="6" fill-style="none" end="344:511" id="{rectengle1}" 
stroke-style="solid" fill="#ff000000" stroke="#ff000000" begin="285:229"/>
```

<div align="left"><img src="https://thumb.tildacdn.com/tild3435-3234-4464-a232-653365343039/-/resize/363x/-/format/webp/2019-03-18_19-50-54.png" alt=""></div>

###

### \<ellipse>

Добавляет эллипс.

#### Атрибуты

| Атрибут                  | Описание                                                                                                                              |
| ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------- |
| **stroke-style="solid"** | Вид границ эллипса. Виды эллипса аналогичны видам линии.                                                                              |
| **begin="x:y"**          | Начало эллипса, где x, y — положение начальной точки в  [системе координат](/studio/2d-model/settings#sistema-koordinat-v-2d-modeli). |
| **end="x:y"**            | Конец эллипса, где x, y — положение конечной точки в [системе координат](/studio/2d-model/settings#sistema-koordinat-v-2d-modeli).    |
| **id="{name}"**          | Уникальный идентификатор.                                                                                                             |
| **fill-style="none"**    | <p>Заливка. По умолчанию стоит «none». Заполненный эллипс<br> — будет со значением «solid».</p>                                       |
| **stroke-width="6″**     | Ширина границ эллипса.                                                                                                                |
| **fill="#ff000000″**     | Цвет границ эллипса.                                                                                                                  |
| **stroke="#ff000000″**   | цвет заливки эллипса                                                                                                                  |

#### Пример

```markup
<ellipse stroke-width="6" fill-style="none" end="-178:300" id="{ellipse1}" 
stroke-style="solid" fill="#ff000000" stroke="#ff000000" begin="-260:7"/>
```

<div align="left"><img src="https://thumb.tildacdn.com/tild3261-3339-4333-b639-663432303630/-/resize/402x/-/format/webp/2019-03-18_19-54-16.png" alt=""></div>

###

### \<stylus>

Определяет стилус для рисования.

#### Атрибуты

| Атрибут                  | Описание                                                                                                             |
| ------------------------ | -------------------------------------------------------------------------------------------------------------------- |
| **stroke-style="solid"** | Вид фигуры. Виды фигур, нарисованных с помощью стилуса, аналогичны видам линии.                                      |
| **id="{name}"**          | Уникальный идентификатор.                                                                                            |
| **fill-style="none"**    | Заливка. В данном случае этот атрибут не имеет смысла, т.к. нарисованные фигуры с помощью стилуса всегда однородные. |
| **stroke-width="6″**     | Толщина стилуса.                                                                                                     |
| **fill="#ff000000″**     | Цвет стилуса.                                                                                                        |
| **stroke="#ff000000″**   | Цвет заливки стилуса.                                                                                                |

#### Пример

```markup
<stylus stroke-width="6" fill-style="none" id="{stylus_name}" stroke-style="solid" 
fill="#ff000000" stroke="#ff000000">
```

<div align="left"><img src="https://thumb.tildacdn.com/tild3731-3835-4431-a632-623366313137/-/resize/214x/-/format/webp/2019-03-18_20-05-28.png" alt=""></div>

### \<stylusLine>

Позволяет рисовать произвольные фигуры с помощью стилуса. Этот блок кода состоит из множества отрезков.

#### Атрибуты

| Атрибут                  | Описание                                                                                                            |
| ------------------------ | ------------------------------------------------------------------------------------------------------------------- |
| **stroke-style="solid"** | вид фигуры. Виды фигур, нарисованных с помощью стилуса, аналогичны видам линии                                      |
| **id="{name}"**          | уникальный идентификатор                                                                                            |
| **fill-style="none"**    | заливка. В данном случае этот атрибут не имеет смысла, т.к. нарисованные фигуры с помощью стилуса всегда однородные |
| **stroke-width="6″**     | толщина стилуса                                                                                                     |
| **fill="#ff000000″**     | цвет стилуса                                                                                                        |
| **stroke="#ff000000″**   | цвет заливки эллипса стилуса                                                                                        |

#### Пример

```markup
<stylusLine stroke-width="6" fill-style="none" end="-334:259" id="{name1}" stroke-style="solid"
fill="#ff000000" stroke="#ff000000" begin="-334:260"/>
<stylusLine stroke-width="6" fill-style="none" end="-333:258" id="{name2}" stroke-style="solid"
fill="#ff000000" stroke="#ff000000" begin="-334:259"/>
<stylusLine stroke-width="6" fill-style="none" end="-333:254" id="{name3}" stroke-style="solid"
fill="#ff000000" stroke="#ff000000" begin="-333:258"/>
```

&#x20;![](https://thumb.tildacdn.com/tild3731-3835-4431-a632-623366313137/-/resize/214x/-/format/webp/2019-03-18_20-05-28.png)

### \<region>

Позволяет добавлять регионы на сцене. Существует 2 вида региональных ограничений:&#x20;

* rectangle — прямоугольник

![](/files/-M4yIcGceN3WfJR1QF6p)

* ellipse — эллипс

![](/files/-M4yIiK-H-zAYXH61ATk)

#### Атрибуты

| **Атрибут**          | Описание                                                                                                                                                         |
| -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **filled="true"**    | Заполненность. Значение по умолчанию — true.                                                                                                                     |
| **type="rectangle"** | Геометрический вид региона.                                                                                                                                      |
| **height="300″**     | Высота региона (в случае с эллипсом это высота прямоугольника, описывающего эллипс).                                                                             |
| **width="300″**      | Ширина региона (в случае с эллипсом это длина прямоугольника, описывающего эллипс).                                                                              |
| **text="Finish"**    | Название, которое будет выводиться в TRIK Studio.                                                                                                                |
| **textX="0″**        | Положение названия региона относительно левого нижнего угла по оси X.                                                                                            |
| **textY="0″**        | Положение названия региона относительно левого нижнего угла по оси Y.                                                                                            |
| **x="1300″**         | Положение начала региона (левого верхнего угла) по оси X (в случае с эллипсом это координата по оси X левого верхнего угла прямоугольника, описывающего эллипс). |
| **y="-200″**         | Положение начала региона (левого верхнего угла) по оси Y (в случае с эллипсом это координата по оси Y левого верхнего угла прямоугольника, описывающего эллипс). |
| **visible="false"**  | Видимость в TRIK Studio.                                                                                                                                         |
| **id="finish"**      | Уникальный идентификатор региона.                                                                                                                                |
| **color="#ff0000″**  | Цвет границ и заполнения.                                                                                                                                        |

#### Пример

```markup
<regions>
            <region filled="true" type="rectangle" height="300" width="300" textX="0" 
text="Finish" textY="0" x="1300" y="-200" visible="true" id="Start" color="#ff0000"/>
</regions>
```

![](https://thumb.tildacdn.com/tild3334-6334-4534-b539-356262353336/-/resize/360x/-/format/webp/2019-04-01_14-23-44.png)

## Пример настройки 2D-модели

### Задача «Штрихкод»

Необходимо нарисовать штрихкод. Штрихкод состоит из белых и черных линий одинаковой толщины. Черная линия задает 1 в двоичном числе, а белая 0. Первая черная линия на пути робота — это старший бит числа.

Порядок линий в штрихкоде: `1001011011`.

### Создание мира

В данной задаче линии должны быть одинаковой толщины и длины. От руки с помощью инструмента «Линия» или «Стилус» нарисовать линии очень сложно, поэтому отредактируйте линии вручную:

1\. Нарисуйте на сцене 10 линий.

![](https://thumb.tildacdn.com/tild3431-6663-4035-b566-393133623464/-/resize/676x/-/format/webp/image26.png)

2\. Сохраните модель мира.

![](/files/-M4tOW5byzlTRSMpVjOl)

3\. Откройте получившийся XML-файл в любом удобном редакторе. Обратите внимание на блок кода с тегом `<line...>`.

![](https://thumb.tildacdn.com/tild6436-6631-4339-a436-313861333065/-/format/webp/image22.png)

4\. Для удобства назовите каждую линию `black1`-`black5` и `white1`-`white5`. Сделать это можно в атрибуте `id`. Называйте линии в порядке, указанном выше.

![](https://thumb.tildacdn.com/tild3136-3562-4363-a666-336365323431/-/format/webp/image32.png)

5\. Укажите толщину линий «50» в атрибуте `stroke-width`.

![](https://thumb.tildacdn.com/tild3836-3162-4263-b864-656136326336/-/format/webp/image10.png)

6\. Присвойте цвет каждой линии: `#ff000000` — черный, `#ffffffff` — белый. Сделать это можно в атрибуте `fill`. Присваивайте цвета таким образом, чтобы получился штрихкод.

![](https://thumb.tildacdn.com/tild3634-3930-4337-a131-363938313565/-/format/webp/image11.png)

&#x20;7\. Выставьте положение каждой линии в атрибутах `begin` и `end` без зазоров, чтобы получился ровный штрихкод.&#x20;

![](https://thumb.tildacdn.com/tild3832-3161-4230-b636-373161346433/-/format/webp/image2.png)

### Результат

![](https://thumb.tildacdn.com/tild3330-6466-4461-b262-373037613431/-/resize/428x/-/format/webp/image24.png)

## Пример модели мира

{% file src="/files/-MKorpp4qy72U3N0\_9M5" %}
Скачать
{% endfile %}


# Добавление ограничений в 2D-модель

* [Структура описания ограничений](/studio/2d-model/restrictions#struktura-napisaniya-ogranichenii)
* [Условия](/studio/2d-model/restrictions#usloviya)
* [Атомарные условия](/studio/2d-model/restrictions#atomarnye-usloviya)
* [Типы переменных и арифметические операции](/studio/2d-model/restrictions#tipy-peremennykh-i-arifmeticheskie-operacii)
* [Триггеры](/studio/2d-model/restrictions#triggery)
* [Названия датчиков](/studio/2d-model/restrictions#nazvaniya-datchikov)
* [Дополнительные свойства робота](/studio/2d-model/restrictions#dopolnitelnye-svoistva-robota)
* [Работа с экраном контроллера](/studio/2d-model/restrictions#rabota-s-ekranom-kontrollera)
* [Пример добавления ограничений](/studio/2d-model/restrictions#primer-dobavleniya-ogranichenii)

Для подготовки [упражнений](/studio/exercises) для учеников существует возможность внесения ограничений с помощью [редактирования XML-файла](/studio/2d-model/settings).

Ограничения бывают трех видов:

1. **Временны́е.**\
   Например, лимит времени на исполнение задачи или конкретное действие в конкретный временной отрезок.<br>
2. **Пространственные.**\
   Например, добавление регионов («Старт», «Финиш») или запрет / принуждение робота, его датчика или какого-то подвижного предмета находиться в определенные промежутки времени в определенном месте.<br>
3. **Ограничения на устройства.**\
   Например, ограничение на набор датчиков или на поведение устройств.

## Структура написания ограничений

Для описания ограничений используется главный тег [`<constraints>…</constraints>`](/studio/2d-model/restrictions#less-than-constraints-greater-than-less-than-constraints-greater-than), в который вписываются все ограничения. Используется как контейнер. Ограничения описываются внутри тега, каждый дочерний тег должен быть одним из четырех:

| Тег                                                                                                             | Описание                                                                                  |
| --------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- |
| [timelimit](/studio/2d-model/restrictions#less-than-timelimit-greater-than)                                     | Временное ограничение.                                                                    |
| [constraint](/studio/2d-model/restrictions#less-than-constraint-greater-than-less-than-constraint-greater-than) | Ограничение с произвольным условием, при нарушении которого будет выдана заданная ошибка. |
| [event](/studio/2d-model/restrictions#event)                                                                    | Основной инструмент задания динамических ограничений. Используется как контейнер.         |
| [init](/studio/2d-model/restrictions#init)                                                                      | Безусловное событие, выполняющееся перед началом выполнения программы.                    |

## \<constraints>...\</constraints>

Основной тег, в который вписываются все ограничения. Используется как контейнер.

```markup
<constraints>
     <!-- Временное ограничение -->
     <timelimit value="30000"/>
     
     <!-- Ограничение с условием. При нарушении условия будет выдана ошибка -->
     <constraint checkOnce="true" failMessage="Робот должен находиться на старте перед запуском!">
          <inside objectId="robot1" regionId="start_zone"/>
     </constraint>
     
     <!-- Инициализация переменной x со значением 2 -->
     <init>
          <setter name="x">
               <int value="2"/>
          </setter>
      </init>

</constraints>
```

## \<timelimit/>

Временное ограничение. Является обязательным.

#### Атрибуты

| Атрибут              | Описание                                                                                                    |
| -------------------- | ----------------------------------------------------------------------------------------------------------- |
| **value="значение"** | Количество миллисекунд, через которое исполнение будет прекращено и выдана ошибка «Превышен лимит времени». |

#### Синтаксис

```markup
<timelimit value="35000"/>
```

## \<constraint>...\</constraint>

Ограничение с произвольным условием, при нарушении которого будет выдана заданная ошибка. Может использоваться как контейнер. Имеет один дочерний тег: `<conditions>...</conditions>`.

#### Атрибуты

| Атрибут                   | Описание                                                                                                                                                                                                                                                                               |
| ------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **checkOnce="true"**      | <p>Логический атрибут. Если в значении стоит true, то ограничение будет проверено 1 раз при старте программы и больше проверяться не будет.</p><p>Полезно, например, если нужно 1 раз проверить, что датчики расставлены верно, а дальше во время исполнения ничего не поменяется.</p> |
| **failMessage="Ошибка!"** | Сообщение об ошибке, которое будет показано при нарушении ограничения.                                                                                                                                                                                                                 |

#### Синтаксис

```markup
<constraint checkOnce="true" failMessage="Робот должен находиться на старте перед запуском!">
```

```markup
<!-- Проверяет при запуске, что на порту А1 установлен инфракрасный датчик расстояния -->
<constraint checkOnce="true" failMessage="У робота должен быть установлен инфракрасный датчик расстояния на порту А1">
    <equals>
        <typeOf objectId="robot1.A1"/>
        <string value="twoDModel::robotModel::parts::RangeSensor"/>
    </equals>
</constraint>
```

```markup
<!-- Проверяет, что робот находится в допустимом регионе на протяжении всего времени выполнения программы -->
<constraint failMessage="Робот покинул допустимую зону!">
    <inside objectId="robot1" regionId="warzone"/>
</constraint>
```

## \<event>...\</event> <a href="#event" id="event"></a>

Основной инструмент задания динамических ограничений. Используется как контейнер. Описывает строго одно событие.

Событие - это просто пара ([условие](/studio/2d-model/restrictions#usloviya), [триггер](/studio/2d-model/restrictions#triggery)).

#### Атрибуты

| Атрибут                      | Описание                                                                                                                                                                                                                                                                                                |
| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **settedUpInitially="true"** | Атрибут, позволяющий указать взведено ли событие при старте программы. Событие может быть взведено или спущено (setted up и dropped). Во взведенном состоянии событие выполняет свой триггер по выполнению своего условия, в спущенном оно просто игнорируется системой. Значение по умолчанию — false. |
| **id="finish checker"**      | Уникальный идентификатор события. По этому идентификатору можно обращаться к данному событию из других. Опциональный.                                                                                                                                                                                   |
| **dropsOnFire = "true"**     | Логический атрибут, который указывает, продолжать ли быть событию взведенным после его срабатывания или нет. Опциональный. Значение по умолчанию -- true.                                                                                                                                               |

#### Синтаксис

```markup
<event id="finish checker" settedUpInitially="false">
	<condition>
		<inside objectId="robot1" regionId="finish"/>
	</condition>
	<trigger>
		<success/>
	</trigger>
</event>
```

## \<init>...\</init> <a href="#init" id="init"></a>

Безусловное событие, выполняющееся перед началом выполнения программы.&#x20;

#### Пример

```markup
<!-- Перед началом выполнения программы заводим переменную "my_value" со значением два -->
<init>
    <setter name="my_value">
        <int value="2"/>
    </setter>
</init>
```

## Условия

Теперь обсудим, какими могут быть условия в элементах [\<constraint>](/studio/2d-model/restrictions#less-than-constraint-greater-than-less-than-constraint-greater-than) и [\<event>](/studio/2d-model/restrictions#event). Условия задаются с помощью тега [\<condition>](/studio/2d-model/restrictions#condition) в случае, если проверяется только одно из [атомарных условий](/studio/2d-model/restrictions#atomarnye-usloviya), или тега [\<conditions>](/studio/2d-model/restrictions#less-than-conditions-greater-than-less-than-conditions-greater-than), если проверяется составное условие.

## \<condition>...\</condition> <a href="#condition" id="condition"></a>

Внутри этого тега описывается проверяемое условие.

#### Пример

```markup
<condition>
    <!-- Внутри тега описано условие равенства двух значений -->
    <equals>
        <objectState object="robot1.display.smiles"/>
        <bool value="true"/>
    </equals>
</condition>
```

## \<conditions>...\</conditions>

Используется для создания составных условий. Обязательным атрибутом должна быть указана логическая связка. Связкой может быть `and` или `or`. Отрицание выражения задается тегом `<not>` без атрибутов. Среди подвыражений могут также встречаться другие элементы \<conditions>.

#### Атрибуты

| Атрибут        | Описание           |
| -------------- | ------------------ |
| **glue="and"** | Логическая связка. |

#### Синтаксис

```markup
<conditions glue="and">
   <!-- Условие1 -->
   <!-- Условие2 -->
   <!--    ...   -->
   <!-- УсловиеN -->
</conditions>

<conditions glue="and">
   <not>
      <!-- Условие1 -->
   </not>
</conditions>

<conditions glue="and">
   <timer timeout="1000" forceDropOnTimeout="true"/>
   <conditions glue="or">
      <greater>
         <objectState object="robot1.display.labels.size"/>
         <int value="20"/>
      </greater>
      <less>
         <objectState object="robot1.display.labels.size"/>
         <int value="19"/>
       </less>    
    </conditions>
</conditions>
```

## Атомарные условия

Атомарное условие представляет собой один из следующих элементов:

| Тег                                                                                                                                                                                              | Описание                                                                       |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------ |
| [equals](/studio/2d-model/restrictions#equals), [notEqual](/studio/2d-model/restrictions#notequal), [greater](/studio/2d-model/restrictions#greater), [less](/studio/2d-model/restrictions#less) | Операции сравнения значений.                                                   |
| [inside](/studio/2d-model/restrictions#inside)                                                                                                                                                   | Позволяет задавать пространственные ограничения.                               |
| [settedUp и dropped](/studio/2d-model/restrictions#settedup)                                                                                                                                     | Позволяет проверить, взведено событие или нет.                                 |
| [timer](/studio/2d-model/restrictions#timer)                                                                                                                                                     | Позволяет задать время в мс, после которого данное условие считается истинным. |

## \<equals>...\</equals> <a href="#equals" id="equals"></a>

Равно. Операция сравнения значений функциональных символов. Может использоваться как контейнер.

#### Синтаксис

```markup
<equals>
	<objectState object="robot1.display.labels.first.text"/>
	<string value="finish"/>
</equals>
```

## \<notEqual>...\</notEqual> <a href="#notequal" id="notequal"></a>

Не равно. Операция сравнения значений функциональных символов. Может использоваться как контейнер.

#### Синтаксис

```markup
<notEqual>
	<objectState object="robot1.display.labels.first.text"/>
	<string value="finish"/>
</notEqual>
```

## \<greater>...\</greater> <a href="#greater" id="greater"></a>

Больше. Операция сравнения значений функциональных символов. Может использоваться как контейнер.

#### Синтаксис

```markup
<greater>
	<objectState object="robot1.display.labels.size"/>
	<int value="0"/>
</greater>
```

## \<less>...\</less> <a href="#less" id="less"></a>

Меньше. Операция сравнения значений функциональных символов. Может использоваться как контейнер.

#### Синтаксис

```markup
<less>
    <objectState object="robot1.display.labels.size"/>
    <int value="10"/>
</less>
```

## \<inside/> <a href="#inside" id="inside"></a>

Позволяет задавать пространственные ограничения.

#### Атрибуты

| Атрибут                            | Описание                                                                                                                                                                                  |
| ---------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **objectId="id"**                  | id взятого объекта.                                                                                                                                                                       |
| **regionId="id"**                  | id взятого региона.                                                                                                                                                                       |
| **objectPoint="center\|all\|any"** | <p>Осуществляет проверку того, что:</p><p>center — центр объекта находится в зоне,<br>all — все точки объекта находятся в зоне,<br>any — хоть какая-то точка объекта находится в зоне</p> |

#### Синтаксис

```markup
<!-- Задаем ограничение на то, что объект робот находится в регионе с id=”start” -->
<inside objectId="robot1" regionId="start"/>
```

## \<settedUp/> и \<dropped/> <a href="#settedup" id="settedup"></a>

Позволяет проверить, взведено событие или нет.

#### Атрибуты

| Атрибут         | Описание                           |
| --------------- | ---------------------------------- |
| **id="event1"** | Идентификатор проверяемого события |

#### Синтаксис

```markup
<!-- Условие, что событие с id=”event1” взведено -->
<condition>
    <settedUp id="event1"/>
</condition>

<!-- Условие, что событие с id=”event2” опущено -->
<condition>
    <dropped id="event2"/>
</condition>
```

#### Пример

В условиях события “check event” проверяется, что другое событие с id=”Try move” находится во взведенном состоянии, а событие с id=”Go back” опущено и не выполняется. Если оба эти условия после проверки возвращают значение true, то программа успешно завершается.

```markup
<event id="check event" settedUpInitially="true">
    <conditions glue="and">
        <settedUp id="Try move"/>
        <dropped id="Go back"/>
    </conditions>
    <trigger>
        <success/>
    </trigger>
</event>
```

## \<timer/> <a href="#timer" id="timer"></a>

Предикат, который начинает выдавать true, когда с момента взведения данного события прошло заданное время, а до этого момента выдает false.

#### Атрибуты

| Атрибут                       | Описание                                                                                                                                                                                                                                             |
| ----------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **timeout="1000"**            | Промежуток времени, через которой данный предикат станет истинным. Обязательный, значение должно быть неотрицательным и целочисленным.                                                                                                               |
| **forceDropOnTimeout="true"** | Логический атрибут, позволяющий опустить событие, которое имеет в условии данный таймер. Если выставлен в true, событие будет опущено даже при наличии других активных таймеров и невыполненных условий. Опциональный. Значение по умолчанию -- true |

#### Синтаксис

```markup
<timer timeout="1000" forceDropOnTimeout="false"/>
```

#### Пример

Рассмотрим использование \<timer/> c различными значениями атрибута forceDropOnTimeout .

В событии “check region” проверяются временное и пространственное ограничения. Первое условие (timer) становится истинным спустя 1000мс, а до этого момента ложно. После этого его значение больше не изменяется. Второе условие (inside) проверяет, что робот находится в регионе с id=”start\_zone”. В тот момент, когда оба этих условия будут выполнены одновременно, программа будет выполнена успешно.

1\. Т. к. атрибут forceDropOnTimeout равен "false", то после заданного количества времени событие будет продолжать оставаться взведенным и ждать выполнения второго условия.

```markup
<event id="check region" settedUpInitially="true">
    <conditions glue="and">
        <timer timeout="1000" forceDropOnTimeout="false"/>
        <inside objectId="robot1" regionId="start_zone"/>
    </conditions>
    <trigger>
        <success/>
    </trigger>
</event>
```

2\. Т. к. атрибут forceDropOnTimeout равен "true", то после заданного количества миллисекунд событие будет опущено, несмотря на наличие .другого условия. Таким образом, если в момент времени 1000 мс робот не находится в нужном регионе, то сообщение об успешном выполнении не будет выведено даже в случае, если робот окажется там спустя некоторое время.

```markup
<event id="check region" settedUpInitially="true">
    <conditions glue="and">
        <timer timeout="1000" forceDropOnTimeout="true"/>
        <inside objectId="robot1" regionId="start_zone"/>
    </conditions>
    <trigger>
        <success/>
    </trigger>
</event>
```

## Типы переменных и арифметические операции

| Переменная                                                           | Описание                                                                                                                 |
| -------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ |
| [int, double, string, bool](/studio/2d-model/restrictions#intdouble) | Целочисленная, дробная, строковая и логическая константы.                                                                |
| [variableValue](/studio/2d-model/restrictions#variablevalue)         | Значение переменной.                                                                                                     |
| [objectState](/studio/2d-model/restrictions#objectstate)             | Взять состояние объекта.                                                                                                 |
| [typeOf](/studio/2d-model/restrictions#typeof)                       | Взять метатип объекта с заданным идентификатором.                                                                        |
| [minus, abs](/studio/2d-model/restrictions#minusabs)                 | Унарные арифметические функции, имеют ровно 1 дочерний элемент, значение которого должно быть целочисленным.             |
| [sum, difference, min, max](/studio/2d-model/restrictions#summinmax) | Бинарные арифметические функции, имеют ровно 2 дочерних элемента, значение каждого из которых должно быть целочисленным. |

## \<int/>, \<double/>, \<string>, \<bool/> <a href="#intdouble" id="intdouble"></a>

Задание константы.

#### Атрибуты

| Атрибут       | Описание                     |
| ------------- | ---------------------------- |
| **value="0″** | Значение заданной константы. |

#### Синтаксис

```markup
<int value="0"/>

<string value="finish"/>
```

## \<variableValue/> <a href="#variablevalue" id="variablevalue"></a>

Значение переменной.&#x20;

Возможно взятие свойства какой-либо переменной, для этого используется точка. Например, значение rect.width вернет ширину прямоугольника, сохраненного в переменной rect.

#### Атрибуты

| Атрибут              | Описание       |
| -------------------- | -------------- |
| **name="my\_value"** | Имя переменной |

#### Синтаксис

```markup
<variableValue name="rotation"/>
```

## \<objectState/> <a href="#objectstate" id="objectstate"></a>

Взять состояние объекта.

#### Атрибуты

| Атрибут                                 | Описание            |
| --------------------------------------- | ------------------- |
| **object="robot1.display.labels.size"** | id взятого объекта. |

#### Синтаксис

```markup
<objectState object="robot1.display.labels.first.text"/>
```

#### Пример

```markup
<!-- Присвоим переменной rotation значение угла поворота робота -->
<setter name="rotation">
     <objectState object="robot1.rotation"/>
 </setter>
<!-- Проверяем равно ли значение переменной rotation значению угла поворота робота -->
<equals>
   <variableValue name="rotation"/>
   <objectState object="robot1.rotation"/>
</equals>
```

## \<typeOf/> <a href="#typeof" id="typeof"></a>

Взять метатип объекта с заданным идентификатором. Например: если взять `typeOf` объекта `wall` с `id=777`, то он вернет, что тип этого объекта `wall`.

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

#### Атрибуты

| Атрибут           | Описание                                  |
| ----------------- | ----------------------------------------- |
| **objectId="id"** | Уникальный идентификатор взятого объекта. |

#### Синтаксис

```markup
<typeOf objectId="robot1.A3"/>
```

## \<minus>..\</minus>, \<abs>...\</abs> <a href="#minusabs" id="minusabs"></a>

Унарные арифметические операции отвечающие за изменение знака и взятие модуля числа.

#### Синтаксис

```markup
<minus>
    <objectState object="robot1.rotation"/>
</minus>

<abs>
    <objectState object="robot1.rotation"/>
</abs>
```

#### Пример

```markup
<!-- Модуль разности переменной rotation и значения угла поворота робота -->
<abs>
    <difference>
        <variableValue name="rotation"/>
        <objectState object="robot1.rotation"/>
    </difference>
</abs>
```

## \<sum>, \<difference>, \<min>, \<max> <a href="#summinmax" id="summinmax"></a>

Сумма и разность значений. Минимальное и максимальное значение.

#### Пример

```markup
<!-- Разность между переменной rotation и значением угла поворота робота -->
<difference>
       <variableValue name="rotation"/>
       <objectState object="robot1.rotation"/>
</difference>

<!-- Сумма переменной counter и единицы -->
<sum>
       <variableValue name="counter"/>
       <int value="1"/>
</sum>
```

## Триггеры

| Тег                                                        | Описание                                                                                                          |
| ---------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- |
| [trigger](/studio/2d-model/restrictions#trigger)           | Действие или группа действий, которые будут выполнены один или множество раз по факту выполнения условия события. |
| [fail](/studio/2d-model/restrictions#fail)                 | Показать ошибку пользователю, завершить проверку задания.                                                         |
| [success](/studio/2d-model/restrictions#success)           | Показать пользователю сообщение об успешном прохождении задания и завершить проверку.                             |
| [setter](/studio/2d-model/restrictions#setter)             | Установить значение переменной.                                                                                   |
| [setUp, drop](/studio/2d-model/restrictions#setup)         | Взводит или опускает событие                                                                                      |
| [message](#less-than-message-text-vash-tekst-greater-than) | Выводит текст                                                                                                     |

## \<trigger>...\</trigger> <a href="#trigger" id="trigger"></a>

Действие или группа действий, которые будут выполнены один или множество раз по факту выполнения условия события.&#x20;

#### Синтаксис

```markup
<trigger>
    <!— тут только один тег —>
</trigger>

<triggers>
    <!— тут —>
    <!— несколько —>
    <!— тегов —>
</triggers>
```

## \<fail/> <a href="#fail" id="fail"></a>

Показать ошибку, завершить проверку задания.

#### Атрибуты

| Атрибут                       | Описание                |
| ----------------------------- | ----------------------- |
| **message="Неверный ответ!"** | текст выведенной ошибки |

#### Синтаксис

```markup
<fail message="Неверный ответ!"/>
```

## \<success/> <a href="#success" id="success"></a>

Задание успешно пройдено.

#### Атрибуты

| Атрибут          | Описание                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| deferred="false" | Опциональный. По умолчанию равен "false". При выставлении его в *true* данный триггер не остановит выполнение программы, т. е. чекер дождется конца программы и, либо скажет, что программа выполнена успешно, если ошибок не было, либо выпадет с ошибкой в противном случае. Другими словами атрибут *deferred*  не позволяет получить ошибку "Программа закончилась, но задание не выполнено": программа либо завершится с успехом, либо с содержательной ошибкой типа "Превышен лимит времени". |

#### Синтаксис

```markup
<success/>
```

## \<setter>...\</setter> <a href="#setter" id="setter"></a>

Установить значение переменной

#### Атрибуты

| Атрибут          | Описание            |
| ---------------- | ------------------- |
| name="my\_value" | Название переменной |

#### Пример

```markup
<!-- Создаем переменную total_score со значением 0.-->
<setter name="total_score">
       <int value="0"/>
 </setter>

<!-- Добавляем к переменной total_score + 2. -->
<setter name="total_score">
       <sum>
              <variableValue name="total_score"/>
              <int value="2"/>
       </sum>
</setter>
```

## \<setUp/>, \<drop/> <a href="#setup" id="setup"></a>

Взводит или опускает событие

#### Атрибуты

| Атрибут                 | Описание              |
| ----------------------- | --------------------- |
| **id="finish checker"** | id выбранного события |

#### Пример

```markup
<!-- Запустить событие "finish checker" -->
<triggers>
				<setUp id="finish checker"/>
</triggers>
```

## \<message/>&#x20;

Выводит текст в консоль

**Атрибуты**

| Атрибут              | Описание          |
| -------------------- | ----------------- |
| text="Hello, world!" | Необходимый текст |
|                      |                   |

```javascript
<trigger>
<message text="Hello, world!"/>
</trigger>

При срабатывании такого триггера в консоль робота будет выведен текст "Hello, world!"
```

## Названия датчиков

#### Датчики для робота TRIK

| Название                                       | Описание            |
| ---------------------------------------------- | ------------------- |
| twoDModel::robotModel::parts::RangeSensor      | Датчик расстояния   |
| trik::robotModel::twoD::parts::TwoDLightSensor | Датчик освещенности |
| twoDModel::robotModel::parts::TouchSensor      | Датчик касания      |
| trik::robotModel::twoD::parts::LineSensor      | Датчик линии        |

#### Датчики для робота Lego EV3

| Название                                         | Описание                      |
| ------------------------------------------------ | ----------------------------- |
| twoDModel::robotModel::parts::RangeSensor        | Датчик расстояния             |
| twoDModel::robotModel::parts::LightSensor        | Датчик освещённости           |
| twoDModel::robotModel::parts::TouchSensor        | Датчик касания                |
| twoDModel::robotModel::parts::ColorSensorRed     | Датчик цвета (красный)        |
| twoDModel::robotModel::parts::ColorSensorGreen   | Датчик цвета (зеленый)        |
| twoDModel::robotModel::parts::ColorSensorBlue    | Датчик цвета (синий)          |
| twoDModel::robotModel::parts::ColorSensorPassive | Датчик цвета (пассивный)      |
| twoDModel::robotModel::parts::ColorSensorFull    | Датчик цвета EVX/NXT (цвет)   |
| twoDModel::robotModel::parts::ColorSensorAmbient | Датчик цвета EV3 (рассеянный) |
| ev3::robotModel::twoD::parts::GyroscopeSensor    | Гиродатчик                    |
| ev3::robotModel::twoD::parts::GyroscopeSensor    | Компас                        |

## Дополнительные свойства робота

| Свойство                | Описание                                                                                                |
| ----------------------- | ------------------------------------------------------------------------------------------------------- |
| robot1.rotation         | Позволяет узнать текущий угол поворота робота                                                           |
| robot1.x и robot1.y     | Позволяет узнать координаты робота                                                                      |
| robot1.led.color        | Позволяет узнать цвет диода                                                                             |
| robot1.marker.isDown    | Проверяет, что у робота установлен маркер и он рисует линию на поле. Возвращает значения true или false |
| robot1.shell.lastPhrase | Узнать текст, который сказал робот                                                                      |

## Работа с экраном контроллера

| Свойство                         | Описание                                                                                              |
| -------------------------------- | ----------------------------------------------------------------------------------------------------- |
| robot1.display.sadSmiles         | Проверяет, что на экране контроллера установлен грустный смайлик. Возвращает значение true или false. |
| robot1.display.smiles            | Проверяет, что на экране контроллера установлен веселый смайлик. Возвращает значение true или false.  |
| robot1.display.labels.first.text | Текст сообщения (label), которое было выведено на экран первым.                                       |
| robot1.display.labels.last.text  | Текст сообщения (label), которое было выведено на экран последним.                                    |
| robot1.display.labels.size       | Узнать количество label-ов, выведенных на экран.                                                      |

#### Пример

Проверяем, что на экран контроллера было выведено слово “сообщение”. Регистр слова важен.

```markup
<equals>
        <objectState object="robot1.display.labels.first.text"/>
        <string value="сообщение"/>
</equals>
```

## Пример добавления ограничений

Стартовав в синем квадрате, необходимо проехать вдоль стены с помощью датчика расстояния ИК до красного квадрата.

![](https://thumb.tildacdn.com/tild6265-3339-4037-b064-366561643230/-/resize/740x/-/format/webp/2019-04-03_12-46-00.png)

```markup
<?xml version="1.0" encoding="UTF-8"?>
<root>
   <world>
      <background />
      <walls>
         <!-- Стена -->
         <wall id="{wall1}" end="300:150" begin="0:100" />
         <wall id="{wall2}" end="550:100" begin="300:150" />
         <wall id="{wall3}" end="650:200" begin="550:100" />
         <wall id="{wall4}" end="850:300" begin="650:200" />
         <wall id="{wall5}" end="1200:300" begin="850:300" />
         <wall id="{wall6}" end="1600:50" begin="1200:300" />
      </walls>
      <skittles />
      <balls />
      <colorFields />
      <images />
      <regions>
         <!-- Регионы -->
         <region visible="true" id="finish" x="1300" color="#ff0000" text="Finish" type="rectangle" width="300" textX="0" textY="0" y="-200" filled="true" height="300" />
         <region visible="true" id="start_zone" x="-50" color="#0000ff" text="Start" type="rectangle" width="150" textX="0" textY="0" y="100" filled="true" height="-150" />
         <region visible="false" id="warzone_1" x="-50" color="#ffff00" text="warzone1" type="rectangle" width="650" textX="0" textY="0" y="-50" filled="true" height="200" />
         <region visible="false" id="warzone_2" x="600" color="#ffff00" text="warzone2" type="rectangle" width="250" textX="0" textY="0" y="0" filled="true" height="250" />
         <region visible="false" id="warzone_3" x="850" color="#ffff00" text="warzone3" type="rectangle" width="750" textX="0" textY="0" y="50" filled="true" height="250" />
      </regions>
   </world>
   <robots>
      <!-- Описание робота -->
      <robot id="trikKitRobot" position="0:0" direction="0">
         <sensors>
            <sensor port="A1###input###А1###sensorA1" position="75:25" type="trik::robotModel::parts::TrikInfraredSensor" direction="45" />
            <sensor port="M3###output###JM3$$$C$$$3###" position="75:25" type="kitBase::robotModel::robotParts::Motor" direction="0" />
            <sensor port="M4###output###JM4$$$D$$$4###" position="75:25" type="kitBase::robotModel::robotParts::Motor" direction="0" />
         </sensors>
         <startPosition id="{ee2c46c1-23fc-4cda-98f4-77d9de775305}" x="25" y="25" direction="0" />
         <wheels left="M3###output###М3###" right="M4###output###М4###" />
      </robot>
   </robots>
   <constraints>
      <!-- Лимит на выполнение программы (30 секунд) -->
      <timelimit value="30000" />
      <!-- Зональное ограничение на начало езды. Проверяется один раз в начале программы -->
      <constraint checkOnce="true" failMessage="Робот должен находиться в синем квадрате перед запуском!">
         <inside regionId="start_zone" objectId="robot1" />
      </constraint>
      <!-- Ограничение на наличие и тип датчиков -->
      <constraint checkOnce="true" failMessage="Должен быть подключен только Датчик расстояния ИК на A1">
         <conditions glue="and">
            <equals>
               <typeOf objectId="robot1.A1" />
               <string value="trik::twoDModel::robotModel::parts::RangeSensor" />
            </equals>
            <equals>
               <typeOf objectId="robot1.A2" />
               <string value="undefined" />
            </equals>
            <equals>
               <typeOf objectId="robot1.A3" />
               <string value="undefined" />
            </equals>
            <equals>
               <typeOf objectId="robot1.A4" />
               <string value="undefined" />
            </equals>
            <equals>
               <typeOf objectId="robot1.A5" />
               <string value="undefined" />
            </equals>
            <equals>
               <typeOf objectId="robot1.A6" />
               <string value="undefined" />
            </equals>
            <equals>
               <typeOf objectId="robot1.D1" />
               <string value="undefined" />
            </equals>
            <equals>
               <typeOf objectId="robot1.D2" />
               <string value="undefined" />
            </equals>
         </conditions>
      </constraint>
      <!-- Контроль езды робота -->
      <constraint failMessage="Робот попытался выехать из разрешенной зоны!">
         <conditions glue="or">
            <inside regionId="warzone_1" objectId="robot1" />
            <inside regionId="warzone_2" objectId="robot1" />
            <inside regionId="warzone_3" objectId="robot1" />
         </conditions>
      </constraint>
      <!-- Событие, проверяющее не заехал ли робот в зону финиша -->
      <event settedUpInitially="true">
         <condition>
            <timer timeout="100" forceDropOnTimeout="true" />
         </condition>
         <trigger>
            <setUp id="finish checker" />
         </trigger>
      </event>
      <!-- Событие, оповещающее об успешном выполнении программы -->
      <event id="finish checker" settedUpInitially="false">
         <condition>
            <inside regionId="finish" objectId="robot1" />
         </condition>
         <trigger>
            <success />
         </trigger>
      </event>
   </constraints>
</root>

```


# Примеры задания ограничений

Задание ограничений — уникальная возможность TRIK Studio, предназначенная для автоматизированной проверки заданий. Этот инструмент имеет множество применений:

* самопроверка домашнего задания учениками,
* ускорение процесса проверки заданий учителем,
* проведение онлайн-соревнований с автоматической проверкой решений участников.

Язык ограничений в TRIK Studio — очень мощный инструмент, который позволяет проверить практически все аспекты выполнения программы и поведения робота, и может показаться сложным на первый взгляд. Однако не стоит расстраиваться — в данной статье мы разберем процесс создания задач с ограничениями, начиная от простых ограничений, которые покрывают большинство задач, и заканчивая сложными ограничениями, что может быть полезно для энтузиастов.

* [Ограничения на время исполнения программы и на зоны «Старт» и «Финиш»](/studio/2d-model/restrictions/examples#ogranicheniya-na-vremya-ispolneniya-programmy-i-na-zony-start-i-finish)
* [Разбор примеров](/studio/2d-model/restrictions/examples#razbor-primerov)
  * [Пример 1. Проезд из зоны «Старт» в зону «Финиш» с ограничением на зону для перемещений](/studio/2d-model/restrictions/examples#primer-1-proezd-iz-zony-start-v-zonu-finish-s-ogranicheniem-na-zonu-dlya-peremeshenii)
  * [Пример 2. Проезд из зоны «Старт» в зону «Финиш» с остановкой](/studio/2d-model/restrictions/examples#primer-2-proezd-iz-zony-start-v-zonu-finish-s-ostanovkoi)
  * [Пример 3. Проезд из зоны «Старт» в зону «Финиш» вдоль стены с проверкой датчиков](/studio/2d-model/restrictions/examples#ex3)
  * [Пример 4. Подсчет перекрестков и вывод на экран](/studio/2d-model/restrictions/examples#ex4)
  * [Пример 5. Кегельринг](/studio/2d-model/restrictions/examples#ex5)
  * [Пример 6. Проверка поведения робота](/studio/2d-model/restrictions/examples#ex4)

## Ограничения на время исполнения программы и на зоны «Старт» и «Финиш»

Для тех, кто только начинает знакомиться с языком создания ограничений в TRIK Studio, мы предлагаем начать с простых ограничений на время исполнения программы, зону «Старт» и «Финиш». Для большинства робототехнических задач этого более чем достаточно.

1\. Определите для задачи и модели мира следующие условия и параметры.

* **Оптимальное время выполнения программы.** Если программа будет выполняться больше этого времени, проверяющая система выдаст ошибку «Программа работала слишком долго».
* **Зона «Старт».**  Зона, из которой робот должен начать выполнение программы, иначе проверяющая система выдаст ошибку.
* **Зона** **«Финиш».** Зона, в которую должен приехать робот по окончании выполнения программы, иначе проверяющая система выдаст ошибку.

2\. Отредактируйте в xml-файле мира значение тега `<regions>`, добавив туда зоны «Старт» и «Финиш». Меняя значения `x`, `y`, `width` и `height` , вы можете редактировать местоположение и размер зон. Чтобы проверить положение зоны, загрузите файл в виртуальную модель мира и проверьте расположение зон. После этого, при необходимости, вы можете сделать зоны «Старт» и «Финиш» невидимыми, выставив атрибут `visible="false"`. &#x20;

```markup
<regions>
    <region type="rectangle" visible="true" color="blue" text="Старт" x="-450" y="-400" width="150" height="150" id="start_zone"/>
    <region type="rectangle" visible="true" color="green" text="Финиш" x="450" y="-400" width="150" height="150" id="finish_zone"/>
</regions>
```

3\. Скопируйте в xml-файл мира, для которого необходимы ограничения, шаблон блока `<constraints>`, приведенный ниже.

```markup
<constraints>
    <!--  Ограничение на время выполнения программы -->
     <timelimit value="300000"/>

    <!-- Ограничение, которое проверится один раз перед началом программы -->
    <constraint checkOnce="true" failMessage="Робот должен находиться в зоне старта перед запуском!">
        <inside objectId="robot1" regionId="start_zone"/>
    </constraint>
    
    <!-- Событие, которое проверяет, что робот находится в зоне финиша по окончании выполнения программы -->
    <event id="finish checker" settedUpInitially="true">
        <condition>
            <inside objectId="robot1" regionId="finish_zone"/>
        </condition>
        <trigger>
            <success/>
        </trigger>
    </event>
</constraints>
```

4\. Заполните тег `<timelimit value="300000">`. Укажите оптимальное, на ваш взгляд, время выполнения программы. Обратите внимание, что время указывается в миллисекундах, т.е. 300000 мс = 5 минут, 120000 мс = 2 минуты и т.п.

5\. Задание с ограничениями готово! Теперь вы умеете проверять стартовое и конечное положение робота, время исполнения программы.&#x20;

## Разбор примеров

Теперь давайте разберем применение данной техники для различных задач и рассмотрим варианты более детальных проверок.

### Пример 1. Проезд из зоны «Старт» в зону «Финиш» с ограничением на зону для перемещений

Задача прохождения лабиринта. Стартовав в синем квадрате, необходимо проехать до зоны финиша. Для того чтобы проверять, что пользователь действительно проходит лабиринт, а не объезжает его, задано пространственное ограничение.

![Синий квадрат - зона старта, красный квадрат - зона финиша, черный прямоугольник - поле, которое нельзя покидать роботу](/files/-M6WgoUYUpZq_vEq-uWO)

Ниже приведен полный код для проверки этой задачи.

```markup
<?xml version='1.0' encoding='utf-8'?>
<root>
	<!-- Описание мира -->
	<world>
		<trace/>
		<walls>
			<wall end="450:-400" id="" begin="-300:-400"/>
			<wall end="-300:200" id="" begin="-300:-250"/>
			<wall end="450:200" id="" begin="-300:200"/>
			<wall end="450:200" id="" begin="450:-250"/>
			<wall end="150:-100" id="" begin="150:-400"/>
			<wall end="300:50" id="" begin="300:-250"/>
			<wall end="450:-250" id="" begin="300:-250"/>
			<wall end="-150:-250" id="" begin="-300:-250"/>
			<wall end="0:-250" id="" begin="-150:-250"/>
			<wall end="-150:-100" id="" begin="150:-100"/>
			<wall end="150:50" id="" begin="-150:50"/>
			<wall end="150:200" id="" begin="150:50"/>
		</walls>
		<colorFields/>
		<!-- Задание регионов (зон) на карте мира -->
		<regions>
			<region type="rectangle" visible="true" color="blue" text="Старт" x="-450" y="-400" width="150" height="150" id="start_zone"/>
			<region type="rectangle" visible="true" color="green" text="Финиш" x="450" y="-400" width="150" height="150" id="finish_zone"/>

			<region id="warzone" type="rectangle" filled="false" color="black" visible="true" x="-450" y="-400" width="1050" height="600"/>
		</regions>
	</world>
	<robots>
		<robot id="trikKitRobot" direction="0" position="-401:-351">
			<sensors>
				<sensor type="kitBase::robotModel::robotParts::Motor" direction="0" port="M4###output###JM4$$$D$$$4###" position="75:25"/>
				<sensor type="kitBase::robotModel::robotParts::Motor" direction="0" port="M3###output###JM3$$$C$$$3###" position="75:25"/>
				<sensor type="kitBase::robotModel::robotParts::Motor" direction="0" port="M2###output###JM2$$$B$$$2###" position="75:25"/>
				<sensor type="kitBase::robotModel::robotParts::Motor" direction="0" port="M1###output###JM1$$$A$$$1###" position="75:25"/>
			</sensors>
			<startPosition direction="0" x="-376" y="-326"/>
		</robot>
	</robots>
	<!-- Описание ограничений -->
	<constraints>
		<!-- Ограничение на время 5 минут -->
		<timelimit value="300000"/> 
		
		<constraint checkOnce="true" failMessage="Робот должен находиться в зоне старта перед запуском!">
			<inside objectId="robot1" regionId="start_zone"/>
		</constraint>

		<!-- Ограничение, проверяющее, что робот находится в допустимой зоне -->
		<constraint failMessage="Робот попытался объехать лабиринт!">
			<inside objectId="robot1" regionId="warzone"/>
		</constraint>

		<!-- Событие, которое проверяет, что робот находится в зоне финиша по окончании выполнения программы -->
		<event id="finish checker" settedUpInitially="true">
			<condition>
				<inside objectId="robot1" regionId="finish_zone"/>
			</condition>
			<trigger>
				<success/>
			</trigger>
		</event>
	</constraints>
</root>
```

Рассмотрим подробнее, как происходит проверка.

**1.** Зададим ограничение на время прохождения задания. Это ограничение является обязательным. Время указывается в миллисекундах.

```markup
<timelimit value="300000"/>
```

**2.** Зададим ограничение на зону, в которой должен находиться робот перед началом программы. По условию задачи это должен быть синий квадрат - зона старта. Это ограничение будет проверяться один раз, в начале программы, так как атрибут `checkOnce` равен `true`.&#x20;

С помощью тега [\<inside>](/studio/2d-model/restrictions#less-than-inside-greater-than) мы задаем пространственное ограничение. Он имеет два атрибута. В первом (objectId) указываем id объекта, местоположение которого мы хотим проверить, в нашем случае это робот. Во втором (regionId) указываем id региона, в котором должен находиться наш объект.&#x20;

В случае, если условие, которое описано в `<inside>` не выполняется, то программа будет завершена с ошибкой. Для этого у тега [\<constraint>](/studio/2d-model/restrictions#less-than-constraint-greater-than-less-than-constraint-greater-than) есть атрибут failMessage, который позволяет задать текст сообщения об ошибке.

```markup
<constraint checkOnce="true" failMessage="Робот должен находиться в зоне старта перед запуском!">
    <inside objectId="robot1" regionId="start_zone"/>
</constraint>
```

**3.** Для того, чтобы проверять, что пользователь действительно проходит лабиринт, а не объезжает его, давайте зададим еще одно пространственное ограничение.&#x20;

Отредактируем в xml-файле мира значение тега `<regions>`, добавив туда регион с `id = “warzone”`.

```markup
<region id="warzone" type="rectangle" filled="false" color="black" visible="true" x="-450" y="-400" width="1050" height="600"/>
```

Это ограничение будет проверяться во все время выполнения программы. В теге [\<inside>](/studio/2d-model/restrictions#less-than-inside-greater-than) укажем id объекта и id региона, в нашем случае это робот и черный прямоугольник, ограничивающий лабиринт.

В случае, если робот в любой момент времени окажется вне указанного региона, программа будет завершена с ошибкой, текст которой указан в атрибуте `failMessage`.

```markup
<constraint failMessage="Робот попытался объехать лабиринт!">
    <inside objectId="robot1" regionId="warzone"/>
</constraint>
```

**4.** Теперь нам осталось проверить, что робот доезжает до зоны финиша.&#x20;

Для этого давайте создадим событие, которое будет проверять находится робот в нужной зоне или нет. Атрибут `settedUpInitially="true"` означает, что событие будет запущено (взведено) сразу при старте программы.

В теге [\<condition>](/studio/2d-model/restrictions#less-than-conditions-greater-than-less-than-conditions-greater-than) мы указываем какое именно условие необходимо проверить. В нашем случае условие аналогично описанным выше - мы проверяем, что робот находится в регионе с `id = "finish"`. В случае, если это условие выполнится, то пользователю будет показано сообщение об успешном выполнении программы. Для этого в теге [\<trigger>](/studio/2d-model/restrictions#less-than-trigger-greater-than-less-than-trigger-greater-than) мы пишем дочерний тег [\<success/>](/studio/2d-model/restrictions#less-than-success-greater-than).

```markup
<event id="finish checker" settedUpInitially="true">
    <!-- Условие -->
    <condition>
        <inside objectId="robot1" regionId="finish_zone"/>
    </condition>
    <!-- Триггер -->
    <trigger>
        <success/>
    </trigger>
</event>
```

### Пример 2. Проезд из зоны «Старт» в зону «Финиш» с остановкой

Задача проехать вперед и остановиться в зоне финиша.

Эта задача немного отличается от Примера 1 тем,  что добавляется еще одно условие  для успешного завершения программы - роботу необходимо не просто оказаться в зоне финиша, но и остановиться.

![](/files/-M6Wuk94Fw6hVbz5cPt9)

Ниже приведен полный код для проверки этой задачи.

```markup
<?xml version='1.0' encoding='utf-8'?>
<root version="20190819">
    <world>
    <!-- Задание регионов (зон) на карте мира -->
		<regions>
            <region id="finish_zone" text="Finish" textX="0" width="200" height="150" color="green" x="320" y="-50" visible="true" type="rectangle" filled="true" textY="0"/>
            <region id="start_zone" text="Start" textX="0" width="100" height="-100" color="#0000ff" x="-20" y="70" visible="true" type="rectangle" filled="true" textY="0"/>
			
						<region type="rectangle" id="warzone" text="Поле, которое нельзя покидать" x="-20" y="-140" width="610" height="320" color="orange" visible="true"/>
		</regions>
    </world>
    <robots>
        <robot id="trikKitRobot" direction="0" position="0:0">
            <sensors>
                <sensor port="M3###output###М3###" direction="0" position="75:25" type="kitBase::robotModel::robotParts::Motor"/>
                <sensor port="M4###output###М4###" direction="0" position="75:25" type="kitBase::robotModel::robotParts::Motor"/>
                <sensor port="M1###output###М1###" direction="0" position="75:25" type="kitBase::robotModel::robotParts::Motor"/>
                <sensor port="M2###output###М2###" direction="0" position="75:25" type="kitBase::robotModel::robotParts::Motor"/>
            </sensors>
            <startPosition id="{888338bf-3f53-44a4-ac0a-8aeea2d036b2}" y="25" direction="0" x="25"/>
            <wheels left="M3###output###М3###" right="M4###output###М4###"/>
        </robot>
    </robots>
    <settings realisticMotors="false" realisticSensors="false" realisticPhysics="false"/>
    <!-- Задание ограничений -->
    <constraints>
        <!-- Ограничение на время -->
        <timelimit value="10000"/>
    
        <!-- Зональное ограничение на начало езды. Проверяется один раз в начале программы-->
        <constraint checkOnce="true" failMessage="Робот должен находиться в синем квадрате перед запуском!">
            <inside objectId="robot1" regionId="start_zone"/>
        </constraint>
	    
	    	<!-- Робот находится в допустимой зоне-->
	    	<constraint failMessage="Робот покинул допустимую зону!">
	    		<inside objectId="robot1" regionId="warzone"/>
	    	</constraint>
    
        <!-- Событие, оповещающее об успешном выполнении программы (зона финиша + робот остановился) -->
        <event id="finish checker" settedUpInitially="true">
            <conditions glue="and">
                <inside regionId="finish" objectId="robot1"/>
                <equals>
                    <objectState object="robot1.M3.power"/>
                    <int value="0"/>
                </equals>
                <equals>
                    <objectState object="robot1.M4.power"/>
                    <int value="0"/>
                </equals>
            </conditions>
            
            <trigger>
                <success/>
            </trigger>
        </event>
    </constraints>
</root>
```

Теперь давайте рассмотрим подробнее как происходит проверка.

**1.** Зададим ограничение на время прохождения задания.

```markup
<timelimit value="10000"/>
```

**2.** Зададим ограничение на начальное положение робота. Оно проверится один раз в начале программы.

```markup
<constraint checkOnce="true" failMessage="Робот должен находиться в синем квадрате перед запуском!">
    <inside objectId="robot1" regionId="start_zone"/>
</constraint>
```

**3.** Зададим ограничение на зону, которую робот не может покидать.

```markup
<constraint failMessage="Робот покинул допустимую зону!">
    <inside objectId="robot1" regionId="warzone"/>
</constraint>
```

**4.** А теперь создадим событие, которое будет проверять, что робот находится в финишной зоне и при этом он остановился в ней, а не проехал дальше.

Зональное ограничение задается с помощью тега [\<inside>](/studio/2d-model/restrictions#less-than-inside-greater-than). Для того, чтобы проверить, что робот остановился, нужно проверить, что мощность на обоих моторах равна нулю. Для этого используем тег [\<equals>](/studio/2d-model/restrictions#less-than-equals-greater-than-less-than-equals-greater-than). С помощью тега [\<objectState>](/studio/2d-model/restrictions#less-than-objectstate-greater-than) укажем объект, значение которого мы хотим сравнить. В нашем случае это мощность на моторах, поэтому в атрибуте `object` пишем `robot1.M3.power` или `robot1.M4.power,` где `M3` и `M4` обозначают порты, к которым в текущей конфигурации подключены моторы. А значение, с которым нужно сравниться, записываем с помощью тега [\<int> ](/studio/2d-model/restrictions#less-than-int-greater-than)и его атрибута `value`.

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

```markup
<event id="finish checker" settedUpInitially="true">
    <!-- Составное условие -->
    <conditions glue="and">
        <inside regionId="finish" objectId="robot1"/>
        
        <equals>
            <objectState object="robot1.M3.power"/>
            <int value="0"/>
        </equals>
        
        <equals>
            <objectState object="robot1.M4.power"/>
            <int value="0"/>
        </equals>
    </conditions>
    
    <trigger>
        <success/>
    </trigger>
</event>
```

### Пример 3. Проезд из зоны «Старт» в зону «Финиш» вдоль стены с проверкой датчиков <a href="#ex3" id="ex3"></a>

Стартовав в синем квадрате, необходимо проехать вдоль стены с помощью датчика расстояния ИК до красного квадрата.

![](/files/-M7cadxJpZ1CNfhAkALH)

Ниже приведен полный код для проверки этого задания.

```markup
<?xml version='1.0' encoding='utf-8'?>
<root version="20190819">
    <world>
        <walls>
            <wall stroke-width="10" end="-110:50" stroke="#ff000000" begin="-200:50" stroke-style="none" fill="#ff000000" id="{f148f786-7d73-4c42-a3aa-c7a29892d3d7}"/>
            <wall stroke-width="10" end="0:100" stroke="#ff000000" begin="-110:50" stroke-style="none" fill="#ff000000" id="{8f39faac-9392-4878-86e9-9fe5dbea0007}"/>
            <wall stroke-width="10" end="250:110" stroke="#ff000000" begin="0:100" stroke-style="none" fill="#ff000000" id="{bf465864-fa2e-4b59-ac65-e27bd85300d5}"/>
            <wall stroke-width="10" end="350:160" stroke="#ff000000" begin="250:110" stroke-style="none" fill="#ff000000" id="{ba5441dd-8dd8-4100-ad8b-66d634792e3f}"/>
            <wall stroke-width="10" end="400:260" stroke="#ff000000" begin="350:160" stroke-style="none" fill="#ff000000" id="{ca85b1de-8e9c-49e9-8c40-c2c49f43dcaa}"/>
        </walls>
        <skittles/>
        <balls/>
        <colorFields/>
        <images/>
        <regions>
            <region visible="true" type="rectangle" x="350" filled="true" y="50" width="150" height="200" id="good_zone3" color="#ffff00"/>
            <region visible="true" type="rectangle" x="-250" filled="true" y="-50" width="150" textY="0" height="100" text="Start" id="start_zone" textX="0" color="#0000ff"/>
            <region visible="true" type="rectangle" x="0" filled="true" y="0" width="400" height="150" id="good_zone2" color="#ffff00"/>
            <region visible="true" type="rectangle" x="400" filled="true" y="150" width="100" textY="0" height="100" text="Finish" id="finish" textX="0" color="#ff0000"/>
            <region visible="true" type="rectangle" x="-200" filled="true" y="-50" width="250" height="150" id="good_zone1" color="#ffff00"/>
        </regions>
    </world>
    <robots>
        <robot direction="0" position="-200:-25" id="trikKitRobot">
            <sensors>
                <sensor type="trik::robotModel::parts::TrikInfraredSensor" direction="69.6769" position="42:18" port="A1###input###А1###sensorA1"/>
                <sensor type="kitBase::robotModel::robotParts::Motor" direction="0" position="75:25" port="M4###output###М4###"/>
                <sensor type="kitBase::robotModel::robotParts::Motor" direction="0" position="75:25" port="M3###output###М3###"/>
                <sensor type="" direction="0" position="0:0" port="A5###input###А5###sensorA5"/>
                <sensor type="" direction="0" position="0:0" port="A6###input###А6###sensorA6"/>
            </sensors>
            <startPosition direction="0" x="-175" y="0" id="{84223544-d500-411a-9fdb-b382eb98d09f}"/>
            <wheels right="M3###output###М3###" left="M4###output###М4###"/>
        </robot>
    </robots>
    <settings realisticPhysics="false" realisticSensors="false" realisticMotors="false"/>
    <constraints>
        <!-- Лимит времени. Обязательное ограничение -->
        <timelimit value="40000"/>
        <!-- Проверка, что на порт А1 установлен датчик расстояния -->
        <constraint checkOnce="true" failMessage="У робота должен быть установлен датчик расстояния на порт А1">
            <equals>
                <typeOf objectId="robot1.A1"/>
                <string value="twoDModel::robotModel::parts::RangeSensor"/>
            </equals>
        </constraint>
        <!-- Провека, что нет датчиков, кроме датчика расстояния-->
        <constraint checkOnce="true" failMessage="У робота не должно быть датчиков, кроме датчика расстояния">
            <conditions glue="and">
                <equals>
                    <typeOf objectId="robot1.A2"/>
                    <string value="undefined"/>
                </equals>
                <equals>
                    <typeOf objectId="robot1.A3"/>
                    <string value="undefined"/>
                </equals>
                <equals>
                    <typeOf objectId="robot1.A4"/>
                    <string value="undefined"/>
                </equals>
                <equals>
                    <typeOf objectId="robot1.A5"/>
                    <string value="undefined"/>
                </equals>
                <equals>
                    <typeOf objectId="robot1.A6"/>
                    <string value="undefined"/>
                </equals>
                <equals>
                    <typeOf objectId="robot1.D1"/>
                    <string value="undefined"/>
                </equals>
                <equals>
                    <typeOf objectId="robot1.D2"/>
                    <string value="undefined"/>
                </equals>
                <equals>
                    <typeOf objectId="robot1.F1"/>
                    <string value="undefined"/>
                </equals>
            </conditions>
        </constraint>

        <!-- Зональное ограничение на начало езды. Проверяется один раз в начале программы-->
        <constraint checkOnce="true" failMessage="Робот должен находиться в синей зоне перед стартом!">
            <inside objectId="robot1" regionId="start_zone"/>
        </constraint>
        <!-- Проверяет, что робот находится в допустимом регионе на протяжении всего времени выполнения программы -->
        <constraint failMessage="Робот покинул допустимую зону!">
            <conditions glue="or">
                <inside objectId="robot1" regionId="good_zone1"/>
                <inside objectId="robot1" regionId="good_zone2"/>
                <inside objectId="robot1" regionId="good_zone3"/>
            </conditions>
        </constraint>
        <!-- Событие, оповещающее об успешном выполнении программы -->
        <event id="finish checker" settedUpInitially="true">
            <condition>
                <inside objectId="robot1" regionId="finish"/>
            </condition>
            <trigger>
                <success/>
            </trigger>
        </event>
    </constraints>
</root>

```

Теперь давайте рассмотрим подробнее как происходит проверка.

**1.** Зададим ограничение на время выполнения задания.

```markup
<timelimit value="40000"/>
```

**2.** По условию задачи у робота должен быть подключен только датчик расстояния (других датчиков быть не должно). Для того чтобы убедиться в этом, сравним значение объекта на порту `A1` со значением, которое обозначает датчик расстояния. Подробнее о названиях датчиков для разных конструкторов можно узнать по [ссылке](/studio/2d-model/restrictions#nazvaniya-datchikov).

```markup
<constraint checkOnce="true" failMessage="У робота должен быть установлен датчик расстояния на порт А1">
    <equals>
        <typeOf objectId="robot1.A1"/>
        <string value="twoDModel::robotModel::parts::RangeSensor"/>
    </equals>
</constraint>
```

**3**. Выполним проверку, что к другим портам не подключены никакие датчики. Для этого сравним значение на каждом порту со строкой `“undefined”`.

```markup
<constraint checkOnce="true" failMessage="У робота не должно быть датчиков, кроме датчика расстояния">
    <conditions glue="and">
        <equals>
            <typeOf objectId="robot1.A2"/>
            <string value="undefined"/>
        </equals>
        <equals>
            <typeOf objectId="robot1.A3"/>
            <string value="undefined"/>
        </equals>
        <equals>
            <typeOf objectId="robot1.A4"/>
            <string value="undefined"/>
        </equals>
        <equals>
            <typeOf objectId="robot1.A5"/>
            <string value="undefined"/>
        </equals>
        <equals>
            <typeOf objectId="robot1.A6"/>
            <string value="undefined"/>
        </equals>
        <equals>
            <typeOf objectId="robot1.D1"/>
            <string value="undefined"/>
        </equals>
        <equals>
            <typeOf objectId="robot1.D2"/>
            <string value="undefined"/>
        </equals>
        <equals>
            <typeOf objectId="robot1.F1"/>
            <string value="undefined"/>
        </equals>
    </conditions>
</constraint>
```

**4**. Зададим ограничение на начальное положение робота. Оно проверится один раз в начале программы, потому что выставлен флаг `checkOnce` .

```markup
<constraint checkOnce="true" failMessage="Робот должен находиться в синем квадрате перед запуском!">
    <inside objectId="robot1" regionId="start_zone"/>
</constraint>
```

**5.** Зададим ограничение на зону, которую робот не может покидать. В предыдущих примерах мы рассматривали ситуацию, когда роботу нужно было находиться в одной зоне. В данном случае допустимая зона состоит из нескольких прямоугольников, поэтому нам нужно проверять, что робот находится в одной из этих зон. Для этого используем тег `<conditions></conditions>` с атрибутом `glue = “or”`.

```markup
<constraint failMessage="Робот покинул допустимую зону!">
    <conditions glue="or">
        <inside objectId="robot1" regionId="good_zone1"/>
        <inside objectId="robot1" regionId="good_zone2"/>
        <inside objectId="robot1" regionId="good_zone3"/>
    </conditions>
</constraint>
```

**6.** И наконец, создадим событие, которое будет оповещать об успешном выполнении программы в случае, если робот находится в зоне финиша.

```markup
<event id="finish checker" settedUpInitially="true">
    <condition>
        <inside objectId="robot1" regionId="finish"/>
    </condition>
    <trigger>
        <success/>
    </trigger>
</event>
```

### Пример 4. Подсчет перекрестков и вывод на экран <a href="#ex4" id="ex4"></a>

Движение по линии с подсчетом перекрестков: при заезде на перекресток робот должен выводить на экран номер этого перекрестка.

![](/files/-M8nczFE_P9qmkfsA4Dg)

Ниже приведен полный код для проверки этого задания.

```markup
<?xml version='1.0' encoding='utf-8'?>
<root version="20190819">
    <world>
        <walls/>
        <skittles/>
        <balls/>
        <colorFields>
            <cubicBezier id="{6199f811-617a-463d-848f-39b28b918584}" stroke-style="solid" fill-style="none" stroke="#ff000000" begin="-174.411:98.5051" cp1="-173.503:9.71619" stroke-width="12" cp2="-184.608:-31.2306" fill="#ff000000" end="-103.03:-28.2828"/>
            <line id="{311aba08-eff0-4d50-98f1-fc7595e22b79}" stroke-style="solid" fill-style="none" stroke="#ff000000" begin="-97.2997:-28.5387" stroke-width="12" fill="#ff000000" end="353.7:-28.5387"/>
            <line id="{e4428c3f-4ef1-4214-b5be-9a22eb4f875e}" stroke-style="solid" fill-style="none" stroke="#ff000000" begin="-175.556:244" stroke-width="12" fill="#ff000000" end="-175.556:106.222"/>
            <line id="{c921474d-3f18-4f98-b3fd-c83fa6e712b8}" stroke-style="solid" fill-style="none" stroke="#ff000000" begin="-202.02:102.353" stroke-width="12" fill="#ff000000" end="-149.459:102.353"/>
            <line id="{5f4000d6-8494-45bb-8e0c-44a5779f3140}" stroke-style="solid" fill-style="none" stroke="#ff000000" begin="-49.8316:-64.6465" stroke-width="12" fill="#ff000000" end="-49.8316:11.4478"/>
            <line id="{c20e8d67-e66b-4cd1-a4d5-da909d32717a}" stroke-style="solid" fill-style="none" stroke="#ff000000" begin="48.2829:-65.5219" stroke-width="12" fill="#ff000000" end="48.2829:10.5724"/>
            <line id="{3abe2138-f488-429d-bb27-94b6a13c913e}" stroke-style="solid" fill-style="none" stroke="#ff000000" begin="146.599:-64.8485" stroke-width="12" fill="#ff000000" end="146.599:11.2458"/>
            <line id="{ccaf1f51-b4b8-4ed4-9110-cf08067e7bf4}" stroke-style="solid" fill-style="none" stroke="#ff000000" begin="249.63:-65.5219" stroke-width="12" fill="#ff000000" end="249.63:10.5724"/>
            <line id="{6866e178-6a20-4048-8eab-ed3554098cd4}" stroke-style="solid" fill-style="none" stroke="#ff000000" begin="460.157:66.3198" stroke-width="12" fill="#ff000000" end="460.157:260.178"/>
            <cubicBezier id="{47001b3d-8af4-432d-8e66-9cc7728f2a39}" stroke-style="solid" fill-style="none" stroke="#ff000000" begin="358.194:-28.399" cp1="438.051:-29.9289" stroke-width="12" cp2="457.133:13.7415" fill="#ff000000" end="459.881:62.7527"/>
            <cubicBezier id="{edb3034d-f57c-4349-a714-3439433d2db2}" stroke-style="solid" fill-style="none" stroke="#ff000000" begin="458.622:252.499" cp1="457.591:441.101" stroke-width="12" cp2="251.469:440.071" fill="#ff000000" end="249.408:304.03"/>
            <cubicBezier id="{ff2677c7-98f1-46e0-b17c-197a3d94e664}" stroke-style="solid" fill-style="none" stroke="#ff000000" begin="249.408:304.03" cp1="251.469:155.622" stroke-width="12" cp2="-10.3061:151.5" fill="#ff000000" end="-9.27549:302.999"/>
            <cubicBezier id="{c841736a-ce7b-4bc4-90bb-7bb72bb7dd99}" stroke-style="solid" fill-style="none" stroke="#ff000000" begin="-9.27549:302.999" cp1="-9.02218:404.61" stroke-width="12" cp2="-177.667:378.931" fill="#ff000000" end="-175.204:250.438"/>
            <line id="{34475443-f1cf-4718-bb44-bd4bfc7221bf}" stroke-style="solid" fill-style="none" stroke="#ff000000" begin="428.351:105.655" stroke-width="12" fill="#ff000000" end="489.769:105.655"/>
            <line id="{9e883af6-6280-4577-b0da-608011ca26ed}" stroke-style="solid" fill-style="none" stroke="#ff000000" begin="428.197:199.401" stroke-width="12" fill="#ff000000" end="489.615:199.401"/>
        </colorFields>
        <images/>
        <regions>
            <region id="region_1" type="rectangle" textX="0" width="80" textY="0" visible="true" y="0" text="1" filled="true" height="80" color="#0000ff" x="-215"/>
            <region id="region_2" type="rectangle" textX="0" width="80" textY="0" visible="true" y="-70" text="2" filled="true" height="80" color="#0000ff" x="-40"/>
            <region id="region_3" type="rectangle" textX="0" width="80" textY="0" visible="true" y="-70" text="3" filled="true" height="80" color="#0000ff" x="55"/>
            <region id="region_4" type="rectangle" textX="0" width="80" textY="0" visible="true" y="-70" text="4" filled="true" height="80" color="#0000ff" x="160"/>
            <region id="region_5" type="rectangle" textX="0" width="80" textY="0" visible="true" y="-70" text="5" filled="true" height="80" color="#0000ff" x="260"/>
            <region id="region_6" type="rectangle" textX="0" width="80" textY="0" visible="true" y="110" text="6" filled="true" height="80" color="#0000ff" x="420"/>
            <region id="region_7" type="rectangle" textX="0" width="80" textY="0" visible="true" y="210" text="7" filled="true" height="80" color="#0000ff" x="420"/>
            <region id="start_zone" type="rectangle" textX="0" width="80" textY="0" visible="true" y="130" text="Старт" filled="true" height="80" color="#ff0000" x="-215"/>
        </regions>
    </world>
    <robots>
        <robot id="trikKitRobot" position="-199.667:149.444" direction="-90">
            <sensors>
                <sensor type="kitBase::robotModel::robotParts::Motor" port="M3###output###М3###" position="75:25" direction="0"/>
                <sensor type="" port="A1###input###JA1###sensorA1" position="0:0" direction="0"/>
                <sensor type="" port="A2###input###JA2###sensorA2" position="0:0" direction="0"/>
                <sensor type="" port="LineSensorPort###input###TrikLineSensorPort###lineSensor" position="0:0" direction="0"/>
                <sensor type="kitBase::robotModel::robotParts::EncoderSensor" port="E3###input###M3$$$Е3###encoder3" position="75:25" direction="0"/>
                <sensor type="kitBase::robotModel::robotParts::EncoderSensor" port="E4###input###M4$$$Е4###encoder4" position="75:25" direction="0"/>
                <sensor type="trik::robotModel::parts::TrikLightSensor" port="A5###input###А5###sensorA5" position="54:42" direction="0"/>
                <sensor type="trik::robotModel::parts::TrikLightSensor" port="A6###input###А6###sensorA6" position="54:8" direction="0"/>
                <sensor type="kitBase::robotModel::robotParts::Motor" port="M4###output###М4###" position="75:25" direction="0"/>
            </sensors>
            <startPosition id="{9f3c8967-8967-4a0d-a118-ba8041db8a37}" y="174.444" direction="-90" x="-174.667"/>
            <wheels left="M3###output###М3###" right="M4###output###М4###"/>
        </robot>
    </robots>
    <settings realisticMotors="false" realisticSensors="false" realisticPhysics="true"/>
    <constraints>
        <timelimit value="50000"/>
        <constraint failMessage="Робот должен находиться в зоне старта перед запуском!" checkOnce="true">
            <inside regionId="start_zone" objectId="robot1"/>
        </constraint>
        <event id="id_1" settedUpInitially="true">
            <conditions glue="and">
                <inside regionId="region_1" objectId="robot1"/>
                <equals>
                    <objectState object="robot1.display.labels.last.text"/>
                    <string value="1"/>
                </equals>
            </conditions>
            <trigger>
                <setUp id="id_2"/>
            </trigger>
        </event>
        <event id="id_1_fail" settedUpInitially="true">
            <conditions glue="and">
                <inside regionId="region_1" objectId="robot1"/>
                <notEqual>
                    <objectState object="robot1.display.labels.last.text"/>
                    <string value="1"/>
                </notEqual>
            </conditions>
            <trigger>
                <fail message="Неверный номер перекрестка! Обратите внимание, что номер перекрестка должен выводиться последней строчкой"/>
            </trigger>
        </event>
        <event id="id_2" settedUpInitially="false">
            <conditions glue="and">
                <inside regionId="region_2" objectId="robot1"/>
                <equals>
                    <objectState object="robot1.display.labels.last.text"/>
                    <string value="2"/>
                </equals>
            </conditions>
            <trigger>
                <setUp id="id_3"/>
            </trigger>
        </event>
        <event id="id_3" settedUpInitially="false">
            <conditions glue="and">
                <inside regionId="region_3" objectId="robot1"/>
                <equals>
                    <objectState object="robot1.display.labels.last.text"/>
                    <string value="3"/>
                </equals>
            </conditions>
            <trigger>
                <setUp id="id_4"/>
            </trigger>
        </event>
        <event id="id_4" settedUpInitially="false">
            <conditions glue="and">
                <inside regionId="region_4" objectId="robot1"/>
                <equals>
                    <objectState object="robot1.display.labels.last.text"/>
                    <string value="4"/>
                </equals>
            </conditions>
            <trigger>
                <setUp id="id_5"/>
            </trigger>
        </event>
        <event id="id_5" settedUpInitially="false">
            <conditions glue="and">
                <inside regionId="region_5" objectId="robot1"/>
                <equals>
                    <objectState object="robot1.display.labels.last.text"/>
                    <string value="5"/>
                </equals>
            </conditions>
            <trigger>
                <setUp id="id_6"/>
            </trigger>
        </event>
        <event id="id_6" settedUpInitially="false">
            <conditions glue="and">
                <inside regionId="region_6" objectId="robot1"/>
                <equals>
                    <objectState object="robot1.display.labels.last.text"/>
                    <string value="6"/>
                </equals>
            </conditions>
            <trigger>
                <setUp id="id_7"/>
            </trigger>
        </event>
        <event id="id_7" settedUpInitially="false">
            <conditions glue="and">
                <inside regionId="region_7" objectId="robot1"/>
                <equals>
                    <objectState object="robot1.display.labels.last.text"/>
                    <string value="7"/>
                </equals>
            </conditions>
            <trigger>
                <success/>
            </trigger>
        </event>
    </constraints>
</root>

```

Давайте рассмотрим то, как происходит проверка.

**1.** После каждого перекрестка зададим зоны, в которых будет проверяться, что на экран выведен правильный номер перекрестка. Для этого в xml-файле мира отредактируйте значение тега [\<regions>](/studio/2d-model/settings#less-than-region-greater-than), добавив туда необходимое количество зон для проверки.  Меняя значения `x`, `y`, `width` и `height` , вы можете редактировать местоположение и размер зон. Чтобы проверить положение зоны, загрузите файл в виртуальную модель мира и проверьте расположение зон. После этого, при необходимости, вы можете сделать зоны невидимыми, выставив атрибут `visible="false"`.&#x20;

```markup
<!-- Пример зоны -->
<region id="region_1" type="rectangle" textX="0" width="80" textY="0" visible="true" y="0" text="1" filled="true" height="80" color="#0000ff" x="-215"/>
```

**2.** После этого в блоке [\<constraints>](/studio/2d-model/restrictions#less-than-constraints-greater-than-less-than-constraints-greater-than) зададим проверку ограничений.  Первым укажем ограничение на время выполнения задания.

```markup
<timelimit value="50000"/>
```

**3.** Зададим ограничение на начальное положение робота.

```markup
<constraint failMessage="Робот должен находиться в зоне старта перед запуском!" checkOnce="true">
    <inside regionId="start_zone" objectId="robot1"/>
</constraint>
```

**4.** В каждой зоне, которая находится после перекрестка, будем проверять, что на экран выведен правильный номер. Для этого в теге [\<inside>](/studio/2d-model/restrictions#inside) укажем `id` нужного региона и проверим, что последнее выведенное сообщение на экран контроллера (`robot1.display.labels.last.text`) равно номеру пройденного перекрестка. После этого по цепочке будем вызывать аналогичные события для остальных зон.

```markup
<event id="id_1" settedUpInitially="true">
    <conditions glue="and">
        <inside regionId="region_1" objectId="robot1"/>
        <equals>
            <objectState object="robot1.display.labels.last.text"/>
            <string value="1"/>
        </equals>
    </conditions>
    <trigger>
        <setUp id="id_2"/>
    </trigger>
</event>
```

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

```markup
<event id="id_1_fail" settedUpInitially="true">
    <conditions glue="and">
        <inside regionId="region_1" objectId="robot1"/>
        <notEqual>
            <objectState object="robot1.display.labels.last.text"/>
            <string value="1"/>
        </notEqual>
    </conditions>
    <trigger>
        <fail message="Неверный номер перекрестка! Обратите внимание, что номер перекрестка должен выводиться последней строчкой"/>
    </trigger>
</event>
```

**6.** Зададим событие, которое будет выводить сообщение об успешном выполнении программы, если правильно пройдены все заданные перекрестки.

```markup
<event id="id_7" settedUpInitially="false">
    <conditions glue="and">
        <inside regionId="region_7" objectId="robot1"/>
        <equals>
            <objectState object="robot1.display.labels.last.text"/>
            <string value="7"/>
        </equals>
    </conditions>
    <trigger>
        <success/>
    </trigger>
</event>
```

### Пример 5. Кегельринг <a href="#ex5" id="ex5"></a>

Робот должен должен вытолкнуть все кегли за пределы круга.

![](/files/-M8nggkzCQH39M31hXWC)

Ниже приведен полный код для проверки этого задания.

```markup
<?xml version='1.0' encoding='utf-8'?>
<root version="20190819">
    <world>
        <walls/>
        <skittles>
            <skittle markerY="0.107756" y="0.107756" rotation="0" startRotation="0" id="{skittle1}" x="-90.3433" markerX="-90.3433"/>
            <skittle markerY="62.9765" y="62.9765" rotation="0" startRotation="0" id="{skittle2}" x="-63.8519" markerX="-63.8519"/>
            <skittle markerY="62.963" y="62.963" rotation="0" startRotation="0" id="{skittle3}" x="62.3031" markerX="62.3031"/>
            <skittle markerY="-89.2259" y="-89.2259" rotation="0" startRotation="0" id="{skittle4}" x="-0.323222" markerX="-0.323222"/>
            <skittle markerY="89.0101" y="89.0101" rotation="0" startRotation="0" id="{skittle5}" x="-1.45453" markerX="-1.45453"/>
            <skittle markerY="-1.44107" y="-1.44107" rotation="0" startRotation="0" id="{skittle6}" x="88.1212" markerX="88.1212"/>
            <skittle markerY="-63.1785" y="-63.1785" rotation="0" startRotation="0" id="{skittle7}" x="62.3031" markerX="62.3031"/>
            <skittle markerY="-64.7408" y="-64.7408" rotation="0" startRotation="0" id="{skittle8}" x="-63.8519" markerX="-63.8519"/>
        </skittles>
        <balls/>
        <colorFields/>
        <images>
            <image imageId="{ed8c2ee9-a500-4993-b874-611ba6b78853}" id="{d91a151a-4519-4646-89fd-395c863b5e77}" isBackground="false" rect="0:0:-6:-6" position="0:0"/>
            <image imageId="{9275be02-a681-4b9f-981e-56bcb9f17cee}" id="{8f470550-4bb5-4b34-b46e-c349d686bd9a}" isBackground="false" rect="0:0:-6:-6" position="0:0"/>
            <image imageId="{229679a6-12a5-44d0-97d9-99f132ded1e2}" id="{5dcb114e-03d4-493b-9849-daf4cd364a2a}" isBackground="false" rect="0:0:-6:-6" position="0:0"/>
            <image imageId="{27036474-ec49-423d-9f20-141d0c7d1044}" id="{ebb8366d-61c7-422f-9460-865851d1e0f1}" isBackground="false" rect="0:0:-6:-6" position="0:0"/>
            <image imageId="{69f0b63a-2937-4b12-bad7-2e240210db2e}" id="{f7bd0d83-ae88-46c8-bd9e-95fd3c32c174}" isBackground="false" rect="0:0:-6:-6" position="0:0"/>
            <image imageId="{80069e12-f4e6-4d56-8487-d8d4dd9e5ce2}" id="{1345cda3-f2e1-49b9-ae6b-35b4aa2eb850}" isBackground="false" rect="0:0:-6:-6" position="0:0"/>
            <image imageId="{7904d24c-5993-4013-80b5-bc899c0daabf}" id="{116c53b9-aa2c-4a16-bf8c-d291629c416f}" isBackground="false" rect="0:0:-4:-4" position="0:0"/>
            <image imageId="{742a7dc4-05a6-47c2-87fc-d04f1b3f0be4}" id="{9ee0c06d-b9c0-4da8-8227-98ffdc24f0be}" isBackground="false" rect="-200:-201:399:401" position="0:0"/>
        </images>
        <regions>
            <region type="ellipse" filled="true" textY="0" y="-150" visible="true" width="300" text="Ring" id="warzone" x="-150" height="300" textX="0" color="#ff0000"/>
        </regions>
    </world>
    <robots>
        <robot direction="0" id="trikKitRobot" position="-25:-24.4321">
            <sensors>
                <sensor type="kitBase::robotModel::robotParts::EncoderSensor" direction="0" port="E1###input###M1$$$Е1###encoder1" position="75:25"/>
                <sensor type="trik::robotModel::parts::TrikLightSensor" direction="0" port="A5###input###А5###sensorA5" position="50:25"/>
                <sensor type="kitBase::robotModel::robotParts::EncoderSensor" direction="0" port="E2###input###M2$$$Е2###encoder2" position="75:25"/>
                <sensor type="trik::robotModel::parts::TrikLightSensor" direction="0" port="A3###input###А3###sensorA3" position="56:43"/>
                <sensor type="kitBase::robotModel::robotParts::Motor" direction="0" port="M2###output###М2###" position="75:25"/>
                <sensor type="trik::robotModel::parts::TrikInfraredSensor" direction="0" port="A1###input###А1###sensorA1" position="22:25"/>
                <sensor type="kitBase::robotModel::robotParts::Motor" direction="0" port="M1###output###М1###" position="75:25"/>
                <sensor type="kitBase::robotModel::robotParts::Motor" direction="0" port="M4###output###М4###" position="75:25"/>
                <sensor type="trik::robotModel::parts::TrikLightSensor" direction="0" port="A2###input###А2###sensorA2" position="56:5"/>
                <sensor type="kitBase::robotModel::robotParts::Motor" direction="0" port="M3###output###М3###" position="75:25"/>
                <sensor type="kitBase::robotModel::robotParts::EncoderSensor" direction="0" port="E3###input###M3$$$Е3###encoder3" position="75:25"/>
                <sensor type="kitBase::robotModel::robotParts::EncoderSensor" direction="0" port="E4###input###M4$$$Е4###encoder4" position="75:25"/>
            </sensors>
            <startPosition y="0.567901" direction="0" id="{2b1161e8-ba72-40ed-bf22-be49c2ab4cb9}" x="0"/>
            <wheels left="M4###output###М4###" right="M3###output###М3###"/>
        </robot>
    </robots>
    <settings realisticSensors="false" realisticPhysics="true" realisticMotors="false"/>
    <constraints>
        <timelimit value="60000"/>
        <constraint failMessage="Робот должен находиться в круге перед запуском!" checkOnce="true">
            <inside objectId="robot1" regionId="warzone"/>
        </constraint>
        <event settedUpInitially="true">
            <condition>
                <timer forceDropOnTimeout="true" timeout="100"/>
            </condition>
            <trigger>
                <setUp id="finish checker"/>
            </trigger>
        </event>
        <event id="finish checker" settedUpInitially="false">
            <conditions glue="and">
                <not>
                    <inside objectId="{skittle1}" regionId="warzone"/>
                </not>
                <not>
                    <inside objectId="{skittle2}" regionId="warzone"/>
                </not>
                <not>
                    <inside objectId="{skittle3}" regionId="warzone"/>
                </not>
                <not>
                    <inside objectId="{skittle4}" regionId="warzone"/>
                </not>
                <not>
                    <inside objectId="{skittle5}" regionId="warzone"/>
                </not>
                <not>
                    <inside objectId="{skittle6}" regionId="warzone"/>
                </not>
                <not>
                    <inside objectId="{skittle7}" regionId="warzone"/>
                </not>
                <not>
                    <inside objectId="{skittle8}" regionId="warzone"/>
                </not>
            </conditions>
            <trigger>
                <success/>
            </trigger>
        </event>
    </constraints>
</root>
```

Теперь разберем подробнее, как происходит проверка.

**1.** Отредактируем xml-файл мира, добавив в тег [\<regions>](/studio/2d-model/settings#less-than-region-greater-than)  зону круга.

```markup
<region type="ellipse" filled="true" textY="0" y="-150" visible="true" width="300" text="Ring" id="warzone" x="-150" height="300" textX="0" color="#ff0000"/>
```

![](/files/-M8nhdk5GcFRtBHixksN)

**2.** Зададим ограничение на время выполнения задания.

```markup
<timelimit value="60000"/>
```

**3.** Зададим ограничение на начальное положение робота.

```markup
<constraint failMessage="Робот должен находиться в круге перед запуском!" checkOnce="true">
    <inside objectId="robot1" regionId="warzone"/>
</constraint>
```

**4.** Зададим событие, которое проверяет, что все кегли находятся за пределами круга, и после этого выводит сообщение об успешном выполнении программы.

```markup
<event id="finish checker" settedUpInitially="false">
    <conditions glue="and">
        <not>
            <inside objectId="{skittle1}" regionId="warzone"/>
        </not>
        <not>
            <inside objectId="{skittle2}" regionId="warzone"/>
        </not>
        <not>
            <inside objectId="{skittle3}" regionId="warzone"/>
        </not>
        <not>
            <inside objectId="{skittle4}" regionId="warzone"/>
        </not>
        <not>
            <inside objectId="{skittle5}" regionId="warzone"/>
        </not>
        <not>
            <inside objectId="{skittle6}" regionId="warzone"/>
        </not>
        <not>
            <inside objectId="{skittle7}" regionId="warzone"/>
        </not>
        <not>
            <inside objectId="{skittle8}" regionId="warzone"/>
        </not>
    </conditions>
    <trigger>
        <success/>
    </trigger>
</event>
```

### Пример 6. Проверка поведения робота <a href="#ex4" id="ex4"></a>

В начальном положении робот должен находиться в стартовой зоне на расстоянии от стены, к порту А1 должен быть подключен датчик касания. Успешным прохождением считается то, где робот подъедет к стене, коснется ее датчиком касания, отъедет от нее и так 5 раз.

![](/files/-M7oG_-DJ5OSNwcMm93K)

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

Ниже приведен полный код для проверки этого задания.

```markup
<?xml version='1.0' encoding='utf-8'?>
<root version="20190819">
    <world>
        <walls>
            <wall fill="#ff000000" stroke-width="0" stroke="#ff000000" begin="-68:-204" id="{6f8bd6be-2983-4b0b-bbf8-5a26d1ed1ef7}" end="-68:77" stroke-style="none"/>
        </walls>
        <skittles/>
        <balls/>
        <colorFields/>
        <images/>
        <regions>
            <region x="-270" textY="0" y="-110" text="Стартовое поле" id="start_zone" color="#0000ff" filled="true" width="80" visible="true" textX="0" type="rectangle" height="80"/>
            <region x="-280" textY="0" y="-230" text="Поле, которое нельзя покидать" id="warzone" color="#ffff00" filled="true" width="210" visible="false" textX="0" type="rectangle" height="285"/>
        </regions>
    </world>
    <robots>
        <robot position="-256:-103" id="trikKitRobot" direction="0">
            <sensors>
                <sensor port="A5###input###А5###sensorA5" position="0:0" type="" direction="0"/>
                <sensor port="M3###output###М3###" position="75:25" type="kitBase::robotModel::robotParts::Motor" direction="0"/>
                <sensor port="M4###output###М4###" position="75:25" type="kitBase::robotModel::robotParts::Motor" direction="0"/>
                <sensor port="A1###input###А1###sensorA1" position="75:25" type="trik::robotModel::parts::TrikTouchSensor" direction="0"/>
            </sensors>
            <startPosition x="-231" y="-78" id="{99807fe9-54b1-42d7-991b-2b9cf102abe7}" direction="0"/>
            <wheels left="M4###output###М4###" right="M3###output###М3###"/>
        </robot>
    </robots>
    <settings realisticPhysics="false" realisticMotors="false" realisticSensors="false"/>
    <constraints>
        <!-- Ограничение на временя в 30 секунд -->
        <timelimit value="300000"/>
        <!-- Проверка, что на порту А1 установлен датчик касания -->
        <constraint checkOnce="true" failMessage="На порту А1 должен быть выставлен датчик касания">
            <equals>
                <typeof objectId="robot1.А1"/>
                <string value="twoDModel::robotModel::parts::TouchSensor"/>
            </equals>
        </constraint>
        <!-- Провека, что нет датчиков, кроме датчика касания на порту А1 -->
        <constraint checkOnce="true" failMessage="У робота не должно быть датчиков, кроме датчика касания на порту А1">
            <conditions glue="and">
                <equals>
                    <typeOf objectId="robot1.A2"/>
                    <string value="undefined"/>
                </equals>
                <equals>
                    <typeOf objectId="robot1.A3"/>
                    <string value="undefined"/>
                </equals>
                <equals>
                    <typeOf objectId="robot1.A4"/>
                    <string value="undefined"/>
                </equals>
                <equals>
                    <typeOf objectId="robot1.A5"/>
                    <string value="undefined"/>
                </equals>
                <equals>
                    <typeOf objectId="robot1.A6"/>
                    <string value="undefined"/>
                </equals>
                <equals>
                    <typeOf objectId="robot1.D1"/>
                    <string value="undefined"/>
                </equals>
                <equals>
                    <typeOf objectId="robot1.D2"/>
                    <string value="undefined"/>
                </equals>
                <equals>
                    <typeOf objectId="robot1.F1"/>
                    <string value="undefined"/>
                </equals>
            </conditions>
        </constraint>
        <!-- Проверка, что в течении времени выполнения программы робот находится в допустимой зоне -->
        <constraint failMessage="Робот покинул допустимую зону!">
            <inside objectId="robot1" regionId="warzone"/>
        </constraint>
		
		    <!-- Событие, которое говорит о том, что робот поехал и стартует цепочку проверки -->
        <event id="First move" settedUpInitially="true">
            <condition>
                <greater>
                    <objectState object="robot1.M3.power"/>
                    <int value="0"/>
                </greater>
            </condition>
            <triggers>
                <setUp id="Touching wall"/>
                <setter name="counter">
                    <int value="0"/>
                </setter>
            </triggers>
        </event>

        <!-- Событие, которое выдает ошибку, если робот не тронулся с места в первую секунду -->
        <event id="Waiting for going forward too long" settedUpInitially="true">
            <conditions glue="and">
                <timer timeout="1000" forceDropOnTimeout="true"/>
                <settedUp id="First move"/>
            </conditions>
            <trigger>
                <fail message="Робот так и не поехал в первую секунду"/>
            </trigger>
        </event>

        <!-- Событие, которое проверяет, что робот подъехал к стене (сработал датчик касания) и взводит второе -->
        <event id="Touching wall">
            <condition>
                <equals>
                    <objectState object="robot1.A1.value"/>
                    <int value="1"/>
                </equals>
            </condition>
            <trigger>
                <setUp id="Returned back"/>
            </trigger>
        </event>

        <!-- Событие, которое проверяет, что робот вернулся назад, инкрементирует счетчик итераций и снова взводит первое -->
        <event id="Returned back">
            <condition>
                <inside objectId="robot1" regionId="start_zone"/>
            </condition>
            <triggers>
                <setUp id="Touching wall"/>
                <setUp id="Done?"/>
                <setter name="counter">
                    <sum>
                        <variableValue name="counter"/>
                        <int value="1"/>
                    </sum>
                </setter>
            </triggers>
        </event>

        <!-- Событие, которое проверяет, что количество итераций дошло до 5 и, таким образом, задание выполнено -->
        <event id="Done?">
            <condition>
                <notLess>
                    <variableValue name="counter"/>
                    <int value="5"/>
                </notLess>
            </condition>
            <trigger>
                <success/>
            </trigger>
        </event>
    </constraints>
</root>

```

Теперь давайте рассмотрим подробнее, как происходит проверка.

**1.** Зададим ограничение на время выполнения задания.

```markup
<timelimit value="40000"/>
```

**2.** По условию задачи у робота должен быть подключен только датчик касания (других датчиков быть не должно). Для того чтобы убедиться в этом, сравним значение объекта на порту `A1` со значением, которое обозначает датчик касания. Подробнее о названиях датчиков для разных конструкторов можно узнать по [ссылке](/studio/2d-model/restrictions#nazvaniya-datchikov).

```markup
<constraint checkOnce="true" failMessage="На порту А1 должен быть выставлен датчик касания">
    <equals>
        <typeof objectId="robot1.А1"/>
        <string value="twoDModel::robotModel::parts::TouchSensor"/>
    </equals>
</constraint>
```

**3.** Выполним проверку, что к другим портам не подключены никакие датчики. Для этого сравним значение на каждом порту со строкой `“undefined”`.

```markup
<constraint checkOnce="true" failMessage="У робота не должно быть датчиков, кроме датчика касания">
    <conditions glue="and">
        <equals>
            <typeOf objectId="robot1.A2"/>
            <string value="undefined"/>
        </equals>
        <equals>
            <typeOf objectId="robot1.A3"/>
            <string value="undefined"/>
        </equals>
        <equals>
            <typeOf objectId="robot1.A4"/>
            <string value="undefined"/>
        </equals>
        <equals>
            <typeOf objectId="robot1.A5"/>
            <string value="undefined"/>
        </equals>
        <equals>
            <typeOf objectId="robot1.A6"/>
            <string value="undefined"/>
        </equals>
        <equals>
            <typeOf objectId="robot1.D1"/>
            <string value="undefined"/>
        </equals>
        <equals>
            <typeOf objectId="robot1.D2"/>
            <string value="undefined"/>
        </equals>
        <equals>
            <typeOf objectId="robot1.F1"/>
            <string value="undefined"/>
        </equals>
    </conditions>
</constraint>
```

**4**. Зададим ограничение на зону, которую робот не может покидать.

```markup
<constraint failMessage="Робот покинул допустимую зону!">
    <inside objectId="robot1" regionId="warzone"/>
</constraint>
```

**5.** Зададим событие, которое проверяет, что робот начал двигаться вперед. В качестве условия укажем, что мощность, которая подана на мотор на порту М3, должна быть больше нуля. В том случае, если это условие выполняется, срабатывает два триггера. Первый запускает (взводит) событие с `id = "Touching wall"`, а второй присваивает переменной `counter` значение ноль.

Так как у атрибута `settedUpInitially` установлено значение `true`, то событие будет запущено (взведено) сразу при старте программы.

```markup
<event id="First move" settedUpInitially="true">
    <condition>
        <greater>
            <objectState object="robot1.M3.power"/>
            <int value="0"/>
        </greater>
    </condition>
    <triggers>
        <setUp id="Touching wall"/>
        <setter name="counter">
            <int value="0"/>
        </setter>
    </triggers>
</event>
```

**6.** Зададим событие, которое будет показывать ошибку в случае, если спустя `1000мс(=1сек)` после начала выполнения программы робот так и не начал движение вперед (т.е событие с `id=”First move”` всё ещё находится во взведенном состоянии и не было выполнено).  Т.к. в данном событии проверяется выполнение сразу нескольких условий, то используется тег [\<conditions>\</conditions>](/studio/2d-model/restrictions#less-than-conditions-greater-than-less-than-conditions-greater-than) с указанием логической связки.

```markup
<event id="Waiting for going forward too long" settedUpInitially="true">
    <conditions glue="and">
        <timer timeout="1000" forceDropOnTimeout="true"/>
        <settedUp id="First move"/>
    </conditions>
    <trigger>
        <fail message="Робот так и не поехал в первую секунду"/>
    </trigger>
</event>
```

**7.** Зададим событие, которое проверяет, что робот проехал до стены. В условии проверяется, что значение датчика касания, расположенного на порту A1, равно единице ( это означает, что сработал датчик касания). При выполнении этого условия срабатывает триггер и запускается (взводится) событие с `id="Returned back"`.

```markup
<event id="Touching wall">
    <condition>
        <equals>
            <objectState object="robot1.A1.value"/>
            <int value="1"/>
        </equals>
    </condition>
    <trigger>
        <setUp id="Returned back"/>
    </trigger>
</event>
```

**8.** Зададим событие, которое проверяет, что робот вернулся в зону старта после касания стены. Для этого необходимо задать условие `inside` с атрибутами `objectId="robot1"` (наш робот) и `regionId="start_zone"` (зона, в которую нужно вернуться).

При выполнении этого условия взводятся два события и инкрементируется счетчик итераций.. Первое событие проверяет, что робот коснулся стены, второе проверяет было ли выполнено условие задачи.

```markup
<!-- Событие, которое проверяет, что робот вернулся назад, инкрементирует счетчик итераций и снова взводит первое -->
<event id="Returned back">
    <condition>
        <inside objectId="robot1" regionId="start_zone"/>
    </condition>
    <triggers>
        <setUp id="Touching wall"/>
        <setUp id="Done?"/>
        <setter name="counter">
            <sum>
                <variableValue name="counter"/>
                <int value="1"/>
            </sum>
        </setter>
    </triggers>
</event>
```

**9.** Зададим событие, которое будет выводить сообщение об успешном выполнении программы, если значение переменной `counter` не меньше, чем 5.&#x20;

```markup
<event id="Done?">
    <condition>
        <notLess>
            <variableValue name="counter"/>
            <int value="5"/>
        </notLess>
    </condition>
    <trigger>
        <success/>
    </trigger>
</event>
```


# Программирование на визуальном языке

Программа в TRIK Studio представляется в виде последовательности [блоков](/studio/programming-visual/blocks), соединённых [связями](/studio/programming-visual/connection-between-blocks).&#x20;

![](/files/-M2EJRIzEgXCEoYrGcEZ)

Каждой программе соответствует [главная диаграмма](/studio/programming-visual#main-diagramm), которая может содержать [другие диаграммы (подпрограммы)](/studio/programming-visual#podprogrammy). Диаграммы упаковываются в проекты, хранящиеся на диске.

![](/files/-M2EKET3jlKMjZ6Y3O61)

## Главная диаграмма <a href="#main-diagramm" id="main-diagramm"></a>

Главная диаграмма создаётся при [создании проекта](/studio/start#new-project). Про добавление и удаление блоков на [сцену](/studio/interface#editor-window-1) читайте в статье:

{% content-ref url="/pages/-M2Cg4NSr84OpQjA\_hVf" %}
[Добавление и удаление блоков](/studio/programming-visual/blocks-add-delete)
{% endcontent-ref %}

## Подпрограммы

Диаграммы с подпрограммами создаются автоматически при добавлении блока [«Подпрограмма»](/studio/programming-visual/blocks#subprogram) на сцену. При этом отображение подпрограммы происходит при двойном клике на блок «Подпрограмма» на сцене.

![](/files/-M2ELFCCXgElMe0ezDM7)

Подробнее о подпрограммах читайте в статье:

{% content-ref url="/pages/-M0P0uMo74LbuO5OSe3E" %}
[Подпрограммы](/studio/programming-visual/subprograms)
{% endcontent-ref %}


# Добавление и удаление блоков

## Добавление блоков на сцену

Блоки на [сцену](/studio/interface#editor-window-1) в TRIK Studio можно добавить тремя способами:

1. [Перетаскиванием](/studio/programming-visual/blocks-add-delete#dropanddown) соответствующих иконок из палитры элементов на диаграмму.
2. [Жестом мыши](/studio/programming-visual/blocks-add-delete#mouse-gesture).
3. [При создании новой связи](/studio/programming-visual/blocks-add-delete#connection) между блоками с помощью линкеров.

### Добавление блоков перетаскиванием из «Палитры» <a href="#dropanddown" id="dropanddown"></a>

Кликнете левой кнопкой мыши на необходимый блок, расположенный на панели [«Палитра»](/studio/interface#panel-palette). Не отпуская кнопку мыши, передвиньте блок на сцену.

![](/files/-M2J9eNX0cpEekI5OEAj)

### Добавление блоков жестами мыши <a href="#mouse-gesture" id="mouse-gesture"></a>

Нарисуйте на сцене условное изображение блока левой кнопкой мыши. Блок появится в центре нарисованного изображения.

Жесты можно рисовать несколькими штрихами. Ввод жеста заканчивается, если штрихи некоторое время не рисовали (настроить время можно в окне настроек на вкладке [«Поведение»](/studio/settings#behavior)).

![](/files/-M2JABxHB_DKPUIZJPk0)

\
Доступные условные изображения можно посмотреть двумя способами:

1\. В окне «Жесты мышью», открывающемся через главное меню `Инструменты → Жесты мышью`.

![Окно «Жесты мышью»](/files/-M2JAsuwuyMuSvpqUHXx)

2\. Во всплывающей подсказке, появляющейся при наведении курсора мыши на блок на панели «Палитра».

![Появляющаяся подсказка при наведении на блок](/files/-M2JAUzHky-xGWPNjv2B)

### Добавление блоков при создании связи <a href="#connection" id="connection"></a>

1. Начните [создавать связь с помощью линкера](/studio/programming-visual/connection-between-blocks#linker) (цветного кружка справа от блока, появляющегося после выделения блока) и отпустите левую клавишу мыши, когда курсор будет находится на пустом участке диаграммы.
2. В появившемся меню выберите пункт «Создать новый элемент». Появится новое меню с блоками.
3. Выберите нужный блок.

![Добавление блока с помощью новой связи](/files/-M2JCqG3DiJSLnix0mA_)

## Удаление блоков <a href="#del" id="del"></a>

Удаление добавленного блока возможно двумя способами:

1. Выделите блок левой кнопкой мыши и затем нажмите кнопку «Delete».
2. Нажмите на блок правой кнопкой мыши и в появившемся меню выберите «Удалить».

![](/files/-M2JE752lSwe5RrUpiVx)

### Удаление нескольких блоков

1\. Выберите необходимые блоки одним из способов.

1.1. Зажмите кнопку «Ctrl» и выделите правой кнопкой мыши необходимые блоки.

![](/files/-M2JH6am65b-WxPSLZkD)

1.2. Правой кнопкой мыши выделите область на сцене с необходимыми блоками.

![](/files/-M2JH9hPjrAhFmK2M8q_)

2\. Удалите выбранные блоки одним из способов.

2.1. Нажмите кнопку «Delete» на клавиатуре.

2.2. Нажмите правой клавишей мыши на любой выделенный блок и выберите в появившемся меню пункт «Удалить».

![](/files/-M2JGAavczoWdghr6K8M)

## Замена блоков <a href="#exchange" id="exchange"></a>

Для замены добавленного блока:

1\. Нажмите на блок правой кнопкой мыши и в появившемся меню выберите «Заменить на…».

![](https://thumb.tildacdn.com/tild3839-3561-4261-b561-613230353832/-/resize/316x/-/format/webp/2019-08-06_18-14-48.png)

2\. Выберите из списка блок, которым хотите заменить выделенный.

![Замена блока](/files/-M2JFBQ5-0MKzyqsKW4J)


# Общие блоки

Список доступных блоков зависит от выбранной платформы и от модели робота (реальный робот или [двумерная модель](/studio/2d-model)). При этом недоступные для данной платформы блоки не показываются вообще, а недоступные для данной модели в рамках одной платформы блоки показываются в [палитре](/studio/interface#panel-palette) серым и недоступны для перетаскивания на [сцену](/studio/interface#editor-window-1).

![Недоступные блоки для 2D-модели выделены серым](/files/-M4sFuOW8LK27QM9paFd)

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

Список блоков, специфичных для конкретного конструктора, можно найти в соответствующих разделах:

* [ТРИК](/trik/programming-visual/blocks)
* [LEGO EV3](/ev3/blocks)
* [LEGO NXT](/nxt/blocks)
* [Квадрокоптер Геоскан Пионер](/pioneer/blocks)

## Все общие блоки

|                                                                                             Вид                                                                                            |                                  Название                                  | Описание                                                                                                                                                                                                                                                                                            |
| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------: | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| ![](https://gblobscdn.gitbook.com/assets%2F-M-9YMGCK0ySSnTAiseS%2F-M4siuJqdaQ-i-x_2pCT%2F-M4soizl8q-7pvnHEsmN%2FinitialBlock_50.png?alt=media\&token=c1fd4b99-84cd-4f2f-a78d-4cb718f8dbe0) |             [Начало](/studio/programming-visual/blocks#initial)            | <p>Начальная точка выполнения программы.</p><p></p><p>На каждой диаграмме должен быть только один такой блок. В него не должно быть входящих связей, а исходящая связь из этого элемента должна быть только одна.</p><p></p><p>Процесс интерпретации диаграммы начинается именно с этого блока.</p> |
|                                                             <img src="/files/-M52AW4J4S3FdvyaSaQw" alt="" data-size="original">                                                            |              [Конец](/studio/programming-visual/blocks#final)              | <p>Конец программы.</p><p></p><p>Если программа состоит из нескольких параллельных участков выполнения, достижение этого блока завершает соответствующий участок выполнения.</p><p></p><p>У данного блока не может быть исходящих связей.</p>                                                       |
|                                                             <img src="/files/-M4sbcwdOi_s0Icqm-DE" alt="" data-size="original">                                                            | [Инициализация переменной](/studio/programming-visual/blocks#variableinit) | Блок для объявления новой переменной и задания ей значения.                                                                                                                                                                                                                                         |
|                                                             <img src="/files/-M52MMMDTWsMLGG3yp_z" alt="" data-size="original">                                                            |           [Условие](/studio/programming-visual/blocks#condition)           | Разделение выполнения программы в соответствии с заданным условием.                                                                                                                                                                                                                                 |
|                                                             <img src="/files/-M52CZNktjFbwTxIAxPU" alt="" data-size="original">                                                            |          [Конец условия](/studio/programming-visual/blocks#endif)          | Обозначает слияние двух веток условного оператора. Никаких действий не выполняет, но полезен для обеспечения структурности программы.                                                                                                                                                               |
|                                                             <img src="/files/-M56Xm638UU1wpYYLTLo" alt="" data-size="original">                                                            |       [Цикл с предусловием](/studio/programming-visual/blocks#while)       | Цикл, который выполняется пока истинно некоторое условие, указанное перед его началом. Это условие проверяется до выполнения тела цикла, поэтому тело может быть не выполнено ни разу (если условие с самого начала ложно).                                                                         |
|                                                             <img src="/files/-M52DOdwx_5fS_9MgKaU" alt="" data-size="original">                                                            |               [Цикл](/studio/programming-visual/blocks#loop)               | Блок, организующий выполнение последовательности блоков несколько раз.                                                                                                                                                                                                                              |
|                                                             <img src="/files/-M52DGNx7GI807kR0tVy" alt="" data-size="original">                                                            |              [Выбор](/studio/programming-visual/blocks#switch)             | Условие с несколькими альтернативами.                                                                                                                                                                                                                                                               |
|                                                             <img src="/files/-M52DSe3uI0AOTgYRkOR" alt="" data-size="original">                                                            |          [Выражение](/studio/programming-visual/blocks#expression)         | Считает значение заданного выражения. Также допускается инициализация переменных.                                                                                                                                                                                                                   |
|                                                             <img src="/files/-M52DXqvZTRL24H_ebQ1" alt="" data-size="original">                                                            |        [Подпрограмма](/studio/programming-visual/blocks#subprogram)        | Вызов подпрограммы.                                                                                                                                                                                                                                                                                 |
|                                                             <img src="/files/-M52DeDyKfJZ4tC9_teH" alt="" data-size="original">                                                            |        [Параллельные задачи](/studio/programming-visual/blocks#fork)       | Блок разделяет выполнение программы на несколько потоков.                                                                                                                                                                                                                                           |
|                                                             <img src="/files/-M52DhSkZBEzCnc-c1_M" alt="" data-size="original">                                                            |           [Слияние задач](/studio/programming-visual/blocks#join)          | Блок слияния параллельных задач.                                                                                                                                                                                                                                                                    |
|                                                             <img src="/files/-M52Dk3JQqG1nDK_lrE4" alt="" data-size="original">                                                            |      [Завершить задачу](/studio/programming-visual/blocks#killthread)      | Завершает задачу с указанным в свойстве «Задача» идентификатором. Должен применяться из другой задачи.                                                                                                                                                                                              |
|                                                             <img src="/files/-M52DojWoIM6b9rpHTqd" alt="" data-size="original">                                                            |         [Случайное число](/studio/programming-visual/blocks#random)        | Блок для присвоения указанной переменной случайного целого числа из заданного промежутка.                                                                                                                                                                                                           |
|                                                             <img src="/files/-M52DryFvsimyiA6uzxd" alt="" data-size="original">                                                            |          [Комментарий](/studio/programming-visual/blocks#comment)          | Блок для добавления на диаграмму произвольного текста в качестве комментария.                                                                                                                                                                                                                       |
|                                                             <img src="/files/-M52DuigeGV1EK8nyKWK" alt="" data-size="original">                                                            |              [Таймер](/studio/programming-visual/blocks#timer)             | Блок для задания задержки. Устанавливается время задержки в параметре «Задержка» в миллисекундах.                                                                                                                                                                                                   |
|                                                             <img src="/files/-M52DxVJLFYL1Ctlh0tw" alt="" data-size="original">                                                            |       [Опустить маркер](/studio/programming-visual/blocks#markerdown)      | Начать рисование маркером заданного цвета на полу. При движении робота в двумерной модели за ним будет оставаться цветная линия.                                                                                                                                                                    |
|                                                             <img src="/files/-M52DzUtqMNkpm5w20WK" alt="" data-size="original">                                                            |        [Поднять маркер](/studio/programming-visual/blocks#markerup)        | Закончить рисование маркером.                                                                                                                                                                                                                                                                       |

## Начало <a href="#initial" id="initial"></a>

<div align="center"><img src="/files/-M4sGhTqlIwe1aBl6wOh" alt="Начало"></div>

Начальная точка выполнения программы.

На каждой диаграмме должен быть только один такой блок. В него не должно быть входящих связей, а исходящая связь из этого элемента должна быть только одна.

Процесс интерпретации диаграммы начинается именно с этого блока.

## Конец <a href="#final" id="final"></a>

![Конец](/files/-M524lBgOTGyNt9mtV2F)

Конец программы.

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

У данного блока не может быть исходящих связей.

## Инициализация переменной <a href="#variableinit" id="variableinit"></a>

<div align="center"><img src="/files/-M4sTKMESJo-_Y-K5ihw" alt="Инициализация переменной"></div>

Блок для объявления новой переменной и задания ей значения. Этого же можно добиться с помощью блока «[Выражение](/studio/programming-visual/blocks#expression)», но этот блок делает программу понятнее.

#### Свойства

| Свойство       | Описание                                                           |
| -------------- | ------------------------------------------------------------------ |
| **Значение**   | Указывается выражение, определяющее начальное значение переменной. |
| **Переменная** | Указывается имя переменной.                                        |

## Условие <a href="#condition" id="condition"></a>

![Условие](/files/-M52GkOK1oWsfAXMdhud)

Разделение выполнения программы в соответствии с заданным условием.

У данного блока должны быть две исходящие связи, у хотя бы одной из которых должно быть задано значение параметра «Условие»: «истина» или «ложь».

#### Свойства

| Свойство    | Описание                                                                                                                                                                                                                    |
| ----------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Условие** | Указывается логическое выражение (подробнее см. в статье «[Синтаксис выражений](/studio/programming-visual/expression-syntax)»), на основе значения которого будет осуществлен выбор дальнейшего пути выполнения диаграммы. |

## Конец условия <a href="#endif" id="endif"></a>

![Конец условия](/files/-M52KB8mgduTmYlRxiRx)

Обозначает слияние двух веток условного оператора.\
\
Никаких действий не выполняет, но полезен для обеспечения структурности программы. Если придерживаться правила, что все ветки операторов «[Условие](/studio/programming-visual/blocks#condition)» или «[Выбор](/studio/programming-visual/blocks#switch)» сходятся на таком блоке, это существенно повысит шансы на то, что генератор сможет породить код на текстовом языке без операторов `goto`.

## Цикл с предусловием <a href="#while" id="while"></a>

![Цикл с предусловием](/files/-M56XvGyWTEuEwuTe1B-)

Цикл с предусловием — цикл, который выполняется пока истинно некоторое условие, указанное перед его началом. Это условие проверяется до выполнения тела цикла, поэтому тело может быть не выполнено ни разу (если условие с самого начала ложно).

#### Свойства

| Свойство    | Описание                                                                                                                                                                                                                    |
| ----------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Условие** | Указывается логическое выражение (подробнее см. в статье «[Синтаксис выражений](/studio/programming-visual/expression-syntax)»), на основе значения которого будет осуществлен выбор дальнейшего пути выполнения диаграммы. |

## Цикл <a href="#loop" id="loop"></a>

![Цикл](/files/-M52KXNX1QV8AQO9p6NP)

Блок, организующий выполнение последовательности блоков несколько раз.\
\
Число повторений задается значением параметра «Итерации». Блок должен иметь две исходящие связи, одна из которых должна быть помечена значением «тело цикла» (то есть значение параметра «Условие» у связи должно быть «тело цикла»). Другая связь, исходящая из блока «Цикл», должна оставаться непомеченной: по ней будет осуществляться переход, когда программа пройдет через блок «Цикл» указанное число раз.\
\
Бесконечные циклы и циклы вида `while/do` и `while` организуются без использования этого блока, зацикливанием потока управления с помощью связей. Выход из такого цикла осуществляется с помощью блока «[Условие](/studio/programming-visual/blocks#condition)».

## Выбор <a href="#switch" id="switch"></a>

![Выбор](/files/-M52KnJEFnfXE5uUu7JO)

Условие с несколькими альтернативами.\
\
В параметре «Выражение» можно указать произвольное выражение (подробнее см. в разделе «[Синтаксис выражений](/studio/programming-visual/expression-syntax)»), на основе значения которого будет осуществлен выбор дальнейшего пути выполнения диаграммы.\
\
У данного блока должны быть несколько исходящих связей. Все связи, кроме одной, должны быть помечены элементарным значением (строка, число и др.), которое может принимать выражение (значение просто пишется в свойство «Условие» у связи). Одна из связей должна быть не помечена: по ней осуществляется переход, если выражение не равно ни одному из перечисленных значений.

## Выражение <a href="#expression" id="expression"></a>

![Выражение](/files/-M52KsPo2p59kJNESCHb)

Считает значение заданного выражения. Также допускается инициализация переменных.\
\
Подробнее про синтаксис допустимых выражений параметра «Выражение» см. в разделе «[Синтаксис выражений](/studio/programming-visual/expression-syntax)».

## Подпрограмма <a href="#subprogram" id="subprogram"></a>

![Подпрограмма](/files/-M52L-mm_iShMyQud3XN)

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

#### Свойства

Изменение свойств у данного блока происходит не на панели «Редактор свойств», а с помощью пункта «Изменить свойства» в контекстном меню. Для вызова контекстного меню нажмите правой кнопкой мыши на блок «Подпрограмма».

![](/files/-M52oxM5_WQcSylPjaTA)

В открывшемся окне вы можете:

* Изменить имя подпрограммы.
* Добавить и изменить параметры подпрограммы, задав имя, тип и значение.
* Изменить картинку на иконке вашей подпрограммы.
* Изменить фон иконки подпрограммы.

![](/files/-M52p7BrXt1lx1OfmdrG)

## Параллельные задачи <a href="#fork" id="fork"></a>

![Параллельные задачи](/files/-M52LDQmY_RasNqVr3U6)

Блок разделяет выполнение программы на несколько потоков. Например, можно одновременно ждать срабатывания сенсора и истечения временного интервала.\
\
Блок должен иметь хотя бы две исходящие связи.\
\
Чтобы иметь возможность далее ссылаться на параллельные задачи, порождённые этим блоком (например, в блоке «[Завершить задачу](/studio/programming-visual/blocks#killthread)» или в блоке «[Слияние задач](/studio/programming-visual/blocks#join)») надо дать задачам имена. Это делается на исходящих связях, в свойстве «Условие». Именем задачи может быть любая строка, но одним из имён должно быть имя задачи, которая входит в этот блок. Имя главной программы — `main`.

## Слияние задач <a href="#join" id="join"></a>

![Слияние задач](/files/-M52LJBYwI0c1iNCrqDa)

Блок слияния параллельных задач.\
\
Блокирует исполнение программы до тех пор, пока исполнение всех параллельных задач, входящих в этот блок, не достигнет этого блока.\
\
Блок должен иметь не менее двух входящих связей. На исходящей связи (в свойстве «Условие») должен быть идентификатор задачи, которая продолжится после того, как блок отработает.

## Завершить задачу <a href="#killthread" id="killthread"></a>

![Завершить задачу](/files/-M52LONenxOow_sNGfct)

Завершает задачу с указанным в свойстве «Задача» идентификатором. Должен применяться из другой задачи.

## Случайное число <a href="#random" id="random"></a>

![Случайное число](/files/-M52LSv1gTJFdqLsvskg)

Блок для присвоения указанной переменной случайного целого числа из заданного с помощью свойств «От» и «До» промежутка.

## Комментарий <a href="#comment" id="comment"></a>

![Комментарий](/files/-M52LZ4P_hrgfhAeOFxy)

Блок для добавления на диаграмму произвольного текста в качестве комментария.

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

При выполнении программы блок не учитывается.

## Таймер <a href="#timer" id="timer"></a>

![Таймер](/files/-M52LdZ1Mgsla1mOJRGx)

Блок для задания задержки. Устанавливается время задержки в параметре «Задержка» в миллисекундах.&#x20;

## Опустить маркер <a href="#markerdown" id="markerdown"></a>

![Опустить маркер](/files/-M52Llr3ZNfgbefFMyn6)

Начать рисование маркером заданного цвета на полу. При движении робота в двумерной модели за ним будет оставаться цветная линия.

Блок доступен только в режиме двумерной модели.

## Поднять маркер <a href="#markerup" id="markerup"></a>

![Поднять маркер](/files/-M52LprAEjenhdhiERjI)

Закончить рисование маркером.

Блок доступен только в режиме двухмерной модели.


# Связи между блоками

Связи между блоками в TRIK Studio обозначают направление передачи управления между блоками.

#### Пример

Пусть необходимо, чтобы вслед за задержкой программа сразу же завершилась.\
\
Для этого надо соединить блоки [«Таймер»](/studio/programming-visual/blocks#taimer) и [«Конец»](/studio/programming-visual/blocks#konec) стрелкой, имеющей направление от блока «Таймер» к блоку завершения программы.

![](/files/-M53ZWO6oyd2e0Ul4k5j)

## Создание связей

Связи можно создавать двумя способами:

1. [Жестом мыши](/studio/programming-visual/connection-between-blocks#mouse).
2. [С помощью линкеров](/studio/programming-visual/connection-between-blocks#linker).

### Создание связи жестом мыши <a href="#mouse" id="mouse"></a>

Наведите курсор на блок, зажмите правую кнопку мыши и проведите линию до второго блока. Форма линии может быть произвольной. Важно, чтобы она начиналась строго на одном блоке и заканчивалась на втором.&#x20;

![](/files/-M53SqJcR_I0LiP-NbGh)

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

![](/files/-M53W9CxSQFXgdDIpNBh)

### Создание связи с помощью линкеров <a href="#linker" id="linker"></a>

![](https://thumb.tildacdn.com/tild3839-3232-4431-b534-323262666636/-/resize/88x/-/format/webp/programming-linkers.png)Линкер — цветной кружок справа от блока, появляющийся после выделения блока.\
\
При нажатии на этот кружок и движении мыши с зажатой левой клавишей, из элемента начинает вытягиваться связь.

Если «бросить» эту связь на существующем элементе, произойдет соединение данных элементов.

![](/files/-M53WuPhfbu1WPkW4Rj_)

Если же отпустить левую клавишу мыши, когда курсор находится на пустом участке диаграммы, то появится меню с пунктами:

* Удалить
* Создать новый элемент

При выборе пункта меню «Удалить» созданная связь удаляется.

При наведении на пункт меню «Создать новый элемент» появляется новое меню, в котором перечислены все возможные для создания элементы. При выборе одного из этих пунктов на диаграмме создастся соответствующий элемент и присоединится к текущему связью.

![](/files/-M53Z5Ext6byUoe9j0Hh)

## Удаление связей

Удаление связей осуществляется аналогично [удалению блоков](/studio/programming-visual/blocks-add-delete#del).

## Добавление нового блока на связь

Если необходимо добавить новый блок между двумя связанными блоками, перетащите из панели «Палитра» блок на связь. Отпустите кнопку мыши при наведении курсора (не блока) на связь.

![](/files/-M53XeF_u9OXlvfeuP0i)

## Создание точек излома

Связи в TRIK Studio могут быть ломаными линиями. Для добавления точки излома наведите курсор мыши на линию связи, нажмите левую кнопку мыши и потяните появившийся серый маркер.

![](/files/-M53XxnSCV9ZBdQCY6CG)

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

![](/files/-M53YKSDQU8gmAYvXNzC)


# Синтаксис выражений в блоках

Для объявления переменных и задания им определенных значений используется блок [«Инициализация переменной»](/studio/programming-visual/blocks#initialization).

![Блок «Инициализация переменной»](/files/-M51qy1lrvlast0f4s2z)

А для записи математических вычислений — блок [«Выражение»](/studio/programming-visual/blocks#expression).

![Блок «Выражение»](/files/-M51s0-8mn_MW1mdTryJ)

Также математические выражения, в том числе и изменяющие значения переменных, могут встречаться почти везде, где можно указать какое-либо значение.

Блоки и их свойства, не допускающие использования математических выражений, описаны в разделе [«Общие блоки»](/studio/programming-visual/blocks#vse-obshie-bloki).

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

## Язык TRIK Studio

Используемый внутри блоков язык создан на базе [Lua 5.3](https://www.lua.org/) и во многом следует его синтаксису. Тем не менее имеются существенные отличия, поэтому полное описание используемого в TRIK Studio языка приводится здесь.

* [Типы языка TRIK Studio](/studio/programming-visual/expression-syntax)
* [Лексемы языка](/studio/programming-visual/expression-syntax/lexemes)
* [Операторы языка](/studio/programming-visual/expression-syntax/operators)
* [Сенсорные переменные](/studio/programming-visual/expression-syntax/sensory-variables)
* [Константы](/studio/programming-visual/expression-syntax/const)
* [Встроенные функции](/studio/programming-visual/expression-syntax/built-in-functions)

## Примеры записи выражений

Объявление нескольких переменных в одном блоке [«Выражение»](/studio/programming-visual/blocks#vyrazhenie):

![](/files/-M53y1TOodwlxbMcodLx)

То же через блоки [«Инициализация переменной»](/studio/programming-visual/blocks#inicializaciya-peremennoi):

![](/files/-M53y6T5AjzqUWbF0EZe)

Пропорциональный регулятор для езды по линии с использованием двух датчиков света для платформы ТРИК:

![](/files/-M53zUs1dbNJIYLG3ZN9)

Пример использования [массивов](/studio/programming-visual/expression-syntax/types/array) для задания портов блока «Моторы вперёд». Создаётся массив с именем `a`, нулевому элементу присваивается порт `M3`, первому — `M1`, потом содержимое первого элемента массива меняется на `M4`, затем получившийся массив передаётся в свойство «Порты» блока «Моторы вперёд»:

![](/files/-M54-bgExR8QCuI8yQNq)


# Типы языка TRIK Studio

В отличие от [Lua](https://www.lua.org/) язык TRIK Studio статически типизирован, то есть тип каждого выражения и каждой переменной должен быть известен во время компиляции. При этом язык не требует (и даже не позволяет!) явно писать типы переменных. Используется автоматический вывод типов по использованию переменных.

Например, по выражению `a = 1` среда «поймёт», что тип `a` — целое.

| Тип                                                                | Описание                                                                                                                                                                                        |
| ------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Булевый (логический) тип                                           | Принимает значения true (истина) и false (ложь).                                                                                                                                                |
| Вещественное число                                                 | Использует 64-битное представление binary64 стандарта IEEE 754 (позволяет хранить значения до 1.7E+308).                                                                                        |
| Целое число                                                        | Использует 32-битное знаковое представление (позволяет хранить значения от -2 147 483 648 до 2 147 483 647).                                                                                    |
| Строка                                                             | Позволяет хранить символьные строки произвольной длины в кодировке UTF-8.                                                                                                                       |
| Нулевой тип                                                        | Имеет только одно значение nil и означает отсутствие «настоящего» значения.                                                                                                                     |
| [Массив](/studio/programming-visual/expression-syntax/types/array) | Позволяет хранить произвольное количество значений произвольного (но для каждого значения в одном массиве одинакового) типа, в том числе и другие массивы, и обращаться к значениям по индексу. |

О синтаксисе выражений в блоках читайте в статье

{% content-ref url="/pages/-M0P0kE4EwB9x-p35xad" %}
[Синтаксис выражений в блоках](/studio/programming-visual/expression-syntax)
{% endcontent-ref %}


# Массив

Массив — один из [типов языка TRIK Studio](/studio/programming-visual/expression-syntax/types), хранящий набор значений (элементов массива), идентифицируемых по индексу. Нумерация индексов в массиве начинается с 0.

Массивы можно создавать явно, используя следующие выражения (варианты записи равносильны):

```
a = {1; 2; 3; 4};
a = {1, 2, 3, 4};
```

Или с явным указанием индексов:

```
a = {[0] = 1, [10] = 2, [20] = 3};
```

Можно использовать массивы, не создавая их. Например, так:

```
a[1] = 1;
a[2] = 2;
```

При этом «пустые места» в массиве (индексы, которым не было явного присваивания) будут заполнены значениями по умолчанию:

* `0` — для **целых** и **вещественных**;
* `false` *—* для **булевых**;
* *пустыми строками* для **строковых** массивов.

Значения массива также могут использоваться без фигурных скобок, если используются в качестве возвращаемого значения. Например, данное выражение вернёт массив из чисел `1` и `2`:

```
a = 1;
b = 2;
a, b 
```

Сделано это для того, чтобы интерпретировать перечисления значений (например, порты моторов в блоке [«Моторы вперёд»](/trik/programming-visual/blocks)) как массивы. Поэтому везде, где используется запись значений через запятую, можно использовать массив.


# Лексемы языка TRIK Studio

Язык использует **пробелы**, **табуляции** и **переводы строк** вне строковых литералов только как **разделители** между лексемами — влияния на интерпретацию выражений они не оказывают.

В языке есть следующие **ключевые слова**:

* and
* false
* nil
* not
* or
* true​

И следующие [операторы](/studio/programming-visual/expression-syntax/operators):

```lua
+ - * / % ^ # & ~ | << >> // == ~= <= >= < > = ( ) { } [ ] ; : , . .. && ||
```

**Строковые литералы** пишутся либо в одинарных, либо в двойных кавычках. Наприме&#x440;**,**

```lua
a = 'alo123'
a = "alo123"
```

**Целые числа** пишутся либо в десятичной, либо в восьмеричной, либо в шестнадцатеричной системе. Шестнадцатеричные числа начинаются с префикса `0x`, восьмеричные — с префикса `0`. Например,

* `3`, `345` — десятичные числа
* `0xff`, `0xBEBADA` — шестнадцатеричные числа
* `07654321` — восьмеричное число

**Вещественные числа** пишутся либо в общепринятой, либо в экспоненциальной форме. Например,

```
3.0
3.1416 
314.16e-2
0.31416E1 
34e1​
```

**Комментарии** начинаются с `--` и продолжаются до конца строки. Например,

```
a = 1; -- комментарий
```

О синтаксисе выражений в блоках читайте в статье

{% content-ref url="/pages/-M0P0kE4EwB9x-p35xad" %}
[Синтаксис выражений в блоках](/studio/programming-visual/expression-syntax)
{% endcontent-ref %}


# Операторы языка TRIK Studio

1. [Бинарные операторы](/studio/programming-visual/expression-syntax/operators#binarnye-operatory).
2. [Унарные операторы.](/studio/programming-visual/expression-syntax/operators#unarnye-operatory)
3. [Оператор присваивания](/studio/programming-visual/expression-syntax/operators#operator-prisvaivaniya).
4. [Оператор возврата значения](/studio/programming-visual/expression-syntax/operators#operator-vozvrata-znacheniya).
5. [Пустой оператор](/studio/programming-visual/expression-syntax/operators#pustoi-operator).

## Бинарные операторы <a href="#binarnye-operatory" id="binarnye-operatory"></a>

| ​Title               | ​Title                          | ​Title                                                                                                                                   |
| -------------------- | ------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
| +                    | Сложение                        | <p>Применимо к вещественным и целым значениям. Результат целый,</p><p>если оба аргумента целые, иначе вещественный.</p>                  |
| -                    | Вычитание                       | Применимо к вещественным и целым значениям. Результат целый, если оба аргумента целые, иначе вещественный.                               |
| \*                   | Умножение                       | Применимо к вещественным и целым значениям. Результат целый, если оба аргумента целые, иначе вещественный.                               |
| /                    | Деление                         | Применимо к вещественным и целым значениям. Результат вещественный.                                                                      |
| //                   | Целочисленное деление           | Применимо к целым значениям. Результат целый.                                                                                            |
| ^                    | Возведение в степень            | Применимо к вещественным и целым значениям. Результат вещественный.                                                                      |
| %                    | Остаток от деления              | Применим к целым значениям. Результат целый.                                                                                             |
| &                    | Побитовое «и»                   | Применимо к целым значениям. Результат целый.                                                                                            |
| \|                   | Побитовое «или»                 | Применимо к целым значениям. Результат целый.                                                                                            |
| >>, <<               | Побитовые сдвиги вправо и влево | Применимы к целым значениям. Результат целый.                                                                                            |
| ..                   | Конкатенация                    | Применим к строковым значениям. Результат — строка.                                                                                      |
| >=, >, <, <=         | Операции сравнения              | Применимы к целым и вещественным значениям. Результат булевый.                                                                           |
| ==                   | Операция проверки равенства     | Применима к значениям любых типов. Результат булевый.                                                                                    |
| \~=, !=, '\~=', '!=' | Операция проверки неравенства   | Применима к значениям любых типов. Результат булевый. Альтернативные способы записи операции не различаются по смыслу.                   |
| and, &&              | Логическое «и»                  | Применимо к целым, вещественным и булевым значениям. Результат булевый. Альтернативные способы записи операции по смыслу не различаются. |
| or, \|\|             | Логическое «или»                | Применимо к целым, вещественным и булевым значениям. Результат булевый. Альтернативные способы записи операции по смыслу не различаются. |

## Унарные операторы <a href="#unarnye-operatory" id="unarnye-operatory"></a>

| ​Title | ​Title                       | ​Title                                                                                                                                         |
| ------ | ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
| -      | Арифметический унарный минус | Применим к целым и вещественным значениям. Результат целый или вещественный (в зависимости от типа аргумента).                                 |
| \~     | Побитовое «не»               | Применимо к целым значениям. Результат целый.                                                                                                  |
| not    | Логическое «не»              | Применимо к булевым, целым, вещественным и строковым значениям, результат булевый (0 или пустая строка считается false, всё остальное — true). |
| #      | Оператор взятия длины        | Применим к строковым значениям. Результат целый.                                                                                               |

## **Оператор присваивания**

Имеет следующий вид:

`переменная1, переменная2, …, переменнаяN = выражение1, выражение2, …, выражениеN`

В самом простом виде `переменная = выражение`.

## **Оператор возврата значения**

Записывается как обычное выражение и должен находиться в конце блока операторов.

## **Пустой оператор**

Записывается как `;`.

## Пример

Блок операторов с двумя операторами присваивания и оператором возврата значения:

```
a, b = 1, 2; -- оператор присваивания и пустой оператор
c = 3; -- оператор присваивания и пустой оператор
a + b + c -- оператор возврата значения
```


# Константы

В TRIK Studio сейчас только одна встроенная константа. С ней можно работать так же, как и с [сенсорными переменными](/studio/programming-visual/expression-syntax/sensory-variables), но ее значение не меняется.

|        |                  |                                                                                   |
| ------ | ---------------- | --------------------------------------------------------------------------------- |
| **pi** | 3.14159265358979 | Представляет отношение длины окружности к ее диаметру, определяемое константой π. |


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

Кроме [констант](/studio/programming-visual/expression-syntax/const), в TRIK Studio доступны зарезервированные переменные, которые хранят значения показаний сенсоров, подключенных к соответствующим портам.

Эти значения можно присваивать переменным и использовать в математических выражениях.

Переменные имеют вид

```lua
sensor<имя порта сенсора>
```

Например, `sensorA1` для ТРИК или `sensor1` для Lego NXT.

Полный список сенсорных переменных приводится в разделах к конкретным платформам:

* [ТРИК](/trik/programming-visual/sensory-variables).
* [LEGO EV3](/ev3/sensory-variables).
* [LEGO NXT](/nxt/sensory-variables).


# Встроенные функции

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

| Функция           | Описание                                                                                                                         |
| ----------------- | -------------------------------------------------------------------------------------------------------------------------------- |
| **time()**        | Возвращает время в миллисекундах с начала работы программы.                                                                      |
| **sin(angle)**    | Синус угла, где «angle» — угол в радианах.                                                                                       |
| **cos(angle)**    | Косинус угла, где «angle» — угол в радианах.                                                                                     |
| **ln(a)**         | Натуральный логарифм, где «a» — число.                                                                                           |
| **exp(a)**        | Экспонента («e» в степени аргумента «a»).                                                                                        |
| **asin(a)**       | Арксинус, где «a» — число.                                                                                                       |
| **acos(a)**       | Арккосинус, где «a» — число.                                                                                                     |
| **atan(a)**       | Арктангенс, где «a» — число.                                                                                                     |
| **atan2(a1, a2)** | Арктангенс от a1/a2 c проверкой деления на 0.                                                                                    |
| **sgn(a)**        | Знак. Возвращает 1, если аргумент «a» положительный, -1, если отрицательный, и 0, если аргумент равен нулю.                      |
| **sqrt(a)**       | Квадратный корень аргумента «a». В случае если аргумент отрицательный, переменной будет присвоено значение «NaN» (Not A Number). |
| **abs(a)**        | Модуль аргумента «a».                                                                                                            |
| **ceil(a)**       | Округляет переданный аргумент «a» до целого в большую сторону.                                                                   |
| **floor(a)**      | Округляет переданный аргумент «a» до целого в меньшую сторону.                                                                   |
| **random(a)**     | Случайное число в интервале от 0 до переданного аргумента «a».                                                                   |


# Редактирование свойств элементов

В TRIK Studio есть два способа редактирования значений свойств, которые имеются у блоков и связей на диаграммах:

1. [С помощью панели «Редактор свойств»](/studio/programming-visual/editing-element-properties#panel).
2. [Прямо на диаграмме](/studio/programming-visual/editing-element-properties#diagram).

{% hint style="warning" %}
**Внимание!** Редактирование свойств блока [«Подпрограмма»](/studio/programming-visual/blocks#subprogram) осуществляется только с помощью контекстного меню.
{% endhint %}

## Редактирование свойств с помощью панели <a href="#panel" id="panel"></a>

При выделении блока, связи, или элемента, на панели [«Редактор свойств»](/studio/interface#panel-property-editor) отображаются все свойства текущего элемента.

![Редактор свойств блока «Моторы вперёд» для ТРИК](/files/-M527b8S9ph4tvrVC4LN)

Редактор свойств представляет собой таблицу. В левой колонке отображается название свойства элемента, в правой — его значение.&#x20;

Изменить значение любого свойства можно, кликнув на соответствующей ячейке правой колонки и введя нужное значение.

Для свойств, которые допускают только определенный набор значений, например, свойство «Порт» у блока [«Ждать ИК датчик расстояния»](/trik/programming-visual/blocks#wait-for-infrared-distance), при попытке их редактирования, появится выпадающее меню, где выбирается нужное значение:

![Свойство «Порт» блока «Ждать ИК датчик расстояния»](/files/-M528WwxHoQUdkVejiav)

## Редактирование свойств на диаграмме <a href="#diagram" id="diagram"></a>

Для редактирования свойств прямо на диаграмме:

1. Наведите курсор мыши на значение нужного свойства.
2. Двойным нажатием левой кнопки мыши активируйте редактирование свойства.
3. Введите нужное значение.
4. Кликните в произвольное место сцены.

![](/files/-M53wpPMI52uKH4Ki8TW)

{% hint style="danger" %}
**Внимание!** Данный подход может служить источником ошибок, поскольку позволяет ввести произвольное текстовое значение свойства, в том числе и некорректное. Будьте внимательны.
{% endhint %}


# Подпрограммы

Любую программу в TRIK Studio можно сохранить как подпрограмму и использовать в другой программе.

Подпрограммы можно [сохранять](/studio/programming-visual/subprograms#save) в локальную коллекцию или [экспортировать](/studio/programming-visual/subprograms#export) в отдельный файл для переноса на другие компьютеры.

Для работы с коллекцией подпрограмм используйте пункт меню `Инструменты → Подпрограммы`:

1. [Экспортировать в файл](/studio/programming-visual/subprograms#export).
2. [Импортировать из файла](/studio/programming-visual/subprograms#import).
3. [Сохранить в коллекцию](/studio/programming-visual/subprograms#save).
4. [Загрузить из коллекции](/studio/programming-visual/subprograms#load).
5. [Очистить коллекцию](/studio/programming-visual/subprograms#delete).

![](/files/-M53eYmQW6c1PjOcV39j)

## Экспорт подпрограмм в файл <a href="#export" id="export"></a>

{% hint style="info" %}
Используйте экспорт подпрограмм в файл для их переноса на другие компьютеры. Если же вы планируете использовать подпрограммы на своем компьютере, то используйте [сохранение в коллекцию](/studio/programming-visual/subprograms#save).
{% endhint %}

Для экспорта подпрограмм из открытого проекта в отдельный qrs-файл выберите в главном меню `Инструменты → Подпрограммы → Экспортировать в файл`.

В данный файл будут экспортированы все подпрограммы из текущего проекта.

![Список подпрограмм в проекте](/files/-M51lFgEtdd1aP5g6a3s)

## Импорт подпрограмм из файла <a href="#import" id="import"></a>

Для загрузки сохраненных ранее подпрограмм выберите в главном меню `Инструменты → Подпрограммы → Импортировать из файла`.

{% hint style="danger" %}
**Внимание!** Если в импортируемом файле присутствуют подпрограммы с такими же именами, как в текущем проекте, то подпрограммы из проекта будут заменены импортируемыми.
{% endhint %}

## Сохранение подпрограмм в коллекцию <a href="#save" id="save"></a>

{% hint style="info" %}
Для переноса подпрограмм на другие компьютеры используйте функцию [экспорта](/studio/programming-visual/subprograms#export).
{% endhint %}

Для сохранения подпрограмм из открытого проекта выберите в главном меню `Инструменты → Подпрограммы → Сохранить в коллекцию`.

![](/files/-M51lFgFoNr_mQAe7iN4)

Затем выберите подпрограммы, которые хотите сохранить, и нажмите **OK**.

![Список подпрограмм](/files/-M51lFgGNKByrgh9aJUX)

{% hint style="danger" %}
**Внимание!** Если в коллекции подпрограмм есть подпрограммы с такими же именами, они будут перезаписаны.
{% endhint %}

## Загрузка подпрограмм из коллекции <a href="#load" id="load"></a>

Для загрузки подпрограмм из коллекции, выберите в главном меню `Инструменты → Подпрограммы → Загрузить из коллекции`.

![](/files/-M51lFgH2Ci-YNDmOwxG)

Затем выберите подпрограммы, которые хотите импортировать в текущий проект, и нажмите **OK**.

![Список подпрограмм в коллекции](/files/-M51lFgIt0yOd0fDpprC)

## Удаление коллекции подпрограмм <a href="#delete" id="delete"></a>

Для удаления всех сохраненных в коллекцию подпрограмм выберите в главном меню `Инструменты → Подпрограммы → Очистить коллекцию`.

{% hint style="info" %}
Коллекция подпрограмм хранится в каталоге пользователя и не теряется при удалении или переустановке TRIK Studio.
{% endhint %}


# Программирование на текстовом языке

Создание новой текстовой программы, генерация диаграммы в код и поддерживаемые языки программирования

Текстовый режим программирования позволяет редактировать [сгенерированную](/studio/programming-code#generation) по диаграмме программу перед загрузкой на робота или [написать программу](/studio/programming-code#new-programm) в текстовом виде с нуля.

## Создание новой текстовой программы <a href="#new-programm" id="new-programm"></a>

1\. [Создайте диаграмму](/studio/start#new-project), содержащую блоки «Начало» и «Конец».

2\. Выберите режим реального робота.

3\. Нажмите на кнопку «Генерировать код».\
\
После этого появится пустой шаблон программы, которая содержит все необходимые объявления, но ничего не делает.

![](/files/-M2ENPe_7rsP91Yr-ALq)

## Генерация диаграммы в код <a href="#generation" id="generation"></a>

1\. Выберите режим реального робота.

2\. Нажмите на кнопку «Генерировать код».

{% hint style="info" %}
При повторной генерации диаграммы ручные изменения не потеряются, если текстовый файл сохранен. Результат новой генерации сохранится в другой файл.
{% endhint %}

![](/files/-M2EO-4xSPDUGHt9vGQu)

## Поддерживаемые языки программирования

Поддерживаемый текстовый язык программирования зависит от платформы. Одна платформа может иметь несколько целевых текстовых языков.

{% hint style="warning" %}
**Внимание!** Доступные генераторы зависят от установленных подключаемых модулей.
{% endhint %}

### Контроллер ТРИК <a href="#trik" id="trik"></a>

Для платформы ТРИК возможна генерация в:

* [Python](/trik/programming-code).
* [JavaScript](/trik/programming-code).

### Контроллер Lego EV3 <a href="#ev3" id="ev3"></a>

Эксперты в EV3 могут посмотреть на сгенерированный на внутреннем языке EV3 код с помощью кнопки «Сгенерировать в байт-код EV3». Теоретически его можно подредактировать и запустить на исполнение или вообще использовать для текстового программирования EV3, но делать это неудобно — язык создавался для автоматической генерации, а не написания программ.

### Контроллер Lego NXT <a href="#nxt" id="nxt"></a>

Для Lego NXT поддерживается генерация в [язык С](/nxt/c) с использованием библиотеки ECRobot.

### Квадрокоптер Геоскан Пионер <a href="#peoneer" id="peoneer"></a>

Для квадрокоптера Геоскан Пионер возможна генерация в Lua.


# Упражнения

Создание и загрузка упражнений

Упражнение — это обычная программа, в которой нельзя модифицировать некоторые части решения. То есть любую диаграмму можно сохранить как упражнение для учеников (если она еще не является таковой).

## Создание упражнения <a href="#create" id="create"></a>

1\. Нарисуйте на сцене поле с помощью [панели редактирования мира](/studio/2d-model#editor-world), если это необходимо для вашей задачи.&#x20;

![](/files/-M50vqBUYHzTvIlqd5F1)

2\. Создайте диаграмму.

![](/files/-M50wePxUOqPuu2-aKBd)

3\. Удалите из диаграммы все или часть блоков. Блок [«Начало»](/studio/programming-visual/blocks#nachalo) обязательно должен присутствовать.

![](/files/-M50wePw6TX173FnojT9)

4\. Выберите в [главном меню](/studio/interface#menu) `Инструменты → Сохранить как упражнение…`.

5\. В появившемся диалоговом окне выберите ограничения для упражнения.

![](/files/-M50wePunwrfFmJcns1q)

|   | Название                                                               | Описание                                                                                           |
| - | ---------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- |
| 1 | Двумерная модель неизменяема                                           | Запрещает редактировать стены и цветные линии в двумерной модели.                                  |
| 2 | Положение и конфигурация сенсоров неизменяемы                          | Запрещает изменять конфигурацию датчиков, а также их положение и направление в двумерной модели.   |
| 3 | Начальное положение робота в двумерной модели неизменяемо              | Запрещает двигать робот «вручную».                                                                 |
| 4 | Соответствие портов моторов и колёс неизменяемо                        | Запрещает менять моторы в настройках двумерной модели.                                             |
| 5 | Настройки симуляции двумерной модели (физика, шумы и т.д.) неизменяемы | Запрещает менять настройки шумов датчиков и моторов, а также физический движок в двумерной модели. |

6\. Нажмите «OK» и выберите путь для сохранения упражнения.

7\. После сохранения упражнение автоматически откроется в TRIK Studio, где можно будет убедиться, что выбранные опции недоступны для редактирования.

![Окно настроек сенсоров при их запрещенном редактировании](/files/-M50wePscUyiNj05eTE7)

## Загрузка упражнения

Загрузка сохраненного упражнения происходит как обычная программа. Например, с помощью [панели «Файл»](/studio/interface#panel-file).


# Сторонние утилиты

PuTTY, WinSCP, TRIK Gamepad

В TRIK Studio доступны три сторонние утилиты:

1. [PuTTY](/studio/utilities/putty).
2. [WinSCP](/studio/utilities/winscp).
3. [TRIK Gamepad](/gamepad/about/utility).

Для запуска утилиты зайдите в меню `Инструменты → Сторонние утилиты`.

![](/files/-M0-WuN4NRJw6ct5upzd)


# PuTTY

**PuTTY** — клиентская программа для работы с сетевыми протоколами. К [контроллеру ТРИК](/trik/about) можно подключиться, используя протоколы **SSH** и **Serial**.

![](/files/-M0-XKhAfL51pOTK9sRP)

## Запуск PuTTY из TRIK Studio

Для запуска утилиты зайдите в меню `Инструменты → Сторонние утилиты → PuTTY`.

![](/files/-M0-WuN4NRJw6ct5upzd)

## Подключение к контроллеру ТРИК в PuTTY

1\. Подключите контроллер к компьютеру по [Wi-Fi](/trik/wi-fi/network-connection).

2\. Пропишите в настройках студии на вкладке «[Роботы](/studio/settings#robots)» IP-адрес контроллера, который отображается на главном экране контроллера.

![Пример ввода IP-адреса контроллера](/files/-M0-Xe7AMeghJTDFmW8M)

3\. Запустите PuTTY из TRIK Studio, выбрав в главном меню `Инструменты → Сторонние утилиты → PuTTY`.

![](/files/-M0-WuN4NRJw6ct5upzd)

4\. В открывшемся окне введите логин `root`. Поле `Пароль` оставьте пустым.

![](/files/-M0-YIO3vfrlEkg9R9WT)


# WinSCP

**WinSCP** — графический клиент протоколов **SFTP** и **SCP**, предназначенный для Windows. С помощью него можно обмениваться файлами между контроллером ТРИК и компьютером по протоколу **SCP**.

![](/files/-M0NvQC6Lt_KBwMU5uVP)

## Запуск WinSCP из TRIK Studio

Для запуска утилиты зайдите в меню `Инструменты → Сторонние утилиты → WinSCP`.

![](/files/-M0-WuN4NRJw6ct5upzd)

## Подключение к контроллеру ТРИК в WinSCP

1\. В каталоге с установленной TRIK Studio зайдите в папку `winscp` и запустите `WinSCP.exe`

2\. Заполните данные:

* **File protocol:** SCP
* **Host name:** [IP-адрес контроллера](/trik/wi-fi/network-connection#accesspoint).
* **User name:** root.

Поле `Password` оставьте пустым.

![](/files/-M0NwQw7xR5anMK4FT1Q)

3\. Нажмите кнопку «Login».

4\. Если у вас появилось окно «Warning», нажмите «Yes».

{% hint style="info" %}
Это предупреждение возникает, когда **WinSCP** подключается к новому серверу **SSH**.
{% endhint %}

5\. В левой части приложения будет находиться файловая система вашего компьютера, в правой — файловая система контроллера ТРИК.

![](/files/-M0DFmDLXNyrNAP6gPw2)


# Горячие клавиши в TRIK Studio

В таблице ниже указаны горячие клавиши, установленные по умолчанию. Изменить сочетание клавиш для действий можно в [настройках TRIK Studio](/studio/settings#shortcuts).

| Действие                                                     | Сочетание клавиш |
| ------------------------------------------------------------ | ---------------- |
| **Переключение режимов TRIK Studio**                         |                  |
| Включить [режим редактирования](/studio/interface#mode-edit) | Ctrl+1           |
| Включить [режим отладки](/studio/interface#mode-debug)       | Ctrl+2           |
|                                                              |                  |
| **Работа с диаграммой**                                      |                  |
| Показать весь текст                                          | Ctrl+Shift+T     |
| Увеличить масштаб сцены                                      | Ctrl+=           |
| Уменьшить масштаб сцены                                      | Ctrl+-           |
| Повторить                                                    | Ctrl+Shift+Z     |
| Отменить                                                     | Ctrl+Z           |
| Найти                                                        | Ctrl+F           |
| Найти и заменить                                             | Ctrl+H           |
|                                                              |                  |
| **Работа с проектом**                                        |                  |
| Закрыть все вкладки                                          | Ctrl+Shift+W     |
| Закрыть текущую вкладку                                      | Ctrl+W           |
| Создать проект                                               | Ctrl+N           |
| Открыть проект                                               | Ctrl+O           |
| Сохранить проект                                             | Ctrl+S           |
| Сохранить проект как                                         | Ctrl+Shift+S     |
| Загрузить программу на робота                                | Ctrl+U           |
| Показать/спрятать панель ошибок                              | Alt+1            |
| Показать/спрятать панель консоли                             | Alt+2            |


# Сбои из-за антивирусов

Некоторые антивирусы распознают TRIK Studio как угрозу, что мешает корректной работе TRIK Studio.

Ниже приведены инструкции для решения подобных проблем с антивирусами:

* [Антивирус Avast блокирует TRIK Studio. Что делать?](/studio/antivirus-conflicts/avast)


# Антивирус Avast блокирует TRIK Studio. Что делать?

## **Avast выдаёт сообщение о блокировке файла**

Если при установке или запуске TRIK Studio антивирус Avast выдает сообщение о блокировке файла, то указанный файл следует добавить в исключения в настройках антивируса.

![](/files/-MNg4cooTFy2am5ALwmS)

Для этого:

1\. В появившемся окне нажмите на кнопку «Другие параметры» и выберите «Создать исключение».

![](/files/-MNg4T6mjKJLR0cRovIq)

2\. Нажмите на кнопку «Понятно».

![](/files/-MNg53kluEdVgd8TCBOe)

3\. После данных действий TRIK Studio запустится.

## Avast не выдает сообщение об угрозе

Возможна ситуация, при которой Avast может удалить исполняемый файл TRIK Studio или просто не выдавать сообщение об угрозе при запуске TRIK Studio.

В данном случае:

1\. Откройте главное окно Avast.

2\. В «Меню» выберите пункт «Моя статистика».

![](/files/-MNg70eZy0Zq0kg1pGx4)

![](/files/-MNg6UD-F5v552u9nIQy)

3\. Затем «Угрозы в хранилище вирусов (Открыть хранилище вирусов)».

![](/files/-MNg7RNVITJ1r-ChS1AV)

4\. Наведите курсор мыши на запись о заблокированном файле, после чего справа появится кнопка выпадающего меню «...». Нажмите на нее и выберите «Другие параметры».

![](/files/-MNg84tr1RCc3zmSO-kh)

5\. Затем выберите «Восстановить и добавить в исключения».

![](/files/-MNg8TN-8E1P-XY-ZFQX)

6\. После этих действий TRIK Studio должна запускаться и работать в штатном режиме.


# О TRIK Studio Junior

**TRIK Studio** **Junior** — бесплатная среда программирования с [«Исполнителем»](/trik-studio-junior/about#chto-takoe-ispolnitel) для начальной и средней школы.

![](/files/-Ma2NkxwHBxuuoj_KIcW)

Среда имеет общий интерфейс со средой программирования роботов [TRIK Studio](/studio/about), что позволяет вести непрерывный процесс обучения, начиная с начальной школы.

## Особенности TRIK Studio Junior <a href="#features" id="features"></a>

1\. Поддержаны основные алгоритмические структуры (следование, ветвление, циклы, подпрограммы, массивы), математические и логические операции, а также команды для перемещения «Исполнителя».

{% content-ref url="/pages/-Ma34IQD7leu6ZFjVLqW" %}
[Блоки в TRIK Studio Junior](/trik-studio-junior/programming/blocks)
{% endcontent-ref %}

![](/files/-Ma375FuoxfFucfVZxEw)

2\. Вы можете загрузить как своего «Исполнителя» и мир, так и [выбрать](https://trikset.com/products/trik-studio-junior#fields) из заготовленных.

{% content-ref url="/pages/-Ma37yoEx4\_gaXTEICqZ" %}
[Как заменить изображение «Исполнителя» в TRIK Studio Junior?](/trik-studio-junior/interfeis-trik-studio-junior/robot-image-change)
{% endcontent-ref %}

![](/files/-Ma37Qr4DMNXmmuVXPRw)

3\. Вы можете создавать упражнения для самостоятельного выполнения с автоматической проверкой.

{% content-ref url="/pages/-Ma39BaTL4Oje0Cu2TSJ" %}
[Упражнения в TRIK Studio Junior](/trik-studio-junior/exercises)
{% endcontent-ref %}

![](/files/-Ma391-yvUYomdKKqQKU)

4\. Так же, как и в TRIK Studio, в TRIK Studio Junior есть [интерактивный режим имитационного моделирования](/studio/2d-model). Чтобы научиться программировать, необязательно иметь конструктор.

![](/files/-Ma33-4rBa41Cm9DiOXA)

{% hint style="info" %}
Так как интерфейс и работа в **TRIK Studio** **Junior** во многих моментах совпадает с интерфейсом и работой в **TRIK Studio**, в некоторых статьях данного раздела будут даны ссылки на аналогичные статьи раздела справки про TRIK Studio.
{% endhint %}

## Что такое «Исполнитель»

«Исполнитель» — объект, который понимает и исполняет команды алгоритма. В TRIK Studio Junior можно менять изображение исполнителя.

{% content-ref url="/pages/-Ma37yoEx4\_gaXTEICqZ" %}
[Как заменить изображение «Исполнителя» в TRIK Studio Junior?](/trik-studio-junior/interfeis-trik-studio-junior/robot-image-change)
{% endcontent-ref %}

## Скачать TRIK Studio Junior <a href="#download" id="download"></a>

Последнюю версию TRIK Studio Junior можно скачать на сайте [trikset.com](https://trikset.com/downloads#trikstudiojr).

{% content-ref url="/pages/-M\_XaJjK4ncPRUWcrK3c" %}
[Как узнать версию TRIK Studio Junior](/trik-studio-junior/about/version)
{% endcontent-ref %}

## Рекомендуемые системные требования для TRIK Studio Junior <a href="#system-requirements" id="system-requirements"></a>

* Оперативная память: 4 ГБ или больше.
* Операционная система:
  * 64-разрядная Windows 10.
  * Ubuntu 16.04 и выше.
  * macOS 10.12 Sierra и выше.


# Как узнать версию TRIK Studio Junior

Версия TRIK Studio Junior отображается в заголовке окна.

![](/files/-Ma2OqHauytQL9tXerW_)

А также на стартовой странице.

![](/files/-Ma2PZLADnuIToiK4k79)


# Начало работы и создание проекта в TRIK Studio Junior

Создание нового проекта и запуск существующего

## Главное окно

После запуска **TRIK Studio Junior** откроется стартовая страница, на которой будет отображена [версия](/trik-studio-junior/about/version) TRIK Studio Junior, быстрый доступ к недавним проектам, а также кнопки для [открытия существующего проекта](/trik-studio-junior/start#new-project) и [создания нового](/trik-studio-junior/start#open-project).

![](/files/-Ma2fqKJdSI1V6u2FoJY)

## Создание проекта <a href="#new-project" id="new-project"></a>

Для создания нового проекта нажмите кнопку «Создать проект» на стартовой странице TRIK Studio Junior.

![](/files/-Ma2xB_lqKXh8iHfJigD)

Или в [главном меню](/studio/interface/main-menu) выберите `Файл → Новый проект`.&#x20;

![](/files/-Ma2xJTMx0ia6p60vW2p)

Откроется окно с новой программой на визуальном языке программирования:

![](/files/-M2E9ayrdOG7JZkLiyWg)

## Запуск существующего проекта <a href="#open-project" id="open-project"></a>

Для запуска существующего проекта нажмите кнопку «Открыть проект» на стартовой странице TRIK Studio Junior.

![](/files/-Ma2xZQZxmt3-B6n1aA8)

Или в [главном меню](/studio/interface/main-menu) выберите `Файл → Открыть...`.&#x20;

![](/files/-Ma2y-fC8_xXmxwNC_Yt)

По умолчанию TRIK Studio Junior ищет файлы в формате `*.tsj` .


# Интерфейс TRIK Studio Junior

TRIK Studio Junior так же, как и [TRIK Studio](/studio/interface), имеет два режима работы.

1. [**Режим редактирования**](/studio/interface#mode-edit)\
   Предназначен для создания диаграммы управления роботом и исполнения её на роботе в режиме генерации.<br>
2. [**Режим отладки**](/studio/interface#mode-debug)\
   Предназначен для исполнения и отладки программы на 2D-модели.

Интерфейс TRIK Studio Junior зависит от выбранного режима и совпадает с интерфесом для TRIK Studio:

{% content-ref url="/pages/-M-9jpbQS5U15k0rWKKw" %}
[Интерфейс TRIK Studio](/studio/interface)
{% endcontent-ref %}


# Как заменить изображение «Исполнителя» в TRIK Studio Junior?

Изменить изображение «Исполнителя» можно двумя способами:

1. [В контекстом меню исполнителя](/trik-studio-junior/interfeis-trik-studio-junior/robot-image-change#context). Здесь можно добавить несколько изображений, которые будут менятся в зависимости от направления движения «Исполнителя».
2. [В настройках TRIK Studio Junior](/trik-studio-junior/interfeis-trik-studio-junior/robot-image-change#settings).

{% hint style="warning" %}
Если выбрано изображение в контекстном меню «Исполнителя», то изображение, выбранное в настройках TRIK Studio Junior **игнорируется**.
{% endhint %}

## Замена изображения «Исполнителя» в контекстном меню <a href="#context" id="context"></a>

1\. Кликните левой кнопкой мыши на «Исполнителя».

![](/files/-Mgz6X9PnAMObtD0nGfH)

2\. Поставьте «галочку» во второй строке. Появится иконка для выбора изображения «Исполнителя».

![](/files/-Mgz7---H7xjpArwhML5)

{% hint style="info" %}
Если вы захотите вернуться к варианту изображения «Исполнителя» по умолчанию (изображение, выбранное [в настройках](/trik-studio-junior/interfeis-trik-studio-junior/robot-image-change#settings)), уберите «галочку».
{% endhint %}

3\. Нажмите на появившуюся иконку и выберите одно или несколько изображений «Исполнителей».

Выбор нескольких изображений «Исполнителей» необходим, если у вас есть изображения в разных проекциях. Имя таких файлов должны оканчиваться на:

* `_up` — для изображения, когда «Исполнитель» движется **наверх**
* `_down`— для изображения, когда «Исполнитель» движется **вниз**
* `_right` — для изображения, когда «Исполнитель» движется **направо**
* `_left` — для изображения, когда «Исполнитель» движется **налево**

## Замена изображения «Исполнителя» в настройках TRIK Studio Junior <a href="#settings" id="settings"></a>

1\. Выберите в [главном меню](/studio/interface/main-menu#menu-settings) `Настройки → Настройки...`.

![](/files/-Ma3CEuJH94WS2AGSJT8)

2\. В открывшемся окне выберите вкладку «Роботы», нажмите рядом с полем «Картинка робота в 2D» кнопку «Обзор» и выберите нужное изображение.

![](/files/-Ma3G26NNJEf3yKs2i7C)

3\. Нажмите «OK».

## Скачать изображения «Исполнителя» <a href="#download" id="download"></a>

На сайте trikset.com вы можете [скачать](https://trikset.com/products/trik-studio-junior#fields) заготовленные изображения «Исполнителей».


# 2D-модель в TRIK Studio Junior

Интерфейс и работа с 2D-моделью (интерактивным режимом имитационного моделирования) в TRIK Studio Junior почти полностью совпадает с интерфейсом и работой в TRIK Studio:

{% content-ref url="/pages/-M0Now5ADLgit5TISAGo" %}
[2D-модель](/studio/2d-model)
{% endcontent-ref %}

Отличительной особенностью является только элемент [«Кубик»](/trik-studio-junior/2d-model#cube) на панели редактирования модели мира.

## **Редактирование модели мира** <a href="#editor-world" id="editor-world"></a>

Редактирование модели мира осуществляется с помощью соответствующей панели.

|                                                                                                                                                         | Название                                       | Описание                                                                                                                                                                                                                                                                                                                                                                                                                                                 | Горячая клавиша |
| ------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :-------------: |
| <img src="https://thumb.tildacdn.com/tild3763-3237-4833-a164-393534336437/-/resize/65x/-/format/webp/57ef89a9ee81c1577fb1.png" alt="" data-size="line"> | **Курсор**                                     | Переключение в режим выбора.                                                                                                                                                                                                                                                                                                                                                                                                                             |        1        |
| <img src="https://thumb.tildacdn.com/tild3564-6138-4364-a232-326133336338/-/resize/65x/-/format/webp/2d_wall.png" alt="" data-size="line">              | **Стена**                                      | <p>Добавление на сцену препятствия в виде стены.</p><p></p><p>При добавлении с нажатой клавишей <code>Shift</code> стена помещается либо под прямым углом, либо под углом в 45<strong>°</strong> относительно границ окна. Отображается стена в виде «кирпичной» линии.<br><br>При касании такой линии датчиком касания или при попадании в зону действия датчиком расстояния происходит срабатывание сенсора. Робот не может проехать сквозь стену.</p> |        2        |
| <img src="/files/-Md1uZYBCV3xrIneV2m8" alt="" data-size="line">                                                                                         | [**Кубик**](/trik-studio-junior/2d-model#cube) | Добавление на сцену препятствия в виде кубика                                                                                                                                                                                                                                                                                                                                                                                                            |        3        |
| <p></p><p><img src="/files/-M4sxiS_RcmyFhBUiINS" alt="" data-size="line"></p><p></p>                                                                    | **Мяч**                                        | Добавление на сцену препятствия в виде мяча. При касании тележки он отскакивает на некоторое расстояние.                                                                                                                                                                                                                                                                                                                                                 |        4        |
| <img src="https://thumb.tildacdn.com/tild6331-3031-4161-b430-623435333135/-/resize/65x/-/format/webp/2d_ruler.png" alt="" data-size="line">             | **Линия**                                      | <p>Добавление на сцену прямой линии.</p><p></p><p>При добавлении линии с нажатой клавишей <code>Shift</code> линия помещается либо под прямым углом, либо под углом в 45<strong>°</strong> относительно границ окна.<br><br>На линию могут реагировать датчики света и цвета, расположенные на виртуальном роботе.</p><p></p><p>Можно <a href="/pages/-M0Now5ADLgit5TISAGo#editor-line">настраивать</a> цвет и толщину линии.</p>                        |        5        |
| <img src="https://static.tildacdn.com/tild6230-3232-4431-a636-383235306539/2d_bezier.svg" alt="" data-size="line">                                      | **Кривая Безье**                               | <p>Добавление на сцену линии с возможностью закругления.<br><br>На линию могут реагировать датчики света и цвета, расположенные на виртуальном роботе.<br><br>Можно <a href="/pages/-M0Now5ADLgit5TISAGo#editor-line">настраивать</a> цвет и толщину линии.</p>                                                                                                                                                                                          |        6        |
| <img src="https://static.tildacdn.com/tild6539-6166-4638-a465-643132613331/2d_rectangle.svg" alt="" data-size="line">                                   | **Прямоугольник**                              | <p>Добавление на сцену прямоугольника.<br><br>Можно <a href="/pages/-M0Now5ADLgit5TISAGo#editor-line">настраивать</a> цвет и толщину линий прямоугольника, а также цвет его заливки.</p>                                                                                                                                                                                                                                                                 |        7        |
| <img src="https://thumb.tildacdn.com/tild3038-3963-4733-b130-656566616134/-/resize/65x/-/format/webp/2d_ellipse.png" alt="" data-size="line">           | **Эллипс**                                     | <p>Добавление на сцену эллипса.<br><br>Можно <a href="/pages/-M0Now5ADLgit5TISAGo#editor-line">настраивать</a> цвет и толщину линий эллипса, а также цвет его заливки.</p>                                                                                                                                                                                                                                                                               |        8        |
| <img src="https://thumb.tildacdn.com/tild3363-6336-4332-b434-636563633334/-/resize/65x/-/format/webp/2d_pencil.png" alt="" data-size="line">            | **Стилус**                                     | <p>Рисование линии мышью.<br></p><p>На нарисованную линию могут реагировать датчики света и цвета, расположенные на виртуальном роботе.</p><p></p><p>Можно <a href="/pages/-M0Now5ADLgit5TISAGo#editor-line">настраивать</a> цвет и толщину линий.</p>                                                                                                                                                                                                   |        9        |
| <img src="/files/-M4szSQsE4pf9785VlvE" alt="" data-size="line">                                                                                         | [**Картинка**](/studio/2d-model#add-image)     | Добавление на сцену готового фона.                                                                                                                                                                                                                                                                                                                                                                                                                       |        0        |

### Кубик <a href="#cube" id="cube"></a>

Элемент «Кубик» позволяет создавать упражнения в виде игр-головоломок, в которой «Исполнителю» необходимо расставить ящики по обозначенным местам лабиринта.

![](/files/-Md1vNCQZTIq8BALY0Ij)


# Настройки TRIK Studio Junior

## Окно настроек

Окно настроек TRIK Studio Junior открывается выбором соответствующего пункта в [главном меню](/studio/interface/main-menu#menu-settings):`Настройки → Настройки...`.

![](/files/-Ma3CEuJH94WS2AGSJT8)

Интерфейс окна с настройками в TRIK Studio Junior совпадает с интерфейсом настроек в TRIK Studio:

{% content-ref url="/pages/-M0NonWgnLIVTh1umaCA" %}
[Настройки TRIK Studio](/studio/settings)
{% endcontent-ref %}


# Программирование на визуальном языке в TRIK Studio Junior

Программа в TRIK Studio Junior представляется в виде последовательности [блоков](/trik-studio-junior/programming/blocks), соединённых [связями](/trik-studio-junior/programming/connection-between-blocks).&#x20;

![](/files/-M2EJRIzEgXCEoYrGcEZ)

Каждой программе соответствует [главная диаграмма](/trik-studio-junior/programming#main-diagramm), которая может содержать [другие диаграммы (подпрограммы)](/trik-studio-junior/programming#subprogram). Диаграммы упаковываются в проекты, хранящиеся на диске.

![](/files/-M2EKET3jlKMjZ6Y3O61)

## Главная диаграмма <a href="#main-diagramm" id="main-diagramm"></a>

Главная диаграмма создаётся при [создании проекта](/trik-studio-junior/start#new-project). Про добавление и удаление блоков на [сцену](/studio/interface#editor-window-1) читайте в статье:

{% content-ref url="/pages/-Ma34EZLOEf\_KbIfsYmu" %}
[Добавление и удаление блоков в TRIK Studio Junior](/trik-studio-junior/programming/blocks-add-delete)
{% endcontent-ref %}

## Подпрограммы <a href="#subprogram" id="subprogram"></a>

Диаграммы с подпрограммами создаются автоматически при добавлении блока «Подпрограмма» на сцену. При этом отображение подпрограммы происходит при двойном клике на блок «Подпрограмма» на сцене.

![](/files/-M2ELFCCXgElMe0ezDM7)

Подробнее о подпрограммах читайте в статье:

{% content-ref url="/pages/-Ma3HqgFQwTiF9phmgBh" %}
[Подпрограммы в TRIK Studio Junior](/trik-studio-junior/programming/subprograms)
{% endcontent-ref %}


# Добавление и удаление блоков в TRIK Studio Junior

Добавление и удаление блоков в TRIK Studio Junior происходит таким же образом, как и в TRIK Studio:

{% content-ref url="/pages/-M2Cg4NSr84OpQjA\_hVf" %}
[Добавление и удаление блоков](/studio/programming-visual/blocks-add-delete)
{% endcontent-ref %}


# Блоки в TRIK Studio Junior

Блоки в TRIK Studio Junior делятся на четыре категории:

1. [Алгоритмы](/trik-studio-junior/programming/blocks#algorithms) — блоки для описания алгоритмов.
2. [Действия](/trik-studio-junior/programming/blocks#action-blocks) — блоки, выполняющие какое-либо действие «Исполнителя»: команды проезда вперед, поворотов, проигрывания звука и других.
3. [Ожидания](/trik-studio-junior/programming/blocks#waiting-blocks) — блоки, ждущие наступления какого-либо события: определённых показаний датчиков, нажатия на кнопку и т. д.
4. [Рисования](/trik-studio-junior/programming/blocks#bloki-risovaniya) — блоки, используемые для вывода графики и текста на экран.

## Алгоритмы <a href="#algorithms" id="algorithms"></a>

|                                                                                             Вид                                                                                            |                                   Название                                   | Описание                                                                                                                                                                                                                                                                                            |
| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------: | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| ![](https://gblobscdn.gitbook.com/assets%2F-M-9YMGCK0ySSnTAiseS%2F-M4siuJqdaQ-i-x_2pCT%2F-M4soizl8q-7pvnHEsmN%2FinitialBlock_50.png?alt=media\&token=c1fd4b99-84cd-4f2f-a78d-4cb718f8dbe0) |            [Начало](/trik-studio-junior/programming/blocks#start)            | <p>Начальная точка выполнения программы.</p><p></p><p>На каждой диаграмме должен быть только один такой блок. В него не должно быть входящих связей, а исходящая связь из этого элемента должна быть только одна.</p><p></p><p>Процесс интерпретации диаграммы начинается именно с этого блока.</p> |
|                                                             <img src="/files/-M52AW4J4S3FdvyaSaQw" alt="" data-size="original">                                                            |             [Конец](/trik-studio-junior/programming/blocks#final)            | <p>Конец программы.</p><p></p><p>Если программа состоит из нескольких параллельных участков выполнения, достижение этого блока завершает соответствующий участок выполнения.</p><p></p><p>У данного блока не может быть исходящих связей.</p>                                                       |
|                                                             <img src="/files/-M4sbcwdOi_s0Icqm-DE" alt="" data-size="original">                                                            | [Инициализация переменной](/trik-studio-junior/programming/blocks#condition) | Блок для объявления новой переменной и задания ей значения.                                                                                                                                                                                                                                         |
|                                                             <img src="/files/-M52MMMDTWsMLGG3yp_z" alt="" data-size="original">                                                            |         [Условие](/trik-studio-junior/programming/blocks#condition-1)        | Разделение выполнения программы в соответствии с заданным условием.                                                                                                                                                                                                                                 |
|                                                             <img src="/files/-M52CZNktjFbwTxIAxPU" alt="" data-size="original">                                                            |         [Конец условия](/trik-studio-junior/programming/blocks#endif)        | Обозначает слияние двух веток условного оператора. Никаких действий не выполняет, но полезен для обеспечения структурности программы.                                                                                                                                                               |
|                                                             <img src="/files/-M56Xm638UU1wpYYLTLo" alt="" data-size="original">                                                            |      [Цикл с предусловием](/trik-studio-junior/programming/blocks#while)     | Цикл, который выполняется пока истинно некоторое условие, указанное перед его началом. Это условие проверяется до выполнения тела цикла, поэтому тело может быть не выполнено ни разу (если условие с самого начала ложно).                                                                         |
|                                                             <img src="/files/-M52DOdwx_5fS_9MgKaU" alt="" data-size="original">                                                            |              [Цикл](/trik-studio-junior/programming/blocks#loop)             | Блок, организующий выполнение последовательности блоков несколько раз.                                                                                                                                                                                                                              |
|                                                             <img src="/files/-M52DGNx7GI807kR0tVy" alt="" data-size="original">                                                            |            [Выбор](/trik-studio-junior/programming/blocks#switch)            | Условие с несколькими альтернативами.                                                                                                                                                                                                                                                               |
|                                                             <img src="/files/-M52DSe3uI0AOTgYRkOR" alt="" data-size="original">                                                            |        [Выражение](/trik-studio-junior/programming/blocks#expression)        | Считает значение заданного выражения. Также допускается инициализация переменных.                                                                                                                                                                                                                   |
|                                                             <img src="/files/-M52DXqvZTRL24H_ebQ1" alt="" data-size="original">                                                            |       [Подпрограмма](/trik-studio-junior/programming/blocks#subprogram)      | Вызов подпрограммы.                                                                                                                                                                                                                                                                                 |
|                                                             <img src="/files/-MgBhfc-ajCitd2V2a0a" alt="" data-size="original">                                                            |        [Черный ящик](/trik-studio-junior/programming/blocks#black-box)       | Подпрограмма, которую нельзя отредактировать после сохранения.                                                                                                                                                                                                                                      |
|                                                             <img src="/files/-M52DeDyKfJZ4tC9_teH" alt="" data-size="original">                                                            |      [Параллельные задачи](/trik-studio-junior/programming/blocks#fork)      | Блок разделяет выполнение программы на несколько потоков.                                                                                                                                                                                                                                           |
|                                                             <img src="/files/-M52DhSkZBEzCnc-c1_M" alt="" data-size="original">                                                            |            [Слияние задач](/studio/programming-visual/blocks#join)           | Блок слияния параллельных задач.                                                                                                                                                                                                                                                                    |
|                                                             <img src="/files/-M52Dk3JQqG1nDK_lrE4" alt="" data-size="original">                                                            |     [Завершить задачу](/trik-studio-junior/programming/blocks#killthread)    | Завершает задачу с указанным в свойстве «Задача» идентификатором. Должен применяться из другой задачи.                                                                                                                                                                                              |
|                                                             <img src="/files/-M52DojWoIM6b9rpHTqd" alt="" data-size="original">                                                            |       [Случайное число](/trik-studio-junior/programming/blocks#random)       | Блок для присвоения указанной переменной случайного целого числа из заданного промежутка.                                                                                                                                                                                                           |
|                                                             <img src="/files/-M52DryFvsimyiA6uzxd" alt="" data-size="original">                                                            |         [Комментарий](/trik-studio-junior/programming/blocks#comment)        | Блок для добавления на диаграмму произвольного текста в качестве комментария.                                                                                                                                                                                                                       |

### Начало <a href="#start" id="start"></a>

<div align="center"><img src="/files/-M4sGhTqlIwe1aBl6wOh" alt="Начало"></div>

Начальная точка выполнения программы.

На каждой диаграмме должен быть только один такой блок. В него не должно быть входящих связей, а исходящая связь из этого элемента должна быть только одна.

Процесс интерпретации диаграммы начинается именно с этого блока.

### Конец <a href="#final" id="final"></a>

![Конец](/files/-M524lBgOTGyNt9mtV2F)

Конец программы.

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

У данного блока не может быть исходящих связей.

### Инициализация переменной <a href="#condition" id="condition"></a>

<div align="center"><img src="/files/-M4sTKMESJo-_Y-K5ihw" alt="Инициализация переменной"></div>

Блок для объявления новой переменной и задания ей значения. Этого же можно добиться с помощью блока «[Выражение](/trik-studio-junior/programming/blocks#expression)», но этот блок делает программу понятнее.

#### Свойства

| Свойство       | Описание                                                           |
| -------------- | ------------------------------------------------------------------ |
| **Значение**   | Указывается выражение, определяющее начальное значение переменной. |
| **Переменная** | Указывается имя переменной.                                        |

### Условие <a href="#condition" id="condition"></a>

![Условие](/files/-M52GkOK1oWsfAXMdhud)

Разделение выполнения программы в соответствии с заданным условием.

У данного блока должны быть две исходящие связи, у хотя бы одной из которых должно быть задано значение параметра «Условие»: «истина» или «ложь».

#### Свойства

| Свойство    | Описание                                                                                                                                                                                                                         |
| ----------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Условие** | Указывается логическое выражение (подробнее см. в статье «[Синтаксис выражений](/trik-studio-junior/programming/expression-syntax)»), на основе значения которого будет осуществлен выбор дальнейшего пути выполнения диаграммы. |

### Конец условия <a href="#endif" id="endif"></a>

![Конец условия](/files/-M52KB8mgduTmYlRxiRx)

Обозначает слияние двух веток условного оператора.\
\
Никаких действий не выполняет, но полезен для обеспечения структурности программы. Если придерживаться правила, что все ветки операторов «[Условие](/trik-studio-junior/programming/blocks#condition-1)» или «[Выбор](/trik-studio-junior/programming/blocks#switch)» сходятся на таком блоке, это существенно повысит шансы на то, что генератор сможет породить код на текстовом языке без операторов `goto`.

### Цикл с предусловием <a href="#while" id="while"></a>

![Цикл с предусловием](/files/-M56XvGyWTEuEwuTe1B-)

Цикл с предусловием — цикл, который выполняется пока истинно некоторое условие, указанное перед его началом. Это условие проверяется до выполнения тела цикла, поэтому тело может быть не выполнено ни разу (если условие с самого начала ложно).

#### Свойства

| Свойство    | Описание                                                                                                                                                                                                                         |
| ----------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Условие** | Указывается логическое выражение (подробнее см. в статье «[Синтаксис выражений](/trik-studio-junior/programming/expression-syntax)»), на основе значения которого будет осуществлен выбор дальнейшего пути выполнения диаграммы. |

### Цикл <a href="#loop" id="loop"></a>

![Цикл](/files/-M52KXNX1QV8AQO9p6NP)

Блок, организующий выполнение последовательности блоков несколько раз.\
\
Число повторений задается значением параметра «Итерации». Блок должен иметь две исходящие связи, одна из которых должна быть помечена значением «тело цикла» (то есть значение параметра «Условие» у связи должно быть «тело цикла»). Другая связь, исходящая из блока «Цикл», должна оставаться непомеченной: по ней будет осуществляться переход, когда программа пройдет через блок «Цикл» указанное число раз.\
\
Бесконечные циклы и циклы вида `while/do` и `while` организуются без использования этого блока, зацикливанием потока управления с помощью связей. Выход из такого цикла осуществляется с помощью блока «[Условие](/trik-studio-junior/programming/blocks#condition-1)».

### Выбор <a href="#switch" id="switch"></a>

![Выбор](/files/-M52KnJEFnfXE5uUu7JO)

Условие с несколькими альтернативами.\
\
В параметре «Выражение» можно указать произвольное выражение (подробнее см. в разделе «[Синтаксис выражений](/trik-studio-junior/programming/expression-syntax)»), на основе значения которого будет осуществлен выбор дальнейшего пути выполнения диаграммы.\
\
У данного блока должны быть несколько исходящих связей. Все связи, кроме одной, должны быть помечены элементарным значением (строка, число и др.), которое может принимать выражение (значение просто пишется в свойство «Условие» у связи). Одна из связей должна быть не помечена: по ней осуществляется переход, если выражение не равно ни одному из перечисленных значений.

### Выражение <a href="#expression" id="expression"></a>

![Выражение](/files/-M52KsPo2p59kJNESCHb)

Считает значение заданного выражения. Также допускается инициализация переменных.\
\
Подробнее про синтаксис допустимых выражений параметра «Выражение» см. в разделе «[Синтаксис выражений](/trik-studio-junior/programming/expression-syntax)».

### Подпрограмма <a href="#subprogram" id="subprogram"></a>

![Подпрограмма](/files/-M52L-mm_iShMyQud3XN)

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

#### Свойства

Изменение свойств у данного блока происходит не на панели «Редактор свойств», а с помощью пункта «Изменить свойства» в контекстном меню. Для вызова контекстного меню нажмите правой кнопкой мыши на блок «Подпрограмма».

![](/files/-M52oxM5_WQcSylPjaTA)

В открывшемся окне вы можете:

* Изменить имя подпрограммы.
* Добавить и изменить параметры подпрограммы, задав имя, тип и значение.
* Изменить картинку на иконке вашей подпрограммы.
* Изменить фон иконки подпрограммы.

![](/files/-M52p7BrXt1lx1OfmdrG)

### Черный ящик <a href="#black-box" id="black-box"></a>

![Черный ящик](/files/-MgBhz5N3-RQ1Pazb7Mu)

Блок «Черный ящик» используется для составления задач на поиск правила обработки информации.

#### Свойства блока

| Свойство              | Описание                                                                                                                                                            |
| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Количество переменных | В данном свойстве необходимо указать количество переменных, которые необходимо подать на вход. В подпрограмме должно использоваться такое же количество переменных. |

#### Как работает блок

На вход подается одно или несколько значений, на выходе выдается одно значение. Ученику необходимо понять, по какому правилу обрабатывается информация.

Само правило записывается в виде алгоритма «внутри» блока «Черный ящик». То есть по сути это подпрограмма, которую нельзя отредактировать после сохранения.

#### Алгоритм работы с блоком

1. Добавить блок «Черный ящик» на сцену.
2. Написать алгоритм подпрограммы «Черного ящика».
3. Указать в свойствах количество переменных.
4. В контекстном меню выбрать «Закрыть "Черный ящик"». После этого подпрограмму отредактировать будет нельзя.

![](/files/-Mi61uyzV5O8yCS4MS0p)

{% hint style="warning" %}
**Важно!** Если вы используете одну переменную в подпрограмме, то её имя должно быть **`input`**. Если вы используете несколько переменных, то **`input1`**,  **`input2`**, **`input3`** и т.д.

Выходная переменная должна именоваться **`output`**.
{% endhint %}

#### Пример

1\. Запрограммируем правило, по которому входные значения обрабатываются следующим образом:

`Результат = Переменная1 + Переменная2 + Переменная3`

2\. Добавим блок «Черный ящик» и напишем подпрограмму:

![](/files/-MgLHQTQpq5xvsFBt-5A)

3\. Главная диаграмма будет выглядеть так:

![](/files/-MgLHn0cU-xoK-V7q4Cl)

4\. «Закроем» блок и сохраним программу.

![](/files/-Mi61uyzV5O8yCS4MS0p)

5\. При выполнении программы и обработке блока «Чёрный ящик» появится окно:

![](/files/-Mi61-KxqXIsAU67-YMl)

6\. Введем все значения и нажмем кнопку «Выполнить».

![](/files/-Mi611x4cZtETPhN2Dcy)

7\. Далее можно вводить комбинации значений до тех пор, пока мы не установим правило обработки. Нажмем кнопку «Завершить».

![](/files/-Mi614K9cMAs4n39RRdR)

8\. После этого продолжиться выполнение алгоритма программы.

### Параллельные задачи <a href="#fork" id="fork"></a>

![Параллельные задачи](/files/-M52LDQmY_RasNqVr3U6)

Блок разделяет выполнение программы на несколько потоков. Например, можно одновременно ждать срабатывания сенсора и истечения временного интервала.\
\
Блок должен иметь хотя бы две исходящие связи.\
\
Чтобы иметь возможность далее ссылаться на параллельные задачи, порождённые этим блоком (например, в блоке «[Завершить задачу](/trik-studio-junior/programming/blocks#killthread)» или в блоке «[Слияние задач](/trik-studio-junior/programming/blocks#join)») надо дать задачам имена. Это делается на исходящих связях, в свойстве «Условие». Именем задачи может быть любая строка, но одним из имён должно быть имя задачи, которая входит в этот блок. Имя главной программы — `main`.

### Слияние задач <a href="#join" id="join"></a>

![Слияние задач](/files/-M52LJBYwI0c1iNCrqDa)

Блок слияния параллельных задач.\
\
Блокирует исполнение программы до тех пор, пока исполнение всех параллельных задач, входящих в этот блок, не достигнет этого блока.\
\
Блок должен иметь не менее двух входящих связей. На исходящей связи (в свойстве «Условие») должен быть идентификатор задачи, которая продолжится после того, как блок отработает.

### Завершить задачу <a href="#killthread" id="killthread"></a>

![Завершить задачу](/files/-M52LONenxOow_sNGfct)

Завершает задачу с указанным в свойстве «Задача» идентификатором. Должен применяться из другой задачи.

### Случайное число <a href="#random" id="random"></a>

![Случайное число](/files/-M52LSv1gTJFdqLsvskg)

Блок для присвоения указанной переменной случайного целого числа из заданного с помощью свойств «От» и «До» промежутка.

### Комментарий <a href="#comment" id="comment"></a>

![Комментарий](/files/-M52LZ4P_hrgfhAeOFxy)

Блок для добавления на диаграмму произвольного текста в качестве комментария.

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

При выполнении программы блок не учитывается.

## Блоки действия <a href="#action-blocks" id="action-blocks"></a>

| Вид                                                                 |                                            Название                                           | Описание                                                                      |
| ------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------: | ----------------------------------------------------------------------------- |
| <img src="/files/-M57QXJiHc6qgZIyiPRg" alt="" data-size="original"> | [Отправить сообщение в задачу](/trik-studio-junior/programming/blocks#send-message-to-thread) | Отправляет данное сообщение в параллельную задачу с заданным идентификатором. |
| <img src="/files/-M57QaGyasyjni8VQga5" alt="" data-size="original"> |         [Получить код кнопки](/trik-studio-junior/programming/blocks#get-button-code)         | Сохраняет в указанную переменную код нажатой на роботе кнопки.                |
| <img src="/files/-Ma3odAxmFJ748-dCByG" alt="" data-size="original"> |               [Вперед](/trik-studio-junior/programming/blocks#get-button-code-1)              | Перемещает «Исполнителя» на указанное количество клеток вперед.               |
| <img src="/files/-Ma3ohiRCPN8k3UaWQtv" alt="" data-size="original"> |               [Назад](/trik-studio-junior/programming/blocks#get-button-code-2)               | Перемещает «Исполнителя» на указанное количество клеток назад.                |
| <img src="/files/-Ma3okCcMKH0KKGaWhTp" alt="" data-size="original"> |              [Направо](/trik-studio-junior/programming/blocks#get-button-code-3)              | Поворачивает «Исполнителя» направо.                                           |
| <img src="/files/-Ma3omtYBu-QE92p0m1T" alt="" data-size="original"> |               [Налево](/trik-studio-junior/programming/blocks#get-button-code-4)              | Поворачивает «Исполнителя» налево.                                            |
| <img src="/files/-M57R81udW81QciRNj1T" alt="" data-size="original"> |                     [Сказать](/trik-studio-junior/programming/blocks#say)                     | Произнести с помощью динамика фразу, переданную в качестве аргумента блока.   |
| <img src="/files/-M57RAxT3_G5--akNH4A" alt="" data-size="original"> |                    [Светодиод](/trik-studio-junior/programming/blocks#led)                    | Установить указанный цвет светодиода на корпусе контроллера.                  |

### Отправить сообщение в задачу <a href="#send-message-to-thread" id="send-message-to-thread"></a>

![Отправить сообщение в задачу](/files/-M583uRjOrCpHJIplt5t)

Отправляет данное сообщение в параллельную задачу с заданным идентификатором (идентификатор должен быть указан при создании задачи в блоке [«Параллельные задачи»](/trik-studio-junior/programming/blocks#fork)).\
\
В качестве сообщения может быть любое выражение.

### Получить код кнопки <a href="#get-button-code" id="get-button-code"></a>

![Получить код кнопки](/files/-M584J92w9wcfy3VMYoh)

Сохраняет в указанную переменную код нажатой на роботе кнопки.\
\
Свойство «Ожидание» позволяет дождаться или не дожидаться, когда кнопка действительно будет нажата. Если нажатия кнопки блок не дожидается и кнопка не нажата, переменной присваивается значение «-1».

### Вперед <a href="#get-button-code" id="get-button-code"></a>

![](/files/-Ma3o0TXygBp2DEVAYMH)

Перемещает «Исполнителя» на указанное количество клеток вперед.\
\
Свойство «Количество» позволяет задать количество клеток, на которое должен переместиться «Исполнитель».

### Назад <a href="#get-button-code" id="get-button-code"></a>

![](/files/-Ma3oDE7LO-fPEzgMzLi)

Перемещает «Исполнителя» на указанное количество клеток назад.\
\
Свойство «Количество» позволяет задать количество клеток, на которое должен переместиться «Исполнитель».

### Направо <a href="#get-button-code" id="get-button-code"></a>

![](/files/-Ma3oFilly5347GyE49T)

Поворачивает «Исполнителя» направо.

### Налево <a href="#get-button-code" id="get-button-code"></a>

![](/files/-Ma3oHvZ-ARsL6XBqBRw)

Поворачивает «Исполнителя» налево.

### Сказать <a href="#say" id="say"></a>

![Сказать](/files/-M584kOl1brqm1u53t25)

Произнести с помощью динамика фразу, переданную в качестве аргумента блока.

### Светодиод <a href="#led" id="led"></a>

![Светодиод](/files/-M584nGic6Z3JYwk5tGl)

Установить указанный цвет светодиода на корпусе контроллера.

## Блоки ожидания <a href="#waiting-blocks" id="waiting-blocks"></a>

|                                 Вид                                 |                                                  Название                                                 | Описание                                                                                          |
| :-----------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------: | ------------------------------------------------------------------------------------------------- |
| <img src="/files/-M52DuigeGV1EK8nyKWK" alt="" data-size="original"> |                          [Таймер](/trik-studio-junior/programming/blocks#timer-1)                         | Блок для задания задержки. Устанавливается время задержки в параметре «Задержка» в миллисекундах. |
| <img src="/files/-M57ypVi6IEo1RijFtkO" alt="" data-size="original"> | [Получить сообщение из другой задачи](/trik-studio-junior/programming/blocks#receive-message-from-thread) | Ждать получения сообщения из другой параллельной задачи.                                          |
|                   ![](/files/-MHFotHDB2zv6DZZh-ty)                  |                 [Пользовательский ввод](/trik-studio-junior/programming/blocks#userinput)                 | Ждать ввода значения от пользователя.                                                             |
| <img src="/files/-M57zo5QhGbG1jYYl-bW" alt="" data-size="original"> |               [Ждать нажатия кнопки](/trik-studio-junior/programming/blocks#wait-for-button)              | Ждать, пока не будет нажата указанная кнопка на корпусе робота.                                   |

### Таймер <a href="#timer" id="timer"></a>

![Таймер](/files/-M52LdZ1Mgsla1mOJRGx)

Блок для задания задержки. Устанавливается время задержки в параметре «Задержка» в миллисекундах.&#x20;

### Получить сообщение из другой задачи <a href="#receive-message-from-thread" id="receive-message-from-thread"></a>

![Получить сообщение из другой задачи](/files/-M587b6vLBc_UZlx81sw)

Ждать получения сообщения из другой параллельной задачи.\
\
Когда сообщение будет получено, оно будет присвоено указанной в блоке переменной.\
\
Свойство «Дождаться сообщения» позволяет указать, что делать, если очередь сообщений пуста: дождаться прихода нового сообщения или продолжить работу, присвоив переменной пустую строку.\
\
Сообщение автоматически приводится к типу, соответствующему типу переменной-приёмника. Пример: если вы посылаете число в виде строки, то оно будет принято как число.

### Пользовательский ввод <a href="#userinput" id="userinput"></a>

![Пользовательский ввод](/files/-MHFoZWxXEMPetF10goi)

Ждать ввода значения от пользователя. После ввода значение будет присвоено указанной в блоке переменной.

#### Свойства

Блок «Пользовательский ввод» имеет 3 свойства:

| Свойство         | Описание                          |
| ---------------- | --------------------------------- |
| **Переменная**   | Имя переменной.                   |
| **По умолчанию** | Значение переменной по умолчанию. |
| **Текст**        | Описание поля ввода.              |

**Пример**

| **Программа**                                                | Исполнение программы                                         |
| ------------------------------------------------------------ | ------------------------------------------------------------ |
| <p></p><p><img src="/files/-MHFu3BiOxwlNUiB9itw" alt=""></p> | <p></p><p><img src="/files/-MHFu8R6EJhWeXYr84xh" alt=""></p> |

### Ждать нажатия кнопки <a href="#wait-for-button" id="wait-for-button"></a>

![Ждать нажатия кнопки](/files/-M587I3TRtlzluXsZfN0)

Ждать, пока не будет нажата указанная кнопка на корпусе робота.

## Блоки рисования

| Вид                                                                 |                                      Название                                     | Описание                                                                                                                                                                                                         |
| ------------------------------------------------------------------- | :-------------------------------------------------------------------------------: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <img src="/files/-M5818T918Net1_b0IuL" alt="" data-size="original"> |       [Очистить экран](/trik-studio-junior/programming/blocks#clear-screen)       | Стереть всё, что нарисовано на экране.                                                                                                                                                                           |
| <img src="/files/-M52DxVJLFYL1Ctlh0tw" alt="" data-size="original"> |        [Опустить маркер](/trik-studio-junior/programming/blocks#markerdown)       | Начать рисование маркером заданного цвета на полу. При движении «Исполнителя» за ним будет оставаться цветная линия.                                                                                             |
| <img src="/files/-M52DzUtqMNkpm5w20WK" alt="" data-size="original"> |         [Поднять маркер](/trik-studio-junior/programming/blocks#markerup)         | Закончить рисование маркером.                                                                                                                                                                                    |
| <img src="/files/-MgL82YdneFM7IV4JlZN" alt="" data-size="original"> |          [Закрасить клетку](/trik-studio-junior/programming/blocks#fill)          | Закрасить клетку, на которой находится «Исполнитель».                                                                                                                                                            |
| <img src="/files/-M5814kvOBCqnro2Pdw5" alt="" data-size="original"> |       [Напечатать текст](/trik-studio-junior/programming/blocks#print-text)       | Печатает заданную строку в заданном месте на экране робота. Значение свойства «Текст» по умолчанию трактуется как строка в чистом виде, оно так и будет выведено на экран.                                       |
| <img src="/files/-M580iWSqeTAQwq3hWB3" alt="" data-size="original"> |         [Цвет кисти](/trik-studio-junior/programming/blocks#painter-color)        | Указать цвет, которым будут рисоваться простые графические фигуры на экране робота.                                                                                                                              |
| <img src="/files/-M580kkbRdA4q-cb10MU" alt="" data-size="original"> |       [Толщина кисти](/trik-studio-junior/programming/blocks#painter-width)       | Указать ширину линии, которой будут рисоваться простые графические фигуры на экране робота.                                                                                                                      |
| <img src="/files/-M580nHEEuZ2xfB8PA8Y" alt="" data-size="original"> |       [Нарисовать точку](/trik-studio-junior/programming/blocks#draw-pixel)       | Нарисовать на экране точку в указанных координатах.                                                                                                                                                              |
| <img src="/files/-M580r3HM3j4oEEU2KcL" alt="" data-size="original"> |        [Нарисовать линию](/trik-studio-junior/programming/blocks#draw-line)       | Нарисовать на экране отрезок. В качестве параметров блоку указываются концы отрезка.                                                                                                                             |
| <img src="/files/-M580pC_bqwcbeEbnung" alt="" data-size="original"> | [Нарисовать прямоугольник](/trik-studio-junior/programming/blocks#draw-rectangle) | Нарисовать на экране прямоугольник. В качестве параметров указываются координаты левого верхнего угла, ширина и высота прямоугольника.                                                                           |
| <img src="/files/-M580tMbl4I0nHUrz9s9" alt="" data-size="original"> |      [Нарисовать эллипс](/trik-studio-junior/programming/blocks#draw-ellipse)     | Нарисовать на экране эллипс, вписанный в заданный прямоугольник.                                                                                                                                                 |
| <img src="/files/-M580vdpu51HDgOGV-RD" alt="" data-size="original"> |         [Нарисовать дугу](/trik-studio-junior/programming/blocks#draw-arc)        | Нарисовать на экране дугу, заданную координатами прямоугольника, в который она будет вписана, и углами (в градусах) её начала и конца на окружности. Если начало и конец совпадают, будет нарисована окружность. |
| <img src="/files/-M580yAPcSOa8aWR-nZA" alt="" data-size="original"> |              [Смайлик](/trik-studio-junior/programming/blocks#smile)              | Нарисовать на экране смайлик.                                                                                                                                                                                    |
| <img src="/files/-M581-PnAitsHQgnhcDE" alt="" data-size="original"> |        [Грустный смайлик](/trik-studio-junior/programming/blocks#sad-smile)       | Нарисовать на экране грустный смайлик.                                                                                                                                                                           |
| <img src="/files/-M5812dbsuVMqpcwmSPm" alt="" data-size="original"> |        [Цвет фона](/trik-studio-junior/programming/blocks#background-color)       | Задаёт цвет фона экрана.                                                                                                                                                                                         |

### Очистить экран <a href="#clear-screen" id="clear-screen"></a>

![Очистить экран](/files/-M588KBGD8M1LWAwR_li)

Стереть всё, что нарисовано на экране.

### Опустить маркер <a href="#markerdown" id="markerdown"></a>

![Опустить маркер](/files/-M52Llr3ZNfgbefFMyn6)

Начать рисование маркером заданного цвета на полу. При движении «Исполнителя» за ним будет оставаться цветная линия.

### Поднять маркер <a href="#markerup" id="markerup"></a>

![Поднять маркер](/files/-M52LprAEjenhdhiERjI)

Закончить рисование маркером.

### Закрасить клетку <a href="#fill" id="fill"></a>

![](/files/-MgL8BXjDNi2pPcW1S9J)

Закрасить клетку, на которой находится «Исполнитель», выбранным цветом. Цвет выбирается в свойствах блоках в выпадающем меню.

#### Свойства

| Свойство  | Описание                                                                                                   |
| --------- | ---------------------------------------------------------------------------------------------------------- |
| Цвет      | Цвет, которым будет закрашиваться клетка.                                                                  |
| Вычислять | <p>Истина — печатает в клетке значение переменной или выражения.</p><p>Ложь — печатает в клетке текст.</p> |
| Текст     | Текст / имя переменной (выражение) для вывода в клетке.                                                    |

### Напечатать текст <a href="#print-text" id="print-text"></a>

![Напечатать текст](/files/-M588IPKZ_dNh7NmOk9-)

Печатает заданную строку в заданном месте на экране робота.

#### Свойства

| Свойство          | Значение                                                                                              |
| ----------------- | ----------------------------------------------------------------------------------------------------- |
| Вычислять         | <p>Истина — вывод на экран значения переменной или выражения.</p><p>Ложь — вывод на экран текста.</p> |
| Текст             | Текст / имя переменной (выражение) для вывода на экран.                                               |
| Обновить картинку | <p>Истина — обновить экран.<br>Ложь — не обновлять экран.</p>                                         |
| X, Y              | Координаты начала текста.                                                                             |

#### Как вывести текст на экран?

Для вывода текста:

1. В свойстве «Текст» напишите нужный текст.
2. Уберите галочку в свойстве «Вычислять».

#### Как вывести значение переменной на экран?

Для вывода значения переменной:

1. В свойстве «Текст» напишите имя переменной.
2. Поставьте галочку в свойстве «Вычислять».

### Цвет кисти <a href="#painter-color" id="painter-color"></a>

![Цвет кисти](/files/-M587toEF8-BoaHIzvny)

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

### Толщина кисти <a href="#painter-width" id="painter-width"></a>

![Ширина кисти](/files/-M587va0sqyrwp6gAlfd)

Указать ширину линии, которой будут рисоваться простые графические фигуры на экране робота.

### Нарисовать точку <a href="#draw-pixel" id="draw-pixel"></a>

![Нарисовать точку](/files/-M587xh14MetvhWCPlAW)

Нарисовать на экране точку в указанных координатах.

### Нарисовать линию <a href="#draw-line" id="draw-line"></a>

![Нарисовать линию](/files/-M587zY89sIny2uEiT9H)

Нарисовать на экране отрезок. В качестве параметров блоку указываются концы отрезка.

### Нарисовать прямоугольник <a href="#draw-rectangle" id="draw-rectangle"></a>

![Нарисовать прямоугольник](/files/-M5880LQSXqGtFcxaM63)

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

### Нарисовать эллипс <a href="#draw-ellipse" id="draw-ellipse"></a>

![Нарисовать эллипс](/files/-M5882RNQ_qc7GRcY0aQ)

Нарисовать на экране эллипс, вписанный в заданный прямоугольник.

### Нарисовать дугу <a href="#draw-arc" id="draw-arc"></a>

![Нарисовать дугу](/files/-M58860UAVYhHUnttrW6)

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

### Смайлик <a href="#smile" id="smile"></a>

![Смайлик](/files/-M5888W2NZjgbWIXO_Ra)

Нарисовать на экране смайлик.

### Грустный смайлик <a href="#sad-smile" id="sad-smile"></a>

![Грустный смайлик](/files/-M588AfNbHIM1rJapqM6)

Нарисовать на экране грустный смайлик.

### Цвет фона <a href="#background-color" id="background-color"></a>

![Цвет фона](/files/-M588GN40A8ngsrNEaso)

Задаёт цвет фона экрана.


# Связи между блоками в TRIK Studio Junior

Связи между блоками в TRIK Studio Junior обозначают направление передачи управления между блоками.

#### Пример

Пусть необходимо, чтобы вслед за задержкой программа сразу же завершилась.\
\
Для этого надо соединить блоки [«Таймер»](/trik-studio-junior/programming/blocks#timer) и [«Конец»](/trik-studio-junior/programming/blocks#final) стрелкой, имеющей направление от блока «Таймер» к блоку завершения программы.

![](/files/-M53ZWO6oyd2e0Ul4k5j)

Создание и удаление связей в TRIK Studio Junior происходит так же, как и в TRIK Studio:

{% content-ref url="/pages/-M0P0btKnPxiAbzdGpjw" %}
[Связи между блоками](/studio/programming-visual/connection-between-blocks)
{% endcontent-ref %}


# Синтаксис выражений в блоках в TRIK Studio Junior

Синтаксис выражений в блоках в TRIK Studio Junior аналогичен синтаксису выражиний в блоках TRIK Studio:

{% content-ref url="/pages/-M0P0kE4EwB9x-p35xad" %}
[Синтаксис выражений в блоках](/studio/programming-visual/expression-syntax)
{% endcontent-ref %}


# Редактирование свойств элементов в TRIK Studio Junior

Редактирование свойств элементов в TRIK Studio Junior аналогичен редактированию свойств элементов в TRIK Studio:

{% content-ref url="/pages/-M0P0qQgiJrqVGvF1drs" %}
[Редактирование свойств элементов](/studio/programming-visual/editing-element-properties)
{% endcontent-ref %}


# Подпрограммы в TRIK Studio Junior

Любую программу в TRIK Studio Junior можно сохранить как подпрограмму и использовать в другой программе.

Работа с подпрограммами в TRIK Studio Junior аналогична работе с подпрограммами в TRIK Studio:

{% content-ref url="/pages/-M0P0uMo74LbuO5OSe3E" %}
[Подпрограммы](/studio/programming-visual/subprograms)
{% endcontent-ref %}


# Упражнения в TRIK Studio Junior

Упражнение — это обычная программа, в которой нельзя модифицировать некоторые части решения. То есть любую диаграмму можно сохранить как упражнение для учеников (если она еще не является таковой).

Создание и загрузка упражнений в TRIK Studio Junior происходит таким же образом, как и в TRIK Studio:

{% content-ref url="/pages/-M0Npx\_AtJlxUbHcH-l8" %}
[Упражнения](/studio/exercises)
{% endcontent-ref %}


# PyCharm

TRIK Studio можно интегрировать с внешней средой программирования [PyCharm](https://www.jetbrains.com/ru-ru/pycharm/).

Это позволит опытным пользователям TRIK Studio использовать все возможности профессиональных текстовых редакторов и их плагинов:

* статические анализаторы,
* автоформаттеры,
* цветовые темы.

О том, как интегрировать PyCharm с TRIK Studio читайте в статьях:

{% content-ref url="/pages/-M8zBTscPPKk3gu9TP4C" %}
[Запуск 2D-модели в TRIK Studio из PyCharm](/integrations/pycharm/running-2d-model-in-trik-studio-from-pycharm)
{% endcontent-ref %}


# Запуск 2D-модели в TRIK Studio из PyCharm

В данной статье рассматривается настройка и использование внешней среды программирования **PyCharm** для вызова программ в [2D-модели](/studio/2d-model) TRIK Studio. &#x20;

Это позволит опытным пользователям TRIK Studio использовать все возможности профессиональных текстовых редакторов и их плагинов: статические анализаторы, автоформаттеры, цветовые темы.

Также рассказывается как автоматически запускать программу на нескольких полях, что может быть полезно участникам соревнований с автоматизированными системами проверки (например, [Олимпиады НТИ ИРС](https://trikset.com/education/nti)).

## **Подготовка** <a href="#configure" id="configure"></a>

Предполагается, что пользователь пишет программу во внешнем редакторе и хотел бы запустить данную программу на одном или нескольких полях. Поля могут быть представлены как в формате `.xml` (подробнее в статье [«Гибкая настройка 2D-модели»](/studio/2d-model/settings)), так и в формате `.qrs`.

1. Скачайте файл [run\_2d\_model.cmd](https://gist.github.com/anastasiia-kornilova/2b955e62c3cef7a509fc043a189ea3ff) для Windows или [run\_2d\_model.sh](https://gist.github.com/anastasiia-kornilova/f13a708562debabeeb126381f3d535e5) для Linux и поместите его в папку, в которой установлена TRIK Studio.
2. Поместите поля, на которых необходимо тестировать программу, в отдельную папку. Если поля представлены в формате `.xml`, создайте в данной папке пустой проект `default.qrs`.

## Настройка PyCharm

{% hint style="danger" %}
Инструкция протестирована на PyCharm Professional Edition (2019.3).\
Скачать PyCharm можно на [официальном сайте](https://www.jetbrains.com/ru-ru/pycharm/).
{% endhint %}

1\. Откройте папку с исходным кодом в **PyCharm** c помощью `File → Open`.

2\. Выберите `File → Settings` или нажмите комбинацию клавиш `«Ctrl+Alt+S»`.

![](/files/-MA5wRatQkZhWoQENd7a)

3\. Выберите `Tools → External tools` и нажмите на значок `«+»`.

![](/files/-MA5weBwonLK9G7Y2mWS)

4\.  В поле `Name` введите желаемое имя тула, например, `«run_2d_model»`. В открывшимся окне подставьте в поле `Program` свой путь к файлу `run_2d_model.cmd`. В поле `Arguments` впишите параметры `$FileDir$` и `$FileName$` или выберите `Insert Macros` и выберите из списка нужные параметры. В поле `Working Directory` впишите `$FileDir$` или выберите `Insert Macros` и выберите нужный параметр. Нажмите кнопку `«ОК»`.

![](/files/-MA5xrU4JNBSNSLquo4Z)

![](/files/-MA5xuqTMx5O2SvHl3sg)

5\. Для того чтобы запустить код, выберите `Tools→ External tools` и `run_2d_model` (либо свое название, выбранное ранее).

![](/files/-MA5y6IAlrwEVFaQFCx0)

6\. Для добавления «горячих клавиш» выберите `File → Settings` или нажмите комбинацию клавиш `«Ctrl+Alt+S»`. В открывшемся меню выберите вкладку `Keymap` и перейдите к созданному external tool. Нажмите на `run_2d_model` правой кнопкой мыши, выберите `Add Keyboard Shortcut`.

![](/files/-MA5ycMos41o2UvuSYFl)

7\. В открывшемся окне введите желаемое сочетание клавиш для вызова тула и нажмите кнопку `«ОК»`.

![](/files/-MA5yscOgxWd-21J1579)

8\. Теперь для запуска кода достаточно нажать выбранное сочетание (в данном случае `Shift+B`, но возможно выбрать любое другое).

{% hint style="danger" %}
В случае возникновения ошибки выберите `Settings → Tools → Terminal` и введите свой путь к файлу cmd.exe (`shell path`). Затем нажмите `Apply`.
{% endhint %}

![](/files/-MA5zDB4qtdPCPLvpNRh)


# Sublime Text

TRIK Studio можно интегрировать с внешней средой программирования [**Sublime Text**](https://www.sublimetext.com/)**.**

Это позволит опытным пользователям TRIK Studio использовать все возможности профессиональных текстовых редакторов и их плагинов:

* статические анализаторы,
* автоформаттеры,
* цветовые темы.

О том, как интегрировать Sublime с TRIK Studio читайте в статьях:

{% content-ref url="/pages/-M-9r9lpF56YS-4Tt-H-" %}
[Запуск 2D-модели в TRIK Studio из Sublime Text](/integrations/sublime/run-2d-from-sublime)
{% endcontent-ref %}

{% content-ref url="/pages/-M24zrEio-\_V1IGUBBKh" %}
[Загрузка программ на нескольких роботов ТРИК из Sublime Text](/integrations/sublime/loading-programs-on-several-robots)
{% endcontent-ref %}


# Запуск 2D-модели в TRIK Studio из Sublime Text

В данной статье рассматривается настройка и использование внешней среды программирования **Sublime Text** для вызова программ в [2D-модели](/studio/2d-model) TRIK Studio. &#x20;

Это позволит опытным пользователям TRIK Studio использовать все возможности профессиональных текстовых редакторов и их плагинов: статические анализаторы, автоформаттеры, цветовые темы.

Также рассказывается как автоматически запускать программу на нескольких полях, что может быть полезно участникам соревнований с автоматизированными системами проверки (например, [Олимпиады НТИ ИРС](https://trikset.com/education/nti)).

## **Подготовка** <a href="#configure" id="configure"></a>

Предполагается, что пользователь пишет программу во внешнем редакторе и хотел бы запустить данную программу на одном или нескольких полях. Поля могут быть представлены как в формате `.xml` (подробнее в статье [«Гибкая настройка 2D-модели»](/studio/2d-model/settings)), так и в формате `.qrs`.

1. Скачайте файл [run\_2d\_model.cmd](https://gist.github.com/anastasiia-kornilova/2b955e62c3cef7a509fc043a189ea3ff) для Windows или [run\_2d\_model.sh](https://gist.github.com/anastasiia-kornilova/f13a708562debabeeb126381f3d535e5) для Linux и поместите его в папку, в которой установлена TRIK Studio.
2. Поместите поля, на которых необходимо тестировать программу, в отдельную папку. Если поля представлены в формате `.xml`, создайте в данной папке пустой проект `default.qrs`.

## Настройка **Sublime Text**

{% hint style="warning" %}
Инструкция протестирована на Sublime Text 3 (Build 3211).\
Скачать Sublime Text можно на [официальном сайте](https://www.sublimetext.com/).
{% endhint %}

1\. Откройте **Sublime Text**.

2\. Выберите `Tools → Build System → New Build System`. &#x20;

![](/files/-M-zUTeDk6alulBRq26a)

3\. Откроется окно с текстовым файлом. В нем необходимо всё стереть и вставить вместо этого следующий код, где `<path to field dir>` — полный путь к папке с полями:

```javascript
{
"cmd": ["D:\\TRIKStudio\\run_2d_model.cmd", “<path to fields dir>”, "$file"],
"selector": "source.js",
"encoding": "windows-1251"
}
```

4\. В зависимости от вашей операционной системы отредактируйте этот файл:

* Для Linux необходимо подставить свой путь к файлу `run_2d_model.sh` вместо указанного в коде. Например:\
  `"cmd": ["/home/admin/TRIKStudio/run_2d_model.sh", “/home/admin/fields/”, "$file"]`
* Для Windows необходимо подставить свой путь к файлу `run_2d_model.cmd` вместо указанного в коде. Например:\
  `"cmd": ["D:\TRIKStudio\run_2d_model.cmd", "D:\Users\Admin\fields", "$file"]`

![](/files/-M-zVQWFacIluqJ9tFdQ)

5\. Сохраните этот текстовый файл в предлагаемой директории\
*`<папка с системными файлами>\Sublime Text 3\Packages\User`*\
под именем `TRIK.sublime-build`.

6\. Откройте ваш исходный код в **Sublime Text**. Для его запуска достаточно нажать `Tools → Build` или соответствующую комбинацию клавиш (**Ctrl+B**).

{% hint style="success" %}
За предложение добавить данную функциональность команда проекта ТРИК благодарит участника Олимпиады НТИ ИРС 2018—2020 гг. **Александра Журавлева**.
{% endhint %}


# Загрузка программ на нескольких роботов ТРИК из Sublime Text

В данной статье рассматривается возможность одновременной загрузки программ на группу роботов с использованием внешнего текстового редактора **Sublime Text**. Статья является продолжением материала

{% content-ref url="/pages/-M-9r9lpF56YS-4Tt-H-" %}
[Запуск 2D-модели в TRIK Studio из Sublime Text](/integrations/sublime/run-2d-from-sublime)
{% endcontent-ref %}

## Настройка

Скачайте файл [send\_files.cmd](https://gist.github.com/anastasiia-kornilova/e1344f658a91449cf16217ec03147a18) для Windows и поместите его в папку, в которую установлена TRIK Studio.

{% hint style="warning" %}
Инструкция протестирована на Sublime Text 3 (Build 3211).\
Скачать Sublime Text можно на [официальном сайте](https://www.sublimetext.com/).
{% endhint %}

Перед первым запуском программы необходимо зайти на контроллер ТРИК через WinSCP. Инструкция о том, как это сделать, доступна по [ссылке](/studio/utilities/winscp). После этого WinSCP запомнит, что было разрешено устанавливать соединение с этим роботом и не будет требовать подтверждений. Это действие необходимо повторять при подключении каждого нового контроллера.

1\. Откройте Sublime Text.

2\. Выберите `Tools → Build System → New Build System`

![](/files/-M256_16md-PrAA3qsUw)

3\. Откроется окно с текстовым файлом. В нем необходимо всё стереть и вставить вместо этого следующий код:

```javascript
{
"cmd": ["D:\\TRIKStudio\\send_filesl.cmd", “<path to scripts dir>”, "<file with ip addresses>"],
"selector": "source.js"
}
```

Здесь:

* `<path to scripts dir>` — полный путь к папке с программами, которые необходимо загрузить на роботов, &#x20;
* `<file with ip addresses>` — название файла `.txt`, в котором содержатся ip-адреса роботов для загрузки файлов. Каждый ip-адрес на новой строке. Файл с ip-адресами роботов должен находиться в той же папке, что и отправляемые программы.

4\. Укажите свой путь к файлу `send_files.cmd` вместо указанного в коде. Например:

```javascript
"cmd": ["C:\\TRIKStudio\\send_files.cmd", "C:\\Users\\Admin\\myfiles", "ip_addr.txt"]
```

![](/files/-M256c_quDxxUm1XqIVL)

5\. Сохраните этот текстовый файл в предлагаемой директории `<папка с системными файлами>\Sublime Text 3\Packages\User` под именем `TRIK_SEND.sublime-build`.

6\. Выберите `Tools → Build System` и в открывшемся списке выберите `TRIK_send`.

![](/files/-M256hbb5D56Pm5yQWwu)

7\. Для начала отправки программ на роботов достаточно нажать `Tools → Build` или соответствующую комбинацию клавиш `Ctrl+B`. Для того чтобы вернуться к [запуску 2D-модели](/integrations/sublime/run-2d-from-sublime), необходимо выбрать `Tools → Build System` и в открывшемся списке выбрать `TRIK`.

![](/files/-M256qUuNXoo5j2HSCaP)


# VSCode

TRIK Studio можно интегрировать с внешней средой программирования [**VSCode**](https://code.visualstudio.com/)**.**

Это позволит опытным пользователям TRIK Studio использовать все возможности профессиональных текстовых редакторов и их плагинов:

* статические анализаторы,
* автоформаттеры,
* цветовые темы.

О том, как интегрировать VSCode с TRIK Studio читайте в статьях:

{% content-ref url="/pages/-M5NmrJb6XSWgG0F9tF0" %}
[Запуск 2D-модели в TRIK Studio из VSCode](/integrations/vscode/run-2d-from-vscode)
{% endcontent-ref %}

{% content-ref url="/pages/-M5Nmx47xW0tCtjw5wGg" %}
[Загрузка программ на нескольких роботов ТРИК из VSCode](/integrations/vscode/loading-programs-on-several-robots)
{% endcontent-ref %}


# Запуск 2D-модели в TRIK Studio из VSCode

В данной статье рассматривается настройка и использование внешней среды программирования **VSCode** для вызова программ в [2D-модели](/studio/2d-model) TRIK Studio.&#x20;

Это позволит опытным пользователям TRIK Studio использовать все возможности профессиональных текстовых редакторов и их плагинов: статические анализаторы, автоформаттеры, цветовые темы.

Также рассказывается как автоматически запускать программу на нескольких полях, что может быть полезно участникам соревнований с автоматизированными системами проверки (например, [Олимпиады НТИ ИРС](https://trikset.com/education/nti)).

## **Подготовка** <a href="#configure" id="configure"></a>

Предполагается, что пользователь пишет программу во внешнем редакторе и хотел бы запустить данную программу на одном или нескольких полях. Поля могут быть представлены как в формате `.xml` (подробнее в статье [«Гибкая настройка 2D-модели»](/studio/2d-model/settings)), так и в формате `.qrs`.

1. Скачайте файл [run\_2d\_model.cmd](https://gist.github.com/anastasiia-kornilova/2b955e62c3cef7a509fc043a189ea3ff) для Windows или [run\_2d\_model.sh](https://gist.github.com/anastasiia-kornilova/f13a708562debabeeb126381f3d535e5) для Linux и поместите его в папку, в которой установлена TRIK Studio.
2. Поместите поля, на которых необходимо тестировать программу, в отдельную папку. Если поля представлены в формате `xml`, создайте в данной папке пустой проект `default.qrs`.

{% hint style="warning" %}
Инструкция протестирована на январском релизе 2020 года (version 1.42).\
Скачать VSCode можно на [официальном сайте](https://code.visualstudio.com/Download).
{% endhint %}

## Настройка **VSCode**

1\. Создайте папку, в которой будет находиться файл с исходным кодом.

2\.  Откройте эту папку в **VSCode** c помощью `File → Open Folder`.

3\.  Вызовите `Terminal → Configure Tasks`.

![](/files/-M-zXDTkh2QJUm2SkEBd)

4\. Если ранее задач не было, то выберите в выпадающем меню `Create tasks.json file from template → Others`. Откроется файл `tasks.json`. \
Если tasks были созданы ранее, он откроется сразу после пункта 3.

![](/files/-M-zXVq6P8LeZLRph-VE)

5\. Удалите всё из этого файла и вставьте данный код, где `<path to field dir>` — полный путь к папке с полями:

```javascript
{
"version": "2.0.0",
	"tasks": [ {
		"label": "Run TRIK 2D model",
		"type": "shell",
		"command": "/home/admin/TRIKStudio/run_2d_model.sh" <path to fields dir> script.js",
		"windows": {
			"command": "D:\\TRIKStudio\\run_2d_model.cmd  <path to fields dir> script.js"
		},
		"group": "test",
		"presentation": {
			"reveal": "always",
			"panel": "new"
		}
	}]
}
```

6\. В зависимости от вашей операционной системы отредактируйте файл `tasks.json`:

* Для Linux необходимо в строке, соответствующей полю `"command"`, указать путь к отредактированному `run_2d_model.sh` и третьим аргументом указать файл вашего исходного кода. Данный файл должен находиться в папке, которую мы открыли с помощью **VSCode**. Например: `"command": "/home/admin/TRIKStudio/run_2d_model.sh /home/admin/fields/ script.js"`
* Для Windows необходимо в строке соответствующей полю `"windows": { "command"` указать путь к отредактированному `run_2d_model.cmd` и третьим аргументом указать файл вашего исходного кода. Данный файл должен находиться в папке, которую мы открыли с помощью **VSCode**. Например:\
  `"command": "D:\TRIKStudio\run_2d_model.cmd D:\Users\Admin\fields script.js"`

![](/files/-M-zbDm0X9qoFSDFBZtQ)

7\. Сохраните файл `tasks.json`.

8\. Теперь при нажатии `Terminal → Run Task` в выпадающем меню выберите`Run TRIK 2D model,` чтобы запустить ваш код, или соответствующую комбинацию клавиш (**Ctrl+Shift+B**).&#x20;

![](/files/-M-zbtjtSJFI3Mfp6AyO)

{% hint style="success" %}
За предложение добавить данную функциональность команда проекта ТРИК благодарит участника Олимпиады НТИ ИРС 2018—2020 гг. **Александра Журавлева**.
{% endhint %}


# Загрузка программ на нескольких роботов ТРИК из VSCode

В данной статье рассматривается возможность одновременной загрузки программ на группу роботов с использованием внешнего текстового редактора **VSCode**. Статья является продолжением материала

{% content-ref url="/pages/-M5NmrJb6XSWgG0F9tF0" %}
[Запуск 2D-модели в TRIK Studio из VSCode](/integrations/vscode/run-2d-from-vscode)
{% endcontent-ref %}

## Настройка

Скачайте файл [send\_files.cmd](https://gist.github.com/anastasiia-kornilova/e1344f658a91449cf16217ec03147a18) для Windows и поместите его в папку, в которую установлена TRIK Studio.

{% hint style="warning" %}
Инструкция протестирована на январском релизе 2020 года (version 1.42).\
Скачать VSCode можно на [официальном сайте](https://code.visualstudio.com/Download).
{% endhint %}

При первом запуске программы для установки соединения с роботом потребуется подтверждение от пользователя.

![](/files/-M290IhFU06XeTzCs3gN)

Чтобы разрешить соединение, введите в командной строке `Y` или `Yes`.

![](/files/-M290TE46pxYwWCFGIP9)

1\. Откройте папку с файлами, которые хотите отправить, в VSCode с помощью `File → Open Folder`.

2\. Вызовите `Terminal → Configure Tasks`.

![](/files/-M256yJEg2qAxD7sJmgO)

3\. Если ранее задач не было, то выберите в выпадающем меню `Create tasks.json file from template → Others`. Откроется файл `tasks.json`. Если tasks были созданы ранее, он откроется сразу после пункта 2.

![](/files/-M25723yFuYPBdcn_fSu)

4\. Удалите всё из этого файла и вставьте данный код:

```javascript
{
    "version": "2.0.0",
        "tasks": [ {
            "label": "Send files",
            "type": "shell",
            "windows": {
                "command": "C:\\TRIKStudio\\send_files.cmd  <path to scripts dir> <file with ip addresses>"
            },
            "group": "test",
            "presentation": {
                "reveal": "always",
                "panel": "new"
            }
        }]
}
```

Здесь:

* `<path to scripts dir>` — полный путь к папке с программами, которые необходимо загрузить на роботов,
* `<file with ip addresses>` — название файла `.txt`, в котором содержатся ip-адреса роботов для загрузки файлов. Каждый ip-адрес на новой строке.

5\. В строке, соответствующей полю `"windows": { "command"` укажите путь к файлу `send_files.cmd`. Файл с ip-адресами роботов должен находиться в той же папке, что и отправляемые программы. Например:

```javascript
"command": "C:\TRIKStudio\send_files.cmd C:\Users\Admin\myfiles ip_addr.txt"
```

![](/files/-M257UdbJQWMeCF6R9TY)

6\. Сохраните файл `tasks.json`.

7\. Теперь при нажатии `Terminal → Run Task` в выпадающем меню выбираем `Send files`, чтобы загрузить программы на роботов, или соответствующую комбинацию клавиш `Ctrl+Shift+B`.


# О контроллере ТРИК

**Контроллер ТРИК** — образовательная робототехническая платформа, разработанная командой опытных инженеров специально для робототехники.

[TRIK Studio](/studio/about) поддерживает данную платформу для [программирования](/trik/about#programmirovanie-kontrollera-trik).

![](/files/-M5XAKF1A-3WQFbUtwGI)

Контроллер ТРИК снабжён цветным сенсорным дисплеем, [программируемыми кнопками](/trik/programming-visual/sensory-variables) и Wi-Fi-модулем, который может работать в [двух режимах](/trik/wi-fi).

Контроллер ТРИК совместим с широким спектром периферийных [устройств](/trik/work-with-devices), имеет в своем составе все необходимое оборудование для управления двигателями постоянного тока и сервоприводами, а также для приема и обработки информации от цифровых и аналоговых датчиков, микрофонов, видеомодулей. На борту у контроллера имеются встроенные гироскоп и акселерометр.

Контроллер ТРИК поддерживает различные способы [подключения по Wi-Fi](/trik/wi-fi), [подключение и работу с внешними устройствами](/trik/work-with-devices).

{% hint style="info" %}
Подробную информацию о контроллере ТРИК смотрите на [сайте](https://trikset.com/products/trik-controller) производителя.
{% endhint %}

## Программирование контроллера ТРИК

Для программирования контроллера ТРИК выберите «ТРИК» в настройках TRIK Studio во вкладке [«Роботы»](/studio/interface/faq-robot-settings).

![](/files/-M5XEYw5Z2lcI584SyO3)

Используйте [специализированные](/trik/programming-visual/blocks) и [общие](/studio/programming-visual/blocks) блоки для написания программ на визуальном языке. Подробнее о визуальном программировании читайте в статье

{% content-ref url="/pages/-M0Npqc4WgYQzryDW1qz" %}
[Программирование на визуальном языке](/studio/programming-visual)
{% endcontent-ref %}

О текстовом программировании читайте в статье

{% content-ref url="/pages/-M0Npt6Rsejz5XCUWJsR" %}
[Программирование на текстовом языке](/studio/programming-code)
{% endcontent-ref %}


# Скриншот экрана контроллера ТРИК

С помощью веб-интерфейса, а также утилит PuTTY и WinSCP

Скриншот экрана контроллера ТРИК можно сделать двумя способами:

1. С помощью [веб-интерфейса](/trik/about/screenshot#web).
2. С помощью утилит [PuTTY и WinSCP](/trik/about/screenshot#utilities).

## С помощью веб-интерфейса <a href="#web" id="web"></a>

1\. Подключитесь к контроллеру по Wi-Fi любым из [способов](/trik/wi-fi/network-connection).

2\. Войдите в [веб-интерфейс](/trik/web-interface), набрав ip-адрес контроллера в браузере.

3\. Убедитесь, что на экран контроллера выведено изображение или текст, скриншот которого хотите сделать.

4\. Выберите в веб-интерфейсе пункт меню «Изображение» и нажмите кнопку «Сделать снимок экрана».

![](/files/-M64aBhi3RZGA_4Hce67)

5\. После этого скриншот появится в списке. Если этого не произошло, обновите страницу.

![](/files/-M5gvZsnmUgHzOPKkzoE)

6\. Для загрузки сделанных скриншотов нажмите кнопку «Загрузить всё».

## С помощью утилит PuTTY и WinSCP <a href="#utilities" id="utilities"></a>

1\. Подключитесь к контроллеру по Wi-Fi любым из [способов](/trik/wi-fi/network-connection).

2\. Откройте TRIK Studio.

3\. Запустите утилиту [PuTTY](/studio/utilities/putty). Для этого в главном меню откройте `Инструменты → Сторонние программы → PuTTY`.

![](/files/-M0DE5tV1ijP_whup1fh)

4\. Дождитесь завершения процесса подключения.&#x20;

![](/files/-M0DEeAzykJWuklKnrgM)

5\. Убедитесь, что на экран контроллера выведено изображение или текст, скриншот которого хотите сделать.

6\. Введите команду `fbgrab image.png`, где `image` — произвольное название сохраненного изображения.

![](/files/-M0DF4yU94gA2563vwqS)

7\. При удачном исходе в консоль будет выведен следующий текст:

`Resolution: 240x320 depth 16`\
`Converting image from 16`\
`Now writing PNG file (compression -1)`

![](/files/-M0DFQcbr48wAhwl35ug)

8\. Запустите утилиту [WinSCP](/studio/utilities/winscp). Для этого в главном меню откройте `Инструменты → Сторонние программы → WinSCP`.&#x20;

9\. Если у вас появилось окно «Warning», нажмите «Yes».

![](/files/-M0DFfGUiEpvY7YMfBQm)

10\. Выберите в левом окне директорию, в которую хотите сохранить снимок. Перетащите созданное изображение из правого окна в левое.

![](/files/-M0DFmDLXNyrNAP6gPw2)


# Обновление встроенного программного обеспечения контроллера ТРИК

Инструкция для Windows, Linux и Ubuntu

Выберите операционную систему:

* [Windows](/trik/firmware#windows)
* [Linux](/trik/firmware#linux)
* [Ubuntu](/trik/firmware#ubuntu)

## Windows

1\. Скачайте последнюю версию [встроенного программного обеспечения](https://trikset.com/downloads#firmware).\
2\. Скачайте и установите программу [DiskImager](https://github.com/RomanBelkov/DiskImager/releases/download/1.4.1/DiskImager.Installer.msi).&#x20;

![Установка DiskImager](/files/-M524aETQlUxr1Ga1Uot)

{% hint style="warning" %}
**Внимание!** Для установки и использования DiskImager вам понадобятся права администратора.
{% endhint %}

3\. Извлеките карту памяти microSD из контроллера ТРИК.\
4\. Вставьте её в компьютер, используя картридер.\
5\. Запустите DiskImager. Для смены языка выберите в меню `About → Language`.

![Для смены языка выберите в меню «About» → «Language»](/files/-M526HuiBJmqa9_ECnJk)

6\. Выберите диск для записи.

![](/files/-M526HujEjKwTXgtVj7Y)

&#x20;7\. Нажмите «Восстановить флешки из образа» («Restore drives from»).

![](/files/-M526HumzNQ97URbtW05)

8\. В появившемся окне отфильтруйте файлы по типу `.xz` и выберите скачанный файл.

![](/files/-M526Hun6XSNMXUk5QAl)

9\. Нажмите «Открыть».

![](/files/-M526HupAwSQe2UaWOhG)

10\. Дождитесь выполнения операции.

**Первое включение контроллера после прошивки**

1. Нажмите и **удерживайте** кнопки **«Влево»**, **«Вправо»** и **«Галочка»**.
2. Не отпуская их, кратковременно нажмите кнопку **питания**.
3. Дождитесь запуска системы.

<figure><img src="/files/mbv2wX6CacCfxOSlzYoD" alt=""><figcaption></figcaption></figure>

## Linux

1\. Скачайте последнюю версию [встроенного программного обеспечения](https://trikset.com/downloads#firmware).\
2\. Извлеките карту памяти microSD из контроллера ТРИК.\
3\. Вставьте её в компьютер, используя картридер.\
4\. Если SD-карта имеет правильную таблицу разделов (первый раздел не менее 2 Гб, файловая система ext4), то перейдите к пункту 18.\
5\. Получите права суперпользователя (root):

```
sudo -i
```

6\. Посмотрите устройства, которые в данный момент подключены к компьютеру:

```
fdisk -l
```

7\. Размонтируйте все разделы с помощью команды `umount`.

```
umount /dev/{first partition}
umount /dev/{second partition}
...
```

Пример:

```
umount /dev/sdb1
```

8\. Выберите вставленную карту памяти microSD:

```
fdisk /dev/{устройство}
```

Пример:

```
sudo fdisk /dev/sdb
```

9\. Посмотрите текущую таблицу разделов с помощью команды `p`.

```
p
```

10\. Удалите все существующие разделы с помощью команды `d`.

```
d
```

11\. Убедитесь, что все разделы удалились:

```
p
```

12\. Создайте новый раздел с помощью команды `n`.

```
n
```

13\. Все параметры, кроме размера, оставьте по умолчанию — жмите `Enter`. На запрос «Last sector, +sectors or +size{K, M, G}» укажите `+2G`.

```
Command (m for help): n
Partition type:
     p     primary (0 primary, 0 extended, 4 free)
     e     extended
Select (default p):
Partition number (1-4, default 1):
First sector (4096-784932712):
Last sector, +sectors or +size{K,M,G}: +2G
```

14\. Создайте раздел на оставшейся части карты памяти с помощью команды `n`. Все параметры оставьте по умолчанию.

```
Command (m for help): n
Partition type:
     p     primary (0 primary, 0 extended, 4 free)
     e     extended
Select (default p):
Partition number (1-4, default 1):
First sector (4096-784932712):
Last sector, +sectors or +size{K,M,G}:
```

15\. Проверьте командой `p`, что получилось.

```
p
```

16\. Примените изменения с помощью команды `w`.

```
w
```

17\. Отформатируйте разделы с помощью команд `sudo mkfs. ext4`.

```
sudo mkfs.ext4 /dev/{раздел}
```

Пример:

```
sudo mkfs.ext4 /dev/sdb1
sudo mkfs.ext4 /dev/sdb2
```

18\. Размонтируйте первый раздел с помощью команды `umount`.

```
umount /dev/{first partition}
```

Пример:

```
umount /dev/sdb1
```

19\. Распакуйте скачанный образ прошивки с помощью Archive Manager.\
20\. Скопируйте распакованный образ на карту памяти с помощью команды `dd`.

```
sudo dd bs=4M if=trik-base-v2-trikboard.ext4 of=/dev/{first partion}
```

Пример:

```
sudo dd bs=4M if=trik-base-v2-trikboard.ext4 of=/dev/sdb1
```

## Ubuntu

{% hint style="info" %}
Инструкция для версии 14.04 и старше.
{% endhint %}

1\. Скачайте последнюю версию [встроенного программного обеспечения](https://trikset.com/downloads#firmware).\
2\. Извлеките карту памяти microSD из контроллера ТРИК.\
3\. Вставьте её в компьютер, используя картридер.\
4\. Откройте в файловом менеджере местоположение загруженного образа прошивки.\
5\. Вызовите контекстное меню правым кликом мыши по архиву и выберите первый пункт «Открыть в „Создание загрузочного диска“».\
6\. Из выпадающего меню выберите диск, на который хотите записать прошивку. Затем нажмите кнопку «Начать восстановление».

![](/files/-M529rryiaBsRPN6mQaY)


# Как узнать версию встроенного ПО контроллера ТРИК?

1\. Включите контроллер.

2\. Перейдите в `Ещё... → Версия и обновление`.\
![](https://thumb.tildacdn.com/tild3737-3436-4431-b330-636236666266/-/format/webp/more.png)![](https://thumb.tildacdn.com/tild6237-3463-4237-b830-343739363032/-/format/webp/system-version1.png)

3\. «Версия ОС» и есть версия встроенного программного обеспечения контроллера.

![](https://thumb.tildacdn.com/tild6465-6138-4461-b739-376631356465/-/format/webp/system-version.png)


# Меню контроллера ТРИК

Меню контроллера ТРИК состоит из шести разделов:

1. [Файлы](/trik/menu#files) — запуск и удаление программ.
2. [Тестирование](/trik/menu#testing) — тестирование подключенных к контроллеру ТРИК устройств.
3. [Сеть](/trik/menu#network) — подключение контроллера ТРИК к другим устройствам.
4. [Взаимодействие](/trik/menu#interaction) — взаимодействие нескольких контроллеров ТРИК.
5. [Язык / Language](/trik/menu#language) — выбор языка.

<figure><img src="/files/7HxwOFL1RzTZuvhWiyqk" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
&#x20;Для работы с меню используйте кнопки контроллера.

«Вверх», «Вниз», «Вправо», «Влево» — перемещение по меню.\
«Ввод» (галочка) — выбора раздела меню.\
«Выход» (крестик) — выход из подменю.
{% endhint %}

## **Файлы** <a href="#files" id="files"></a>

Раздел «Файлы» предназначен для просмотра, запуска и удаления загруженных на контроллер программ.

| ![](/files/7HxwOFL1RzTZuvhWiyqk) | ![](/files/dRApukXSeIv6uWJrBjQY) |
| -------------------------------- | -------------------------------- |
|                                  |                                  |

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

Для запуска программы нажмите кнопку «Ввод» (галочка).

### Удаление программы

Для удаления программы нажмите кнопку «Вправо» и подтвердите удаление.

<figure><img src="/files/zCPWLiHVzAeuXSaib9Sd" alt=""><figcaption></figcaption></figure>

### Удаление всех программ

Для удаления всех программы выберите пункт «Удалить всё...» и подтвердите удаление.

## **Тестирование** <a href="#testing" id="testing"></a>

На контроллере ТРИК с помощью данного пункта меню можно протестировать подключенные устройства:

1. Аналоговые датчики.
2. Сервоприводы.
3. Силовые моторы.
4. Цифровые датчики.
5. Энкодеры.
6. Гироскоп.
7. Акселерометр.

| ![](/files/Fa51TyGlZX4jsBlH9CCa) | ![](/files/0lcAfOWdmA0biM9XOMvU) |
| -------------------------------- | -------------------------------- |

Подробнее смотрите в статье

{% content-ref url="/pages/-M02tX4p6vSt9VRnJ-N-" %}
[Тестирование подключенных к контроллеру ТРИК устройств](/trik/work-with-devices/testing-connected-devices)
{% endcontent-ref %}

## **Сеть** <a href="#network" id="network"></a>

Для того, чтобы перейти в раздел "Сеть" необходимо зайти в пункт меню "Настройки".\
Данный раздел предназначен для настройки подключения контроллера к компьютеру или смартфону.

| ![](/files/AXtWqd3W5vanosph9cWz) | ![](/files/Hu9WrM55KEgu3rPsj5UW) | <p><img src="/files/Ozz3zef1dcEBUY1NXmhq" alt="" data-size="original"></p><p></p> |
| -------------------------------- | -------------------------------- | --------------------------------------------------------------------------------- |

В пункте «Сеть» вы можете подключить контроллер к компьютеру или смартфону в двух режимах:

1. &#x20;Wi-Fi точка доступа.
2. &#x20;Wi-Fi клиент.

Подробнее смотрите в статье

{% content-ref url="/pages/-M02eN-vS5kI-JkxERrX" %}
[Подключения по Wi-Fi к контроллеру ТРИК](/trik/wi-fi)
{% endcontent-ref %}

## **Взаимодействие** <a href="#interaction" id="interaction"></a>

В пункте «Взаимодействие» вы можете настроить параметры для взаимодействия контроллеров.

| ![](/files/Uz5554ujyFCM3jPjiJPB) | <img src="/files/9ABfKBJO0rdj3PiRHmhF" alt="" data-size="original"> |
| -------------------------------- | ------------------------------------------------------------------- |

Подробнее смотрите в статье

{% content-ref url="/pages/-M02gpSf0QRPSelT9fF7" %}
[Взаимодействие контроллеров ТРИК](/trik/wi-fi/interaction)
{% endcontent-ref %}

## **Язык / Language** <a href="#language" id="language"></a>

Данный раздел позволяет выбрать язык меню контроллера ТРИК.

1\. Выберите требуемый язык и нажмите «Ввод».<br>

<table data-header-hidden><thead><tr><th width="402.22479248046875"></th><th></th></tr></thead><tbody><tr><td><div><figure><img src="/files/KvAri3s0fz6lTvwokZtf" alt=""><figcaption></figcaption></figure></div><p></p></td><td><p><img src="/files/NwNA4gWnYznGos40c3PH" alt="" data-size="original"></p><p></p></td></tr></tbody></table>

### **Настройки системы** <a href="#system-settings" id="system-settings"></a>

В данном подразделе вы можете выбрать, что будет отображаться в папке «Файлы»:

* Папка со скриптами. В данном случае будут отображаться только загруженные программы из TRIK Studio.
* Файловая система.

![](/files/EO6D2TOEoPkM8Sp17Jnf)

### **О системе** <a href="#system-version" id="system-version"></a>

В данном подразделе вы можете посмотреть версию прошивки и MAC-адрес.

| ![](/files/Z86zQW0lxFRbNTRgMGOC) | ![](/files/bYMZP3QjpDeNfmhXjzmA) |
| -------------------------------- | -------------------------------- |


# Подключения по Wi-Fi к контроллеру ТРИК

На контроллере ТРИК стоит Wi-Fi-модуль, который может работать в двух режимах:

1. В режиме **точки доступа**, то есть когда контроллер сам создает новую сеть, и мы к нему подключаем устройства.
2. В режиме **Wi-Fi-клиента**, то есть когда мы подключаем контроллер к уже существующей сети.

Для выбора режима в меню контроллера выберите пункт `Сеть`.

![Меню контроллера ТРИК](/files/wQDWT4QS2hNDNorqOfis)

О подключении контроллера к устройствам в разных режимах и взаимодействии нескольких контроллеров читайте в статьях:

{% content-ref url="/pages/-M0-ZXrYSHHDja21FEqC" %}
[Подключение контроллера ТРИК к компьютеру и смартфону](/trik/wi-fi/network-connection)
{% endcontent-ref %}

{% content-ref url="/pages/-M02fB52lCsyKRFIUTA6" %}
[Подключение контроллера ТРИК к TRIK Studio](/trik/wi-fi/connect-to-ts)
{% endcontent-ref %}

{% content-ref url="/pages/-M02gpSf0QRPSelT9fF7" %}
[Взаимодействие контроллеров ТРИК](/trik/wi-fi/interaction)
{% endcontent-ref %}


# Подключение контроллера ТРИК к компьютеру и смартфону

В режимах точки доступа и клиента

Контроллер ТРИК может быть подключен к другим устройствам двумя способами:

1. Используем контроллер ТРИК как [**точку доступа**](#accesspoint) \*\*(\*\*то есть контроллер сам создает новую сеть) и подключаем к нему устройства.
2. Используем контроллер ТРИК в режиме [**Wi-Fi-клиента**](#client) и подключаем устройства и сам контроллер к существующей сети.

## Способ 1. Контроллер в режиме точки доступа Wi-Fi <a href="#accesspoint" id="accesspoint"></a>

В этом режиме контроллер сам создает новую сеть, и мы к нему подключаем устройства.

1\. Зайдите в меню `Сеть`. Контроллер раздаст Wi-Fi, а на экране появятся параметры сети:

* Имя сети.
* Пароль сети.
* IP-адрес контроллера.

![](/files/WCNYjRIFomQb8n1pGXrM)

2\. При подключении к сети Wi-Fi компьютера или смартфона выберите сеть контроллера и введите пароль.

## Способ 2. Контроллер в режиме Wi-Fi-клиента <a href="#client" id="client"></a>

В этом режиме контроллер и устройства мы подключаем к уже существующей Wi-Fi-сети.

Для этого нам в [веб-интерфейсе](/trik/web-interface) контроллера надо прописать имя и пароль сети, к которой будем подключать контроллер.

1\. Для запуска веб-интерфейса подключите компьютер или смартфон к контроллеру как к [точке доступа](#accesspoint).

2\. В адресной строке браузера введите IP-адрес контроллера. Откроется веб-интерфейс.

{% tabs %}
{% tab title="На ноутбуке" %}
![](/files/-M03Bw5ojDgSfyTxf1-s)
{% endtab %}

{% tab title="На смартфоне" %}
![](/files/-M03C9xCVtSjIFwbpVPK)
{% endtab %}
{% endtabs %}

3\. В поле «Wi-Fi-клиент» введите имя и пароль сети, к которой хотите подключить контроллер. Нажмите кнопку «Сохранить».

4\. Переключите контроллер в режим Wi-Fi-клиента.

![](/files/LjjJtCLk8M5RSogJGxvs)

5\. При успешном подключении вверху экрана рядом с иконкой <img src="/files/-M03FqEGq2cVCmBr_8Px" alt="" data-size="line"> отобразится ip-адрес контроллера, а в списке иконкой <img src="/files/-M03G0g8oZ_6k622K563" alt="" data-size="line"> будет выделено имя сети.

![](/files/U2Ub0tAfMbwpeqH9Xo06)


# Подключение контроллера ТРИК к TRIK Studio

1\. Подключите контроллер к компьютеру, на котором установлена TRIK Studio, любым из [двух способов](/trik/wi-fi/network-connection).

2\. В настройках TRIK Studio перейдите в раздел «Роботы» и выберите платформу ТРИК в окне «Платформы».

![Выбор платформы](/files/-M02rcXaxxtuv7QKbfhz)

3\. Укажите IP-адрес контроллера в строке «Настройки TCP».

![Настройки TCP](/files/-M02rg_pEnSN2bnQ3cLw)

Также IP-адрес контроллера можно указать на панели инструментов:

![](/files/-M29KFr0olOkHAcTcmQJ)

4\. Нажмите «OK».

## Как проверить соединение?

Попробуйте [загрузить](/trik/run-upload-programs) программу на контроллер.

## Что делать, если соединения нет?

Если соединения с контроллером нет, TRIK Studio выдаст ошибку:

![](/files/-M29O_pAKbg8IdtLHp9W)

В этом случае проверьте:

1. Совпадает ли IP-адрес в TRIK Studio с IP-адресом на контроллере.
2. Отображает ли контроллер ТРИК свой IP-адрес.\
   \
   IP-адреса может не быть, если контроллер в режиме Wi-Fi-клиента подключен к Wi-Fi-сети, но роутер не выдал его. Рекомендуем немного подождать или переключиться в режим «Точка доступа» и обратно в режиме Wi-Fi-клиента.\
   \
   Также это может произойти в режиме «Точка доступа». Рекомендуем выключить контроллер на некоторое время, а затем снова запустить.


# Взаимодействие контроллеров ТРИК

Контроллеры ТРИК могут взаимодействовать друг с другом, что позволяет решать [задачи](/trik/wi-fi/interaction/interaction-example) по передаче сообщений между роботами.

Для взаимодействия контроллеров необходимо будет выбрать **ведущий** контроллер — тот, к которому мы будем подключать остальные контроллеры. А также подключить все контроллеры к одной сети. Это можно сделать двумя способами:

1\. С помощью существующей сети.

![](/files/-M03NaORDzlpSNS-7Pjb)

2\. С помощью создания точки доступа Wi-Fi на одном из контроллеров.

![](/files/-M03NhkQ_MpZfLnHMXuo)

## Способ 1. Взаимодействие с помощью существующей Wi-Fi-сети

1\. Выберите **ведущий** контроллер и подключите его к существующей Wi-Fi-сети в [режиме клиента](/trik/wi-fi/network-connection#client).

2\. В [веб-интерфейсе](/trik/web-interface) **ведущего** контроллера в поле «Взаимодействие роботов» укажите бортовой номер (обычно для ведущего это `01`, но можно любой другой) и его IP-адрес.

![Пример ввода бортномера и IP-адреса ведущего контроллера](/files/-M0D4Rjqy97JZNqiT0qE)

3\. Подключите **все** остальные контроллеры к этой же Wi-Fi-сети в [режиме клиента](/trik/wi-fi/network-connection#client).

4\. Укажите для каждого из них в своих веб-интерфейсах в поле «Взаимодействие роботов» бортовой номер (отличный от других) и IP-адрес **ведущего** контроллера.

![Пример ввода бортномера и IP-адреса ведущего контроллера](/files/-M0D55tDPjl4U9l56Dl1)

{% hint style="info" %}
Также бортномер и IP-адрес **ведущего** контроллера можно указать на контроллере в пункте меню `Взаимодействие`.
{% endhint %}

4\. На **всех** контроллерах зайдите в пункт меню `Взаимодействие` и нажмите кнопку «Подключиться». В правом верхнем углу на экранах контроллеров должна появиться иконка<img src="/files/-M0D69CCIhGDWIMaQnpE" alt="" data-size="line">.

![Скриншоты экранов двух подключенных к друг другу контроллеров](/files/78wkftY4E3ZdLSXSjh2J)

## Способ 2. Взаимодействие с помощью Wi-Fi точки доступа одного из контроллеров <a href="#trikwap" id="trikwap"></a>

### Действия с ведущим контроллером

1\. Выберите **ведущий** контроллер и раздайте с него Wi-Fi с помощью [режима точки доступа](/trik/wi-fi/network-connection#accesspoint) (выберите в меню `Сеть)`.

![](/files/WCNYjRIFomQb8n1pGXrM)

2\. Далее вернитесь на главный экран меню, выберите пункт `Настройки –> Взаимодействие`.

![](/files/ELhiSvQYtz6jFyy6eY5c)

3\. Укажите бортовой номер (обычно для ведущего это `01`, но можно любой другой) и его IP-адрес.

![](/files/lPtWyVEmhJyjsnFT6PkW)

### Действия с остальными контроллерами

4\. Подключите остальные контроллеры к ведущему с помощью [режима Wi-Fi-клиент](/trik/wi-fi/network-connection#client). Для этого в веб-интерфейсе каждого контроллера необходимо в полях «Wi-Fi клиент» указать имя и пароль сети ведущего контроллера в режиме Wi-Fi точки доступа.

5\. Зайдите в веб-интерфейс, используя IP-адрес, который отображается на контроллере в режиме Wi-Fi клиент.

6\. Укажите для каждого из контроллеров в своих веб-интерфейсах в поле «Взаимодействие роботов» бортовой номер (отличный от других) и IP-адрес **ведущего** контроллера.

![Пример ввода бортномера и IP-адреса ведущего контроллера](/files/-M0D55tDPjl4U9l56Dl1)

{% hint style="info" %}
Также бортномер и IP-адрес **ведущего** контроллера можно указать на контроллере в пункте меню `Взаимодействие`.
{% endhint %}

### Действие со всеми контроллерами

7\.  На всех контроллерах зайдите в пункт меню `Взаимодействие` и нажмите кнопку «Подключиться». В правом верхнем углу на экранах контроллера должна появиться иконка<img src="/files/-M0D69CCIhGDWIMaQnpE" alt="" data-size="line">.

![Скриншоты экранов двух подключенных к друг другу контроллеров](/files/78wkftY4E3ZdLSXSjh2J)

{% content-ref url="/pages/-M0559VMfkJdzqhhbKcQ" %}
[Пример решения задачи по взаимодействию двух роботов](/trik/wi-fi/interaction/interaction-example)
{% endcontent-ref %}


# Пример решения задачи по взаимодействию двух роботов

## Условие задачи

Отправить сообщение «5» с одного робота и принять его на втором.

{% hint style="warning" %}
Обратите внимание, что решить задачу возможно только в режиме реального робота.
{% endhint %}

## Решение

Для решения задачи необходимо:

1. Написать [алгоритм передачи сообщения](/trik/wi-fi/interaction/interaction-example#algoritm-peredachi-soobsheniya) для ведущего робота.
2. Написать [алгоритм приема сообщения](/trik/wi-fi/interaction/interaction-example#algoritm-priema-soobsheniya) для второго робота.
3. [Подключить](/trik/wi-fi/interaction) роботов в единую сеть.
4. Запустить программы на роботах.

### Алгоритм передачи сообщения

1\. Перейдите в TRIK Studio в режим [реального робота](/studio/interface#panel-interpreter).

2\. Введите переменную для сообщения `message` и инициализируйте её, присвоив ей цифру `5` в блоке «[Выражение](/studio/programming-visual/blocks#expression)».

![](/files/-M5REJLIBOo9gr2TZTCc)

3\. Добавьте блок «[Послать сообщение](https://help.trikset.com/trik-controller/blocks#send-message)» и «[Конец](https://help.trikset.com/trik-studio/blocks-common#block-final)». В свойствах блока «[Послать сообщение](https://help.trikset.com/trik-controller/blocks#send-message)» укажите бортномер робота, на который вы хотите отправить сообщение, и переменную, содержащую сообщение.

![](/files/-M5REBqwl4Qs70R94HG_)

#### Общий вид алгоритма

![](/files/-M5REF7Mzm8TLW41aqT6)

### Алгоритм приема сообщения

1\. Перейдите в TRIK Studio в режим [реального робота](/studio/interface#panel-interpreter).

2\. Добавьте блок «[Получить сообщение](/trik/programming-visual/blocks#receive-message-from-thread)».\
\
В свойствах блока укажите переменную, в которую хотите записать сообщение, отправленное с другого робота. Переменная может называться как угодно.\
\
В свойстве «Дождаться сообщения» укажите значение `истина`.

![](/files/-M5RivH1q9GVafTkpZ2r)

3\. После того как сообщение пришло, выведите его на экран робота в течение 3 секунд, а затем закончите выполнение алгоритма. Для этого добавьте блоки «[Напечатать текст](/trik/programming-visual/blocks#print-text)», «[Таймер](/studio/programming-visual/blocks#timer)» и «[Конец](/studio/programming-visual/blocks#final)».\
\
В свойствах блока «Напечатать текст» поставьте флажок `Вычислять` и укажите значение `истина` в поле «Обновить картинку».

![](/files/-M5RjB-Yf0P-YCfQD8zc)

#### Общий вид алгоритма

![](/files/-M5RiiMC6Mj2D5WGSZzc)


# Подключение к контроллеру ТРИК с помощью UART

Подробная инструкция

Кроме подключения контроллера ТРИК к компьютеру с [помощью Wi-Fi](/trik/wi-fi), его можно подлючить через преобразователь интерфейса USB в интерфейс UART на базе чипа CP2102:

![](/files/-MJbFo1YvxI_ze8KLy1K)

Ниже описан алгоритм подключения.

1. [Установка драйверов](/trik/uart#uart-driver)
2. [Настройка COM-порта](/trik/uart#uart-com)
3. [Установка модема](/trik/uart#uart-modem1)
4. [Настройка модема](/trik/uart#uart-modem2)
5. [Создание сетевого подключения](/trik/uart#uart-lan1)
6. [Настройка сетевого подключения](/trik/uart#6-nastroika-setevogo-podklyucheniya)
7. [Подключение к контроллеру](/trik/uart#7-podklyuchenie-k-kontrolleru)

## 1. Установка драйверов <a href="#uart-driver" id="uart-driver"></a>

1\. [Скачайте драйвера](https://www.silabs.com/documents/public/software/CP210x_Windows_Drivers.zip) с официального сайта производителя преобразователя: [silabs.com](https://www.silabs.com/).

2\. Распакуйте архив и запустите установщик драйвера, соответствующий вашей операционной системе (32 или 64 бит).

![](/files/-MJiGaXm1bAPf95kWHyW)

3\. После окончания установки подключите преобразователь USB — UART к компьютеру (без контроллера). Дождитесь, пока устройство определится.

![](/files/-MJiGpr4O6T5aBv5gQyQ)

4\. Проверьте в «Диспетчере устройств», правильно ли установился драйвер.

![](/files/-MJiGxVxq-0SILWUBbFE)

5\. Если в «Диспетчере устройств» `CP2102 USB to UART Bridge Controller` отображается с восклицательным знаком, как на примере ниже, значит драйвер устройства не установлен. Повторите процедуру установки или обратитесь к специалисту.

![](/files/-MJXhi7BOCfw4AFQ8kGM)

Если данное устройство в списке «Диспетчера устройств» отсутствует, проверьте работоспособность USB-порта и правильность установки устройства в USB-порт. При корректном подключении преоразователя на нем должен загореться красный светодиод «POWER».

![](/files/-MJiHPGFELdHU0FRy0-L)

## 2. Настройка COM-порта <a href="#uart-com" id="uart-com"></a>

1\. В «Диспетчере Устройств» вызовите свойства `Silicon Labs CP210x USB to UART Bridge (COMx)`.&#x20;

На вкладке «Параметры порта» установите:

* Бит в секунду: 115200.
* Управление потоком: Нет.

![](/files/-MJiHymDVTsbETWcHp8x)

По кнопке «Дополнительно» можно выбрать номер COM-порта, если это необходимо:

![](/files/-MJiILpc98Y5ADDZNWd9)

![](/files/-MJiIQNetjnvR4kUs9h5)

## 3. Установка модема <a href="#uart-modem1" id="uart-modem1"></a>

1\. На панели управления выберите раздел «Телефон и модем».

![](/files/-MJiIh6f2v2lXP3pNzYk)

2\. Введите любой телефонный код города и нажмите «ОК».

![](/files/-MJiPBGVoxnVmuRdTWRt)

3\. На вкладке «Модемы» нажмите кнопку «Добавить».&#x20;

![](/files/-MJiPLGgjAmZSf-4sqlN)

4\. Выберите «Не определять тип модема (выбор из списка)» и нажмите «Далее».

![](/files/-MJiPQq5-sF8018U7AJ6)

5\. Выберите «Стандартные типы модемов» → «Последовательный кабель для соединения компьютеров» и нажмите «Далее».

![](/files/-MJiP_8_X7tHZ3H3_1w8)

6\. Выберите указанный ранее порт (в нашем примере — COM3), затем нажмите «Далее» и «Готово».

![](/files/-MJiPhH3eiBOqyyplK61)

![](/files/-MJiPqDMSLdlkgGrZebh)

## 4. Настройка модема <a href="#uart-modem2" id="uart-modem2"></a>

1\. Вновь на панели управления выберите «Телефон и модем» и перейдите на вкладку «Модемы».

2\. Выберите «Последовательный кабель для соединения компьютеров (COM3)» и нажмите кнопку «Свойства».

![](/files/-MJiPyyG5lmxtjD8zY5I)

3\. Если параметры на вкладках «Модем» и «Дополнительные параметры связи» невозможно изменить,

<div align="center"><img src="/files/-MJiQi0vhunuMJhafQAD" alt=""></div>

![](/files/-MJiR0C8_1YMiR2RAckt)

на вкладке «Общие» нажмите кнопку «Изменить параметры».

![](/files/-MJiRURTawsMpHk_Z35J)

4\. На вкладке «Дополнительные параметры связи» нажмите кнопку «Изменить умолчания...»

![](/files/-MJiRr8A3EV_jr9ajczx)

5\. На вкладке «Общие» установите:\
– Скорость порта: 115200.\
– Управление потоком: Отсутствует.

И нажмите «ОК».

![](/files/-MJiRyRjxXyBkDUYJxDU)

6\. На вкладке «Модем» должны правильно отображаться COM-порт (COM3) и скорость соединения (115200).

![](/files/-MJiSLmHzj88Jj19BP1F)

## 5. Создание сетевого подключения <a href="#uart-lan1" id="uart-lan1"></a>

1\. На панели управления выберите «Центр управления сетями и общим доступом».

![](/files/-MJiSvsRxs9T6gYcNo-Y)

2\. Затем «Настройка нового подключения или сети».

![](/files/-MJiT-ZSLyX8fP7DbKT6)

3\. Выберите «Настройка телефонного подключения» и нажмите «Далее».

![](/files/-MJiTbqAjQnehKuHJQSF)

4\. В поле «Набираемый номер» введите `1` и нажмите кнопку «Подключить».

![](/files/-MJiTwuQxZgIKpv0ftU3)

5\. Затем выберите «Всё равно создать это подключение».

![](/files/-MJiU4E3SC6MtZxjisK8)

6\. Нажмите «Закрыть».

![](/files/-MJiU9Q8VguX9QXEpy4w)

## 6. Настройка сетевого подключения&#x20;

1\. На панели управления выберите «Центр управления сетями и общим доступом», а затем нажмите «Изменение параметров адаптера».

![](/files/-MJiUKNpyQizbir9lSm_)

2\. Зайдите в свойства «Телефонного подключения».

![](/files/-MJiUQ0mOD0c8deSKO6S)

3\. На вкладке «Общие» в окне «Подключаться через» выберите «Последовательный кабель для соединения компьютеров (COMx)» и нажмите «Настроить».

![](/files/-MJiUX9mspiYmuYbbaVq)

4\. Выберите следующий параметр:\
– Наибольшая скорость: 115200.

И уберите галочку «Аппаратное управление потоком». Нажмите «ОК».

![](/files/-MJiUcVwlm_-193WCLB8)

5\. На вкладке «Параметры» нажмите на кнопку «Параметры PPP...»

![](/files/-MJiW8xfZEloP31TX12H)

6\. Уберите галочку «Использовать программное сжатие данных» и нажмите «ОК».

![](/files/-MJiWGmU2Acc38OAoQsH)

7\. На вкладке «Сеть» должен быть включен протокол «IPv4».

![](/files/-MJiWaGfthZebWD3rLs4)

## 7. Подключение к контроллеру

1\. Извлеките преобразователь USB — UART из разъема USB.

2\. Включите контроллер.

3\. Подключите преобразователь USB — UART к соответствующему порту контроллера.

![](/files/-MJiXACTmJKqnxwU1OXp)

![](/files/-MJiXEOuLEGcR8VipxFM)

3\. Подкючите преобразователь USB — UART к компьютеру.

![](/files/-MJibLcRwyfkOAZeV5ck)

4\. Откройте «Сетевые подключения» (Панель управления → «Центр управления сетями и общим доступом»→ «Изменение параметров адаптера»).

![](/files/-MJibmY0i6C8CcSZ82lN)

5\. Откройте «Телефонное подключение» и нажмите на кнопку «Вызов».

![](/files/-MJic4I8ejhks4FDXFZS)

6\. Если всё сделано верно, на преобразователе должны замигать лампочки «RXD» и «TXD».

![](/files/-MJir9unFR2fhXzV-1CD)

А статус соединения должен измениться на активный.

![](/files/-MJictcNn5M1rw6yO97R)

7\. Откройте окно состояния телефонного подлючения.

![](/files/-MJircv3vrCkUKGPev-e)

8\. Нажмите на кнопку «Сведения».

![](/files/-MJirnEYf_zOnOBCFtLU)

9\. Адрес IPv4 должен быть `10.0.5.1` .

![](/files/-MJirxKHPhlA3rwmKFv8)

10\. Если всё верно, то можно зайти в [веб-интерфес](/trik/web-interface) по адресу `10.0.5.2`.

![](/files/-MJisADUKxMF33Dn74fG)

11\. Или указать IP-адрес `10.0.5.2` в соответствующем окне TRIK Studio для управления контроллером.

![](/files/-MJispY9gmYTupDxTi38)


# Запуск программ и их загрузка на контроллер ТРИК

Для работы с контроллером ТРИК в настройках TRIK Studio перейдите в [раздел «Роботы»](/studio/interface/faq-robot-settings) и выберите платформу ТРИК.

![](https://thumb.tildacdn.com/tild3263-3262-4133-b837-386234653731/-/format/webp/connect-with-TRIK.png)

Существует несколько вариантов выполнения программ для контроллера ТРИК:

* [Пошаговая интерпретация диаграммы с моделированием поведения робота на двумерной модели](/trik/run-upload-programs#2d).
* [Загрузка программы на робот и дальнейшее её автономное исполнение без связи с компьютером](/trik/run-upload-programs#upload).

## **Интерпретация с моделированием поведения робота** <a href="#id-2d" id="id-2d"></a>

{% hint style="info" %}
В режиме двумерной модели робота команды не передаются роботу, а исполняются пошагово для виртуальной модели, отображающейся на экране. Подробнее см. в статье [«2D-модель»](/studio/2d-model).
{% endhint %}

1\. Включите режим двумерной модели.

![](https://thumb.tildacdn.com/tild3736-6466-4133-b364-346339373336/-/resize/893x/-/format/webp/2d-1.png)

2\. Нажмите на кнопку «Выполнить».

![](https://thumb.tildacdn.com/tild3861-6630-4261-b834-393131393231/-/resize/893x/-/format/webp/2d-2.png)

3\. Откроется окно двумерной модели и начнется выполнение программы.

![](https://static.tildacdn.com/tild3630-6365-4430-a366-376638373634/2d-3.gif)

4\. При переключении в режим редактирования можно отслеживать шаги выполнения программы.

![](https://static.tildacdn.com/tild3834-3961-4331-b230-303666336339/2d-4.gif)

## **Загрузка на контроллер** <a href="#upload" id="upload"></a>

Из TRIK Studio можно загрузить готовую программу на робота, чтобы в дальнейшем автономно её исполнять без связи с компьютером.\
1 . [Подключите](/trik/wi-fi/connect-to-ts) контроллер ТРИК к TRIK Studio.\
2 . Нажмите на кнопку «Загрузить программу».

![](https://thumb.tildacdn.com/tild6538-6439-4439-b362-653832623161/-/resize/893x/-/format/webp/upload.png)

3 . Для запуска программы на контроллере зайдите в меню «Файлы», выберите нужную программу и нажмите на кнопку «Ввод».

<figure><img src="/files/xojVHOgDOnnjpMPaddSv" alt=""><figcaption></figcaption></figure>


# Программирование ТРИК на визуальном языке

Для программирования контроллера ТРИК на визуальном языке в TRIK Studio есть [специализированные блоки](/trik/programming-visual/blocks), а также [сенсорные переменные](/trik/programming-visual/sensory-variables).

Подробнее о визуальном программировании читайте в статье

{% content-ref url="/pages/-M0Npqc4WgYQzryDW1qz" %}
[Программирование на визуальном языке](/studio/programming-visual)
{% endcontent-ref %}


# Блоки ТРИК

Специализированные блоки для ТРИК делятся на три категории:

1. [Действия](/trik/programming-visual/blocks#action-blocks) — блоки, выполняющие какое-либо действие на контроллере: включение моторов, проигрывание звука и т. д.
2. [Ожидания](/trik/programming-visual/blocks#waiting-blocks) — блоки, ждущие наступления какого-либо события: определённых показаний датчиков, нажатия на кнопку и т. д.
3. [Рисования](/trik/programming-visual/blocks#bloki-risovaniya) — блоки, используемые для вывода графики и текста на экран.

Блоки, доступные для всех платформ см. в статье

{% content-ref url="/pages/-M0P0XKqjxR8vRCElOaf" %}
[Общие блоки](/studio/programming-visual/blocks)
{% endcontent-ref %}

## Блоки действия <a href="#action-blocks" id="action-blocks"></a>

<table data-header-hidden><thead><tr><th width="219.33333333333331">Вид</th><th align="center">Название</th><th>Описание</th></tr></thead><tbody><tr><td>Вид</td><td align="center">Название</td><td>Описание</td></tr><tr><td><img src="/files/-M57QXJiHc6qgZIyiPRg" alt="" data-size="original"> </td><td align="center"><a href="/pages/-M032rQkmzbGrjWrrn3_#send-message-to-thread">Отправить сообщение в задачу</a></td><td>Отправляет данное сообщение в параллельную задачу с заданным идентификатором.</td></tr><tr><td><img src="/files/-M57QaGyasyjni8VQga5" alt="" data-size="original"> </td><td align="center"><a href="/pages/-M032rQkmzbGrjWrrn3_#get-button-code">Получить код кнопки</a></td><td>Сохраняет в указанную переменную код нажатой на роботе кнопки.</td></tr><tr><td><img src="/files/-M57QiEPSYu9I7BBNcH9" alt="" data-size="original"> </td><td align="center"><a href="/pages/-M032rQkmzbGrjWrrn3_#play-sound">Играть звук</a></td><td>Проигрывает на контроллере звук с заданной частотой и длительностью.</td></tr><tr><td><img src="/files/-M57QmLtcyz0CBzpXa6G" alt="" data-size="original"> </td><td align="center"><a href="/pages/-M032rQkmzbGrjWrrn3_#igrat-zvukovoi-fail">Играть звуковой файл</a></td><td>Проиграть на контроллере заданный звуковой файл.</td></tr><tr><td><img src="/files/-M57Qp9uJVF-ZFFq7fAi" alt="" data-size="original"> </td><td align="center"><a href="/pages/-M032rQkmzbGrjWrrn3_#motors-forward">Моторы вперёд</a></td><td>Включить моторы по заданным портам с заданной мощностью.</td></tr><tr><td><img src="/files/-M57QrQI76KSJfeBGIAn" alt="" data-size="original"> </td><td align="center"><a href="/pages/-M032rQkmzbGrjWrrn3_#motors-backward">Моторы назад</a></td><td>Включить моторы в режиме реверса по заданным портам с заданной мощностью.</td></tr><tr><td><img src="/files/-M57Qt8z1UfpFqGfCMXH" alt="" data-size="original"> </td><td align="center"><a href="/pages/-M032rQkmzbGrjWrrn3_#stop-motors">Моторы стоп</a></td><td>Выключить моторы по заданным портам.</td></tr><tr><td><img src="/files/-M57Qvi0g3VL0tbuXBsu" alt="" data-size="original"> </td><td align="center"><a href="/pages/-M032rQkmzbGrjWrrn3_#clear-encoder">Сбросить показания энкодера</a></td><td>Сбросить показания количества оборотов моторов по указанным портам.</td></tr><tr><td><img src="/files/-M57R2jBMdeeLyhM02ne" alt="" data-size="original"> </td><td align="center"><a href="/pages/-M032rQkmzbGrjWrrn3_#uglovoi-servomotor">Угловой сервомотор</a></td><td>Установить валы угловых сервомоторов на указанных портах в указанное положение</td></tr><tr><td><img src="/files/-M57R81udW81QciRNj1T" alt="" data-size="original"> </td><td align="center"><a href="/pages/-M032rQkmzbGrjWrrn3_#say">Сказать</a></td><td>Произнести с помощью динамика фразу, переданную в качестве аргумента блока.</td></tr><tr><td><img src="/files/-M57RAxT3_G5--akNH4A" alt="" data-size="original"> </td><td align="center"><a href="/pages/-M032rQkmzbGrjWrrn3_#led">Светодиод</a></td><td>Установить указанный цвет светодиода на корпусе контроллера.</td></tr><tr><td><img src="/files/-M57RFMIzub5YqwpZOc4" alt="" data-size="original"> </td><td align="center"><a href="/pages/-M032rQkmzbGrjWrrn3_#system-call">Системный вызов</a></td><td>Блок имеет логический параметр «Код». Если он имеет значение «Истина», содержимое параметра «Команда» генерируется напрямую в текст программы при генерации этого блока. Если «Ложь», генерируется вызов консольной команды операционной системы.</td></tr><tr><td><img src="/files/-M57RS3Q4ZTwd9ASoTXU" alt="" data-size="original"> </td><td align="center"><a href="/pages/-M032rQkmzbGrjWrrn3_#initialize-videocamera">Включить видеокамеру</a></td><td>Включить видеокамеру на контроллере в одном из трёх режимов.</td></tr><tr><td><img src="/files/-M57eSYv5fme97XrUIUp" alt="" data-size="original"> </td><td align="center"><a href="/pages/-M032rQkmzbGrjWrrn3_#vyklyuchit-videokameru">Выключить видеокамеру</a></td><td>Выключить видеокамеру.</td></tr><tr><td><img src="/files/-M57SZsbVuv2dRcL2Ukr" alt="" data-size="original"> </td><td align="center"><a href="/pages/-M032rQkmzbGrjWrrn3_#detect-videocamera">Детектировать по камере</a></td><td>Фиксирует изображение в центре кадра и инициализирует им датчик линии или датчик объекта.</td></tr><tr><td><img src="/files/-M57Sesq_8LGWobTco5h" alt="" data-size="original"> </td><td align="center"><a href="/pages/-M032rQkmzbGrjWrrn3_#line-detector-into-variable">Датчик линии в переменную</a></td><td>Помещает текущее показание датчика линии в указанную переменную.</td></tr><tr><td><img src="/files/-M57RVnFDrRCX7XLLdwn" alt="" data-size="original"> </td><td align="center"><a href="/pages/-M032rQkmzbGrjWrrn3_#camera-on">Запустить видеотрансляцию</a></td><td>Запускает видеотрансляцию на роботе.</td></tr><tr><td><img src="/files/-M57earRZPK8SU4o2FNV" alt="" data-size="original"> </td><td align="center"><a href="/pages/-M032rQkmzbGrjWrrn3_#otklyuchit-videotranslyaciyu">Отключить видеотрансляцию</a></td><td>Останавливает видеотрансляцию с камеры робота.</td></tr><tr><td><img src="/files/-M57RxAFVN35PyCwb4q4" alt="" data-size="original"> </td><td align="center"><a href="/pages/-M032rQkmzbGrjWrrn3_#send-message">Послать сообщение</a></td><td>Отправляет данное сообщение роботу с данным бортовым номером.</td></tr><tr><td><img src="/files/-M57S2sZfMFu2W5utr4T" alt="" data-size="original"> </td><td align="center"><a href="/pages/-M032rQkmzbGrjWrrn3_#write-to-file">Записать в файл</a></td><td>Записывает значение данного выражения в заданный файл на роботе.</td></tr><tr><td><img src="/files/-M57S7jgyTLmUKbLQ7XT" alt="" data-size="original"> </td><td align="center"><a href="/pages/-M032rQkmzbGrjWrrn3_#remove-file">Удалить файл</a></td><td>Удаляет заданный файл на роботе.</td></tr><tr><td><img src="/files/-M57eeLDEnLLI1jbmK2D" alt="" data-size="original"> </td><td align="center"><a href="/pages/-M032rQkmzbGrjWrrn3_#kalibrovka-giroskopa">Калибровка гироскопа</a></td><td>Устанавливает гироскоп в 0 в текущей позиции.</td></tr><tr><td><img src="/files/5x4102B0nZcB2db9gwdQ" alt="" data-size="original"></td><td align="center"><a href="#join-network">Join network</a></td><td>Устанавливает соединение между роботами и объединяет их в одну сеть.</td></tr></tbody></table>

### Отправить сообщение в задачу <a href="#send-message-to-thread" id="send-message-to-thread"></a>

<img src="/files/-M583uRjOrCpHJIplt5t" alt="Отправить сообщение в задачу" width="375">

Отправляет данное сообщение в параллельную задачу с заданным идентификатором (идентификатор должен быть указан при создании задачи в блоке [«Параллельные задачи»](/studio/programming-visual/blocks#fork)).\
\
В качестве сообщения может быть любое выражение.

### Получить код кнопки <a href="#get-button-code" id="get-button-code"></a>

![Получить код кнопки](/files/-M584J92w9wcfy3VMYoh)

Сохраняет в указанную переменную код нажатой на роботе кнопки.\
\
Свойство «Ожидание» позволяет дождаться или не дожидаться, когда кнопка действительно будет нажата. Если нажатия кнопки блок не дожидается и кнопка не нажата, переменной присваивается значение «-1».

### Играть звук <a href="#play-sound" id="play-sound"></a>

![Играть звук](/files/-M584M1owLj95nZKiFAA)

Проигрывает на контроллере звук с заданной частотой и длительностью.

### Играть звуковой файл

![Играть звуковой файл](/files/-M584PA6gcjuLPNc_G_V)

Проиграть на контроллере заданный звуковой файл.\
\
Файл должен быть заранее загружен на контроллер. Путь до файла указывается относительно папки `trik` на контроллере. Загрузить файл на контроллер можно, например, с помощью программы [WinSCP](/studio/utilities/winscp).

### Моторы вперёд <a href="#motors-forward" id="motors-forward"></a>

![Моторы вперед](/files/-M584RejWRVmyNIbxoDS)

Включить моторы по заданным портам с заданной мощностью.\
\
Порты задаются строками M1, M2, M3 и M4, разделенными запятыми. Мощность задается в процентах числом от -100 до 100. Если задано отрицательное значение, мотор включается в режиме реверса.

### Моторы назад <a href="#motors-backward" id="motors-backward"></a>

![Моторы назад](/files/-M584UOkF5zwceg-r76w)

Включить моторы в режиме реверса по заданным портам с заданной мощностью.\
\
Параметры аналогичны параметрами блока [«Моторы вперёд»](/trik/programming-visual/blocks#motors-forward).

### Моторы стоп <a href="#stop-motors" id="stop-motors"></a>

![Моторы стоп](/files/-M584XE2UGPmLKBlpRfe)

Выключить моторы по заданным портам.\
\
Порты задаются строками M1, M2, M3 и M4, разделенными запятыми.

### Сбросить показания энкодера <a href="#clear-encoder" id="clear-encoder"></a>

<img src="/files/-M584bbH4xIwGd2Fpt-o" alt="Сбросить показания энкодера" width="563">

Сбросить показания количества оборотов моторов по указанным портам.\
\
Порты задаются строками E1, E2, E3 и E4, разделенными запятыми.

### Угловой сервомотор

![Угловой сервомотор](/files/-M584i5kCPyqbScWz19X)

Установить валы угловых сервомоторов на указанных портах в указанное положение (в градусах, от -90 до 90).\
\
Порты задаются строками, разделенными запятыми.

### Сказать <a href="#say" id="say"></a>

![Сказать](/files/-M584kOl1brqm1u53t25)

Произнести с помощью динамика фразу, переданную в качестве аргумента блока.

### Светодиод <a href="#led" id="led"></a>

![Светодиод](/files/-M584nGic6Z3JYwk5tGl)

Установить указанный цвет светодиода на корпусе контроллера.

### Системный вызов <a href="#system-call" id="system-call"></a>

![Системный вызов](/files/-M584rWH7bcpygz_zl8J)

Блок имеет логический параметр «Код». Если он имеет значение «Истина», содержимое параметра «Команда» генерируется напрямую в текст программы при генерации этого блока. Если «Ложь», генерируется вызов консольной команды операционной системы.

### Включить видеокамеру <a href="#initialize-videocamera" id="initialize-videocamera"></a>

![Включить видеокамеру](/files/-M5851KeCR18SnT0QHny)

Включить видеокамеру на контроллере в одном из трёх режимов:

1. **Сенсор линии** — детектирует цветную линию в центре кадра и в дальнейшем возвращает отклонение центра линии от центра кадра, как число в интервале от -100 (влево) до 100 (вправо).
2. **Сенсор объекта** — детектирует контрастный объект в центре кадра и в дальнейшем возвращает координаты его центра и диаметр в пикселях.
3. **Сенсор цвета** — возвращает доминирующий цвет в центре кадра в виде его координат в цветовой шкале RGB.

### Детектировать по камере <a href="#detect-videocamera" id="detect-videocamera"></a>

![Детектировать по камере](/files/-M56TT9WVmZRRK2KRFSD)

Фиксирует изображение в центре кадра и инициализирует им датчик линии или датчик объекта. Камера должна быть включена в соответствующем режиме блоком [«Включить видеокамеру»](/trik/programming-visual/blocks#initialize-videocamera).

### Датчик линии в переменную <a href="#line-detector-into-variable" id="line-detector-into-variable"></a>

![Датчик линии в переменную](/files/-M585cs06Wd8qwxeuZvW)

Помещает текущее показание датчика линии в указанную переменную.\
\
Камера должна быть включена в режиме датчика линии блоком [«Включить видеокамеру»](/trik/programming-visual/blocks#initialize-videocamera) и инициализирована блоком [«Детектировать по камере»](/trik/programming-visual/blocks#detect-videocamera).

### Запустить видеотрансляцию <a href="#camera-on" id="camera-on"></a>

![Запустить видеотрансляцию](/files/-M585gD84zEiNNaqb_Wz)

Запускает видеотрансляцию на роботе.\
\
Видео может быть просмотрено на пульте управления ТРИК или в браузере по адресу вида:\
`{ip-адрес робота}:8080/?action=stream/`.

### Послать сообщение <a href="#send-message" id="send-message"></a>

![Послать сообщение](/files/-M585_bUADBux_LqLMIk)

Отправляет данное сообщение роботу с данным бортовым номером.\
\
Робот должен быть в той же сети, что и робот, отправляющий сообщение, и зарегистрирован как ведущий или ведомый с помощью меню `Настройки → Сообщения` на роботе. Если роботов с данным бортовым номером в сети несколько, сообщение получат все они.

### Записать в файл <a href="#write-to-file" id="write-to-file"></a>

![Записать в файл](/files/-M585Xzsv8xftnx445LL)

Записывает значение данного выражения в заданный файл на роботе.\
\
Путь до файла может быть абсолютным или относительно папки с `trik-studio.exe`.\
\
Файл можно получить с контроллера, например, с помощью программы [WinSCP](/studio/utilities/winscp) для Windows или scp для Linux.

### Удалить файл <a href="#remove-file" id="remove-file"></a>

![Удалить файл](/files/-M585VCANzrPGpAHeq7O)

Удаляет заданный файл на роботе.\
\
Путь до файла может быть абсолютным или относительно папки с `trik-studio.exe`.

### Выключить видеокамеру

![Выключить видеокамеру](/files/-M585R708SOuIH77Yor8)

Выключает видеокамеру.

### Отключить видеотрансляцию

![Отключить видеотрансляцию](/files/-M585Ne4AyFOPT5ZBdT1)

Останавливает видеотрансляцию с камеры робота.

### Калибровка гироскопа

<img src="/files/-M585JdJVY7Fqut3m6b8" alt="Калибровка гироскопа" width="188">

Устанавливает гироскоп в 0 в текущей позиции.

### Join network

<figure><img src="/files/BjsgU5SYtQhJ1zxMkgq9" alt="" width="157"><figcaption><p>Join network</p></figcaption></figure>

Устанавливает соединение между роботами и объединяет их в одну сеть.\
Имеет 3 свойства: **Address**, **Порт** и **Бортномер**.\
В свойстве **Address** указывается ip-адрес робота или экземпляра TRIK Studio, к которой он подключается.\
В свойстве **Порт** указываем номер порта, начиная с -1. Следующий экземпляр TRIK Studio будет иметь номер 0, следующий 1 и так далее.\
В свойстве **Бортномер** указывается бортномер вашего робота или TRIK Studio, начиная с 1. Если у нескольких роботов будет одинаковый бортномер, то они будут объединены в группу.

## Блоки ожидания <a href="#waiting-blocks" id="waiting-blocks"></a>

| Вид                                                                 |                                              Название                                              | Описание                                                                                                                                              |
| ------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------: | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
| <img src="/files/-M57ypVi6IEo1RijFtkO" alt="" data-size="original"> | [Получить сообщение из другой задачи](/trik/programming-visual/blocks#receive-message-from-thread) | Ждать получения сообщения из другой параллельной задачи.                                                                                              |
| ![](/files/-MHFotHDB2zv6DZZh-ty)                                    |                 [Пользовательский ввод](/trik/programming-visual/blocks#userinput)                 | Ждать ввода значения от пользователя.                                                                                                                 |
| <img src="/files/-M57zKmUw9MPthrXRzuK" alt="" data-size="original"> |                [Ждать гиродатчик](/trik/programming-visual/blocks#zhdat-girodatchik)               | Ждать, пока значение, возвращаемое гиродатчиком на указанном порту, не будет сравнимо с указанным в значении параметра «градусы».                     |
| <img src="/files/-M57zO8T739p60_XRLhD" alt="" data-size="original"> |            [Ждать датчик касания](/trik/programming-visual/blocks#wait-for-touch-sensor)           | Ждать срабатывания датчика касания на указанном порту.                                                                                                |
| <img src="/files/-M57zS2SvVfh9Rfjox1U" alt="" data-size="original"> |                    [Ждать свет](/trik/programming-visual/blocks#wait-for-light)                    | Ждать, пока значение, возвращаемое сенсором света на указанном порту, не будет сравнимо с указанным значением в параметре «Проценты».                 |
| <img src="/files/-M57zbAEV2VNZIm3dNmT" alt="" data-size="original"> |     [Ждать УЗ датчик расстояния](/trik/programming-visual/blocks#wait-for-ultrasonic-distance)     | Ждать, пока расстояние, возвращаемое ультразвуковым сенсором расстояния, не будет сравнимо со значением, указанным в параметре «Расстояние».          |
| <img src="/files/-M57zi--uScH_i_9EzPI" alt="" data-size="original"> |      [Ждать ИК датчик расстояния](/trik/programming-visual/blocks#wait-for-infrared-distance)      | Ждать, пока расстояние, возвращаемое инфракрасным сенсором расстояния, не будет сравнимо с указанным в значении параметра «Расстояние».               |
| <img src="/files/-M57zl2xDEXflqasoKBr" alt="" data-size="original"> |                  [Ждать энкодер](/trik/programming-visual/blocks#wait-for-encoder)                 | Ждать, пока показания счетчика количества оборотов на заданном порту не станут больше или меньше указанного в значении параметра «Предел оборотов».   |
| <img src="/files/-M57zo5QhGbG1jYYl-bW" alt="" data-size="original"> |               [Ждать нажатия кнопки](/trik/programming-visual/blocks#wait-for-button)              | Ждать, пока не будет нажата указанная кнопка на корпусе робота.                                                                                       |
| <img src="/files/-M57zvnNNubsZZCgmTUu" alt="" data-size="original"> |               [Получить сообщение](/trik/programming-visual/blocks#wait-for-message)               | Ждать получения сообщения через систему почтовых ящиков. Когда сообщение будет получено, оно будет помещено в указанную в параметре блока переменную. |
| <img src="/files/-M57zzClLKdwrmgj9ATp" alt="" data-size="original"> |          [Ждать кнопки на пульте](/trik/programming-visual/blocks#wait-for-gamepad-button)         | Ждать нажатия на кнопку на пульте, подключённом к роботу.                                                                                             |
| <img src="/files/-M58-6B1MYOp6WYtyfhO" alt="" data-size="original"> |            [Ждать нажатия на пульт](/trik/programming-visual/blocks#wait-for-pad-press)            | Ждать нажатия на одну из двух активных областей пульта, подключённого к роботу.                                                                       |
| <img src="/files/-M58-9LnSPpJnIP9plqI" alt="" data-size="original"> |          [Ждать "руля" на пульте](/trik/programming-visual/blocks#wait-for-gamepad-wheel)          | Ждать нужного наклона пульта, подключённого к роботу.                                                                                                 |
| <img src="/files/-M58-C66OVf_TIch0RDx" alt="" data-size="original"> |       [Ждать отключения пульта](/trik/programming-visual/blocks#wait-for-gamepad-disconnect)       | Ждать, пока пульт не отключится от робота. Если пульт не подключен, программа продолжит выполнение.                                                   |
| <img src="/files/-M58-E9XVfErkA5ANFEw" alt="" data-size="original"> |        [Ждать подключения пульта](/trik/programming-visual/blocks#wait-for-gamepad-connect)        | Ждать, пока к роботу не подключится пульт. Если пульт уже подключен, программа продолжит выполнение.                                                  |

### Получить сообщение из другой задачи <a href="#receive-message-from-thread" id="receive-message-from-thread"></a>

![Получить сообщение из другой задачи](/files/-M587b6vLBc_UZlx81sw)

Ждать получения сообщения из другой параллельной задачи.\
\
Когда сообщение будет получено, оно будет присвоено указанной в блоке переменной.\
\
Свойство «Дождаться сообщения» позволяет указать, что делать, если очередь сообщений пуста: дождаться прихода нового сообщения или продолжить работу, присвоив переменной пустую строку.\
\
Сообщение автоматически приводится к типу, соответствующему типу переменной-приёмника. Пример: если вы посылаете число в виде строки, то оно будет принято как число.

### Пользовательский ввод <a href="#userinput" id="userinput"></a>

![Пользовательский ввод](/files/-MHFoZWxXEMPetF10goi)

Ждать ввода значения от пользователя. После ввода значение будет присвоено указанной в блоке переменной.

#### Свойства

Блок «Пользовательский ввод» имеет 3 свойства:

| Свойство         | Описание                          |
| ---------------- | --------------------------------- |
| **Переменная**   | Имя переменной.                   |
| **По умолчанию** | Значение переменной по умолчанию. |
| **Текст**        | Описание поля ввода.              |

**Пример**

| **Программа**                                                | Исполнение программы                                         |
| ------------------------------------------------------------ | ------------------------------------------------------------ |
| <p></p><p><img src="/files/-MHFu3BiOxwlNUiB9itw" alt=""></p> | <p></p><p><img src="/files/-MHFu8R6EJhWeXYr84xh" alt=""></p> |

### Ждать гиродатчик

![Ждать гиродатчик](/files/-M587eGNbbB8tI78mu04)

Ждать, пока значение, возвращаемое гиродатчиком на указанном порту, не будет сравнимо с указанным в значении параметра «градусы».

### Ждать датчик касания <a href="#wait-for-touch-sensor" id="wait-for-touch-sensor"></a>

![Ждать датчик касания](/files/-M587gpayfJef9HH-JnS)

Ждать срабатывания датчика касания на указанном порту.

### Ждать свет <a href="#wait-for-light" id="wait-for-light"></a>

![Ждать свет](/files/-M587Yu5kT5w4dpSGisS)

Ждать, пока значение, возвращаемое сенсором света на указанном порту, не будет сравнимо с указанным значением в параметре «Проценты».\
\
Параметры:\
«Проценты» — значение для сравнения со значением, возвращаемым датчиком света.\
«Порт» — порт, к которому подключен сенсор света.\
«Считанное значение» — операция, которая будет использоваться для сравнения со значением параметра «Проценты».

### Ждать УЗ датчик расстояния <a href="#wait-for-ultrasonic-distance" id="wait-for-ultrasonic-distance"></a>

![Ждать УЗ датчик расстояния](/files/-M587WCP5OjHG86wu2Zm)

Ждать, пока расстояние, возвращаемое ультразвуковым сенсором расстояния, не будет сравнимо со значением, указанным в параметре «Расстояние» (расстояние задается в сантиметрах, от 0 до 300).\
\
Параметры:\
«Расстояние» — значение для сравнения со значением, возвращаемым датчиком расстояния.\
«Порт» — порт, к которому подключен датчик расстояния.\
«Считанное значение» — операция, которая будет использоваться для сравнения со значением параметра «Расстояние».

### Ждать ИК датчик расстояния <a href="#wait-for-infrared-distance" id="wait-for-infrared-distance"></a>

![Ждать ИК датчик расстояния](/files/-M587SIFUrsraht9Qbky)

Ждать, пока расстояние, возвращаемое инфракрасным сенсором расстояния, не будет сравнимо с указанным в значении параметра «Расстояние».\
\
По умолчанию на портах A1 и A2 расстояние задается в сантиметрах (от 0 до 100), к остальным подключение не рекомендуется, так как чистое значение с датчика будет обработано с ожиданием другого подключенного датчика.\
\
Еще один параметр — номер порта, к которому подключен датчик расстояния. Также параметром указывается операция, которая будет использоваться для сравнения с введенным расстоянием.

### Ждать энкодер <a href="#wait-for-encoder" id="wait-for-encoder"></a>

![Ждать энкодер](/files/-M587LCzIrUOaTVg9C4b)

Ждать, пока показания счетчика количества оборотов на заданном порту не станут больше или меньше указанного в значении параметра «Предел оборотов».

### Ждать нажатия кнопки <a href="#wait-for-button" id="wait-for-button"></a>

![Ждать нажатия кнопки](/files/-M587I3TRtlzluXsZfN0)

Ждать, пока не будет нажата указанная кнопка на корпусе робота.

### Получить сообщение <a href="#wait-for-message" id="wait-for-message"></a>

![Получить сообщение](/files/-M587FFDQKmimUVl55Ya)

Ждать получения сообщения через систему почтовых ящиков. Когда сообщение будет получено, оно будет помещено в указанную в параметре блока переменную.\
\
Свойство «Дождаться сообщения» позволяет указать, что делать, если очередь сообщений пуста: дождаться прихода нового сообщения или продолжить работу, положив в переменную пустую строку.\
\
Сообщение автоматически приводится к типу, соответствующему типу переменной-приёмника, то есть, например, можно послать число в виде строки и принять его как число.

### Ждать кнопки на пульте <a href="#wait-for-gamepad-button" id="wait-for-gamepad-button"></a>

![Ждать кнопки на пульте](/files/-M587CGEYyvb_XtS-GUF)

Ждать нажатия на кнопку на пульте, подключённом к роботу. Кнопки имеют номера от 1 до 5.

### Ждать нажатия на пульт <a href="#wait-for-pad-press" id="wait-for-pad-press"></a>

![Ждать нажатия на пульт](/files/-M5878byJ41xEC0fqSm4)

Ждать нажатия на одну из двух активных областей пульта, подключённого к роботу. Координаты нажатия можно получить с помощью сенсорных переменных [«gamepadPad»](/trik/programming-visual/sensory-variables#gamepadpad).

### Ждать «руля» на пульте <a href="#wait-for-gamepad-wheel" id="wait-for-gamepad-wheel"></a>

![Ждать «руля» на пульте](/files/-M5876OEn8PE8pe3GwiE)

Ждать нужного наклона пульта, подключённого к роботу.\
\
Наклон регистрируется только если на пульте включён режим «руля», угол наклона кодируется числами от -100 (максимально влево) до 100 (максимально вправо).\
\
Также параметром указывается операция, которая будет использоваться для сравнения со значением параметра «Угол».

### Ждать отключения пульта <a href="#wait-for-gamepad-disconnect" id="wait-for-gamepad-disconnect"></a>

![Ждать отключения пульта](/files/-M5873VZcqz10PTfhDZr)

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

### Ждать подключения пульта <a href="#wait-for-gamepad-connect" id="wait-for-gamepad-connect"></a>

![Ждать подключения пульта](/files/-M58712VVt04Ex5ZahZt)

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

## Блоки рисования

| Вид                                                                 |                                  Название                                  | Описание                                                                                                                                                                                                         |
| ------------------------------------------------------------------- | :------------------------------------------------------------------------: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <img src="/files/-M580iWSqeTAQwq3hWB3" alt="" data-size="original"> |         [Цвет кисти](/trik/programming-visual/blocks#painter-color)        | Указать цвет, которым будут рисоваться простые графические фигуры на экране робота.                                                                                                                              |
| <img src="/files/-M580kkbRdA4q-cb10MU" alt="" data-size="original"> |        [Ширина кисти](/trik/programming-visual/blocks#painter-width)       | Указать ширину линии, которой будут рисоваться простые графические фигуры на экране робота.                                                                                                                      |
| <img src="/files/-M580nHEEuZ2xfB8PA8Y" alt="" data-size="original"> |       [Нарисовать точку](/trik/programming-visual/blocks#draw-pixel)       | Нарисовать на экране точку в указанных координатах.                                                                                                                                                              |
| <img src="/files/-M580r3HM3j4oEEU2KcL" alt="" data-size="original"> |        [Нарисовать линию](/trik/programming-visual/blocks#draw-line)       | Нарисовать на экране отрезок. В качестве параметров блоку указываются концы отрезка.                                                                                                                             |
| <img src="/files/-M580pC_bqwcbeEbnung" alt="" data-size="original"> | [Нарисовать прямоугольник](/trik/programming-visual/blocks#draw-rectangle) | Нарисовать на экране прямоугольник. В качестве параметров указываются координаты левого верхнего угла, ширина и высота прямоугольника.                                                                           |
| <img src="/files/-M580tMbl4I0nHUrz9s9" alt="" data-size="original"> |      [Нарисовать эллипс](/trik/programming-visual/blocks#draw-ellipse)     | Нарисовать на экране эллипс, вписанный в заданный прямоугольник.                                                                                                                                                 |
| <img src="/files/-M580vdpu51HDgOGV-RD" alt="" data-size="original"> |         [Нарисовать дугу](/trik/programming-visual/blocks#draw-arc)        | Нарисовать на экране дугу, заданную координатами прямоугольника, в который она будет вписана, и углами (в градусах) её начала и конца на окружности. Если начало и конец совпадают, будет нарисована окружность. |
| <img src="/files/-M580yAPcSOa8aWR-nZA" alt="" data-size="original"> |              [Смайлик](/trik/programming-visual/blocks#smile)              | Нарисовать на экране смайлик.                                                                                                                                                                                    |
| <img src="/files/-M581-PnAitsHQgnhcDE" alt="" data-size="original"> |        [Грустный смайлик](/trik/programming-visual/blocks#sad-smile)       | Нарисовать на экране грустный смайлик.                                                                                                                                                                           |
| <img src="/files/-M5812dbsuVMqpcwmSPm" alt="" data-size="original"> |        [Цвет фона](/trik/programming-visual/blocks#background-color)       | Задаёт цвет фона экрана.                                                                                                                                                                                         |
| <img src="/files/-M5814kvOBCqnro2Pdw5" alt="" data-size="original"> |       [Напечатать текст](/trik/programming-visual/blocks#print-text)       | Печатает заданную строку в заданном месте на экране робота. Значение свойства «Текст» по умолчанию трактуется как строка в чистом виде, оно так и будет выведено на экран.                                       |
| <img src="/files/-M5818T918Net1_b0IuL" alt="" data-size="original"> |       [Очистить экран](/trik/programming-visual/blocks#clear-screen)       | Стереть всё, что нарисовано на экране.                                                                                                                                                                           |

### Цвет кисти <a href="#painter-color" id="painter-color"></a>

![Цвет кисти](/files/-M587toEF8-BoaHIzvny)

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

### Ширина кисти <a href="#painter-width" id="painter-width"></a>

![Ширина кисти](/files/-M587va0sqyrwp6gAlfd)

Указать ширину линии, которой будут рисоваться простые графические фигуры на экране робота.

### Нарисовать точку <a href="#draw-pixel" id="draw-pixel"></a>

![Нарисовать точку](/files/-M587xh14MetvhWCPlAW)

Нарисовать на экране точку в указанных координатах.

### Нарисовать линию <a href="#draw-line" id="draw-line"></a>

![Нарисовать линию](/files/-M587zY89sIny2uEiT9H)

Нарисовать на экране отрезок. В качестве параметров блоку указываются концы отрезка.

### Нарисовать прямоугольник <a href="#draw-rectangle" id="draw-rectangle"></a>

![Нарисовать прямоугольник](/files/-M5880LQSXqGtFcxaM63)

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

### Нарисовать эллипс <a href="#draw-ellipse" id="draw-ellipse"></a>

![Нарисовать эллипс](/files/-M5882RNQ_qc7GRcY0aQ)

Нарисовать на экране эллипс, вписанный в заданный прямоугольник.

### Нарисовать дугу <a href="#draw-arc" id="draw-arc"></a>

![Нарисовать дугу](/files/-M58860UAVYhHUnttrW6)

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

### Смайлик <a href="#smile" id="smile"></a>

![Смайлик](/files/-M5888W2NZjgbWIXO_Ra)

Нарисовать на экране смайлик.

### Грустный смайлик <a href="#sad-smile" id="sad-smile"></a>

![Грустный смайлик](/files/-M588AfNbHIM1rJapqM6)

Нарисовать на экране грустный смайлик.

### Цвет фона <a href="#background-color" id="background-color"></a>

![Цвет фона](/files/-M588GN40A8ngsrNEaso)

Задаёт цвет фона экрана.

### Напечатать текст <a href="#print-text" id="print-text"></a>

![Напечатать текст](/files/-M588IPKZ_dNh7NmOk9-)

Печатает заданную строку в заданном месте на экране робота.

#### Свойства

| Свойство          | Значение                                                                                              |
| ----------------- | ----------------------------------------------------------------------------------------------------- |
| Вычислять         | <p>Истина — вывод на экран значения переменной или выражения.</p><p>Ложь — вывод на экран текста.</p> |
| Текст             | Текст / имя переменной (выражение) для вывода на экран.                                               |
| Обновить картинку | <p>Истина — обновить экран.<br>Ложь — не обновлять экран.</p>                                         |
| X, Y              | Координаты начала текста.                                                                             |
| Размер            | Размер шрифта в пикселях (необязательный параметр, по-умолчанию шрифт размером 20 пикселей).          |

#### Как вывести текст на экран?

Для вывода текста:

1. В свойстве «Текст» напишите нужный текст.
2. Уберите галочку в свойстве «Вычислять».

#### Как вывести значение переменной на экран?

Для вывода значения переменной:

1. В свойстве «Текст» напишите имя переменной.
2. Поставьте галочку в свойстве «Вычислять».

### Очистить экран <a href="#clear-screen" id="clear-screen"></a>

![Очистить экран](/files/-M588KBGD8M1LWAwR_li)

Стереть всё, что нарисовано на экране.


# Сенсорные переменные для контроллера ТРИК

Сенсорные переменные — зарезервированные переменные для получения показаний сенсоров, подключенных к соответствующим портам.

Эти значения можно присваивать переменным и использовать в математических выражениях.

Изменение переменных можно отследить по ходу программы в [таблице переменных](/studio/interface#panel-variables).

| Переменная                                                                                                                                                 | Описание                                                                                                                                                                                                                                                                                                                                                                                       |
| ---------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [accelerometer](/trik/programming-visual/sensory-variables#accelerometer)                                                                                  | Массив из трёх элементов, содержащий показания акселерометра по оси X, Y и Z.                                                                                                                                                                                                                                                                                                                  |
| <p>buttonDown</p><p>buttonUp</p><p></p><p>buttonEnter</p><p>buttonEsc</p><p>buttonPower</p><p></p><p>buttonLeft</p><p>buttonRight</p><p></p><p></p><p></p> | <p>Состояние кнопок на корпусе контроллера ТРИК:<br>«Вниз»,</p><p>«Вверх»,</p><p></p><p>«Ввод»,</p><p>«Отмена»,<br>«Питание»,<br><br>«Влево»,</p><p>«Вправо».<br><br>Возможные значения:<br>0 — кнопка не нажата.<br>1 — нажатая кнопка.</p>                                                                                                                                                   |
| [colorSensor](/trik/programming-visual/sensory-variables#colorsensor)                                                                                      | <p>Показания датчика цвета по видеокамере в центре кадра — интенсивность красного, зелёного и синего соответственно.</p><p></p><p>Обновляются только когда датчик цвета включён и инициализирован.</p><p><br>Возможные значения: 0 .. 255</p>                                                                                                                                                  |
| <p>encoder1<br>encoder2<br>encoder3<br>encoder4</p>                                                                                                        | Показания энкодеров на портах E1, E2, E3, E4 соответственно.                                                                                                                                                                                                                                                                                                                                   |
| <p>gamepadButton1</p><p>...</p><p>gamepadButton5</p>                                                                                                       | <p>Состояние кнопок на пульте с 1 по 5 соответственно.<br><br>0 — кнопка не нажата.<br>1 — кнопка нажата.</p>                                                                                                                                                                                                                                                                                  |
| gamepadConnected                                                                                                                                           | <p>Состояние подключения пульта.<br></p><p>0 — пульт не подключен.<br>1 — пульт подключен.</p>                                                                                                                                                                                                                                                                                                 |
| <p><a href="/pages/-M032i55eqQ6oReD1pyE#gamepadpad">gamepadPad1</a><br><a href="/pages/-M032i55eqQ6oReD1pyE#gamepadpad">gamepadPad2</a></p>                | <p>Координаты нажатия активных областей на пульте.<br><br>Каждая переменная хранит в себе массив из двух элементов, соответствующих координате точки нажатия.<br></p><p>Возможные значения:<br>От (-100, -100) до (100, 100).</p><p>(-101, -101) — если нажатия нет.</p>                                                                                                                       |
| <p>gamepadPad1Pressed<br>gamepadPad2Pressed</p>                                                                                                            | <p>Состояние нажатия на область левую и правую область пульта соответственно. Координаты нажатия можно узнать с помощью переменных <a href="/pages/-M032i55eqQ6oReD1pyE#gamepadpad">gamepadPad1</a> и <a href="/pages/-M032i55eqQ6oReD1pyE#gamepadpad">gamepadPad2</a>.<br><br>Возможные значения: <br>1 — активная область на пульте нажата.<br>0 — активная область на пульте не нажата.</p> |
| gamepadWheel                                                                                                                                               | <p>Значение наклона пульта (если он подключён и на нём включён «руль»).<br><br>Возможные значения:<br>-100 ... 100.</p><p>-101 — если данных о положении «руля» нет.</p><p></p><p>-100 — крайнее левое положение.<br>100 — крайнее правое положение.</p>                                                                                                                                       |
| [gyroscope](/trik/programming-visual/sensory-variables#gyroscope)                                                                                          | Массив из трёх элементов, содержащий показания гироскопа по оси X, Y и Z соответственно.                                                                                                                                                                                                                                                                                                       |
| [lineSensor](/trik/programming-visual/sensory-variables#linesensor)                                                                                        | Массив из трёх элементов, содержащий показания камеры в режиме датчика линии. Значения обновляются при включенном и инициализированном датчике линии.                                                                                                                                                                                                                                          |
| objectSensorX objectSensorY                                                                                                                                | <p>Координаты распознанного объекта видеокамерой относительно центра экрана. Значения обновляются при включенном и инициализированном датчике.</p><p></p><p>Возможные значения<strong>:</strong><br>От -100 до 100 (относительно центра кадра).</p>                                                                                                                                            |
| objectSensorSize                                                                                                                                           | <p>Размер распознанного объекта видеокамерой. Значение обновляется при включенном и инициализированном датчике объекта.<br></p><p>Возможные значения:<br>От 0 до 100.<br><br>100 — объект занимает весь кадр.</p>                                                                                                                                                                              |
| <p>sensorA1<br>...<br>sensorA6</p>                                                                                                                         | Показания датчиков, подключенных к соответствующим аналоговым портам.                                                                                                                                                                                                                                                                                                                          |
| <p>sensorD1<br>sensorD2</p>                                                                                                                                | Показания датчиков, подключенных к соответствующим цифровым портам.                                                                                                                                                                                                                                                                                                                            |

## **accelerometer**

Массив из трёх элементов, содержащий показания акселерометра по оси X, Y и Z соответственн&#x43E;**.**

#### **Пример**

```python
x = accelerometer[0]; -- показания акселерометра по оси X
y = accelerometer[1]; -- показания акселерометра по оси Y
z = accelerometer[2]; -- показания акселерометра по оси Z
```

## **colorSensor** <a href="#colorsensor" id="colorsensor"></a>

Показания датчика цвета по видеокамере в центре кадра — интенсивность красного, зелёного и синего соответственно.

Обновляются только когда датчик цвета включён и инициализирован.

|                     |                               |
| ------------------- | ----------------------------- |
| **colorSensor\[0]** | Интенсивность красного цвета  |
| **colorSensor\[1]** | Интенсивность зеленого цвета. |
| **colorSensor\[2]** | Интенсивность синего цвета    |

#### **Возможные значения**

От 0 до 255.

#### **Пример**

```
r = colorSensor[0]; -- интенсивность красного цвета
g = colorSensor[1]; -- интенсивность зеленого цвета
b = colorSensor[2]; -- интенсивность синего цвета
```

## **gamepadPad1, gamepadPad2** <a href="#gamepadpad" id="gamepadpad"></a>

Координаты нажатия активных областей на пульте.

Каждая переменная хранит в себе массив из двух элементов, соответствующих координате точки нажатия.

![](https://thumb.tildacdn.com/tild3864-3034-4638-a466-343932386432/-/resize/602x/-/format/webp/image7.png)

#### **Возможные значения**

От (-100, -100) до (100, 100), \
(-100, -100) — левый верхний угол активной области.\
(-101, -101) — если нажатия нет.

## **gyroscope**

Массив из трёх элементов, содержащий показания гироскопа по оси X, Y и Z соответственно.

#### **Пример**

```python
x = gyroscope[0]; -- показания гироскопа по оси X (скорость)
y = gyroscope[1]; -- показания гироскопа по оси Y (скорость)
z = gyroscope[2]; -- показания гироскопа по оси Z (скорость)
t = gyroscope[3]; -- абсолютное время показания (мс)
pos_x = gyroscope[4]; -- угол отклонения робота по оси X (градусы)
pos_y = gyroscope[5]; -- угол отклонения робота по оси Y (градусы)
pos_z = gyroscope[6]; -- угол отклонения робота по оси Z (градусы)
```

## **lineSensor**

Массив из трёх элементов, содержащий показания камеры в режиме датчика линии.Значения обновляются при включенном и инициализированном датчике.

|                    |                                                                                                                                                                                                                      |
| ------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **lineSensor\[0]** | Отклонение линии от центра экрана от -100 (крайнее левое положение линии в кадре) до 100 (крайнее правое положение).                                                                                                 |
| **lineSensor\[1]** | Вероятность перекрёстка — определяется как процент точек внутри горизонтальной полосы в центре кадра, распознанных как линия.От 0 (таких точек нет) до 100 (все точки в горизонтальной полосе распознаны как линия). |
| **lineSensor\[2]** | Относительный размер линии, то есть количество точек в кадре, определённых как линия, от 0 (линии в кадре нет) до 100 (весь кадр распознан как линия).                                                               |


# Программирование ТРИК на Python и JavaScript

## Создание текстовой программы

Про создание новой текстовой программы и генерацию диаграммы в код читайте в статье:

{% content-ref url="/pages/-M0Npt6Rsejz5XCUWJsR" %}
[Программирование на текстовом языке](/studio/programming-code)
{% endcontent-ref %}

## Программирование на Python и JavaScript

Доступ к функциональности среды выполнения предоставляется с помощью предопределённых объектов и функций.

### Объекты

| Объект                                               | Описание                                                                                                   |
| ---------------------------------------------------- | ---------------------------------------------------------------------------------------------------------- |
| [brick](/trik/programming-code/object-brick)         | Представляет контроллер ТРИК и предоставляет доступ к устройствам робота.                                  |
| [script](/trik/programming-code/object-script)       | Представляет методы управления выполнением скрипта и предоставляет доступ к функциям операционной системы. |
| [mailbox](/trik/programming-code/object-mailbox)     | Реализует связь между роботами в сети посредством механизма почтовых ящиков.                               |
| [gamepad](/trik/programming-code/object-gamepad)     | Служит для работы с пультом управления.                                                                    |
| [Threading](/trik/programming-code/object-threading) | Предоставляет управление параллельными потоками.                                                           |

### Функции

| Функция                                                    | Описание                                                                                                                                                                                                                                        |
| ---------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [getPhoto](/trik/programming-code/function-getphoto)       | Возвращает одномерный массив байт, в который записаны пиксели изображения в формате `rgb32`​, снятого с камеры.                                                                                                                                 |
| [include(“path”)](/trik/programming-code/function-include) | Позволяет использовать функции, реализованные пользователем в других файлах. Предполагается для написания собственных библиотек. В качестве передаваемого параметра необходимо указать полный системный путь до файла с необходимыми функциями. |


# Объект «brick»

Объект «brick» представляет контроллер ТРИК и предоставляет доступ к устройствам робота.

| Метод                           | Описание                                                                                                      |
| ------------------------------- | ------------------------------------------------------------------------------------------------------------- |
| [accelerometer](#accelerometer) | Предоставляет доступ к акселерометру.                                                                         |
| [battery](#battery)             | Предоставляет доступ к информации об аккумуляторе.                                                            |
| [colorSensor](#colorsensor)     | Предоставляет доступ к датчику цвета по видеокамере.                                                          |
| [display](#display)             | Предоставляет доступ к дисплею робота.                                                                        |
| [encoder](#encoder)             | Предоставляет доступ к энкодеру на указанном порту.                                                           |
| [getStillImage](#getstillimage) | Получить фотографию с камеры в виде массива байт.                                                             |
| [gyroscope](#gyroscope)         | Предоставляет доступ к гироскопу.                                                                             |
| [keys](#keys)                   | Предоставляет доступ к кнопкам на корпусе робота.                                                             |
| [playSound](#playsound)         | Проиграть звуковой файл.                                                                                      |
| [playTone](#playtone)           | Проиграть звук с заданной частотой.                                                                           |
| [led](#led)                     | Предоставляет доступ к светодиоду на корпусе робота.                                                          |
| [lineSensor](#linesensor)       | Предоставляет доступ к датчику линии по видеокамере.                                                          |
| [motor](#motor)                 | Предоставляет доступ к мотору на указанном порту.                                                             |
| [objectSensor](#objectsensor)   | Предоставляет доступ к датчику объекта по видеокамере.                                                        |
| [say](#say)                     | Произнести переданную как параметр строку (на русском или английском языке).                                  |
| [sensor](#sensor)               | Предоставляет доступ к сенсору на указанном порту.                                                            |
| [stop](#stop)                   | Останавливает все моторы и активные датчики, убирает нарисованное на дисплее.                                 |
| [marker](#marker)               | Предоставляет доступ к рисованию маркером заданного цвета на полу. Доступен только в режиме двумерной модели. |
| [irCamera](#ircamera)           | Предоставляет доступ к инфракрасному датчику.                                                                 |

## accelerometer

Предоставляет доступ к акселерометру (класс «[Accelerometer](/trik/programming-code/object-brick/class-accelerometer)»).

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```python
brick.accelerometer();
```

{% endtab %}

{% tab title="JavaScript " %}

```javascript
brick.accelerometer();
```

{% endtab %}
{% endtabs %}

## battery

Предоставляет доступ к информации об аккумуляторе.(класс «[Battery](/trik/programming-code/object-brick/class-battery)»).

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```python
brick.battery();
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.battery();
```

{% endtab %}
{% endtabs %}

## colorSensor

Предоставляет доступ к датчику цвета по видеокамере (класс «[ColorSensor](/trik/programming-code/object-brick/class-colorsensor)»).

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```python
brick.colorSensor("video1")
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.colorSensor("video1");
```

{% endtab %}
{% endtabs %}

## display

Предоставляет доступ к дисплею робота (класс «[Display](/trik/programming-code/object-brick/class-display)»).

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```
brick.display()
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.display();
```

{% endtab %}
{% endtabs %}

## encoder

Предоставляет доступ к энкодеру на указанном порту (класс «[Encoder](/trik/programming-code/object-brick/class-encoder)»).

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```python
brick.encoder(portName)
brick.encoder("portName")
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.encoder(portName);
brick.encoder("portName");
```

{% endtab %}
{% endtabs %}

В качестве параметра необходимо указать порт.

#### Пример

{% tabs %}
{% tab title="Python" %}

```python
brick.encoder(E1) # вызов энкодера на порту E1
brick.encoder("E2") # вызов энкодера на порту E2
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.encoder(E1); // вызов энкодера на порту E1
brick.encoder("E2"); // вызов энкодера на порту E2
```

{% endtab %}
{% endtabs %}

## getStillImage

Получить фотографию с камеры в виде массива байт.

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```
brick.getStillImage()
```

{% endtab %}

{% tab title="JavaScript" %}

```
brick.getStillImage();
```

{% endtab %}
{% endtabs %}

## gyroscope

Предоставляет доступ к гироскопу (класс «[Gyroscope](/trik/programming-code/object-brick/class-gyroscope)»).

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```
brick.gyroscope()
```

{% endtab %}

{% tab title="JavaScript" %}

```
brick.gyroscope();
```

{% endtab %}
{% endtabs %}

## keys

Предоставляет доступ к кнопкам на корпусе робота (класс «[Keys](/trik/programming-code/object-brick/class-keys)»).

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```
brick.keys()
```

{% endtab %}

{% tab title="JavaScript" %}

```
brick.keys();
```

{% endtab %}
{% endtabs %}

## led

Предоставляет доступ к светодиоду на корпусе робота (класс «[Led](/trik/programming-code/object-brick/class-led)»).

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```
brick.led()
```

{% endtab %}

{% tab title="JavaScript" %}

```
brick.led();
```

{% endtab %}
{% endtabs %}

## lineSensor

Предоставляет доступ к датчику линии по видеокамере (класс «[LineSensor](/trik/programming-code/object-brick/class-linesensor)»).

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```
brick.lineSensor("video1")
```

{% endtab %}

{% tab title="JavaScript" %}

```
brick.lineSensor("video1");
```

{% endtab %}
{% endtabs %}

## motor

Предоставляет доступ к мотору (силовому или сервомотору) на указанном порту (класс «[Motor](/trik/programming-code/object-brick/class-motor)»).

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```python
brick.motor(motorName)
brick.motor("motorName")
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.motor(motorName);
brick.motor("motorName");
```

{% endtab %}
{% endtabs %}

В качестве параметра необходимо указать порт.

#### Пример

{% tabs %}
{% tab title="Python" %}

```python
brick.motor(M1) # вызов мотора на порту M1
brick.motor("M2") # вызов мотора на порту M2
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.motor(M1) // вызов мотора на порту M1
brick.motor("M2") // вызов мотора на порту M2
```

{% endtab %}
{% endtabs %}

## objectSensor

Предоставляет доступ к датчику объекта по видеокамере (класс «[ObjectSensor](/trik/programming-code/object-brick/class-objectsensor)»).

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```python
brick.objectSensor()
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.objectSensor();
```

{% endtab %}
{% endtabs %}

## playSound

Проиграть звуковой файл.

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```python
brick.playSound("filename")
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.playSound("filename");
```

{% endtab %}
{% endtabs %}

В качестве параметра необходимо указать имя файла с абсолютным путем или путем относительно папки trik на контроллере.

{% hint style="warning" %}
Внимание! Файл должен быть предварительно загружен на контроллер.
{% endhint %}

#### Пример

{% tabs %}
{% tab title="Python" %}

```python
brick.playSound("media/sound.mp3") # проиграть файл sound.mp3 из папки media
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.playSound("media/sound.mp3"); // проиграть файл sound.mp3 из папки media
```

{% endtab %}
{% endtabs %}

## playTone

Проиграть звук с заданной частотой.

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```python
brick.playTone(frequency, time)
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.playSound(frequency, time);
```

{% endtab %}
{% endtabs %}

В качестве параметров необходимо указать частоту звука `frequency` и время `time` в мс, в течение которого необходимо проигрывать звук.

#### Пример

{% tabs %}
{% tab title="Python" %}

```python
brick.playTone(1000, 1000)
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.playTone(1000, 1000);
```

{% endtab %}
{% endtabs %}

## say

Произнести строку (на русском или английском языке).

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```python
brick.say(string)
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.say(string);
```

{% endtab %}
{% endtabs %}

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

#### Пример

{% tabs %}
{% tab title="Python" %}

```python
brick.say("Привет, я ТРИК")
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.say("Привет, я ТРИК");
```

{% endtab %}
{% endtabs %}

## sensor

Предоставляет доступ к сенсору на указанном порту (класс «[Sensor](/trik/programming-code/object-brick/class-sensor)»).

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```python
brick.sensor(portName)
brick.sensor("portName")
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.sensor(portName);
brick.sensor("portName");
```

{% endtab %}
{% endtabs %}

В качестве параметра необходимо указать порт.

#### Пример

{% tabs %}
{% tab title="Python" %}

```python
brick.sensor(A1) # вызов сенсора на порту A1
brick.sensor("A2") # вызов сенсора на порту A2
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.sensor(A1) // вызов сенсора на порту A1
brick.sensor("A2") // вызов сенсора на порту A2
```

{% endtab %}
{% endtabs %}

## stop

Останавливает все моторы и активные датчики, убирает нарисованное на дисплее.

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```python
brick.stop()
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.stop();
```

{% endtab %}
{% endtabs %}

## marker

Предоставляет доступ к рисованию маркером заданного цвета на полу. Доступен только в режиме двумерной модели (класс «[Marker](/trik/programming-code/object-brick/class-marker)»)

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```python
brick.marker()
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.marker();
```

{% endtab %}
{% endtabs %}

## irCamera

Предоставляет доступ к инфракрасному датчику (класс «[IrCamera](/trik/programming-code/object-brick/class-ircamera)»).

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```python
brick.irCamera()
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.irCamera();
```

{% endtab %}
{% endtabs %}


# Класс «accelerometer»

Представляет [акселерометр](/trik/programming-code/object-brick#accelerometer) контроллера ТРИК.

| Метод                                                                | Описание                                                                                                                     |
| -------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- |
| [read](/trik/programming-code/object-brick/class-accelerometer#read) | Возвращает текущее показание сенсора в виде массива из трёх элементов, соответствующих показаниям сенсора по каждой из осей. |

| Сигнал                                                                     | Описание                                                       |
| -------------------------------------------------------------------------- | -------------------------------------------------------------- |
| [newData](/trik/programming-code/object-brick/class-accelerometer#newdata) | Сигнал, посылаемый сенсором, когда у него готовы новые данные. |

## read

Возвращает текущее показание сенсора в виде массива из трёх элементов, соответствующих показаниям сенсора по каждой из осей.

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```
brick.accelerometer().read()
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.accelerometer().read();
```

{% endtab %}
{% endtabs %}

## newData

Сигнал, посылаемый сенсором, когда у него готовы новые данные.


# Класс «battery»

Предоставляет доступ к информации о батарее или блоке питания.

## readVoltage

Возвращает текущий вольтаж батареи (или блока питания) в вольтах.

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```
brick.battery().readVoltage()
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.battery().readVoltage();
```

{% endtab %}
{% endtabs %}


# Класс «colorSensor»

Видеокамера в режиме датчика цвета.

| Метод                                                               | Описание                                                                                             |
| ------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- |
| [init​](/trik/programming-code/object-brick/class-colorsensor#init) | Включает видеокамеру и инициализирует её в режиме датчика цвета.                                     |
| [read​](/trik/programming-code/object-brick/class-colorsensor#read) | Возвращает массив с координатами доминирующего цвета в цветовой шкале RGB в указанном участке кадра. |
| [stop](/trik/programming-code/object-brick/class-colorsensor#stop)  | Выключает видеокамеру и прекращает работу датчика.                                                   |

## init

Включает видеокамеру и инициализирует её в режиме датчика цвета.

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```python
brick.colorSensor("video1").init(True)
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.colorSensor("video1").init(true);
```

{% endtab %}
{% endtabs %}

Булевый параметр определяет, выводить ли на экран изображение с камеры:

* `true` — выводить,
* `false` — не выводить.

## read

Возвращает массив с координатами доминирующего цвета в цветовой шкале RGB в указанном участке кадра.

Кадр делится на квадраты сеткой, по умолчанию 3 на 3, размерность сетки можно задать в `model-config.xml` на роботе. Квадраты индексируются с 1. То есть (1, 1) — это левый верхний край кадра, (2, 2) — его центр.

Возвращаемое значение — массив из трёх элементов от 0 до 255, индексирующийся с 0. Нулевой элемент содержит интенсивность красного (0 — совсем нет, 255 — очень много), первый — интенсивность зелёного, второй — интенсивность синего. Например, (0, 0, 0) — чёрный, (255, 255, 255) — белый, (255, 0, 0) — красный.

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```python
brick.colorSensor("video1").read(x, y)
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.colorSensor("video1").read(x, y);
```

{% endtab %}
{% endtabs %}

В качестве параметра необходимо указать индексы квадрата `x` и `y`.

## stop

Выключает видеокамеру и прекращает работу датчика.

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```python
brick.colorSensor("video1").stop()
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.colorSensor("video1").stop();
```

{% endtab %}
{% endtabs %}


# Класс «display»

Предоставляет доступ к дисплею робота.

{% hint style="info" %}
Размер экрана: 240\*320 пикселей.
{% endhint %}

| Метод                                                                                | Описание                                                                                                                              |
| ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------- |
| [addLabel](/trik/programming-code/object-brick/class-display#addlabel)               | Вывести на экран указанный текст, начиная с указанной координаты.                                                                     |
| [clear](/trik/programming-code/object-brick/class-display#clear)                     | Очистить окно для рисования.                                                                                                          |
| [drawArc](/trik/programming-code/object-brick/class-display#drawarc)                 | Нарисовать дугу эллипса, вписанного в прямоугольник с левым верхним углом в указанных координатах и имеющий заданную ширину и высоту. |
| [drawEllipse](/trik/programming-code/object-brick/class-display#drawellipse)         | Нарисовать эллипс, вписанный в прямоугольник с левым верхним углом в указанных координатах и имеющий заданную ширину и высоту.        |
| [drawLine](/trik/programming-code/object-brick/class-display#drawline)               | Нарисовать линию с началом и концом в заданных координатах.                                                                           |
| [drawPoint](/trik/programming-code/object-brick/class-display#drawpoint)             | Нарисовать точку в заданных координатах.                                                                                              |
| [drawRect](/trik/programming-code/object-brick/class-display#drawrect)               | Нарисовать прямоугольник с левым верхним углом в указанных координатах и имеющий заданную ширину и высоту.                            |
| [hide](/trik/programming-code/object-brick/class-display#hide)                       | Закрыть и очистить окно для рисования.                                                                                                |
| [redraw](/trik/programming-code/object-brick/class-display#redraw)                   | Перерисовать окно для рисования. Изменения в окне произойдут только после вызова этого метода.                                        |
| [removeLabels](/trik/programming-code/object-brick/class-display#removelabels)       | Удалить с экрана весь текст, добавленный на него вызовами метода «addLabel».                                                          |
| [setBackground](/trik/programming-code/object-brick/class-display#setbackground)     | Установить фон экрана в указанный цвет.                                                                                               |
| [setPainterColor](/trik/programming-code/object-brick/class-display#setpaintercolor) | Установить цвет кисти, которой рисуются графические примитивы.                                                                        |
| [setPainterWidth](/trik/programming-code/object-brick/class-display#setpainterwidth) | Установить толщину кисти, которой рисуются графические примитивы, в пикселях.                                                         |
| [show](/trik/programming-code/object-brick/class-display#show)                       | Вывести на дисплей контроллера изображение, сформированное в одномерном массиве.                                                      |
| [showImage](/trik/programming-code/object-brick/class-display#showimage)             | Вывести на экран изображение, предварительно загруженное на робот.                                                                    |

## addLabel

Вывести на экран указанный текст в указанные координаты. Если в указанных координатах уже был текст, он будет заменён новым.

Изменения на дисплее произойдут только после вызова метода «[redraw](/trik/programming-code/object-brick/class-display#redraw)».

{% tabs %}
{% tab title="Python" %}

```python
brick.display().addLabel("text", x, y, size)
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.display().addLabel("text", x, y, size);
```

{% endtab %}
{% endtabs %}

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

* `text` — выводимый текст,
* `x`, `y` — координаты экрана.
* `size` – размер шрифта в пикселях (необязательный параметр, по-умолчанию шрифт размером 20 пикселей).

#### Пример

{% tabs %}
{% tab title="Python" %}

```python
brick.display().addLabel('Привет, мир!', 1, 1, 20)
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.display().addLabel('Привет, мир!', 1, 1);
```

{% endtab %}
{% endtabs %}

## clear

Очистить окно для рисования.

{% tabs %}
{% tab title="Python" %}

```python
brick.display().clear()
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.display().clear();
```

{% endtab %}
{% endtabs %}

## drawArc

Нарисовать дугу эллипса, вписанного в прямоугольник с левым верхним углом в указанных координатах и имеющий заданную ширину и высоту. Изменения на дисплее произойдут только после вызова метода «[redraw](/trik/programming-code/object-brick/class-display#redraw)».

{% tabs %}
{% tab title="Python" %}

```python
brick.display().drawArc(x, y, l, h, from, to)
```

{% endtab %}

{% tab title="JavaScript" %}

```
brick.display().drawArc(x, y, l, h, from, to);
```

{% endtab %}
{% endtabs %}

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

* `x`, `y` — координаты левого верхнего угла прямоугольника на экране,
* `l` — ширина прямоугольника,
* `h` — высота прямоугольника,
* `from` — начальный угол, ограничивающий дугу,
* `to` — конечный угол, ограничивающий дугу.

#### Пример

{% tabs %}
{% tab title="Python" %}

```python
brick.display().drawArc(0, 0, 10, 10, 20, 50)
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.display().drawArc(0, 0, 10, 10, 20, 50);
```

{% endtab %}
{% endtabs %}

## drawEllipse

Нарисовать эллипс, вписанный в прямоугольник с левым верхним углом в указанных координатах и имеющий заданную ширину и высоту. Изменения на дисплее произойдут только после вызова метода «[redraw](/trik/programming-code/object-brick/class-display#redraw)».

{% tabs %}
{% tab title="Python" %}

```python
brick.display().drawEllipse(x, y, l, h, filled)
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.display().drawEllipse(x, y, l, h, filled);
```

{% endtab %}
{% endtabs %}

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

* `x`, `y` — координаты левого верхнего угла прямоугольника,
* `l` — ширина прямоугольника,
* `h` — высота прямоугольника,
* `filled` — заливать фигуру или нет, по умолчанию `false`

  &#x20;

#### Пример

{% tabs %}
{% tab title="Python" %}

```python
brick.display().drawEllipse(0, 0, 10, 10, True)
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.display().drawEllipse(0, 0, 10, 10, true);
```

{% endtab %}
{% endtabs %}

## drawLine

Нарисовать линию с началом и концом в заданных координатах. Изменения на дисплее произойдут только после вызова метода «[redraw](/trik/programming-code/object-brick/class-display#redraw)».

{% tabs %}
{% tab title="Python" %}

```python
brick.display().drawLine(x0, y0, x1, y1)
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.display().drawLine(x0, y0, x1, y1);
```

{% endtab %}
{% endtabs %}

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

* `x0`, `y0` — координаты начала линии,
* `x1`, `y1` — координаты конца линии.

#### Пример

{% tabs %}
{% tab title="Python" %}

```python
brick.display().drawLine(0, 0, 10, 10)
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.display().drawLine(0, 0, 10, 10);
```

{% endtab %}
{% endtabs %}

## drawPoint

Нарисовать точку в заданных координатах. Изменения на дисплее произойдут только после вызова метода «[redraw](/trik/programming-code/object-brick/class-display#redraw)».

{% tabs %}
{% tab title="Python" %}

```python
brick.display().drawPoint(x, y)
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.display().drawPoint(x, y);
```

{% endtab %}
{% endtabs %}

В качестве параметров необходимо указать координаты точки `x`, `y`.

#### Пример

{% tabs %}
{% tab title="Python" %}

```python
brick.display().drawPoint(10, 10)
```

{% endtab %}

{% tab title="JavaScript" %}

```
brick.display().drawPoint(10, 10);
```

{% endtab %}
{% endtabs %}

## drawRect

Нарисовать прямоугольник с левым верхним углом в указанных координатах и имеющий заданную ширину и высоту. Изменения на дисплее произойдут только после вызова метода «[redraw](/trik/programming-code/object-brick/class-display#redraw)».

{% tabs %}
{% tab title="Python" %}

```
brick.display().drawRect(x, y, l, h, filled)
```

{% endtab %}

{% tab title="JavaScript" %}

```
brick.display().drawRect(x, y, l, h, filled);
```

{% endtab %}
{% endtabs %}

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

* `x`, `y` — координаты левого верхнего угла прямоугольника,
* `l` — ширина прямоугольника,
* `h` — высота прямоугольника,
* `filled` — заливать фигуру или нет, по умолчанию `false`

#### Пример

{% tabs %}
{% tab title="Python" %}

```python
brick.display().drawRect(0, 0, 10, 10, True)
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.display().drawRect(0, 0, 10, 10, true);
```

{% endtab %}
{% endtabs %}

## hide

Закрыть и очистить окно для рисования.

{% tabs %}
{% tab title="Python" %}

```
brick.display().hide()
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.display().hide();
```

{% endtab %}
{% endtabs %}

## redraw

Перерисовать окно для рисования. Изменения на дисплее произойдут только после вызова этого метода.

{% tabs %}
{% tab title="Python" %}

```
brick.display().redraw()
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.display().redraw();
```

{% endtab %}
{% endtabs %}

## removeLabels

Удалить с экрана весь текст, добавленный на него вызовами метода «[addLabel](/trik/programming-code/object-brick/class-display#addlabel)».

{% tabs %}
{% tab title="Python" %}

```
brick.display().removeLabels()
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.display().removeLabels();
```

{% endtab %}
{% endtabs %}

## setBackground

Установить фон экрана в указанный цвет.

Возможные цвета:

* white,
* red, darkRed,
* green, darkGreen,
* blue, darkBlue,
* cyan, darkCyan,
* magenta, darkMagenta,
* yellow, darkYellow,
* gray, darkGray, lightGray,
* black.

{% tabs %}
{% tab title="Python" %}

```python
brick.display().setBackground("color")
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.display().setBackground("color");
```

{% endtab %}
{% endtabs %}

В качестве параметра необходимо указать цвет.

#### Пример

{% tabs %}
{% tab title="Python" %}

```python
brick.display().setBackground("red")
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.display().setBackground("red");
```

{% endtab %}
{% endtabs %}

## setPainterColor

Установить цвет кисти, которой рисуются графические примитивы.

Возможные цвета:

* white,
* red, darkRed,
* green, darkGreen,
* blue, darkBlue,
* cyan, darkCyan,
* magenta, darkMagenta,
* yellow, darkYellow,
* gray, darkGray, lightGray,
* black.

{% tabs %}
{% tab title="Python" %}

```python
brick.display().setPainterColor("color")
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.display().setPainterColor("color");
```

{% endtab %}
{% endtabs %}

В качестве параметра необходимо указать цвет.

#### Пример

{% tabs %}
{% tab title="Python" %}

```python
brick.display().setPainterColor("red")
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.display().setPainterColor("red");
```

{% endtab %}
{% endtabs %}

## setPainterWidth

Установить толщину кисти, которой рисуются графические примитивы, в пикселях.

{% tabs %}
{% tab title="Python" %}

```python
brick.display().setPainterWidth(d)
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.display().setPainterWidth(d);
```

{% endtab %}
{% endtabs %}

В качестве параметра необходимо указать толщину `d`.

#### Пример

{% tabs %}
{% tab title="Python" %}

```python
brick.display().setPainterWidth(5)
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.display().setPainterWidth(5);
```

{% endtab %}
{% endtabs %}

## show

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

{% tabs %}
{% tab title="Python" %}

```python
brick.display().show(array, width, height, format)
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.display().show(array, width, height, format)
```

{% endtab %}
{% endtabs %}

Параметры:

* `array` — одномерный целочисленный массив, имеющий размеры `width`×`height`
* `width` и `height` — ширина и высота изображения соответственно
* В качестве параметра **format** необходимо передать формат, в котором представлен каждый элемент массива. Сейчас поддержаны форматы: «rgb32», «grayscale8», «rgb888».

#### Пример

Примеры использования `show()` на изображении, снятом с использованием функции [`getPhoto()`](/trik/programming-code/function-getphoto).

{% tabs %}
{% tab title="Python" %}

```python
#rgb32
photo = getPhoto()
brick.display().show(photo, 160, 120, "rgb32")
script.wait(5000)

#rgb888
pic = []
photo = getPhoto()
l = len(photo)
for i in range(l):
    p = photo[i]
    pic.append((p&0xff0000)>>16)
    pic.append((p&0xff00)>>8)
    pic.append((p&0xff))

brick.display().show(pic, 160, 120, "rgb888")
script.wait(5000);                           

#grayscale8                                   
pic = []                                      
photo = getPhoto()
l = len(photo)                        
for i in range(l):                    
    p = photo[i]                  
    pic.append(((p&0xff0000)>>18) + ((p&0xff00)>>10) + ((p&0xff)>>2))               
                                         
                                              
brick.display().show(pic, 160, 120, "grayscale8")
script.wait(5000)

```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
//rgb32
var photo = getPhoto();
brick.display().show(photo, 160, 120, "rgb32");
script.wait(5000);

//rgb888
pic = []
photo = getPhoto();
l = photo.length;
for (i = 0; i < l; i++) {
    var p = photo[i];
    pic.push((p&0xff0000)>>16);
    pic.push((p&0xff00)>>8);
    pic.push((p&0xff));
}
brick.display().show(pic, 160, 120, "rgb888");
script.wait(5000);                            

//grayscale8                                   
pic = []                                      
photo = getPhoto();
l = photo.length;                             
for (i = 0; i < l; i++) {                     
        var p = photo[i];                     
        pic.push(((p&0xff0000)>>18) + ((p&0xff00)>>10) + ((p&0xff)>>2));                
}                                             
                                              
brick.display().show(pic, 160, 120, "grayscale8");
script.wait(5000);
```

{% endtab %}
{% endtabs %}

## showImage

Вывести на экран изображение, предварительно загруженное на робот.

{% tabs %}
{% tab title="Python" %}

```python
brick.display().showImage("imagePath")
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.display().showImage("imagePath");
```

{% endtab %}
{% endtabs %}

В качестве параметра необходимо указать имя файла с изображением (в форматах BMP, GIF, JPG, JPEG, PNG, PBM, PGM, PPM, TIFF, XBM, XPM), путь указывается либо абсолютным, либо относительно папки trik.

#### Пример

{% tabs %}
{% tab title="Python" %}

```python
brick.display().showImage("media/trik_smile_sad.png")
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.display().showImage("media/trik_smile_sad.png");
```

{% endtab %}
{% endtabs %}


# Класс «encoder»

Представляет энкодеры силовых моторов, подключающиеся к портам E1, E2, E3, E4.

| Метод                                                                        | Описание                                                            |
| ---------------------------------------------------------------------------- | ------------------------------------------------------------------- |
| [read](/trik/programming-code/object-brick/class-encoder#read)               | Возвращает текущее показание энкодера в градусах на заданном порту. |
| [reset](/trik/programming-code/object-brick/class-encoder#reset)             | Сбрасывает на 0 текущее показание энкодера.                         |
| [readRawData](/trik/programming-code/object-brick/class-encoder#readrawdata) | Возвращает текущее показание энкодера в «тиках» на заданном порту.  |

## read

Возвращает текущее показание энкодера в градусах на заданном порту.

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```python
brick.encoder(portName).read()
brick.encoder("portName").read()
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.encoder(portName).read();
brick.encoder("portName").read();
```

{% endtab %}
{% endtabs %}

В качестве параметра необходимо указать порт.

#### Примеры

{% tabs %}
{% tab title="Python" %}

```python
brick.encoder(E1).read()
brick.encoder("E2").read()
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.encoder(E1).read();
brick.encoder("E2").read();
```

{% endtab %}
{% endtabs %}

## reset

Сбрасывает в 0 текущее показание энкодера.

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```python
brick.encoder(portName).reset()
brick.encoder("portName").reset()
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.encoder(portName).reset();
brick.encoder("portName").reset();
```

{% endtab %}
{% endtabs %}

В качестве параметра необходимо указать порт.

#### Примеры

{% tabs %}
{% tab title="Python" %}

```python
brick.encoder(E1).reset()
brick.encoder("E2").reset()
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.encoder(E1).reset();
brick.encoder("E2").reset();
```

{% endtab %}
{% endtabs %}

## readRawData

Возвращает текущее показание энкодера в «тиках» на заданном порту.

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```python
brick.encoder(portName).readRawData()
brick.encoder("portName").readRawData()
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.encoder(portName).readRawData();
brick.encoder("portName").readRawData();
```

{% endtab %}
{% endtabs %}

#### Примеры

{% tabs %}
{% tab title="Python" %}

```python
brick.encoder(E1).readRawData()
brick.encoder("E2").readRawData()
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.encoder(E1).readRawData();
brick.encoder("E2").readRawData();
```

{% endtab %}
{% endtabs %}


# Класс «gyroscope»

Представляет [гироскоп](/trik/programming-code/object-brick#gyroscope) контроллера ТРИК. В состоянии покоя среднее значение выходного сигнала гироскопа не равно нулю и называется **смещением нуля** (`bias`) или **систематической ошибкой** (`bias error`).

Параметр обусловлен многими факторами и может изменяться, например, в зависимости от окружающей температуры.

Для правильной работы гироскопа необходимо вычитать смещение нуля из приходящих значений. Вычислить его можно с помощью метода «[calibrate](/trik/programming-code/object-brick/class-gyroscope#calibrate)».

Так как калибровка занимает длительное время, то при частом запуске модели можно выполнять ее один раз, после чего запоминать значение в переменную с помощью «[getCalibrationVaules»](/trik/programming-code/object-brick/class-gyroscope#getcalibrationvalues), а при запуске программы вместо калибровки вызывать «[setCalibrationValues](/trik/programming-code/object-brick/class-gyroscope#setcalibrationvalues)».

| Метод                                                                                            | Описание                                                                                                                          |
| ------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------- |
| [calibrate](/trik/programming-code/object-brick/class-gyroscope#calibrate)                       | Вычисляет смещением нуля в течение указанного времени и инициализирует гироскоп этим параметром, сбрасывает текущие углы наклона. |
| [getCalibrationValues](/trik/programming-code/object-brick/class-gyroscope#getcalibrationvalues) | Возвращает объект, в котором содержатся необходимые данные о смещении нуля.                                                       |
| [isCalibrated](/trik/programming-code/object-brick/class-gyroscope#iscalibrated)                 | Возвращает true в случае завершении калибровки, false — в противном случае.                                                       |
| [read](/trik/programming-code/object-brick/class-gyroscope#read)                                 | Возвращает массив из семи элементов: угловые скорости по трем осям, время последнего замера, углы наклона по трем осям.           |
| [readRawData](/trik/programming-code/object-brick/class-gyroscope#readrawdata)                   | Возвращает массив из трех элементов с угловыми скоростями по трем осям.                                                           |
| [setCalibrationValues](/trik/programming-code/object-brick/class-gyroscope#setcalibrationvalues) | Устанавливает объект, содержащий необходимые параметры о смещении нуля.                                                           |

| Сигнал                                                                                         | Описание                                                       |
| ---------------------------------------------------------------------------------------------- | -------------------------------------------------------------- |
| [calibrationFinished](/trik/programming-code/object-brick/class-gyroscope#calibrationfinished) | Сигнал, посылаемый сенсором после окончания калибровки.        |
| [newData](/trik/programming-code/object-brick/class-gyroscope#newdata)                         | Сигнал, посылаемый сенсором, когда у него готовы новые данные. |

## calibrate

Вычисляет смещение нуля в течение указанного времени и инициализирует гироскоп этим параметром, сбрасывает текущие углы наклона.Рекомендуемое время калибровки — 10−20 секунд.

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```
brick.gyroscope().calibrate(msec)
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.gyroscope().calibrate(msec);
```

{% endtab %}
{% endtabs %}

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

* `msec` — время в миллисекундах.

## calibrationFinished

Сигнал, посылаемый сенсором после окончания калибровки.

## getCalibrationValues

Возвращает объект, в котором содержатся необходимые данные о смещении нуля.

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```
brick.gyroscope().getCalibrationValues()
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.gyroscope().getCalibrationValues();
```

{% endtab %}
{% endtabs %}

## isCalibrated

Возвращает `true` в случае завершении калибровки, `false` — в противном случае.

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```
brick.gyroscope().isCalibrated()
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.gyroscope().isCalibrated();
```

{% endtab %}
{% endtabs %}

## newData

Сигнал, посылаемый сенсором, когда у него готовы новые данные.

## read

Возвращает массив из семи элементов:

* 0−2 — угловые скорости по трем осям (в миллиградусах/секунды),
* 3 — время последнего замера (в микросекундах),
* 4−6 — углы наклона по трем осям (в миллиградусах).

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```
brick.gyroscope().read()
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.gyroscope().read();
```

{% endtab %}
{% endtabs %}

## readRawData

Возвращает массив из трех элементов с угловыми скоростями по трем осям.

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```
brick.gyroscope().readRawData()
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.gyroscope().readRawData();
```

{% endtab %}
{% endtabs %}

## setCalibrationValues

Устанавливает объект, содержащий необходимые параметры о смещении нуля.&#x20;

{% hint style="warning" %}
Так как калибровка занимает длительное время, то при частом запуске модели можно выполнять ее один раз, после чего запоминать значение в переменную с помощью «[getCalibrationVaules](/trik/programming-code/object-brick/class-gyroscope#getcalibrationvalues)», а при запуске программы вместо калибровки вызывать «setCalibrationValues».
{% endhint %}

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```
brick.gyroscope().setCalibrationValues(values)
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.gyroscope().setCalibrationValues(values);
```

{% endtab %}
{% endtabs %}

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

* `values` — объект, содержащий данные о биасе.


# Класс «keys»

Служит для работы с кнопками на пульте робота.

| Метод                                                                         | Описание                                                                                             |
| ----------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- |
| [buttonPressed](/trik/programming-code/object-brick/class-keys#buttonpressed) | Посылается, когда кнопка с указанным кодом нажата или отпущена.                                      |
| [isPressed](/trik/programming-code/object-brick/class-keys#ispressed)         | Возвращает true, если кнопка с указанным кодом нажата в данный момент.                               |
| [reset](/trik/programming-code/object-brick/class-keys#reset)                 | Сбрасывает запомненные нажатия кнопок.                                                               |
| [wasPressed](/trik/programming-code/object-brick/class-keys#waspressed)       | Возвращает, была ли нажата кнопка с указанным кодом, сбрасывает запомненные нажатия для этой кнопки. |

## buttonPressed

Посылается, когда кнопка с указанным кодом нажата или отпущена.

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```python
brick.keys().buttonPressed.connect(lambda code, value: brick.stop() if code == KeysEnum.Up else print(code))
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.keys().buttonPressed.connect(function(code, value){if (code==KeysEnum.Up)brick.stop() ; });
```

{% endtab %}
{% endtabs %}

Первый параметр — код кнопки, второй — 1, если кнопка нажата, 0, если отпущена.

## isPressed

Возвращает `true`, если кнопка с указанным кодом нажата в данный момент.\
Возможные варианты:

* `KeysEnum.Left` (код 105),
* `KeysEnum.Up` (код 103),
* `KeysEnum.Down` (код 108),
* `KeysEnum.Enter` (код 28),
* `KeysEnum.Right` (код 106),
* `KeysEnum.Power` (код 116),
* `KeysEnum.Esc` (код 1).

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```python
brick.keys().isPressed(KeysEnum.Up)
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.keys().isPressed(KeysEnum.Up);
```

{% endtab %}
{% endtabs %}

## reset

Сбрасывает запомненные нажатия кнопок.

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```
brick.keys().reset()
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.keys().reset();
```

{% endtab %}
{% endtabs %}

## wasPressed

Возвращает, была ли нажата кнопка с указанным кодом, сбрасывает запомненные нажатия для этой кнопки.\
Возможные варианты:

* `KeysEnum.Left` (код 105),
* `KeysEnum.Up` (код 103),
* `KeysEnum.Down` (код 108),
* `KeysEnum.Enter` (код 28),
* `KeysEnum.Right` (код 106),
* `KeysEnum.Power` (код 116),
* `KeysEnum.Esc` (код 1).

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```
brick.keys().wasPressed(KeysEnum.Up)
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.keys().wasPressed(KeysEnum.Up);
```

{% endtab %}
{% endtabs %}


# Класс «led»

Предоставляет управление светодиодом на корпусе робота.

| Метод                                                          | Описание                                |
| -------------------------------------------------------------- | --------------------------------------- |
| [red](/trik/programming-code/object-brick/class-led#red)       | Включает светодиод в режим «красный».   |
| [green](/trik/programming-code/object-brick/class-led#green)   | Включает светодиод в режим «зеленый».   |
| [orange](/trik/programming-code/object-brick/class-led#orange) | Включает светодиод в режим «оранжевый». |
| [off](/trik/programming-code/object-brick/class-led#off)       | Выключает светодиод.                    |

## red

Включает светодиод в режим «красный».

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```
brick.led().red()
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.led().red();	
```

{% endtab %}
{% endtabs %}

## green

Включает светодиод в режим «зеленый».

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```
brick.led().green()
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.led().green();	
```

{% endtab %}
{% endtabs %}

## orange

Включает светодиод в режим «оранжевый».

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```
brick.led().orange()
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.led().orange();
```

{% endtab %}
{% endtabs %}

## off

Выключает светодиод.

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```
brick.led().off()
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.led().off();
```

{% endtab %}
{% endtabs %}


# Класс «lineSensor»

Видеокамера в режиме датчика линии.

| Метод                                                                 | Описание                                                                                                                              |
| --------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
| [detect](/trik/programming-code/object-brick/class-linesensor#detect) | Определяет доминирующий цвет в вертикальной полосе в центре кадра и запоминает его как цвет линии.                                    |
| [init](/trik/programming-code/object-brick/class-linesensor#init)     | Включает видеокамеру и инициализирует её в режиме датчика линии.                                                                      |
| [read](/trik/programming-code/object-brick/class-linesensor#read)     | Возвращает массив с координатой по оси X центра линии относительно центра кадра, вероятность перекрёстка, относительный размер линии. |
| [stop](/trik/programming-code/object-brick/class-linesensor#stop)     | Выключает видеокамеру и прекращает работу датчика.                                                                                    |

## detect

Определяет доминирующий цвет в вертикальной полосе в центре кадра и запоминает его как цвет линии. После этого метод «[read](/trik/programming-code/object-brick/class-linesensor#read)» начинает возвращать данные для этой линии.

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```
brick.lineSensor("video1").detect()
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.lineSensor("video1").detect();
```

{% endtab %}
{% endtabs %}

## init

Включает видеокамеру и инициализирует её в режиме датчика линии. Булевый параметр определяет, выводить ли на экран изображение с камеры (`true` — выводить).

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```python
brick.lineSensor("video1").init(True)
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.lineSensor("video1").init(true);
```

{% endtab %}
{% endtabs %}

Булевый параметр определяет, выводить ли на экран изображение с камеры:

* `true` — выводить,
* `false` — не выводить.

## read

Возвращает массив, в ячейках которого находятся следующие данные:

* в нулевой ячейке координата по оси X центра линии относительно центра кадра (от -100 до 100, -100 — центр линии на краю кадра слева);
* в первой ячейке — вероятность перекрёстка (число от 0 до 100, показывающее сколько точек цвета линии находится в горизонтальной полосе в центре кадра);
* во второй ячейке — относительный размер линии, число от 0 до 100 (100 — линия занимает почти весь кадр, 0 — линии нет на кадре).

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```
brick.lineSensor("video1").read()
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.lineSensor("video1").read();
```

{% endtab %}
{% endtabs %}

## stop

Выключает видеокамеру и прекращает работу датчика.

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```
brick.lineSensor("video1").stop()
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.lineSensor("video1").stop();
```

{% endtab %}
{% endtabs %}


# Класс «motor»

Предоставляет управление мотором робота (силовым или сервомотором), подключающимся к портам M1, …, M4, S1, ..., S6.

| Метод                                                                | Описание                                                        |
| -------------------------------------------------------------------- | --------------------------------------------------------------- |
| [brake](/trik/programming-code/object-brick/class-motor#brake)       | Блокировка моторов для торможения в течение указанного времени. |
| [power](/trik/programming-code/object-brick/class-motor#power)       | Возвращает текущую мощность мотора.                             |
| [powerOff](/trik/programming-code/object-brick/class-motor#poweroff) | Выключает мотор.                                                |
| [setPower](/trik/programming-code/object-brick/class-motor#setpower) | Включает мотор с указанной мощностью.                           |

## brake

Блокировка моторов для торможения в течение указанного времени в миллисекундах. Функция асинхронная, то есть не блокирующая (после ее вызова программа переходит к следующему действию, а не ожидает указанное время торможения).

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```python
brick.motor(motorName).brake(durationMs)
brick.motor("motorName").brake(durationMs)
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.motor(motorName).brake(durationMs);
brick.motor("motorName").brake(durationMs);
```

{% endtab %}
{% endtabs %}

В качестве параметра необходимо указать время в миллисекундах. По умолчанию (если параметр не указан), моторы блокируются на 500 миллисекунд.

При написании алгоритма учитывайте, что после блокировки подача тока на двигатели выключается, поэтому необходимо дождаться этого состояния прежде чем подавать новую мощность на двигатели.&#x20;

## power

Возвращает текущую мощность мотора (от -100 до 100).

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```python
pow1 = brick.motor(motorName).power()
pow2 = brick.motor("motorName").power()
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
var pow1 = brick.motor(motorName).power();
var pow2 = brick.motor("motorName").power();
```

{% endtab %}
{% endtabs %}

## powerOff

Выключает мотор. Перестает подавать на него питание, но мотор может продолжить свободное вращение по инерции или под действием иных внешних сил.

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```python
brick.motor(motorName).powerOff()
brick.motor("motorName").powerOff()
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.motor(motorName).powerOff();
brick.motor("motorName").powerOff();
```

{% endtab %}
{% endtabs %}

## setPower

Включает мотор с указанной мощностью.

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```python
brick.motor(motorName).setPower(power)
brick.motor("motorName").setPower(power)
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.motor(motorName).setPower(power);
brick.motor("motorName").setPower(power);
```

{% endtab %}
{% endtabs %}

В качестве параметра необходимо указать мощность.Мощность задаётся в диапазоне от -100 («полный назад») до 100 («полный вперёд»). 0 соответствует `force break`, то есть мотор останавливается, при этом он заблокирован и остаётся под напряжением.


# Класс «objectSensor»

Видеокамера в режиме датчика объекта. Захватывает контрастный объект в центре кадра и возвращает его координаты и размер в кадре.

| Метод                                                                   | Описание                                                                                                                                                                          |
| ----------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [detect](/trik/programming-code/object-brick/class-objectsensor#detect) | Определяет доминирующий цвет в центре кадра и запоминает его как цвет объекта.                                                                                                    |
| [init](/trik/programming-code/object-brick/class-objectsensor#init)     | Включает видеокамеру и инициализирует её в режиме датчика объекта.                                                                                                                |
| [read](/trik/programming-code/object-brick/class-objectsensor#read)     | Возвращает массив с координатой по оси X центра объекта относительно центра кадра, координатой по оси Y центра объекта относительно центра кадра, относительным размером объекта. |
| [stop](/trik/programming-code/object-brick/class-objectsensor#stop)     | Выключает видеокамеру и прекращает работу датчика.                                                                                                                                |

## detect

Определяет доминирующий цвет в центре кадра и запоминает его как цвет объекта. После этого метод «[read](/trik/programming-code/object-brick/class-objectsensor#read)» начинает возвращать данные для объекта.

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```
brick.objectSensor().detect()
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.objectSensor().detect();
```

{% endtab %}
{% endtabs %}

## init

Включает видеокамеру и инициализирует её в режиме датчика объекта. Булевый параметр определяет, выводить ли на экран изображение с камеры (`true` — выводить).

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```python
brick.objectSensor().init(True)
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.objectSensor().init(true);
```

{% endtab %}
{% endtabs %}

Булевый параметр определяет, выводить ли на экран изображение с камеры:

* `true` — выводить,
* `false` — не выводить.

## read

Возвращает массив, в ячейках которого находятся следующие данные:

* в нулевой ячейке координата по оси X центра объекта относительно центра кадра (от -100 до 100, -100 — центр объекта на краю кадра слева);
* в первой ячейке — координата по оси Y центра объекта относительно центра кадра (от -100 до 100, -100 — центр объекта на краю кадра сверху);
* во второй ячейке — относительный размер объекта, число от 0 до 100 (100 — объекта занимает почти весь кадр, 0 — объекта нет на кадре).

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```
brick.objectSensor().read()
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.objectSensor().read();
```

{% endtab %}
{% endtabs %}

## stop

Выключает видеокамеру и прекращает работу датчика.

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```
brick.objectSensor().stop()
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.objectSensor().stop();
```

{% endtab %}
{% endtabs %}


# Класс «marker»

Предоставляет доступ к рисованию маркером заданного цвета на полу. Доступен только в режиме 2D модели.

| Метод                                                               | Описание                                                                                                                                                                                     |
| ------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [down](/trik/programming-code/object-brick/class-marker#down)       | Начать рисование маркером заданного цвета на полу. При движении робота в двумерной модели за ним будет оставаться цветная линия. Если был установлен маркер другого цвета, он будет заменен. |
| [up](/trik/programming-code/object-brick/class-marker#up)           | Закончить рисование маркером.                                                                                                                                                                |
| [isDown](/trik/programming-code/object-brick/class-marker#isdown)   | Возвращает `true`, если маркер активен, `false`- если нет.                                                                                                                                   |
| [setDown](/trik/programming-code/object-brick/class-marker#setdown) | Вызывает метод `down("black")`, или `up()` в зависимости от аргумента.                                                                                                                       |

## down

Начать рисование маркером заданного цвета на полу. При движении робота в двумерной модели за ним будет оставаться цветная линия. Если был установлен маркер другого цвета, он будет заменен.&#x20;

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```python
brick.marker().down(color)
brick.marker().down("color")
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.marker().down(color)
brick.marker().down("color")
```

{% endtab %}
{% endtabs %}

#### Пример

{% tabs %}
{% tab title="Python" %}

```python
brick.marker().down("blue")
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.marker().down("blue")
```

{% endtab %}
{% endtabs %}

## up

Закончить рисование маркером.

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```python
brick.marker().up()
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.marker().up()
```

{% endtab %}
{% endtabs %}

## isDown

Возвращает `true`, если маркер активен, `false`- если нет.&#x20;

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```python
brick.marker().isDown()
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.marker().isDown();
```

{% endtab %}
{% endtabs %}

## setDown

Вызывает метод `down("black")`, или `up()` в зависимости от аргумента.

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```python
brick.marker().setDown(True) # Вызывает brick.marker().down("black")
brick.marker().setDown(False) # Вызывает brick.marker().up()
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.marker().setDown(true) // Вызывает brick.marker().down("black")
brick.marker().setDown(false) // Вызывает brick.marker().up()
```

{% endtab %}
{% endtabs %}


# Класс «sensor»

—Представляет сенсор (аналоговый или цифровой), подключающийся к портам A1, …, A6, D1, D2.

| Метод                                                                       | Описание                                                                                                 |
| --------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- |
| [read](/trik/programming-code/object-brick/class-sensor#read)               | Возвращает текущее показание сенсора (цифрового или аналогового), подключённого к данному порту.         |
| [readRawData](/trik/programming-code/object-brick/class-sensor#readrawdata) | Возвращает текущее «сырое» показание сенсора (цифрового или аналогового), подключённого к данному порту. |

## read

Возвращает текущее показание сенсора (цифрового или аналогового), подключённого к данному порту. Возвращается приведённое значение, зависящее от конфигурации порта, которая описывается в файле `model-config.xml` в папке `trik` на роботе.

Например, ИК-датчик расстояния возвращает значение в сантиметрах.

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```python
data1 = brick.sensor(sensorName).read()
data2 = brick.sensor("sensorName").read()
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
var data1 = brick.sensor(sensorName).read();
var data2 = brick.sensor("sensorName").read();
```

{% endtab %}
{% endtabs %}

## readRawData

Возвращает текущее «сырое» показание сенсора (цифрового или аналогового), подключённого к данному порту. Диапазон значений зависит от конкретного сенсора и не учитывает конфигурацию робота (возвращаются физические показания сенсора, например, задержка принятого ультразвукового сигнала).

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```python
data1 = brick.sensor(sensorName).readRawData()
data2 = brick.sensor("sensorName").readRawData()
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
var data1 = brick.sensor(sensorName).readRawData();
var data2 = brick.sensor("sensorName").readRawData();
```

{% endtab %}
{% endtabs %}


# Класс «irCamera»

Предоставляет доступ к инфракрасному датчику MLX90640, подключенному по шине I2C, в режиме камеры и сенсора.

| Метод                     | Описание                                                                               |
| ------------------------- | -------------------------------------------------------------------------------------- |
| [init](#init)             | Инициализирует ИК-камеру и запускает захват кадров.                                    |
| [getImage](#getImage)     | Возвращает цветное изображение в виде массива байтов.                                  |
| [readSensor](#readSensor) | Возвращает среднее значение температуры в специальной шкале в указанном участке кадра. |
| [stop](#stop)             | Останавливает захват кадров.                                                           |

## init

Инициализирует инфракрасную камеру и запускает захват кадров.

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```python
brick.irCamera().init()
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.irCamera().init();
```

{% endtab %}
{% endtabs %}

## getImage

Возвращает цветное изображение ширины `32` и высоты `24` пикселя в виде массива байтов в формате «rgb32».

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```python
image = brick.irCamera().getImage()
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
var image = brick.irCamera().getImage();
```

{% endtab %}
{% endtabs %}

#### Пример

Вывод изображения на экран.

{% tabs %}
{% tab title="Python" %}

```python
image = brick.irCamera().getImage()
brik.display().show(image, 32, 24, "rgb32")
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
var image = brick.irCamera().getImage();
brik.display().show(image, 32, 24, "rgb32");
```

{% endtab %}
{% endtabs %}

## readSensor

Возвращает среднее значение температуры в специальной шкале в указанном участке кадра.

Кадр делится на квадраты сеткой, по умолчанию `3` на `3`, размерность сетки можно задать в `model-config.xml` на роботе. Квадраты индексируются с `1`. То есть `(1, 1)` — это левый верхний край кадра, `(2, 2)` — его центр.

Возвращаемое значение — среднее значение температуры в указанном квадрате в следующей шкале:

* Значение меньше `0` — камера не инициализирована
* `0` — соответствует температуре льда из морозильной камеры и ниже
* `1` — соответствует температуре воды из холодильника
* `2` — соответствует температуре в помещении
* `3` — соответствует температуре тела человека
* `4` — соответствует температуре тёплой воды
* `5` — соответствует температуре горячей (близкой к температуре кипения) воды
* `6` — соответствует температуре больше температуры кипения воды

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```python
temp = brick.irCamera().readSensor(x, y)
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
var temp = brick.irCamera().readSensor(x, y);
```

{% endtab %}
{% endtabs %}

В качестве параметра необходимо указать индексы квадрата `x` и `y`.

## stop

#### Синтаксис

Останавливает захват кадров до следующего вызова `init()`.

{% tabs %}
{% tab title="Python" %}

```python
brick.irCamera().stop()
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
brick.irCamera().stop();
```

{% endtab %}
{% endtabs %}


# Объект «script»

Представляет методы управления выполнением скрипта и доступ к функциям операционной системы.

| Метод                                                           | Описание                                                                                                |
| --------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- |
| [quit](/trik/programming-code/object-script#quit)               | Устанавливает флаг окончания работы для событийно-ориентированной программы.                            |
| [random](/trik/programming-code/object-script#random)           | Возвращает случайное число из заданного диапазона.                                                      |
| [readAll](/trik/programming-code/object-script#readall)         | Считывает всё содержимое указанного файла в массив строк.                                               |
| [removeFile](/trik/programming-code/object-script#removefile)   | Удаляет указанный файл.                                                                                 |
| [run](/trik/programming-code/object-script#run)                 | Устанавливает флаг событийно-ориентированной программы.                                                 |
| [system](/trik/programming-code/object-script#system)           | Выполняет переданную в качестве параметра команду консоли операционной системы.                         |
| [time](/trik/programming-code/object-script#time)               | Возвращает временной штамп — количество миллисекунд, прошедших с начала 1 января 1970 года по Гринвичу. |
| [timer](/trik/programming-code/object-script#timer)             | Создаёт и возвращает таймер.                                                                            |
| [wait](/trik/programming-code/object-script#wait)               | Приостанавливает выполнение скрипта на переданное количество миллисекунд.                               |
| [writeToFile](/trik/programming-code/object-script#writetofile) | Записывает строку в файл.                                                                               |

## quit

Устанавливает флаг окончания работы для событийно-ориентированной программы. Как только будет завершён текущий обработчик события, исполнение скрипта закончится.

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```
script.quit()
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
script.quit();	
```

{% endtab %}
{% endtabs %}

## random

Возвращает случайное число из заданного диапазона.

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```
script.random(min, max)
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
script.random(min, max);
```

{% endtab %}
{% endtabs %}

В качестве параметров необходимо указать границы диапазона.

#### Пример

{% tabs %}
{% tab title="Python" %}

```python
a = script.random(0, 10) # случайное число от 0 до 10
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
var a = script.random(0, 10); // случайное число от 0 до 10
```

{% endtab %}
{% endtabs %}

## readAll

Считывает всё содержимое указанного файла в массив строк.

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```python
script.readAll("fileName")
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
script.readAll("fileName");
```

{% endtab %}
{% endtabs %}

В качестве параметра необходимо указать название файла с расширением.

#### Пример

{% tabs %}
{% tab title="Python" %}

```python
lines = script.readAll("input.txt") # считывает текстовый файл input.txt
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
var lines = script.readAll("input.txt"); // считывает текстовый файл input.txt
```

{% endtab %}
{% endtabs %}

## removeFile

Удаляет указанный файл.

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```python
script.removeFile("fileName")
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
script.removeFile("fileName");
```

{% endtab %}
{% endtabs %}

В качестве параметра необходимо указать название файла с расширением.

#### Пример

{% tabs %}
{% tab title="Python" %}

```python
script.removeFile("file.txt"); # удалить файл file.txt
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
script.removeFile("file.txt"); // удалить файл file.txt
```

{% endtab %}
{% endtabs %}

## run

Устанавливает флаг событийно-ориентированной программы. По окончанию работы скрипт не выгружается из памяти, а продолжает ждать наступления событий до тех пор, пока какой-либо из обработчиков не вызовет метод «[quit](/trik/programming-code/object-script#quit)».

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```
script.run()
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
script.run();
```

{% endtab %}
{% endtabs %}

## system

Выполняет переданную команду.

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```
ript.system()
```

{% endtab %}

{% tab title="JavaScript" %}

```
script.system();
```

{% endtab %}
{% endtabs %}

В качестве параметра необходимо указать команду консоли операционной системы.

#### Пример

{% tabs %}
{% tab title="Python" %}

```python
script.system("reboot")
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
script.system("reboot");
```

{% endtab %}
{% endtabs %}

## time

Возвращает временной штамп — количество миллисекунд, прошедших с начала 1 января 1970 года по Гринвичу.

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```
script.time()
```

{% endtab %}

{% tab title="JavaScript" %}

```
script.time();
```

{% endtab %}
{% endtabs %}

## timer

Создаёт и возвращает таймер (класс `«QTimer»`), посылающий сигнал `timeout` каждые n миллисекунд.

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```
script.timer(n)
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
script.timer(n);
```

{% endtab %}
{% endtabs %}

В качестве параметра передаётся n .

#### Пример

{% tabs %}
{% tab title="Python" %}

```python
def foo():
  print("It's Alive!!!")
tim = script.timer(500) # таймер на 500 мс
tim.timeout.connect(foo) # подписываем функцию foo на срабатывание по таймеру tim
script.wait(5000)
tim.stop()
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
function foo(){
  print("It's Alive!!!")
}
tim = script.timer(500) // таймер на 500 мс
tim.timeout.connect(foo) // подписываем функцию foo на срабатывание по таймеру tim
script.wait(5000)
tim.stop()
```

{% endtab %}
{% endtabs %}

## wait

Приостанавливает выполнение скрипта на переданное количество миллисекунд.

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```
script.wait(msCount)
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
script.wait(msCount);
```

{% endtab %}
{% endtabs %}

В качестве параметра передаётся количество миллисекунд.

#### Пример

{% tabs %}
{% tab title="Python" %}

```python
script.wait(1000) # остановить выполнение скрипта на одну секунду
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
script.wait(1000); // остановить выполнение скрипта на одну секунду
```

{% endtab %}
{% endtabs %}

## writeToFile

Записывает сроку в файл.

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```python
script.writeToFile("fileName", "text")
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
script.writeToFile("fileName", "text");
```

{% endtab %}
{% endtabs %}

В качестве параметров необходимо указать название файла и записываемую строку.

#### Пример

{% tabs %}
{% tab title="Python" %}

```python
script.writeToFile("output.txt", "Hello, world") # записать «Hello, world» в файл output.t
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
script.writeToFile("output.txt", "Hello, world"); // записать «Hello, world» в файл output.t
```

{% endtab %}
{% endtabs %}


# Объект «mailbox»

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

| Метод                                                              | Описание                                                                                                                                                                   |
| ------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [joinNetwork](#joinnetwork)                                        | Подключается к роботу с заданным IP-адресом по заданному порту (или порту по умолчанию)номеру. Сообщает ему свой бортовой номер и регистрируется в сети «почтовых ящиков». |
| [hasMessages](/trik/programming-code/object-mailbox#hasmessages)   | Возвращает **`true`**, если роботу пришло новое сообщение.                                                                                                                 |
| [myHullNumber](/trik/programming-code/object-mailbox#myhullnumber) | Возвращает бортовой номер робота.                                                                                                                                          |
| [newMessage](/trik/programming-code/object-mailbox#newmessage)     | Посылает сообщение после получения сообщения.                                                                                                                              |
| [receive](/trik/programming-code/object-mailbox#receive)           | Получает новое сообщение или блокирует исполнение скрипта до тех пор, пока сообщение не придёт.                                                                            |
| [send](/trik/programming-code/object-mailbox#send)                 | Посылает роботу с указанным бортовым номером (или всем роботам) указанное сообщение.                                                                                       |

## joinNetwork

Подключается к роботу с заданным IP-адресом по заданному порту (или порту по умолчанию), сообщает ему свой бортовой номер и регистрируется в сети «почтовых ящиков».

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```python
mailbox.joinNetwork("ip", port, hullNumber)
mailbox.joinNetwork("", port, hullNumber)
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
mailbox.joinNetwork("ip", port, hullNumber);
mailbox.joinNetwork("", port, hullNumber);
```

{% endtab %}
{% endtabs %}

В качестве параметров необходимо указать IP-адрес робота, порт и бортномер. В случае, если порт не указан, используется порт по умолчанию. Борт номер должен быть положительным числом, начиная с 1.\
Если не указан IP-адрес, но изменен бортномер, то происходит смена бортномера без подключения.

#### Пример

{% tabs %}
{% tab title="Python" %}

```python
mailbox.joinNetwork("192.168.77.1", -1, 1)
//Подключение к 192.168.77.1, порту 8889 без смены бортномера
mailbox.joinNetwork("192.168.77.1", -1, 2)
//Подключение к 192.168.77.1, порту 8889 со сменой бортномера на 2
mailbox.joinNetwork("", -1, 2)
//Смена бортномера без подключения
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
mailbox.joinNetwork("192.168.77.1", -1, 1);
//Подключение к 192.168.77.1, порту 8889 без смены бортномера
mailbox.joinNetwork("192.168.77.1", -1, 2);
//Подключение к 192.168.77.1, порту 8889 со сменой бортномера на 2
mailbox.joinNetwork("", -1, 2);
//Смена бортномера без подключения
```

{% endtab %}
{% endtabs %}

## hasMessages

Возвращает `true`, если роботу пришло новое сообщение.

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```python
mailbox.hasMessages()
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
mailbox.hasMessages();
```

{% endtab %}
{% endtabs %}

## myHullNumber

Возвращает бортовой номер робота.

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```python
x = mailbox.myHullNumber()
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
var x = mailbox.myHullNumber();
```

{% endtab %}
{% endtabs %}

## newMessage

Посылает сообщение после получения нового сообщения.

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```python
mailbox.newMessage.connect(lambda sender, message: print(message))
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
mailbox.newMessage.connect(function(sender, message) { print(message); });
```

{% endtab %}
{% endtabs %}

Первый параметр — бортовой номер отправителя, второй — само сообщение.

## receive

Получает новое сообщение или блокирует исполнение скрипта до тех пор, пока сообщение не придёт.

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```python
message = mailbox.receive()
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
var message = mailbox.receive();	
```

{% endtab %}
{% endtabs %}

## send

Посылает роботу с указанным бортовым номером (или всем роботам) указанное сообщение.

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```python
mailbox.send("message")
mailbox.send(hullNumber, "message")
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
mailbox.send("message");
mailbox.send(boardNumber, "message");
```

{% endtab %}
{% endtabs %}

В качестве параметра необходимо указать бортовой номер робота, которому хотите послать сообщение и сообщение. Если бортовой номер не указан, то сообщение отправляется всем роботам, зарегистрированным в сети.

#### Пример

{% tabs %}
{% tab title="Python" %}

```python
mailbox.send(1, "Hello") # отправка сообщения роботу с бортовым номер 1
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
mailbox.send(1, "Hello"); // отправка сообщения роботу с бортовым номер 1
```

{% endtab %}
{% endtabs %}


# Объект «gamepad»

Служит для работы с программируемым пультом управления «[TRIK Gamepad](/gamepad/about)».

| Метод                                                                      | Описание                                                                                                             |
| -------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- |
| [buttonWasPressed](/trik/programming-code/object-gamepad#buttonwaspressed) | Возвращает `true`, если на пульте была нажата кнопка с указанным номером.                                            |
| [isPadPressed](/trik/programming-code/object-gamepad#ispadpressed)         | Возвращает, нажата ли в данный момент область управления на пульте.                                                  |
| [padX](/trik/programming-code/object-gamepad#padx)                         | Если указанная область управления на пульте нажата, возвращает текущую координату нажатия по оси X.                  |
| [padY](/trik/programming-code/object-gamepad#pady)                         | Если указанная область управления на пульте нажата, возвращает текущую координату нажатия по оси Y.                  |
| [padUp](/trik/programming-code/object-gamepad#padup)                       | Посылается, когда пользователь оторвал палец от области управления с указанным номером.                              |
| [reset](/trik/programming-code/object-gamepad#reset)                       | Сбрасывает запомненные события от пульта.                                                                            |
| [wheel](/trik/programming-code/object-gamepad#wheel)                       | Если на пульте включён «руль» (события от акселерометра устройства), возвращает текущий наклон пульта.               |
| [wheelEvent](/trik/programming-code/object-gamepad#wheelevent)             | Посылается, когда на пульте включён «руль» (события от акселерометра устройства) и пользователь повернул устройство. |

| Сигнал                                                         | Описание                                                                                          |
| -------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- |
| [button](/trik/programming-code/object-gamepad#button)         | Посылается, когда пользователь нажал на одну из пяти кнопок внизу пульта.                         |
| [connected](/trik/programming-code/object-gamepad#connected)   | Посылается при подключении пульта к роботу.                                                       |
| [disconnect](/trik/programming-code/object-gamepad#disconnect) | Посылается при отключении пульта.                                                                 |
| [pad](/trik/programming-code/object-gamepad#pad)               | Посылается, когда пользователь нажал на область управления на пульте или переместил палец по ней. |

## button

Посылается, когда пользователь нажал на одну из пяти кнопок внизу пульта.

## buttonWasPressed

Возвращает `true`, если на пульте была нажата кнопка с указанным номером. Сбрасывает запомненное нажатие для этой кнопки.

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```
gamepad.buttonWasPressed(buttonNumber)
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
gamepad.buttonWasPressed(buttonNumber);
```

{% endtab %}
{% endtabs %}

В качестве параметра необходимо указать номер кнопки — от 1 до 5.

#### Пример

{% tabs %}
{% tab title="Python" %}

```python
gamepad.buttonWasPressed(5)
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
gamepad.buttonWasPressed(5);
```

{% endtab %}
{% endtabs %}

## connected

Посылается при подключении пульта к роботу.

## disconnect

Посылается при отключении пульта.

## isPadPressed

Возвращает, нажата ли в данный момент область управления на пульте. Области управления имеют номера 0 и 1.

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```
gamepad.isPadPressed(padId)
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
gamepad.isPadPressed(padId);
```

{% endtab %}
{% endtabs %}

В качестве параметра необходимо указать номер области управления — 0 или 1.

#### Пример

{% tabs %}
{% tab title="Python" %}

```python
gamepad.isPadPressed(1)
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
gamepad.isPadPressed(1);
```

{% endtab %}
{% endtabs %}

## pad

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

## padX

Если указанная область управления на пульте нажата, возвращает текущую x-координату нажатия.

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```
gamepad.padX(padId)
```

{% endtab %}

{% tab title="JavaScript" %}

```
gamepad.padX(padId);
```

{% endtab %}
{% endtabs %}

В качестве параметра необходимо указать — номер области управления `padId`*.*

## padY

Если указанная область управления на пульте нажата, возвращает текущую y-координату нажатия.

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```
gamepad.padY(padId)
```

{% endtab %}

{% tab title="JavaScript" %}

```
gamepad.padY(padId);
```

{% endtab %}
{% endtabs %}

В качестве параметра необходимо указать — номер области управления `padId`*.*

## padUp

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

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```python
gamepad.padUp.connect(lambda padId, x, y: brick.stop())
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
gamepad.padUp.connect( function(padId, x, y) { brick.stop(); });
```

{% endtab %}
{% endtabs %}

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

* `padId` — номер области управления.
* `x`, `y` — координаты последнего известного нажатия от -100 до 100. Координата (-100, -100) соответствует левому верхнему углу области управления.

## reset

Сбрасывает запомненные события от пульта.

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```
gamepad.reset()
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
gamepad.reset();
```

{% endtab %}
{% endtabs %}

## wheel

Если на пульте включён «руль» (события от акселерометра устройства), возвращает текущий наклон пульта.

Наклон кодируется числом от -100 до 100, -100 соответствует крайнему левому положению «руля», 100 — крайнему правому.

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```
gamepad.wheel()
```

{% endtab %}

{% tab title="JavaScript" %}

```
gamepad.wheel();
```

{% endtab %}
{% endtabs %}

## wheelEvent

Посылается, когда на пульте включён «руль» (события от акселерометра устройства) и пользователь повернул устройство.

#### Синтаксис

{% tabs %}
{% tab title="Python" %}

```python
gamepad.wheelEvent.connect(lambda percent: brick.motor("E1").setPower(percent))
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
gamepad.wheelEvent.connect(function(percent) { brick.motor("E1").setPower(percent); });
```

{% endtab %}
{% endtabs %}

В качестве параметра необходимо указать число от -100 до 100, -100 соответствует крайнему левому положению «руля», 100 — крайнему правому.


# Объект «Threading»

Предоставляет управление параллельными потоками.

| Метод                                                                    | Описание                                                              |
| ------------------------------------------------------------------------ | --------------------------------------------------------------------- |
| [joinThread](/trik/programming-code/object-threading#jointhread)         | Ожидает завершения указанного потока.                                 |
| [killThread](/trik/programming-code/object-threading#killthread)         | Заканчивает исполнение указанного потока.                             |
| [receiveMessage](/trik/programming-code/object-threading#receivemessage) | Запрашивает принятое сообщение.                                       |
| [sendMessage](/trik/programming-code/object-threading#sendmessage)       | Посылает сообщение указанному потоку.                                 |
| [startThread](/trik/programming-code/object-threading#startthread)       | Запускает переданную в качестве параметра функцию в отдельном потоке. |

## joinThread

Ожидает завершения указанного потока.

#### Синтаксис

{% tabs %}
{% tab title="JavaScript" %}

```javascript
Threading.joinThread("threadId")
```

{% endtab %}
{% endtabs %}

В качестве параметра необходимо указать id потока.

## killThread

Заканчивает исполнение указанного потока.

#### Синтаксис

{% tabs %}
{% tab title="JavaScript" %}

```javascript
Threading.killThread("threadId")
```

{% endtab %}
{% endtabs %}

В качестве параметра необходимо указать id потока.

## receiveMessage

Запрашивает принятое сообщение.

#### Синтаксис

{% tabs %}
{% tab title="JavaScript" %}

```javascript
Threading.receiveMessage(wait)
```

{% endtab %}
{% endtabs %}

Если `wait` равен `true`, то ожидает, пока не придет сообщение.

## sendMessage

Посылает сообщение указанному потоку.

#### Синтаксис

{% tabs %}
{% tab title="JavaScript" %}

```javascript
Threading.sendMessage("threadId", "message")
```

{% endtab %}
{% endtabs %}

В качестве параметров необходимо указать id потока и сообщение.

## startThread

Запускает переданную в качестве параметра функцию в отдельном потоке.

{% hint style="warning" %}
**Внимание!** При этом создаётся новая копия для всех глобальных переменных. Так что если в одном потоке значение переменной меняется, в другом потоке оно остаётся старым.
{% endhint %}

#### Синтаксис

{% tabs %}
{% tab title="JavaScript" %}

```javascript
Threading.startThread("newThreadId", "functionName")
```

{% endtab %}
{% endtabs %}

В качестве параметров необходимо указать id потока и функцию.


# Функция getPhoto

## Описание функции

Функция возвращает одномерный массив байт, в который записаны пиксели изображения в формате **`rgb32`**, снятого с камеры (размер изображения — 160x120). Данная функция может быть использована для решения задач распознавания маркеров.

## Вызов функции

{% tabs %}
{% tab title="Python" %}

```python
pic = getPhoto()
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
var pic = getPhoto();
```

{% endtab %}
{% endtabs %}

## Пример работы

Рассмотрим пример преобразования кадра, снятого на камеру, в цветовые форматы «оттенок серого» и «черно-белый».

Сделайте снимок и выведите результат на экран c помощью функции [**show**](/trik/programming-code/object-brick/class-display#show).

{% tabs %}
{% tab title="Python" %}

```python
# взять кадр в формате rgb32
pic = getPhoto()
brick.display().show(pic, total_height, total_width, "rgb32")
script.wait(2000)
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
// взять кадр в формате rgb32
var pic = getPhoto();
brick.display().show(pic, total_height, total_width, "rgb32");
script.wait(2000);
```

{% endtab %}
{% endtabs %}

Результат:

![](https://thumb.tildacdn.com/tild6535-6131-4638-b834-323461306536/-/resize/240x/-/format/webp/getphoto1.png)

## Реализация функции перевода изображения в оттенок серого

{% tabs %}
{% tab title="Python" %}

```python
def grayScale(sPic):
	bufPic = []
	for i in range(total_height):
		for j in range(total_width):
			x = i * total_width + j
			p = sPic[x]
			r = (p & 0xff0000) >> 16	# взять значение компоненты красного
			g = (p & 0xff00) >> 8 # взять значение компоненты зеленого
			b = (p & 0xff) # взять значение компоненты синего
			p = r * 0.299 + g * 0.587 + b * 0.114; # компонента Y из YUV
			bufPic.append(p)
	return bufPic
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
function grayScale(sPic){
	bufPic = [];
	for(var i = 0; i < total_height; i++)
		for(var j = 0; j < total_width; j++){
			var x = i * total_width + j;
			var p = sPic[x];
			var r = (p & 0xff0000) >> 16;	// взять значение компоненты красного
			var g = (p & 0xff00) >> 8;	// взять значение компоненты зеленого
			var b = (p & 0xff);		// взять значение компоненты синего
			p = r * 0.299 + g * 0.587 + b * 0.114; // компонента Y из YUV
			bufPic[x] = p; 
		}
	return bufPic;
}
```

{% endtab %}
{% endtabs %}

Перевод изображения в черно-белый формат и вывод на дисплей:

{% tabs %}
{% tab title="Python" %}

```python
pic = grayScale(pic)

brick.display().show(pic, total_height, total_width, "grayscale8")
script.wait(2000)
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
var pic = grayScale(pic);

brick.display().show(pic, total_height, total_width, "grayscale8");
script.wait(2000);
```

{% endtab %}
{% endtabs %}

Результат:

![](https://thumb.tildacdn.com/tild3136-3162-4264-b135-313732663734/-/resize/240x/-/format/webp/getphoto2.png)

## Реализация функции бинаризации изображения

{% tabs %}
{% tab title="Python" %}

```python
# Бинаризация -- перевод изображения в ЧБ
def binarization(treshold, sPic):
	bufPic = []
	for i in range(len(sPic)):
		bufPic.append(255 if sPic[i] > treshold else 0)
	return bufPic
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
// Бинаризация -- перевод изображения в ЧБ
function binarization(treshold, sPic){
	bufPic = []
	for(var i = 0; i < sPic.length; i++){
		bufPic[i] = sPic[i] > treshold ? 255 : 0;
	}
	return bufPic;
}
```

{% endtab %}
{% endtabs %}

Перевод изображения в черно-белого и вывод на дисплей:

{% tabs %}
{% tab title="Python" %}

```python
pic = binarization(80, pic)
brick.display().show(pic, total_height, total_width, "grayscale8")
script.wait(2000)
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
var pic = binarization(80, pic);
brick.display().show(pic, total_height, total_width, "grayscale8");
script.wait(2000);
```

{% endtab %}
{% endtabs %}

Результат:&#x20;

![](https://thumb.tildacdn.com/tild3430-3165-4933-b962-626438366662/-/resize/240x/-/format/webp/getphoto3.png)

{% hint style="info" %}
[Пример программы с использованием функции getPhoto](https://dl.trikset.com/trikset-help/getPhoto.js).
{% endhint %}

{% hint style="info" %}
Дополнительный материал: презентация Университета Иннополис «[Распознавание меток ARTag](https://drive.google.com/file/d/15jbnB8Yv2HZq51Hwwi1jAu7dPtxyN8TS/view)».
{% endhint %}


# Функция include

### Описание функции

Позволяет использовать функции, реализованные пользователем в других файлах. Предполагается для написания собственных библиотек.

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

### Вызов функции

{% tabs %}
{% tab title="other\_file.js" %}
{% code title="other\_file.js" %}

```javascript
// Функции должны быть объявлены как глобальные переменные
sum = function(a, b) {
    return a + b
}
```

{% endcode %}
{% endtab %}

{% tab title="my\_file.js" %}

```javascript
include("other_file.js");
print(sum(1, 2));
```

{% endtab %}
{% endtabs %}


# Веб-интерфейс контроллера ТРИК

Веб-интерфейс контроллера ТРИК позволяет:

* [Изменить настройки Wi-Fi на контроллере.](/trik/web-interface#set)
* [Настроить взаимодействие нескольких контроллеров.](/trik/web-interface#set)
* [Изменить конфигурацию датчиков, моторов и энкодеров.](/trik/web-interface#porty)
* [Изменить конфигурацию микроэлектромеханических систем (гироскоп и акселерометр).](/trik/web-interface#mems)
* [Запустить видеотрансляцию с камеры контроллера.](/trik/web-interface#videotranslyaciya)
* [Скачать лог-файлы.](/trik/web-interface#bortovoi-zhurnal)
* [Посмотреть программы, загруженные на контроллер.](/trik/web-interface#programmy)
* [Сделать скриншоты экрана контроллера и скачать их.](/trik/web-interface#izobrazheniya)
* [Сделать снимки с камеры, подключенной к контроллеру, и скачать их.](/trik/web-interface#izobrazheniya)

## Запуск веб-интерфейса

‌Для запуска веб-интерфейса:

1. Подключите контроллер ТРИК к компьютеру любым из [возможных способов](/trik/wi-fi/network-connection).
2. Введите в адресной строке браузера IP-адрес контроллера.

![Пример ввода IP-адреса](https://lh4.googleusercontent.com/8Dqrd13QCRPWKrIQoD8IPvgMdIYyI2vNabe8JDQxW1o5RGSkI6vM-CurBL5GtXbDzqdFODH-0uKFnYNJhIs4S8waXds6cDGJI5a0Z__AYBy7knvWh8zh2V_5-ouwGcgk-b3vQaoo)

IP-адрес контроллера отображается на экране после подключения к сети.

![](https://lh3.googleusercontent.com/iRtyRma-5whbUFs6X0QXeJxGl-57aqG3GJjxmQQ4KVKmV-p95nyqs6wUNGv1JqMVR8gV7BUr6FG9hthw16klwaNGyB1-LQbApCisv3dTwh6DTyq87YTnoafEyFJYzV8oH8vrHhgH)

## Меню веб-интерфейса

Меню веб-интерфейса содержит следующие пункты:

1. [Сеть.](/trik/web-interface#set)
2. [Порты.](/trik/web-interface#porty)
3. [МЭМС (микроэлектромеханические системы).](/trik/web-interface#mems)
4. [Видеотрансляция.](/trik/web-interface#videotranslyaciya)
5. [Бортовой журнал.](/trik/web-interface#bortovoi-zhurnal)
6. [Программы.](/trik/web-interface#programmy)
7. [Изображения.](/trik/web-interface#izobrazheniya)

## Сеть

На вкладке «Сеть» можно:

* ‌Задать параметры Wi-Fi-сети для контроллера в режиме точки доступа [Wi-Fi-клиента](/trik/wi-fi/network-connection#client).
* Изменить имя точки доступа Wi-Fi для контроллера в режиме [точки доступа Wi-Fi](/trik/wi-fi/network-connection#accesspoint).
* Задать бортномер контроллера и IP-адрес ведущего контроллера для [взаимодействия контроллеров](/trik/wi-fi/interaction).
* Включить или отключить PPP-демон (PPP-демон нужен для эмуляции сетевого подключения через последовательный порт).

![Вкладка «Сеть»](https://lh6.googleusercontent.com/pqcyQadVMo8y9EM1VVEHXJcLAwlGPeykZC4nmAYKohSX4mtFnmjGhJcrSxx7Rnv1tCmZ612-r1CMSKpg0iDBA9fxt7sXDPg0XxuplnDSDH3yu6fV5K2yHUgC1mNhgy3AnQZB8DTv)

## Порты

На вкладке «Порты» можно:

* Выбрать тип подключаемых [силовых моторов](/trik/web-interface#silovye-motory) для каждого порта.
* Выбрать тип подключаемых [сервомоторов](/trik/web-interface#servomotory) для каждого порта.
* Выбрать тип подключаемых [аналоговых датчиков](/trik/web-interface#analogovye-sensory) для каждого порта.
* Выбрать тип [энкодеров](/trik/web-interface#enkodery), использующихся в моторах, для каждого порта, а также положительное направление отсчета положения вала мотора для каждого порта.
* Выбрать тип подключаемых [цифровых датчиков](/trik/web-interface#datchiki-distancii) для каждого порта.
* Сконфигурировать порты для подключения [видеокамер](/trik/web-interface#video1-video2).

![](/files/-M7e10yQgsXB5kNrZZ6n)

После изменения настроек необходимо нажать на кнопку «Сохранить» внизу экрана и подтвердить действие.

![](https://lh3.googleusercontent.com/cPkUdk7HyBuL1DtzCaHxrZyEzBtWtqI5q0CSzuUj_5hX4u4o9z4e8vvSm4wJRrpkywiJeA417dkNNnJZi_lZ0fqsODoEbONpE61SFZ8TdMjUT65vY8fh3FR7NVQjUx9co4k9y6RS)

### Силовые моторы

В разделе «Силовые моторы» вы можете выбрать тип подключаемых силовых моторов для каждого порта.

### Сервомоторы

В разделе «Сервомоторы» вы можете выбрать тип подключаемых сервомоторов для каждого порта.

### Аналоговые сенсоры

В разделе «Аналоговые сенсоры» вы можете выбрать тип подключаемых аналоговых сенсоров для каждого порта.

### Энкодеры

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

### Датчики дистанции

В разделе «Датчики дистанции» вы можете выбрать тип подключаемых цифровых датчиков для каждого порта.

### Video1 / Video2

Видеопорты и подключенные к ним видеокамеры могут работать в следующих режимах:

* colorSensor3x3 — режим датчика цвета.
* lineSensor — режим сенсора линии с детектированием цвета.
* photo — камера используется для получения снимков и видеопотока.
* edgeLineSensor — режим сенсора линии с детектированием границ (работает на инверсных линиях).

![](/files/-M7Cfq-_atZYeaLaT8OH)

## МЭМС

Вкладка МЭМС (микроэлектромеханические системы) позволяет:

* Включить или отключить гироскоп или акселерометр.
* Выбрать частоту обновления и диапазон работы акселерометра и гироскопа в «Расширенных настройках».

![](https://lh4.googleusercontent.com/AYpIMeubH2ZyBByHeB37oYtAOnOO_voBfOcsb44CAoyij6GFKtW54Mv-rrPS6hfoZGY1hmumJZvflID-E_deehGRK-EIg81rRqLiDmrFa4UVIg4TESOimkH48EIp4x1x2QYKjy8Q)

Для изменения конфигурации необходимо нажать кнопку «Сохранить» и подтвердить действие.

![](https://lh5.googleusercontent.com/6qgUIBFewE5C1re6c12IYzh7yhUaiCrAaoeiFDbJN1g43QavyastAIuTkKY54vDl9burYWfq1HE4CGszUwng4mDyiTPGkhOpXQRVMuBsCNVodBOeLdq3Eu55_jGcnPBQ-ol4gM2f)

## Видеотрансляция

Вкладка «Видеотрансляция» позволяет смотреть видео с установленной на контроллере камеры.

Для её запуска необходимо в [программу управления роботом с пульта](/gamepad/remote-control) добавить блок «[Запустить видеотрансляцию](/trik/programming-visual/blocks#camera-on)».

## Бортовой журнал

На вкладке «Бортовой журнал» отображаются логи контроллера, которые можно скачать [для последующей отправки их в службу поддержки](/feedback/logging#trik).

![](https://lh3.googleusercontent.com/gSw8G3IcE5WolWHUJSpZlaBou1jVur3MY12FkxpU6_Zbl_j49p3-XzsLa2TqG40IWm_JunJeM7sYQ6UhxRY1s9ZlJWju84ZjKUyZXDaf0NFjuzxKGqQedqwm2ZwNJDn7EQ0iALz-)

## Программы

На вкладке «Программы» отображаются загруженные на контроллер программы.

![](/files/-M7hNHekarrzXq1RIiq1)

Удалить все программы можно через интерфейс контроллера.

![](/files/-M7hPDgi9vNY8ZZvx8fg)

![](/files/-M7hPMVfPBFn1kWcDv1T)

## Изображения

Вкладка «Изображения» содержит изображения, сделанные с помощью подключенной камеры, а также скриншоты экрана контроллера.

На вкладке вы можете:

* [Сделать снимок экрана контроллера](/trik/about/screenshot).
* Просмотреть и скачать полученные с контроллера изображения как по отдельности, так и все вместе.
* Удалить все имеющиеся изображения (выборочного удаления не предусмотрено).

![](/files/-M7dGg_Ke7yvMPQ9S0L6)

## LOG

Иконка <img src="/files/-M64ffofbgYoMLdWSANW" alt="" data-size="line"> позволяет скачать лог-файлы. Подробнее читайте в статье «Действия при неправильной работе TRIK Studio или контроллера ТРИК» в разделе «[Сбор логов на контроллере ТРИК](/feedback/logging#trik)».


# Подключение устройств к ТРИК и работа с ними

Контроллер ТРИК позволяет собрать робототехническую модель, не ограничивая себя в выборе «оснастки» для неё.

Он позволяет подключать цифровые и аналоговые датчики, внешние устройства по протоколам i2c и UART, оснащен двумя видеопортами и USB-разъемом.

Для подключения моторов на контроллере расположено 6 портов для сервомоторов и 4 порта для силовых моторов.

В данном разделе собрана информация о подключении к контроллеру ТРИК датчиков, моторов, камер — описан процесс тестирования подключенных устройств, их конфигурирования и эффективного использования вместе со средой программирования TRIK Studio.

{% content-ref url="/pages/-M02tX4p6vSt9VRnJ-N-" %}
[Тестирование подключенных к контроллеру ТРИК устройств](/trik/work-with-devices/testing-connected-devices)
{% endcontent-ref %}

{% content-ref url="/pages/-M033Tsy279puktkXWlP" %}
[Настройка работы USB-камеры с контроллером ТРИК](/trik/work-with-devices/usb-camera)
{% endcontent-ref %}

{% content-ref url="/pages/-M14haJ160W\_5lzHQPk9" %}
[Съемка изображений на камеру ТРИК и использование их в TRIK Studio](/trik/work-with-devices/capture-images-on-camera)
{% endcontent-ref %}


# Подключение и работа с видеомодулем

К контроллеру ТРИК можно подключать как видеомодули, так и веб-камеры с интерфейсом USB.

|                             Видеомодуль                             |                              Веб-камера                             |
| :-----------------------------------------------------------------: | :-----------------------------------------------------------------: |
| <img src="/files/-M5X5mqWQFXo0iy-zQYJ" alt="" data-size="original"> | <img src="/files/-M5X5kM8Cv7fG_P9aqFy" alt="" data-size="original"> |

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

Видеомодуль подключается к порту **video1** или **video2**, USB веб-камеры — к порту **USB**.

Подключение видеомодуля к порту **video2 (**&#x438;ли **video1)** происходит таким образом, чтобы ножка у красного штекера была справа.\
&#x20;&#x20;

![](/files/-M5X5P-basy9dLHBDL4W)

## Использование

Камеру в TRIK Studio можно запустить в трех режимах:

1. &#x20;[Как сенсор линии (linesensor)](/trik/work-with-devices/video#linesensor).
2. &#x20;[Как сенсор объектов (objectsensor)](/trik/work-with-devices/video#objectsensor).
3. &#x20;[Как сенсор цвета (colorsensor)](/trik/work-with-devices/video#colorsensor).

Для инициализации видеокамеры напишите алгоритм:&#x20;

![](/files/-M5XJkPMQnk-1zhOzBnk)

После инициализации камеры на дисплее появится трансляция видео с дополнительными графическими элементами.&#x20;

{% hint style="warning" %}
**Внимание!** По умолчанию будет включен режим **`Сенсор линии`**.  Чтобы поменять режим использования, зайдите в свойства блока «Включить видеокамеру» и смените режим на нужный.
{% endhint %}

## LineSensor

Камера как сенсор линии необходима для решения задачи движения по линии, а также по прерывистой линии (линии-профи).

Для того чтобы включить камеру как сенсор линии, вам необходимо изменить режим работы камеры в свойствах блока [«Включить видеокамеру»](/trik/programming-visual/blocks#initialize-videocamera), на `Сенсор линии`. Режим `Сенсор линии` имеет сенсорную переменную [lineSensor](/trik/programming-visual/sensory-variables#linesensor).&#x20;

#### Пример

Задача: напишите алгоритм движения робота по линии с использованием камеры.

#### Написание алгоритма

1\. Объявите переменную `k` — коэффициент пропорциональности, который будет использоваться в пропорциональном регуляторе для движения робота.&#x20;

![](/files/-M5XQ4kYBAaKrrgjchKv)

2\. Инициализируйте камеру как сенсор линии.

![](/files/-M5XQ8AZc9SRGD1szzP8)

{% hint style="warning" %}
**Внимание!** Блок [«Ждать нажатия кнопки»](/trik/programming-visual/blocks#wait-for-button) необходим, чтобы камера успела включиться. Когда на экране робота появится изображение с камеры, можно приступать к следующему пункту.
{% endhint %}

3\. Детектируйте камеру на объекте.

![](/files/-M5XRi6qeCHTZi97r4ke)

4\. Напишите регулятор для движения. Используйте блок [«Датчик линии в переменную»](/trik/programming-visual/blocks#line-detector-into-variable), который записывает показания отклонения объекта от центра экрана по оси `Х` (от -100 до 100) в переменную, указанную в свойствах. Другими словами, это динамическая ошибка.

![](/files/-M5XQCkhWkVJnIJKye6O)

#### Общий вид алгоритма

![](/files/-M5XQEvJpwJgWtCKtfWD)

#### Запуск алгоритма на реальном роботе

1\. Запустите программу на роботе.

2\. Дождитесь, пока включится видеокамера.

3\. В режиме сенсора линии на экране будет отображаться 4 фиолетовые направляющие. Наведите камеру на линию таким образом, чтобы правая граница линии попадала в коридор между двумя правыми направляющими, а левая между двумя левыми.

4\. Нажмите кнопку `Вверх` на контроллере для детектирования объекта (линии).

![](https://thumb.tildacdn.com/tild3466-3731-4536-a331-393238643761/-/resize/240x/-/format/webp/image7.png)

Обратите внимание, что видео транслируется на экран в формате 240×140 px, а это как раз половина экрана.

Чтобы понять, что детектирование произошло, линия должна заполниться желтыми точками, как на картинке:

![](https://thumb.tildacdn.com/tild3165-6632-4635-b137-303930343235/-/resize/240x/-/format/webp/image12.png)

5\. Нажмите кнопку `Вниз`.

## ObjectSensor

Камера как сенсор объекта необходима для решения задач распознавания и отслеживания объектов. Для того чтобы включить камеру как сенсор линии, вам необходимо изменить режим работы камеры, в свойствах блока [«Включить видеокамеру»](/trik/programming-visual/blocks#initialize-videocamera), на `Сенсор объекта`.\
Режим `Сенсор объекта` имеет сенсорные переменные: [objectSensorSize, objectSensorX, objectSensorY.](/trik/programming-visual/sensory-variables)

#### Пример

Задача: напишите алгоритм распознавания объекта с использованием камеры.

{% hint style="info" %}
**Внимание!** Робот должен выводить в консоль координаты центра объекта и его диаметр в пикселях.
{% endhint %}

#### Написание алгоритма

1\. Инициализируйте камеру как сенсор объекта.

![](/files/-M5XTFs2GaKhE74aYiPx)

{% hint style="info" %}
**Внимание!** Блок «Ждать нажатия кнопки» необходим, чтобы камера успела включиться. Когда на экране робота включиться изображение с камеры, можно приступать к следующему пункту.
{% endhint %}

2\. Детектируйте камеру на объекте.

![](/files/-M5XTT9fQt9B0eEb-HZt)

3\. Напишите цикл с условием на выход из программы по нажатию на `Esc` на ложной ветке.

![](/files/-M5XUyIwm1OTAduAs9t5)

4\. На истинную ветку добавьте функцию присвоения координат центра объекта и диаметр в пикселях, переменным `a`, `b`, `c`.

![](/files/-M5XYNC4IVZ07HlDaF2m)

5\. Далее добавьте вывод в консоль переменных `a`, `b`, `c` и закончите цикл блоком [«Таймер»](/studio/programming-visual/blocks#timer):

![](/files/-M5XZzWz9CJpO9YlqPVx)

#### Общий вид алгоритма

![](/files/-M5X_lxbntUBXP5eczIe)

#### Запуск алгоритма на реальном роботе

1 . Запустите программу на роботе.

2\. Дождитесь, пока включится видеокамера.

3\. Поставьте робота таким образом, чтобы камера была направлена маленьким квадратом на объект. Нажмите кнопку `Вверх` на контроллере, для детектирования объекта.

![](https://thumb.tildacdn.com/tild6366-6562-4665-b066-656336636439/-/resize/240x/-/format/webp/image1.png)

Чтобы понять, что детектирование произошло, объект должен заполниться желтыми точками, как на картинке:

![](https://thumb.tildacdn.com/tild3961-3034-4236-a536-653062373966/-/resize/240x/-/format/webp/image20.png)

&#x20;4\. Нажмите кнопку `Вниз` на контроллере.

## ColorSensor

Камера как сенсор цвета необходима для решения задач распознавания цвета.

Для того чтобы включить камеру как сенсор линии, вам необходимо изменить режим работы камеры, в свойствах блока [«Включить видеокамеру»](/trik/programming-visual/blocks#initialize-videocamera), на `Сенсор цвета`.

Режим `Сенсор цвета` имеет сенсорные переменные трех цветов (красный, зеленый, синий): [colorSensorR, colorSensorG, colorSensorB](/trik/programming-visual/sensory-variables#colorsensor).

В режиме сенсора цвета камера делит кадр на 9 зон и возвращает среднее значение цвета центральной зоны.

#### Пример

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

{% hint style="info" %}
Обратите внимание, что решить задачу можно только на реальном роботе.
{% endhint %}

#### Написание алгоритма

1\. Инициализируйте камеру как сенсор цвета.

![](/files/-M5XbX-DLrLHaUsK19cJ)

{% hint style="info" %}
**Внимание!** Блок [«Ждать нажатия кнопки»](/trik/programming-visual/blocks#wait-for-button) необходим, чтобы камера успела включиться. Когда на экране робота включиться изображение с камеры, можно приступать к следующему пункту.
{% endhint %}

2\. Добавьте функцию присвоения сенсорных переменных, переменным `a`, `b`.

![](/files/-M5Xbjc4z7V9067VDlgk)

3\. Напишите условие, которое будет различать красный и зеленый. Учитывая, что красный — это `colorSensorR = 255` , а зеленый — это `colorSensorG = 255` .

![](/files/-M5XdTgGSte266bETc3V)

#### Общий вид алгоритма

![](/files/-M5XdWGa3UMQBEuSHj56)

#### Запуск алгоритма на реальном роботе

1\. Исполните программу на роботе.\
2\. Дождитесь, пока включится видеокамера.\
3\. Поставьте робота таким образом, чтобы камера была направлена на распознаваемый цвет.

![](https://thumb.tildacdn.com/tild3033-3935-4931-b331-613835333636/-/resize/240x/-/format/webp/image2.png)

4\. Нажмите кнопку `Вверх` на контроллере для начала распознавания цвета. На экран робота должен выводиться цвет, на который направлена камера (Green, Red).<br>


# Тестирование подключенных к контроллеру ТРИК устройств

На контроллере ТРИК вы можете протестировать подключенные к нему устройства:

1. [Аналоговые датчики](/trik/work-with-devices/testing-connected-devices#analogovye-datchiki).
2. [Сервоприводы.](/trik/work-with-devices/testing-connected-devices#servoprivody)
3. [Силовые моторы](/trik/work-with-devices/testing-connected-devices#silovye-motory).
4. [Цифровые датчики](/trik/work-with-devices/testing-connected-devices#cifrovye-datchiki).
5. [Энкодеры](/trik/work-with-devices/testing-connected-devices#enkodery).
6. [Гироскоп](/trik/work-with-devices/testing-connected-devices#gyroscope).
7. [Акселерометр](/trik/work-with-devices/testing-connected-devices#accelerometer).
8. [Камера.](/trik/work-with-devices/testing-connected-devices#camera)

Для этого зайдите в меню «Тестирование».

![](/files/-M5TWKGqTtYRFD5W8M3y)

{% hint style="info" %}
**Внимание!** Для тестирования устройства необходимо сначала его подключить к определенному порту.
{% endhint %}

## Аналоговые датчики

Для запуска тестирования аналоговых датчиков выберите соответствующий пункт в списке.

| ![](/files/-M5XTuT_9qesMyoJG36J) | ![](/files/-M5Tac1N0L6kSyjeOQ90) |
| -------------------------------- | -------------------------------- |

### Конфигурация портов для аналоговых датчиков

| Порт  | Конфигурация                                                                                                                                              |
| ----- | --------------------------------------------------------------------------------------------------------------------------------------------------------- |
| A1–A2 | <p>Инфракрасный датчик расстояния.<br>Пределы значений: 8–80 см.</p>                                                                                      |
| A3–A4 | <p>Датчик касания. Значения: <br>0 — отсутствие нажатия, <br>1 — нажатие.</p>                                                                             |
| A5–A6 | <p>Датчик освещенности. <br>Пределы значений: 0–100. 0 — белый, 100 — черный. <br>Датчик должен быть установлен на расстоянии 8–15 мм от поверхности.</p> |

## Сервоприводы

1\. Для запуска тестирования сервоприводов выберите соответствующий пункт в списке.

![](/files/-M5XU-fiqCm-OIcdQYIt)

2\. Выберите порт, к которому подключен сервопривод. Сервоприводы подключаются к портам S1-S3.

![](/files/-M5TbxcoGSmWKlA4fxCn)

3\. Нажмите кнопку «Ввод» на контроллере для подачи питания на сервопривод.

4\. Если прибавить мощность с помощью кнопки «Вправо», сервопривод будет крутиться по часовой стрелке.

![](/files/-M5TcKSX30ZgYthqMFvX)

5\. Если убавить — против часовой стрелки.

![](/files/-M5TcUX1jV2SbeA34JF7)

## Силовые моторы

1\. Для запуска тестирования силовых моторов выберите соответствующий пункт в списке.

![](/files/-M5XRIJKtTqX8xKG5iSz)

2\. Выберите порт, к которому подключен мотор. Моторы подключаются к портам M1–M4.

![](/files/-M5TdO3W_d1qT8TalrWP)

3\. Нажмите кнопку «Ввод» на контроллере для подачи питания на мотор.

4\. Если прибавить мощность с помощью кнопки «Вправо», моторы будут крутиться вперед.

![](/files/-M5TdTeOVi-eVrBGkCT5)

5\. Если убавить — назад.

![](/files/-M5Tdcfv40FkUH6Ekj-R)

{% hint style="info" %}
**Внимание!** Если мотор крутится не в ту сторону, достаточно поменять направление тока — отсоединить силовой провод и вставить другой стороной.
{% endhint %}

## Цифровые датчики

Для запуска тестирования цифровых датчиков выберите соответствующий пункт в списке.

| ![](/files/-M5XRQQWDoDhL-_SEb65) | ![](/files/-M5XG3T-9GTgdOeljqN0) |
| -------------------------------- | -------------------------------- |

### Конфигурация портов для цифровых датчиков

| Порт  | Конфигурация                                                             |
| ----- | ------------------------------------------------------------------------ |
| D1–D2 | <p>Ультразвуковой датчик расстояния. <br>Пределы значений: 8–250 см.</p> |

{% hint style="info" %}
**Внимание!** Если датчик выдает -1, значит он либо слишком далеко от предмета, либо слишком близко к нему.
{% endhint %}

## Энкодеры

1\. Для запуска тестирования энкодеров выберите соответствующий пункт в списке.

![](/files/-M5XRhQ2XCmOKV-A72dO)

2\. Подсоедините колеса к моторам с помощью втулки.

3\. Для тестирования работоспособности энкодера необходимо покрутить колесо вперед-назад и посмотреть изменения показаний энкодеров.

![](/files/-M5TfCK-9uz7-DIR8NAK)

{% hint style="info" %}
**Внимание!** Энкодеры инкрементальные. При прокрутке мотора значение энкодера может быть как отрицательным, так и положительным.
{% endhint %}

## Гироскоп <a href="#gyroscope" id="gyroscope"></a>

1\. Для запуска тестирования гироскопа выберите соответствующий пункт в списке.

![](/files/-M5XRqMFrtYTvQeoTyeR)

2\. Для тестирования работоспособности гироскопа необходимо изменить положение робота в пространстве и посмотреть изменения показаний.

![](/files/-M5ThBak_8souAGvpK24)

{% hint style="info" %}
**Внимание!** Все показания в милиградусах.
{% endhint %}

## Акселерометр <a href="#accelerometer" id="accelerometer"></a>

1\. Для запуска тестирования гироскопа выберите соответствующий пункт в списке.

![](/files/-M5XRvz18JFJDQ0CR8UY)

2\. Для тестирования работоспособности акселерометра необходимо изменить положение робота в пространстве и посмотреть изменения показаний.

![](/files/-M5ThipWjZTT6XhDj-Vr)

{% hint style="info" %}
**Внимание!** Все показания в милиградусах.
{% endhint %}

## Камера <a href="#camera" id="camera"></a>

1\. Для запуска тестирования подключенной камеры выберите соответствующий пункт в списке.

![](/files/-M5XS-fE_VS-WrKu9WhN)

2\. При правильно работающей камере, на экран должно выдаваться изображение.




---

[Next Page](/llms-full.txt/1)

