Nokia N900 + Q-steer = Машинка через ИК управление своими руками

Бродя однажды по рунетовским просторам, наткнулся я как-то раз на самый банальный блок яндекс.директа. Но что-то меня там заинтересовало, и попал я на некий сайт. Где торговали управляемыми машинками. Вроде бы ничего особенного, но в итоге это привело к довольно интересным вещам и к этому топику.

Называются эти машинки Takara-Tomy Q-Steer (известные так-же в США под именами Microsizers и ZipZap). Радикальное отличие машинок Q-steer (а именно ими торговали на том сайте) в том что они маленькие. Очень маленькие. Очень-очень. Длина 4 см, ширина 2.7 см, если быть точным. Но, не смотря на это, машинки полностью управляемые. Понимают команды вперёд-назад, влево-вправо. И ещё форсаж есть (!) А ещё интересный момент — канал управления — ИК. Инфракрасное излучение. Есть у них вроде машинки (чуть побольше размером, но ненамного) на радиоуправлении, но для моих надобностей они не подходят.

В общем, просидев на том сайте несколько часов и проштудировав там практически всё, решил себе купить машинку. С управлением через ИК, само собой, ибо появилась одна интересная мыслишка.

В Москве такие машинки найти не удалось, так что заказал на найденном сайте. Доставка заняла несколько дней, но меня в первый же день после заказа уволили с моей нынешней работы, так что в беготне оставшееся время до прибытия посылки пролетело очень быстро. Про unboxing рассказывать не буду — сорвал обёртку, разорвал пластик, достал машинку и пульт. Всё просто.

При первом личном контакте с машинкой испытал небольшой шок — «такая мелкая, неужели поедет?». Правда, сразу поехать не удалось — в комплекте не было батареек. А батарейки там под стать машинке — тоже мелкие, «часовые» LR44. Только через некоторое время, прочитав инструкцию и выяснив что машинку надо включить поворотом незаметного рычажка, оказалось что батарейки есть и в пульте и в машинке. Так что можно гонять.

Ну, я и погнал :-) Первый опыт микровождения запечатлел на на большом видеоролике.

В общем, машинка идеальна для офиса — можно прекрасно гонять по столу, по стульям, по ноутбуку… Короче, даже по ободу унитаза можно гонять.


Но ручное управление машинкой — это банально и неинтересно. Хочется управления с чего-нибудь айтишного (не люблю я это слово, но всё-таки приходится привыкать). Я уже успел узнать что для Sony PSP есть софтина для управления машинками Q-steer. Однако работает только на старых моделях PSP, где есть ИК. У меня же PSP Slim, а там ИК-порта нет на борту :-(

Из гаджетов с ИК-портом под рукой у меня сейчас есть только Nokia N900. Правда, там ИК-порт немного кастрированый — умеет только передавать сигналы, но не получать. Но для управления машинкой принимать-то ничего и не надо, так что N900 подходит. Готовых программ для N900, которые могли бы управлять моей машинкой, нигде не нашлось, так что пришлось делать самому.

Весь процесс написания софтинки состоял из этапов:

  • Определение управляющих ИК-сигналов из родного пультика машинки
  • Воспроизведение управляющих ИК-сигналов на N900
  • Написание скрипта для N900, преобразующего какие-то действия с телефоном в управляющие сигналы для машинки
  • Распитие бутылочки нефильтрованного
  • Фотографирование и видеосъёмка всего ездящего и управляющего безобразия
  • Торжественная запись в блоге о том что всё заработало
  • Рассылка ссылки на запись всем знакомым дабы похвастаться

ИК машинка

В итоге эти этапы затянулись на два дня (а точнее, на две ночи). Первая была посвящена попыткам раскодировки ИК-сигналов пульта. У меня на десктопе давно уже используется самодельный ИК-приёмник для WinLIRC, вот для приёма сигналов пульта он подошёл идеально. Но всплыла проблемка — WinLIRC не хотел обучаться командам пульта. Перепробовал все варианты настроек — не помогло. И RAW-коды тоже не захотели записываться, так что пришлось вручную выдирать их из тестового окна приёма RAW-сигналов.

Немного не айс, но удалось поймать все нужные коды для основных типов движения. Только вот кнопочку форсажа я не использовал. Сведение всех кодов в один настроечный файл привёл к появлению вот такого — файл настроек для пульта Q-steer. Правда, полностью настройки есть только для диапазона B, в диапазон A я пока не лез, у меня ведь всего одна машинка :-)

В общем, это и была первая часть сабжа после равенства — «сначала Fuck». Ибо потрахался с кодами реально. И ещё предстоит потрахаться — пока немного дёрганое управление получилось, надо ковырять дальше.

С воспроизведением полученных сигналов на N900 проблем не было. Ибо на этой мобило-таблетке стоит вполне себе обычный lirc, для которого очень даже подошёл сформированный мною файлик настроек пульта Q-steer. Осталось только подсунуть его лирцу.

В файл /etc/lircd.conf дописываем инклуд нашего файлика с конфигом (у меня он лежит в /home/user/MyDocs/DISTR/Q-STEER/qsteer)

include "/home/user/MyDocs/DISTR/Q-STEER/qsteer"

Рестартуем лирц. Само собой, это надо проделывать под рутом.

sudo gainroot
/etc/init.d/lirc restart

Итак, демон управления ИК-портом запущен, осталось чем-то передавать ему команды. И вообще, как будем управлять?

А управлять будем наклонами телефона. Зря что-ль в нём акселерометр есть? Наклоняем телефон сильно вперёд — машинка едет вперёд. Наклоняем слегка вперёд — едет назад. Наклоняем слегка назад — машинка останавливается. Почти то же самое с поворотами. Наклон влево — машинка влево, наклон вправо — машинка туда же. Почему было не сделать движение машинки назад при таком же наклоне телефона — просто сигнал ИК-передатчика телефона послабее чем у родного пульта, так что лучше чтоб ИК-светодиод был направлен в сторону машинки, а так получается только когда наклон телефона вперёд. Кстати, забегая вперёд — если телефон вертикально поставить — это выход из программы.

За основу получения координат поворота телефона взял довольно известный скрипт shake.py by Niklas Tanskanen. Для образца взаимодействия с lirc — скрипт некоего Blubbi с форума Maemo. Я раньше ни разу не сталкивался с Python, а тут вот хороший повод появился попробовать покодить на этом языке. Кстати, ппц как непривычно после C/C++, PHP, JavaScript, etc. IMHO, особенно дико условия IF выглядят :-) Да просят меня питоновцы.

Короче, что в итоге получилось? А получилось вот что.

Скрипт qsteer.py — управление машинкой Q-steer с таблетки Nokia N900 путём издевательств над акселерометром.

Выглядит это примерно вот так. Сложно одному одновременно и управлять и камеру держать. И с управлением я ещё не до конца освоился.


 

Движение пока дёрганое, это надо управляющие сигналы корректировать. И мелкие косяки устранить (иногда повторяется посылка импульсов, когда они уже посылаются, из-за этого в конце ролика сообщение об ошибке видно). Но в целом — всё работает!!!

Осталось сделать обучение маршруту — чтоб можно было задать команды и телефон сам бы в цикле их машинке скармливал. Но это уже детали, доделать труда не составит.

Да, кстати. Не сочтите за рекламу, тот магазинчик находится тут.