Как программисты решают проблемы

imageПериодически проверяю раздел «события» на местном айтишном портале, и вот недавно нашел там то, что давно искал — очередной хакатон. Да не простой хакатон, а сложный правильный: без стартаперства, без HRов, без навязывания и ограничения тем, без обедов. В общем, стал я собирать чемоданы…

О том, что из этого получилось — читайте в статье.

Что? Опять?! Возможно, кто-то из вас знает/помнит, что мне не нравится делать вещи наподобие очередной «социальной сети для {placeholder}». И это мое нежелание, как оказалось, полностью совпадает с целью организаторов предстоящего хакатона. В общем, и в этот раз я решил сделать что-нибудь необычное, попробовать что-то новое. Выбор мой пал на Arduino.Ту самую ардуину, которую мы командой проекта подарили на день рождения одному из коллег, и которую мне удалось взять напрокат на выходные («отжать», как выразился ее владелец). Оставалось придумать, что с ней делать.

Бубен программерский, стандартный, одна штука Все знают предание об админском бубне? Том, что оживляет железо и поднимает сети из мертвых? Если нет — тут расписано что и как. Так вот, оказывается, бубны эти не только админам помогают, но и программерские проблемы решают как на духу. Побубнел минутку и все — баги исправляются, проект компилится и работает. И бубен такой у меня есть, программерский, заряженный правильной энергией: image

Но не у всех есть такие девайсы. А даже если и есть, то не всегда работают. А мой-то — проверенный, не первый год служит верой и правдой. В общем, решил я дать возможность воспользоваться живительной силой моего бубна всем тем, у кого есть проблемы. Не только программерам, естественно — бубна на всех хватит. Так родилась идея проекта «bubna.net» — сайта с прямой трансляцией бубна, в который можно побубнить, просто нажав на кнопку на странице. Нажал, побубнил, решил свои проблемы, уступил место очередному страждущему. Решено было остановиться на этой идее.

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

image

И такая макетная плата:

image

И провода к ней, и всякая мелочевка. К слову, с ардуиной я впервые познакомился только благодаря реализации этой моей идеи. Поэтому почти все необходимое пришлось покупать в рамках подготовки к хакатону.

Погнали! Вечер начала хакатона. Мультиметр, паяльник, необходимые железки — все взял с собой на всякий пожарный. Кто-то, как я, пришел со своей идеей. Кто-то, как и я, пришел без команды. Остальные — без того и другого. Моей дурной идеей, как мне показалось, увлеклись еще двое участников — бизнес-аналитик Виктория и программист мобильных приложений Андрей. Задачи распределили просто: я занимаюсь железом, а ребята всем остальным. Остальное — сайт с кнопкой и прямой трансляцией бубна, презентация, чай-кофе-печеньки, анекдоты. Моя задача — собрать воедино все компоненты бубнилки и заставить ее работать.Хакатон проходил с вечера пятницы до вечера воскресенья. В первый день решил разобраться с ардуиной, питанием, макетной платой, проводами и сервами. Проблем с подключением серв и ардуины не возникло, если не считать заминок с питанием (БП от тонометра имел нестандартный штекер) и выбором цвета проводов для макетной платы. Первая серва начала выполнять мои команды уже через час.

Было решено сделать два «молоточка» (по одному на сервопривод) — так можно было бы чередовать и комбинировать удары, варьировать задержки. «Молоточек» — стержень от шариковой ручки с надетым на его конец кусочком ластика, художественно обтертым об стол до шарообразной формы. Крепим его полиэтиленовыми стяжками к качелям сервопривода и получаем неплохой такой «ударный инструмент»:

image

Благополучно переночевав дома, нужно было приниматься за изготовление корпуса нашего музыкального инструмента. Для основания автоматизированного бубна я решил использовать обрезки шпонированного ДСП, оставшиеся от недавно закончившегося приостановленного ремонта. Для скрепления всего этого воедино понадобились более длинные стяжки и проволока. Стяжки вообще очень полезная штука. Получилось очень даже неплохо, учитывая, что это все делалось с порезанным и забинтованным пальцем руки (не спрашивайте, что случилось):

image

Бубен + молоточки + основание = eBuben:

image

А что внутри? Вернувшись на место проведения хакатона, нужно было научить это устройство звучать. Причем, звучать достаточно мелодично, чтобы призываемые духи все же исправляли проблемы, а не усугубляли их.Прошивки для Arduino нужно писать на С++, моем втором родном языке. Но это не спасло меня от долбания головой об стену по поводу и без. Эмпирическим путем удалось подобрать минимальные и максимальные позиции серв, из которых удары происходили четко и были хорошо слышны; тайминги, необходимые для ударения сервой по бубну (в максимальную позицию) и разударения обратно (в минимальную); и т.д. Был «изобретен» конечный автомат переходов серв из состояний покоя в ударение, разударение и обратно в покой. Добавлен механизм асинхронного управления N-сервами одновременно (в нашем случае их было две), логирование, типы сэмплов (тишина, удар i-й сервой или всеми одновременно), проигрывание и остановка треков, зацикливание трека, проигрывание в течение X-секунд и т.д. По сути, был разработан небольшой секвенсор для бубна. Правда, без возможности записи музыки, а только ее хардкода прямо в прошивку.

Управлялось все это через последовательный порт. Конечно, можно было бы сделать возможность загрузки пользовательского трека в «ардуину» прямо с компа, но на это не хватало времени — тут бы стабильной работы добиться и не ударить в грязь бубном лицом на презентации.

Дырявые джинсы, баян и план Б В ночь с субботы на воскресенье нужно было сделать прослойку между бубнилкой и будущей веб-страницей с прямой трансляцией. Решением стал консольный сервер на Python, который слушал нужный url и посылал в нужный порт нужный байт. Все просто. Но какой же большой ошибкой было поставить Python 3.x вместо Python 2.x! Кто знает, тот поймет…Ночь началась с совместного просмотра нескольких фильмов самыми стойкими участниками, а продолжилась на кресле-мешке рядом с теплым ламповым масляным обогревателем. Всю ночь мне снились сны, что я насквозь прожег джинсы. Я прямо чувствовал это. Просыпался, проверял их, не находил дырок и спал дальше. Утром стал мешать баян, который тестили ребята за соседним столом (возможно они об этом сами напишут)… В общем, веселая была ночка, без шуток.

Воскресенье было посвящено допиливанию всего выпиленного и увязыванию его с веб-страницей, которой мои коллеги по команде параллельно занимались. К сожалению, на презентации со страницей что-то пошло не так, и она отказалась запускать наше устройство. Думаю, все получилось бы, будь у меня с собой второй бубен. Потому пришлось использовать резервный план: eBuben был запущен запасной кнопкой (всегда должен быть план Б!).

А вот и eBuben, собственной перcоной:

[embedded content]

Доменное имя bubna.net решили не регистрировать — лениво, да и главной задачей изначально был вовсе не сайт…

Цель была достигнута, выходные прошли не зря, номинация «Самый технологичный проект» была наша.

P.S. Хакатон удался на славу. Было много классных проектов и увлеченных своим делом людей. Спасибо организаторам, буду ждать следующего WTH.

P.P. S. Но самое большое спасибо жене и дочке за то, что отпустили меня на эти айтишные посиделки. Без их одобрения и поддержки у меня ничего бы не получилось.

© Habrahabr.ru