Сделано по мотивам 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)
Ставим кочергу мотора в вертикальное положение и запускаем скрипт. Кочерга уедет вниз и будет ожидать нажатия кнопки.