Сделано по мотивам The Most Useless Machine EVER! Не так забавно, не так симпатично, но… работает.
Тут нужно сказать пару слов о самом конструкторе. Датчане анонсировали версию 2.0 в 2009 году, а самая первая версия конструктора с электронными компонентами вышла аж в 1998.
В комплект входят три мотора, датчики нажатия (по сути просто кнопки), распознавания света/цвета и расстояния до преграды. Еще, само собой, ворох разноцветных пластиковых балок, защелок, осей, четыре колеса и две гусеницы. Шестерни тоже есть, но совсем мало — всего пять среднего размера. Ну и электронное сердце, чтобы оживить все это, — программируемый микроконтроллер с монохромным LCD-дисплеем.
![]() |
| Он следит за тобой, {{ USERNAME }}! |
Итак, как же собрать машину? Принцип очень простой: ставим кнопку, подгоняем к ней балку, чтобы кнопку нажать. Рядом ставим мотор, сверху все накрываем крышкой.
![]() |
| Вид сбоку. |
![]() |
| Под капотом. |
Теперь нужно заставить это реагировать на нажатие кнопки. Насколько я успел разобраться, для программирования здесь есть два типа библиотек. Одни позволяют написать прошивку непосредственно для заливки в контроллер (далее «кирпич»). Другие — управлять кирпичом и подключенной периферией с ПК. Берем второй вариант, чтоб не возиться с отладкой.
Писать будем на Питоне — я большой поклонник его изящности и лаконичности. Понадобится установить библиотеку nxt-python и зависимости, на странице проекта процесс описан. У меня же пакет оказался в репозитории и установился через aptitude, подтянув все необходимое самостоятельно.
Подключаем кирпич по USB. Мой Debian Wheezy увидел его без проблем, в более тяжелых случаях, наверное, нужно включать поддержку чего-то эдакого в ядре. Пишем код:
from time import sleep
import nxt
from nxt.locator import find_one_brick
from nxt.sensor.generic import Touch
# Определяем кирпич, мотор и кнопку:
brick = find_one_brick()
motor = nxt.Motor(brick, nxt.PORT_B)
sensor = Touch(brick, nxt.PORT_1)
# "Мотор запаркован" у нас будет означать, что
# кочерга мотора находится в нижнем положении:
is_parked = False
while True:
if sensor.is_pressed():
# Если кнопка нажата, ждем недолго и крутим мотор,
# чтобы освободить кнопку:
sleep(1)
motor.turn(-20, 40, False)
is_parked = False
elif not is_parked:
# Если кнопка отжата, но мотор не запаркован,
# паркуем:
motor.turn(20, 40, False)
is_parked = True
sleep(0.1)
Ставим кочергу мотора в вертикальное положение и запускаем скрипт. Кочерга уедет вниз и будет ожидать нажатия кнопки.


