Plot chat, или как мы заняли первое место на wth.by

Возможно, кто-то уже слышал о хакатоне wth.by, проходящем в Минске. Ниже я расскажу, как он прошёл для меня и что принесло нашей команде первое место. Если интересно, добро пожаловать под кат.



Подготовка


О проведении хакатона я узнал за 2 недели. Сразу же зарегистрировался, собрал «команду» и мы начали думать, что бы такого сделать. Решили, что это будет нечто основанное на ардуино.

После пары дней размышлений я случайно наткнулся на довольно популярный в последнее время plot clock и мне пришла в голову идея сделать чат с «аутпутом» в таком виде.

Обсудили идею с командой и коллективными усилиями решили, как это будет выглядеть: чат для 2 пользователей, у каждого свой «девайс» для вывода информации, полем для вывода выбрали чековую ленту, которую будет наматывать мотор.

За пару часов до хакатона собрали «альфа-версию» устройства (чтобы на месте сделать упор на написание кода).

Исходные материалы:
Arduino UNO, 2 х MicroServo SG90, 1 x Servo MG946R, 1 шаговый двигатель, деревянный брусок, бумага для чеков, веер с буквами(да, такой как был в детском саду/начальной школе), супер клей и, конечно же, синяя изолента.


Формат мероприятия: некоммерческий хакатон, 44 часа не реализацию идеи, ночёвка: по желанию, тематика: свободная, но связана в веб.

День хакатона


Пятница, 18:00. Мы собрали всё, что есть, и поехали к месту проведения. Послушали ведущего, похлопали судьям, рассказали о том, что собираемся делать, пошли занимать место и приступать к работе, которой, к слову, предстояло много.

Расселись и поняли, что никто не имеет никакого представления о том, как что-то писать, используя 2 серво и маркер. Решили поискать подсказки в сети, наткнулись на кучу «гайдов» для plot clock вроде «распечатайте вот эти модельки, соедините всё вот так, залейте этот код на ардуино и будет вам счастье». Покопавшись в исходниках plot clock я понял, что даже с комментариями к коду ничего не понятно. В итоге спустя пару часов у нас так ничего и не было, оставалось делать всё своими силами.

После ещё пары часов мы смогли нормально сформулировать задачу, она оказалась довольно простой сразу после того, как мы сделали рисунок:

Не нашёл подходящего инструмента для рисования под рукой


Вывели формулы получения углов поворота сервоприводов для попадания в произвольную точку (x,y):

Решение

(аналогично для 2 серво)

К моменту решения уже был готов код сервера и клиента, оставалось продумать коммуникацию клиентского приложения с ардуино и протокол общения. На часах, тем временем, было 4 часа утра и мы пошли спать.

И клиент и сервер были написаны на node.js, коммуникация клиент -> сервер через веб сокет; клиент -> «девайс» через сериал порт, на клиенте с помощью библиотеки node-serialport, на «девайсе» используя стандартный arduino c.

День 2


9-00: проснувшись около то ли от холода, то ли от шума вокруг, мы приступили к размышлениям о том, как писать буквы. Первая идея: каждую букву алфавита нанести на координатную сетку, узнать крайние точки и рисовать прямые лини по точкам. Попробовали и осознали, что из-за особенностей механизма путь из точки (x1,y1) в (x2,y2) является дугой, а не прямой. Решили бить прямую на набор точек и тогда маленькие дуги между этими точками будут не так заметны.

Отсюда мы можем примерно сформулировать протокол общения клиентского приложения с ардуино: клиент получает сообщение, разбивает его на буквы, для каждой буквы заранее известен набор точек, клиент строит набор команд вида: поднять маркер, опустить маркер, промотать ленту и задать углы для двух серво.

На первый взгляд, всё хорошо, но оказалось, что скорости общения, которую позволяет serial порт, недостаточно и буквы пишутся неприемлемо медленно (около минуты на 1 букву).

на самом деле
Возможно, я просто не умею его готовить.

21-00: после нескольких часов попыток с 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.

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

UPD: добавил немного технических деталей и информацию о формате хакатона.
  • +10
  • 10,8k
  • 2
Поделиться публикацией

Комментарии 2

    0
    Экстремальное программирование в действии.
      0
      "… Программист так устроен, что ему лень писать от руки. Ему проще написать код, который будет чем-то управлять, которое будет писать от руки..." — от этой цитаты меня одолевает коктейль позитивных эмоций! Я ещё никогда не видел более точную характеристику программисту. Распечатаю в рамку и повешу на работе на стенку ))

      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

      Самое читаемое