Лет эдак в 10-11, после долгих и беззаботных лет игры с контрукторами Lego, я узнал о существовании великолепного набора Mindstorms, который позволял создавать самых настоящих роботов без специализованных знаний электроники, электротехники и даже программирования. Я сразу же заинтересовался данной серией, но тогда моим мечтам обладать Mindstorms по различным (в основном — финансовым) причинам не суждено было сбыться.
Сейчас мне 20 и в честь юбилея друзья (спасибо им!) решили окунуть меня назад в детство и таки дать возможность полепить собственных роботов. Правда, в этот раз всё будет серьёзнее, чем в моих детских мыслях — мы будем действительно программировать Mindstorms под Debian GNU/Linux.
Что же это?
Mindstorms NXT 2.0 — третий продукт в линейке Mindstorms — специальной серии конструкторов Lego, предназначенной для создания программируемых роботов. Конструктор поставляется с набором обычных деталей серии Lego Technic, а также специальных сенсоров (расстояния, освещенности, касания), нескольких двигателей-тахометров и специального блока NXT. Подробнее о ко Mindstorms можно узнать из вот этой статьи.
К слову о NXT — в этой небольшой коробочке припрятаны целых два микроконтроллера — 32-битный ARM7 и 8-битный AVR, 512 Мб RAM, более 256 Кб flash-памяти, монохромный ЖК-дисплей, динамик, USB-порт, а также 7 портов для подключения сенсоров. А, да — еще отсек для 6 батареек или аккумулятора, который продается отдельно на сайте shop.lego.com. Собственно, NXT и является «сердцем» любого создаваемого робота.
Ознакомившись с кратким руководством, включенным в комплект, можно вполне себе создать робота, который выполняет какие-нибудь нехитрые действия вообще без всякого программирования. Например, за буквально 40 минут вместе со сборкой, можно сделать робота, который будет ездить по комнате и старательно избегать препятствия. Это делается прямо на самом устройстве, без подключения к компьютеру, на встроенном монохромном дисплее.
Неплохо, да?
Собственно, данный робот и будет нашей основной тестовой моделью. Но мы попробуем немного усовершенствовать его навыки. И для этого мы напишем небольшой кусочек кода.
А как?
Действительно. Идущее в комплекте ПО работает только в Windows и Mac OS. А у нас, внезапно, Debian Squeeze. К счастью, Mindstorms обладает огромным сообществом фанатов, которые придумали решение данной проблемы — использование альтернативного ПО для программирования роботов, в частности Bricxcc (здесь выложен полнейший мануал по настройке всего и вся).
А теперь немного теории — в программировании Mindstorms, как правило, помимо визуального среды ROBOLAB для Windows и Mac OS используется язык RCX, однако среди фанатов одним из наиболее популярных языков является достаточно простой NXC (Not eXactly C). Простая программа на NXC выглядит примерно так:
- task music()
- {
- int lastTone=5000;
- while(true)
- {
- int tone=Random(5000)+500;
- int duration=Random(500);
- PlayTone(tone,duration);
- Wait(duration);
- }
- }
-
- task main()
- {
- start music;
- while(true)
- {
- /* Determine Next Action */
- unsigned int duration=Random(5000);
- unsigned int motorSpeed=Random(100);
- unsigned int syncMode=Random(3);
-
- /* Display Next Action */
- ClearScreen();
- NumOut(0,LCD_LINE1,duration);
- NumOut(0,LCD_LINE2,motorSpeed);
- NumOut(0,LCD_LINE3,syncMode);
-
- /* Perform Next Action */
- switch(syncMode)
- {
- case 0:
- OnFwdReg(OUT_AC,motorSpeed,OUT_REGMODE_SYNC);
- break;
- case 1:
- OnRevReg(OUT_AC,motorSpeed,OUT_REGMODE_SYNC);
- break;
- case 2:
- OnFwdSync(OUT_AC,motorSpeed,-100);
- break;
- case 3:
- OnRevSync(OUT_AC,motorSpeed,-100);
- break;
- }
-
- Wait(duration);
- }
- }
* This source code was highlighted with Source Code Highlighter.
Для справки — данная программа заставляет «танцевать» нашего робота под нечто, напоминающее музыку.
Не буду спорить, программа совсем не сложна для понимания, но достаточно громоздка. И её можно заметно упросить, используя вместо написания кода на NXC специальный конвертер PyNXC. Иначе говоря, мы будем писать код на Python'е, а PyNXC будет преобразовывать его в NXC-код и загружать на устройство, избавив нас от необходимости писать громоздкий код на подобии Си.
Пишем программу!
Ну, а теперь, собственно, напишем на Python'е программу для путешествия нашего робота среди прозрачных чашек, но используя более грамотный алгоритм разворота:
- # in cm
- DEFINE NEAR = 7
-
- def main():
- DefineSensors(None, None, None, EYES)
- while True:
- OnFwd(OUT_BC, 50)
- while SensorVal(4) > NEAR:
- pass
-
- Off(OUT_BC)
-
- while SensorVal(4) < NEAR:
- OnFwd(OUT_B, 50)
- Wait(100)
* This source code was highlighted with Source Code Highlighter.
Теперь наш робот научился разворачиваться на месте и, как только мешающий объект пропадет с поля его зрения, продолжать движение вперед.
Как вы уже, наверное, заметили, программировать Mindstorms очень просто. Стоит также сказать, что помимо NXC и Python с использованием PyNXC, можно писать код на Java, Lua, Ruby, Ассемблере, а также, что логично, использовать ассемблерные вставки в других языках.
Благодаря всему этому Mindstorms из детской игрушки превращается в весьма мощную штуку, позволяющую создавать сложные и «умные» механизмы, как например вот эта гитара:
Или этот сортировщик цветных шариков:
А самое приятное во всём этом — в комплект поставки Mindstorms NXT 2.0 уже включено большинство необходимых деталей. Единственное, что действительно может понадобится — дополнительные сенсоры, которые можно купить, например, в официальном магазине Lego.
- Официальный сайт Lego Mindstorms
- Раздел Mindstorms в официальном интернет-магазине Lego
- NXTprograms.com — ресурс с инструкциями по сборке самых разных моделей