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

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

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

Критически важным узлом нашего проекта по понятным причинам является принтер, поэтому к его выбору мы подошли особенно тщательно. Перебрав около 15 разных моделей, мы остановились на струйном принтере HP Officejet Pro X451dw с возможностью дуплексной печати (то есть с двух сторон листа). Его конкурентным преимуществом стали также высокая скорость печати, большой лоток на 500 листов (с возможностью докупить ещё один на такое же количество) и достаточно большая высота, на которой расположено выходное окно для отпечатанных листов.86491b69d5bd49f8b39eed1060582199.jpgПластмассовую подставку под отпечатанные листы мы сняли (она крепится на защёлках), и у нас получился достаточно неплохой перепад высоты. Это позволило нам использовать силу гравитации («Используй силу, Люк!»), под действием которой билеты скользили вниз по подставленному под углом лотку. Заодно не пришлось плодить лишних траволаторов для проталкивания листа внутри лотка.

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

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

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

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

d18a01a196254550ac60fd1e79bfe2dc.jpg

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

c5efc2a43f7b45e3a6a61329a18569a2.png

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

ff26dfa439ac43ecac99a9a9477e50b3.png

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

bdfe5ce5afb448eea9a7351c42f2041c.png

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

8d0bc999020749679d8f2d1508e0bf08.png

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

08a5896d99534a7d8ecd52b01b5857a0.png

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

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

bd8e46e6a9c04c21a4e0174eae66f6f7.png

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

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

45a4febe62e6437eb0e5d7ef0463a6ff.png

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

30466739033d43348c65328968cc4694.png

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

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

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

98ef42a198b84a8c8fc65df8f992338c.png

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

0239290cca4c4ca589e515da716d593a.png

709b827053c74cacac75c1761e8ceff1.png

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

5fdf866762b8445484450987b97a99cc.png

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

02361e37070e46129a3954e8e9a77103.png

Параллельно с железяками мы трудились над «мозгами». А мозгом всей нашей системы стал специальный скрипт, написанный под UNIX. В его задачу входит: Получение данных от Хабра. Формирование на основе этих данных билета участника. Печать. Обмен данными с Arduino. Запись видео. Отправка видео Хабру. Оповещение о неполадках. Управление скриптом мы, для удобства, организовали через SSH-доступ, вот так выглядит панель управления проектом: f00271895ba642aa87c56865d882baa1.jpg

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

7983de986f2e4cba898208634c39a7dc.png

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

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

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

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

b219955154e14ed485fd1a80721c6ee2.jpg

Или за рулём:

14bbf72cab124ae4bd80061dc5b889ba.jpg

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

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

22ec5b82d2204c8caf60ab1cf360f983.jpg

01d5b2b22aec4fa297c0038ead5b7ab8.jpg

98e7c2a46ddd46d6803c8303108a22f8.jpg

dfa5e3ef0a49441ba123e2ba7455804d.jpg

1c0adeb3c5a04fe189edaafc58424585.jpg

ee0fc6ed8c5142558958b01d87abb460.jpg

© Habrahabr.ru