[Из песочницы] Plot chat, или как мы заняли первое место на wth.by
Возможно, кто-то уже слышал о хакатоне wth.by, проходящем в Минске. Ниже я расскажу, как он прошёл для меня и что принесло нашей команде первое место. Если интересно, добро пожаловать под кат.
Подготовка
О проведении хакатона я узнал за 2 недели. Сразу же зарегистрировался, собрал «команду» и мы начали думать, что бы такого сделать. Решили, что это будет нечто основанное на ардуино.
После пары дней размышлений я случайно наткнулся на довольно популярный в последнее время plot clock и мне пришла в голову идея сделать чат с «аутпутом» в таком виде.
Обсудили идею с командой и коллективными усилиями решили, как это будет выглядеть: чат для 2 пользователей, у каждого свой «девайс» для вывода информации, полем для вывода выбрали чековую ленту, которую будет наматывать мотор.
За пару часов до хакатона собрали «альфа-версию» устройства (чтобы на месте сделать упор на написание кода).
Arduino UNO, 2 х MicroServo SG90, 1 x Servo MG946R, 1 шаговый двигатель, деревянный брусок, бумага для чеков, веер с буквами (да, такой как был в детском саду/начальной школе), супер клей и, конечно же, синяя изолента.
День хакатона
Пятница, 18:00. Мы собрали всё, что есть, и поехали к месту проведения. Послушали ведущего, похлопали судьям, рассказали о том, что собираемся делать, пошли занимать место и приступать к работе, которой, к слову, предстояло много.
Расселись и поняли, что никто не имеет никакого представления о том, как что-то писать, используя 2 серво и маркер. Решили поискать подсказки в сети, наткнулись на кучу «гайдов» для plot clock вроде «распечатайте вот эти модельки, соедините всё вот так, залейте этот код на ардуино и будет вам счастье». Покопавшись в исходниках plot clock я понял, что даже с комментариями к коду ничего не понятно. В итоге спустя пару часов у нас так ничего и не было, оставалось делать всё своими силами.
После ещё пары часов мы смогли нормально сформулировать задачу, она оказалась довольно простой сразу после того, как мы сделали рисунок:
Вывели формулы получения углов поворота сервоприводов для попадания в произвольную точку (x, y):
(аналогично для 2 серво)
К моменту решения уже был готов код сервера и клиента, оставалось продумать коммуникацию клиентского приложения с ардуино и протокол общения. На часах, тем временем, было 4 часа утра и мы пошли спать.
День 2
Проснувшись около 9 утра то ли от холода, то ли от шума вокруг, мы приступили к размышлениям о том, как теперь писать буквы. Первая идея: каждую букву алфавита нанести на координатную сетку, узнать крайние точки и рисовать прямые лини по точкам. Попробовали и осознали, что из-за особенностей механизма путь из точки (x1, y1) в (x2, y2) является дугой, а не прямой. Решили бить прямую на набор точек и тогда маленькие дуги между этими точками будут не так заметны.
Теперь мы можем примерно сформулировать протокол общения клиентского приложения с ардуино: клиент получает сообщение, разбивает его на буквы, для каждой буквы заранее известен набор точек, клиент строит набор команд вида: поднять маркер, опустить маркер, промотать ленту и задать углы для двух серво.
На первый взгляд, всё хорошо, но оказалось, что скорости общения, которую позволяет serial порт, недостаточно и буквы пишутся неприемлемо медленно (около минуты на 1 букву).
Возможно, я просто не умею его готовить.
После нескольких часов попыток с serial портом мы были в отчаянии. Возникла идея как всё исправить, которая отлично олицетворяла популярную шутку про код на хакатонах:
Вот что мы сделали: написали «кодогенератор», который для каждой буквы строил набор вызовов функций на си и запихнули этот код прямо в Ардуино. Т.е. мы получили «прошивку» с хардкоженными буквами. Протокол общения немного изменился: клиент принимает сообщение, разбивает его на буквы, каждую букву отправляет ардуино, ардуино принимает букву, пишет её и перематывает ленту (весь код для ардуино занял примерно 30 кб из доступных 32-ух).
Со словами «за такое меня точно уволили бы» в 4 часа утра второго дня мы научились писать слова и пошли спать.
День 3
После нескольких часов сна мы принялись подгонять буквы под 2-е устройство, фиксить баги и подготавливать презентацию. Представление проектов было назначено на 16:00.
В 15–50 мы закончили подгонять буквы под 2-ое устройство.
Чтобы ничего не сломалось в последний момент, решили поставить всё заранее на стол и внести его, когда будет наша очередь. Но и это не спасло нас: во время представления во втором устройстве сломалась перемотка, но, к счастью, это не было заметно.
Видео представления:
Награждение
После того, как все участники показали свои проекты, судьи удалились для приятия решения на долгих 40 минут.
После объявления каждого призового места (несколько номинаций и Топ 3) я мысленно говорил: «вот, теперь мы, давайте!». Тут наступило награждение второго места и я начал отчаиваться: «ну не могли же мы выиграть». Но внезапно я услышал: «plot chat» дальше как в тумане.
Призы: 1 год сильвер репозитория на гитхаб, 1 млн белорусских рублей (~70$) на хоcтинг tut.by и великолепный Lego Mindstorms.
Но главное — это то, что мы получили кучу положительных эмоций и бесценного опыта. А ещё простуду, сорванный голос и огромный недосып. Но оно того стоило.