Самая Бесполезная Машина — теперь из Лего

Открываю серию постов, посвященную замечательному конструктору для пап для детей Lego Mindstorms NXT 2.0. Буду собирать какие-нибудь штуки и показывать результат. И сразу же видео:

Сделано по мотивам 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)

Ставим кочергу мотора в вертикальное положение и запускаем скрипт. Кочерга уедет вниз и будет ожидать нажатия кнопки.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Поставьте галочки правильно (как бы защита от спама):

Я бот

Я не бот