Как стать автором
Обновить
VK
Технологии, которые объединяют

Гик-конкурс: как мы это делали (часть 2) и итоги

Время на прочтение6 мин
Количество просмотров23K
Как и обещали в первой части, рассказываем подробнее о нашем проекте, об удачных и неудачных решениях, проблемах и неожиданных сюрпризах.



Начнём мы, пожалуй, с принтера.

Принтер

Критически важным узлом нашего проекта по понятным причинам является принтер, поэтому к его выбору мы подошли особенно тщательно. Перебрав около 15 разных моделей, мы остановились на струйном принтере HP Officejet Pro X451dw с возможностью дуплексной печати (то есть с двух сторон листа). Его конкурентным преимуществом стали также высокая скорость печати, большой лоток на 500 листов (с возможностью докупить ещё один на такое же количество) и достаточно большая высота, на которой расположено выходное окно для отпечатанных листов.



Пластмассовую подставку под отпечатанные листы мы сняли (она крепится на защёлках), и у нас получился достаточно неплохой перепад высоты. Это позволило нам использовать силу гравитации («Используй силу, Люк!»), под действием которой билеты скользили вниз по подставленному под углом лотку. Заодно не пришлось плодить лишних траволаторов для проталкивания листа внутри лотка.

Когда нам привезли принтер, мы с радостью открыли коробку (не знаю, как вам, а мне нравится запах новой техники!) и начали его настраивать. Первое тестирование прошло на «Ура», принтер печатал исправно наши тестовые билеты. Однако когда началось более тщательное тестирование, оказалось, что дуплексная печать работает только на бумаге формата А4. А у нас формат билетов был А5 (всё-таки мы заботимся об окружающей среде и не хочется изводить лишнюю бумагу). То есть билеты формата А5 печатались «лицом вниз». Мы уже было начали думать о том, как разместить камеру снизу, однако через пару дней нашли чудный драйвер под UNIX (о сервере расскажем чуть ниже) и таки научили его печатать дуплексом.

В целом принтер показал себя весьма неплохо. Было распечатано около 30 000 билетов, и за всё это время замятие бумаги случилось лишь трижды (!).

Arduino, сервоприводы и датчики

Для проекта были закуплены два комплекта Arduino Uno, Troyka Shield, сервоприводы, дисплеи, датчики и прочая мелочь. В первоначальном варианте схема подключения Arduino выглядела так:



Первая Arduino отвечала за открытие и закрытие лотка. Вторая — за получение информации от датчика градиента (позднее появился ещё один датчик — ультразвуковой дальномер), и выводе этой информации на экран. Быстрая сборка показала, что проблем быть не должно, двигатель исправно крутился, на экран выводилась тестовая информация.



Аналоговый датчик линии прекрасно выдавал нам данные об уровне освещённости на тестовом градиенте:



Градиент мы расположили на боковой стенке урны, и над ним закрепили датчик линии:



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



Как только билет падает в лоток, сенсор отдаёт сигнал Arduino, которая в свою очередь передаёт его серверу, и тот включает запись камеры. Через несколько секунд камера выключается и подаётся питание на сервопривод, открывающий «шторку». Шторку мы сделали из элементов Makeblock.



Третий датчик, подключенный к Arduino, — это ультразвуковой дальномер. Он замеряет расстояние между дном урны и полом, является дополнительным источником информации для расчёта веса. После финальной сборки мы не стали прятать ардуинки в тумбочку, а расположили их за прозрачным лотком, чтобы разноцветные провода и мигающие светодиоды радовали глаз любителям гик-порно (а таких у нас в компании работает немало).



Лоток

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



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



Однако, даже несмотря на отверстие под датчиком препятствий, бумажный листок частенько застревал (прилипал к оргстеклу), а сила притяжения была не настолько высокой, чтобы преодолеть силу трения.

Чтобы сократить площадь соприкосновения листка с поверхностью лотка мы натянули бадминтонные струны:



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



Такое «подталкивание» билета снизу решило проблему, и теперь билеты соскальзывали «со свистом». Мы вздохнули с облегчением и переключились на урну.

Урна

Как вы, наверное, уже догадались, урна у нас тоже не самый простой элемент конструкции. Мы ведь не ищем лёгких путей, и решили измерять вес не обычными весами (хотя в самом первом варианте конструкции лениво подумывали насчёт весов с Wi-Fi), а делать это при помощи двух датчиков, о которых уже было написано выше. И для того, чтобы эти датчики замеряли динамику изменения веса, нам необходимо было подвесить урну на пружинах. Для тестовой конструкции мы нашли металлический каркас от старой тумбочки, сделали деревянный ящик из фанеры и подвесили его на пружинах от педали сцепления ВАЗ 2101:



Не беспокойтесь, ни одни «Жигули» не пострадали, все пружины били куплены в магазине автозапчастей. :) Замеры предполагаемого веса конкурсных билетов, коэффициентов растяжения пружин, объёма корзины и прочих параметров показали, что конструкция должна быть гораздо больше, а пружины мощнее:



Вторая версия урны и рамы выглядит так:





Урна была собрана из выставочных алюминиевых профилей и оргстекла, а каркас из конструкций, известных на рынке как «Joker Uno». Более мощные пружины были куплены на строительном рынке, с держателями мы соединили их гибкими металлическими тросиками:



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



Серверная часть

Параллельно с железяками мы трудились над «мозгами». А мозгом всей нашей системы стал специальный скрипт, написанный под UNIX. В его задачу входит:
  1. Получение данных от Хабра.
  2. Формирование на основе этих данных билета участника.
  3. Печать.
  4. Обмен данными с Arduino.
  5. Запись видео.
  6. Отправка видео Хабру.
  7. Оповещение о неполадках.

Управление скриптом мы, для удобства, организовали через SSH-доступ, вот так выглядит панель управления проектом:



Данные передаются порциями по 10 записей. После того, как информация получена, скрипт запускает сборку PDF-файла для первого билета, куда вставляет аватарку, ник, фамилию и имя участника, а также его карму и рейтинг. Сгенерированный PDF отправляется на принтер, и запускается ожидание сигнала от инфракрасного датчика препятствий. Как только билет напечатан и попадает в поле зрения датчика:



(тестировали мы, конечно же, на самых любимых нами пользователях Хабра)

…включается запись с камеры, расположенной над лотком. После того как запись сделана, к ней прикрепляется одно из 30 видеопосланий от Анатолия Вассермана, и файл кладется в папочку «исходящие». При следующем обращении сервер Хабра заберёт эти записанные видео. Далее мы открываем шторку и ждём, когда билет упадёт в урну. Как только инфракрасный датчик перестаёт видеть билет, мы делаем перерасчёт веса и запускаем печать следующего билета.

Если все билеты, полученные от Хабра, уже отпечатаны, то мы меняем статус на «0», что означает, что мы готовы принимать новую партию данных. Попутно скрипт проверяет камеру, принтер и Arduino на предмет ошибок, и если вдруг с каким-то из устройств что-то неладное, нам приходит SMS-оповещение (нельзя же заставлять участников конкурса ждать!).

Поддержка проекта

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

Честно признаемся, мы не стали исключением. Проект длился 45 дней и за это время наш адреналиновый восторг после запуска постепенно сменился на легкую апатию. Тем не менее, мы исправно мониторили проект, и если сервер присылал нам SMS, честно подключались по SSH и смотрели, что там случилось. Иногда надо было просто перезапустить скрипт, иногда позвонить в охрану, чтобы они покормили принтер бумагой (в нерабочее время эту почётную миссию выполняла служба безопасности, за что им огромное спасибо!), иногда спуститься и вытащить застрявший билет или заменить картридж. Иногда тревожное SMS настигало нас в самых неожиданных местах, например, в фитнес-центре:



Или за рулём:



Но сейчас, когда проект закончен, нельзя не признать того, что он был одним из самых интересных в нашей жизни, и у нас уже снова чешутся руки придумать что-то ещё более весёлое! Спасибо всем вам, не оставшимся к проекту равнодушными и принявшим участие в нашем конкурсе. ;)

А теперь, под грохот барабанов, список победителей нашего гик-конкурса!

Приз Победитель
Ноутбук @Noizefan
Ноутбук @yongchunlaohu
Ноутбук @akkNightmare
Samsung Galaxy S5 @alexeyfdv
Samsung Galaxy S5 @Malevolent
Samsung Galaxy S5 @BVYU
Google Nexus 7 @iusfof
Google Nexus 7 @zolt85
Google Nexus 7 @rmq
Google Nexus 7 @mrise
Google Nexus 7 @TomashUA
Jawbone @thepry
Jawbone @zloi_ezhik
Jawbone @msdrSoul
Jawbone @SCIF
Jawbone @sveta0203
Leap Motion @MrMeowington5
Leap Motion @jackee
Leap Motion @Feanrez
Leap Motion @verbaux
Leap Motion @WizardOfRain
Leap Motion @usupport
Рюкзак @koltira
Рюкзак @ldinc
Рюкзак @Mikele
Рюкзак @Kag0r
Рюкзак @shtepochka
Рюкзак @julievstout
Футболка @SquareLemon
Футболка @homm
Футболка @Natasha_Tolstova
Футболка @Allesad
Футболка @pettson
Футболка @alex_trueman
Футболка @Gustychg
Футболка @SergMerlin
Футболка @gyok
Футболка @graycat660
Билетов оказалось очень много, и мы решили высыпать их в надувной бассейн. За каждым билетом приходилось буквально нырять.











Теги:
Хабы:
Всего голосов 93: ↑43 и ↓50-7
Комментарии135

Публикации

Информация

Сайт
team.vk.company
Дата регистрации
Дата основания
Численность
свыше 10 000 человек
Местоположение
Россия
Представитель
Руслан Дзасохов