Lego Mindstorms NXT 2

Років десь у 10-11, після довгих і безтурботних років гри з контрукторами Lego, я дізнався про існування чудового набору Mindstorms, який дозволяв створювати справжніх роботів без специфічних знань електроніки, електротехніки і навіть програмування. Я відразу ж зацікавився цією серією, але тоді мої мрії мати Mindstorms з різних (в основному — фінансових) причин не судилося збутися.

lego

Зараз мені 20 і на честь ювілею друзі (дякую їм!) вирішили занурити мене назад у дитинство і таки дати можливість поліпити своїх роботів. Щоправда, цього разу все буде серйознішим, ніж у моїх дитячих думках — ми дійсно будемопрограмуватиMindstorms під Debian GNU/Linux.

Що це?

duration

До речі про 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 виглядає приблизно так:

  1. task music()
  2. int lastTone=5000;
  3. while (true)
  4. int tone = Random (5000) + 500;
  5. int duration = Random (500);
  6. PlayTone(tone,duration);
  7. Wait(duration);
  8. >
  9. >
  10. task main()
  11. start music;
  12. while (true)
  13. /* Determine Next Action */
  14. unsigned int duration = Random (5000);
  15. unsigned int motorSpeed ​​= Random (100);
  16. unsigned int syncMode = Random (3);
  17. /* Display Next Action */
  18. ClearScreen();
  19. NumOut(0,LCD_LINE1,duration);
  20. NumOut(0,LCD_LINE2,motorSpeed);
  21. NumOut(0,LCD_LINE3,syncMode);
  22. /* Perform Next Action */
  23. switch (syncMode)
  24. case 0:
  25. OnFwdReg(OUT_AC,motorSpeed,OUT_REGMODE_SYNC);
  26. break;
  27. case 1:
  28. OnRevReg(OUT_AC,motorSpeed,OUT_REGMODE_SYNC);
  29. break;
  30. case 2:
  31. OnFwdSync(OUT_AC,motorSpeed,-100);
  32. break;
  33. case 3:
  34. OnRevSync(OUT_AC,motorSpeed,-100);
  35. break;
  36. >
  37. Wait(duration);
  38. >
  39. >

Для довідки - дана програма змушує "танцювати" нашого робота під щось, що нагадує музику.

Не сперечатися, програма зовсім не складна для розуміння, але досить громіздка. І її можна помітно попросити, використовуючи замість написання коду на NXC спеціальний конвертер PyNXC. Інакше кажучи, ми будемо писати код на Python'і, а PyNXC буде перетворювати його в NXC-код і завантажувати на пристрій, позбавивши нас необхідності писати громіздкий код на кшталт Сі.

Пишемо програму!

Ну, а тепер, власне, напишемо на Python'і програму для подорожі нашого робота серед прозорих чашок, але використовуючи грамотніший алгоритм розвороту:

  1. # in cm
  2. DEFINE NEAR = 7
  3. def main():
  4. DefineSensors(None, None, None, EYES)
  5. while True:
  6. OnFwd(OUT_BC, 50)
  7. while SensorVal(4) > NEAR:
  8. pass
  9. Off(OUT_BC)
  10. while SensorVal(4) * Цей source code був highlighted with Source Code Highlighter .

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

Як ви вже напевно помітили, програмувати Mindstorms дуже просто. Варто також сказати, що крім NXC і Python з використанням PyNXC, можна писати код Java, Lua, Ruby, Асемблері, а також, що логічно, використовувати асемблерні вставки в інших мовах. Завдяки цьому Mindstorms з дитячої іграшки перетворюється на дуже потужну штуку, що дозволяє створювати складні і «розумні»механізми, як, наприклад, ось ця гітара:

Або цей сортувальник кольорових кульок:

А найприємніше в усьому цьому — до комплекту поставки Mindstorms NXT 2.0 вже включено більшість необхідних деталей. Єдине, що справді може знадобитися – додаткові сенсори, які можна купити, наприклад, в офіційному магазині Lego.