вторник, 25 сентября 2012 г.

Рефлексы и РобоСкрипт


Идея создания простого языка для записи набора действий робота родилась спонтанно. Началось всё с рефлексов. Захотелось выполнить сразу несколько действий по одной команде пользователя. Если ткнуть робота Митю в глаз, он отпрыгнет и разозлится. Это безусловный рефлекс. Если погладить, он улыбнётся и приподнимет голову. Это тоже у него безусловный рефлекс. Для реализации задумки состав команд пришлось расширить и продумать структуру хранения программы. Получился язык программирования Мити. Я назвал его РобоСкрипт. Возможно, к  вопросу о выборе языка программирования робота надо было подойти более системно, можно было бы вооружиться каким-нибудь готовым языком, но изначально я не ставил цели изобретать велосипед. Он сам изобрёлся шаг за шагом.


Позже захотелось собирать произвольные наборы действий и затем воспроизводить их одной командой. Рефлексы к тому моменту уже были реализованы, и придуманный там подход вполне подходил для реализации новой задумки. Надо было только динамически выделять память под каждую программу. Объём оперативной памяти, доступной для этой цели, в ATMEGA328 ограничен 2КБ. Очень не развернёшься, поэтому количество программ я ограничил десятью штуками, но всё равно надо быть готовым, что памяти может не хватить – всё зависит от размера других РобоСкриптов, а также от объёма памяти, занятого переменными скетча robo_body.

Ложка дёгтя: у этого решения сейчас я вижу один недостаток – РобоСкрипт хранится в оперативной памяти микроконтроллера. Как следствие, размер скриптов ограничен, и они теряются после выключения питания робота. Android-приложение RoboHead гораздо больше подходит для хранения и управления воспроизведением РобоСкриптов, поэтому как-нибудь я обязательно переведу РобоСкрипт на этот уровень. А пока у нас просто эволюция безусловного рефлекса. Назовём его условным рефлексом.

Структура программы на РобоСкрипт на примере с комментариями

Язык примитивный, фактически, это просто последовательность команд с временными задержками. Вот пример скрипта, дважды включающего на 500 миллисекунд светодиод на контроллере:
r0105, Z0004, I0001, W01F4, I0000, W00C8, I0001, W01F4, I0000, W0000, Z0000

Прокомментирую:
r0105 – команда, переводящая RoboHead и robo_body в режим записи программы №5. В этом режиме команды, передаваемые от ПК не выполняются сразу, а сохраняются для последующего выполнения. Старший байт значения команды r (01) указывает на начало записи программы. Младший байт (05) определяет номер записываемой программы. В робота может быть загружено до 10-ти программ с номерами от 00 до 0A.
Z0004 – выделение SRAM-памяти в микроконтроллере для хранения программы. Значение 0004 означает, что программа будет содержать 4 действия. Действие – это команда и задержка до следующего действия.
I0001 – начало первого действия. Включить фары робота (светодиод на плате контроллера, по совместительству).
W01F4 – задержка на 500 миллисекунд до начала выполнения следующего действия.
I0000 – второе действие: выключить светодиод.
W00C8 – задержка на 200 миллисекунд.
I0001 – третье действие: опять включаем.
W01F4 – на 500 миллисекунд.
I0000 – выключаем.
W0000 – длительность задержки уже не важна, но структура РобоСкрипт требует завершения каждого действия задержкой.
Z0000 – конец скрипта. Эта команда является сигналом к переводу robo_body и RoboHead из режима записи программы в обычный режим воспроизведения команд пользователя.

Программирование и запуск программ

Для работы с РобоСкрипт понадобится Windows-приложение RoboConsole.exe. Команды языка  можно вводить по одной, либо через запятую. Допускается произвольное количество пробелов, но запятые всё равно обязательны. Стрелки вверх и вниз обеспечивают навигацию по истории введённых команд. В RoboConsole допускается сокращённый ввод команд: например, I1 вместо I0001, или просто I вместо I0000.

В режиме отладки можно организовать ввод команд непосредственно в контроллер по USB-кабелю. Надо только не забыть отключить Bluetooth-модуль. При непосредственном взаимодействии с роботом можно воспользоваться любым терминалом, например, из IDE Arduino. Здесь запятые и пробелы уже не допускаются, а команды должны вводиться только полностью.

Для воспроизведения программ используется команда r00xx. xx определяет номер ранее записанной программы от 00 до 0A. Для запуска нашей программы мигания светодиодами, например, потребуется ввести команду r0005.

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

UPD:

Применение РобоСкрипта на практике показало необходимость ещё двух вещей:
  1. Необходима команда, прерывающая выполнение РобоСкрипта.
  2. Нужны команды для организации циклов.


Комментариев нет:

Отправить комментарий