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 портом мы были в отчаянии. Возникла идея как всё исправить, которая отлично олицетворяла популярную шутку про код на хакатонах:

Typical hackaton code

Вот что мы сделали: написали «кодогенератор», который для каждой буквы строил набор вызовов функций на си и запихнули этот код прямо в Ардуино. Т.е. мы получили «прошивку» с харадкоженными буквами. Протокол общения немного изменился: клиент принимает сообщение, разбивает его на буквы, каждую букву отправляет ардуино, ардуино принимает букву, пишет её и перематывает ленту (весь код для ардуино занял примерно 30кб из доступных 32-ух).

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

День 3

После нескольких часов сна мы принялись подгонять буквы под 2-е устройство, фиксить баги и подготавливать презентацию. Представление проектов было назначено на 16:00.

В 15-50 мы закончили подгонять буквы под 2-ое устройство.

Чтобы ничего не сломалось в последний момент, решили поставить всё заранее на стол и внести его, когда будет наша очередь. Но и это не спасло нас: во время представления во втором устройстве сломалась перемотка, но, к счастью, это не было заметно.

Видео представления:

Награждение

После того, как все участники показали свои проекты, судьи удалились для приятия решения на долгих 40 минут.
После объявления каждого призового места (несколько номинаций и Топ 3) я мысленно говорил: «вот, теперь мы, давайте!». Тут наступило награждение второго места и я начал отчаиваться: «ну не могли же мы выиграть». Но внезапно я услышал: «plot chat» дальше как в тумане.

Призы: 1 год сильвер репозитория на гитхаб, 1 млн белорусских рублей (~70$) на хоcтинг tut.by и великолепный Lego Mindstorms.

Но главное — это то, что мы получили кучу положительных эмоций и бесценного опыта. А ещё простуду, сорванный голос и огромный недосып. Но оно того стоило.

ссылка на оригинал статьи http://habrahabr.ru/post/262067/


Комментарии

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

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