Начнём мы, пожалуй, с принтера.
Критически важным узлом нашего проекта по понятным причинам является принтер, поэтому к его выбору мы подошли особенно тщательно. Перебрав около 15 разных моделей, мы остановились на струйном принтере HP Officejet Pro X451dw с возможностью дуплексной печати (то есть с двух сторон листа). Его конкурентным преимуществом стали также высокая скорость печати, большой лоток на 500 листов (с возможностью докупить ещё один на такое же количество) и достаточно большая высота, на которой расположено выходное окно для отпечатанных листов.
Пластмассовую подставку под отпечатанные листы мы сняли (она крепится на защёлках), и у нас получился достаточно неплохой перепад высоты. Это позволило нам использовать силу гравитации («Используй силу, Люк!»), под действием которой билеты скользили вниз по подставленному под углом лотку. Заодно не пришлось плодить лишних траволаторов для проталкивания листа внутри лотка.
Когда нам привезли принтер, мы с радостью открыли коробку (не знаю, как вам, а мне нравится запах новой техники!) и начали его настраивать. Первое тестирование прошло на «Ура», принтер печатал исправно наши тестовые билеты. Однако когда началось более тщательное тестирование, оказалось, что дуплексная печать работает только на бумаге формата А4. А у нас формат билетов был А5 (всё-таки мы заботимся об окружающей среде и не хочется изводить лишнюю бумагу). То есть билеты формата А5 печатались «лицом вниз». Мы уже было начали думать о том, как разместить камеру снизу, однако через пару дней нашли чудный драйвер под UNIX (о сервере расскажем чуть ниже) и таки научили его печатать дуплексом.
В целом принтер показал себя весьма неплохо. Было распечатано около 30 000 билетов, и за всё это время замятие бумаги случилось лишь трижды (!).
Для проекта были закуплены два комплекта Arduino Uno, Troyka Shield, сервоприводы, дисплеи, датчики и прочая мелочь. В первоначальном варианте схема подключения Arduino выглядела так:
Первая Arduino отвечала за открытие и закрытие лотка. Вторая — за получение информации от датчика градиента (позднее появился ещё один датчик — ультразвуковой дальномер), и выводе этой информации на экран. Быстрая сборка показала, что проблем быть не должно, двигатель исправно крутился, на экран выводилась тестовая информация.
Аналоговый датчик линии прекрасно выдавал нам данные об уровне освещённости на тестовом градиенте:
Градиент мы расположили на боковой стенке урны, и над ним закрепили датчик линии:
Еще один датчик, подключенный к Arduino — это инфракрасный датчик препятствий. Он располагается на верхней крышке лотка, под ним, в нижней стенке лотка выпилено специальное отверстие. Его задача — оповещать сервер о том, что билет распечатался и упал в лоток:
Как только билет падает в лоток, сенсор отдаёт сигнал Arduino, которая в свою очередь передаёт его серверу, и тот включает запись камеры. Через несколько секунд камера выключается и подаётся питание на сервопривод, открывающий «шторку». Шторку мы сделали из элементов Makeblock.
Третий датчик, подключенный к Arduino, — это ультразвуковой дальномер. Он замеряет расстояние между дном урны и полом, является дополнительным источником информации для расчёта веса. После финальной сборки мы не стали прятать ардуинки в тумбочку, а расположили их за прозрачным лотком, чтобы разноцветные провода и мигающие светодиоды радовали глаз любителям гик-порно (а таких у нас в компании работает немало).
Ещё одним критически важным местом нашей конструкции является лоток. В него попадает распечатанный конкурсный билет, и нужно было сделать лоток таким, чтобы билет не перевернулся, попал точно под камеру и не застрял. Первый прототип, склеенный клеевым пистолетом из обрезков оргстекла, выглядел вот так вот:
После того, как мы более-менее подобрали размеры, расположение камеры, датчиков и сервопривода с шторкой, мы сделали чертёж и вырезали все детали лазерным резаком (спасибо ребятам из lab3dprint.ru). Детали склеили дихлорэтаном (нам ни в коем случае нельзя было допускать щелей и неровностей при склейке), и в результате получилась уже более приличная конструкция с гладкими швами:
Однако, даже несмотря на отверстие под датчиком препятствий, бумажный листок частенько застревал (прилипал к оргстеклу), а сила притяжения была не настолько высокой, чтобы преодолеть силу трения.
Чтобы сократить площадь соприкосновения листка с поверхностью лотка мы натянули бадминтонные струны:
Однако и это не сильно помогло, билет упорно застревал на последнем отрезке и даже не доходил до шторки. Тогда мы пошли ещё дальше, и прикрепили снизу сервопривод с пластиковой шестилепестковой шестернёй, которая начинает вращаться сразу после того, как открывается шторка:
Такое «подталкивание» билета снизу решило проблему, и теперь билеты соскальзывали «со свистом». Мы вздохнули с облегчением и переключились на урну.
Как вы, наверное, уже догадались, урна у нас тоже не самый простой элемент конструкции. Мы ведь не ищем лёгких путей, и решили измерять вес не обычными весами (хотя в самом первом варианте конструкции лениво подумывали насчёт весов с Wi-Fi), а делать это при помощи двух датчиков, о которых уже было написано выше. И для того, чтобы эти датчики замеряли динамику изменения веса, нам необходимо было подвесить урну на пружинах. Для тестовой конструкции мы нашли металлический каркас от старой тумбочки, сделали деревянный ящик из фанеры и подвесили его на пружинах от педали сцепления ВАЗ 2101:
Не беспокойтесь, ни одни «Жигули» не пострадали, все пружины били куплены в магазине автозапчастей. :) Замеры предполагаемого веса конкурсных билетов, коэффициентов растяжения пружин, объёма корзины и прочих параметров показали, что конструкция должна быть гораздо больше, а пружины мощнее:
Вторая версия урны и рамы выглядит так:
Урна была собрана из выставочных алюминиевых профилей и оргстекла, а каркас из конструкций, известных на рынке как «Joker Uno». Более мощные пружины были куплены на строительном рынке, с держателями мы соединили их гибкими металлическими тросиками:
Чтобы раму с урной не сдвинули случайно относительно принтера, мы решили к конструкции добавить ещё и специальную тумбочку под принтер, в итоге все стало выглядеть вот так:
Параллельно с железяками мы трудились над «мозгами». А мозгом всей нашей системы стал специальный скрипт, написанный под UNIX. В его задачу входит:
- Получение данных от Хабра.
- Формирование на основе этих данных билета участника.
- Печать.
- Обмен данными с Arduino.
- Запись видео.
- Отправка видео Хабру.
- Оповещение о неполадках.
Управление скриптом мы, для удобства, организовали через SSH-доступ, вот так выглядит панель управления проектом:
Данные передаются порциями по 10 записей. После того, как информация получена, скрипт запускает сборку PDF-файла для первого билета, куда вставляет аватарку, ник, фамилию и имя участника, а также его карму и рейтинг. Сгенерированный PDF отправляется на принтер, и запускается ожидание сигнала от инфракрасного датчика препятствий. Как только билет напечатан и попадает в поле зрения датчика:
(тестировали мы, конечно же, на самых любимых нами пользователях Хабра)
…включается запись с камеры, расположенной над лотком. После того как запись сделана, к ней прикрепляется одно из 30 видеопосланий от Анатолия Вассермана, и файл кладется в папочку «исходящие». При следующем обращении сервер Хабра заберёт эти записанные видео. Далее мы открываем шторку и ждём, когда билет упадёт в урну. Как только инфракрасный датчик перестаёт видеть билет, мы делаем перерасчёт веса и запускаем печать следующего билета.
Если все билеты, полученные от Хабра, уже отпечатаны, то мы меняем статус на «0», что означает, что мы готовы принимать новую партию данных. Попутно скрипт проверяет камеру, принтер и Arduino на предмет ошибок, и если вдруг с каким-то из устройств что-то неладное, нам приходит SMS-оповещение (нельзя же заставлять участников конкурса ждать!).
Наверное, многим из вас знакомо это чувство, когда проект запущен и желания заниматься им уже нет — всё самое вкусное уже пройдено, всё работает, и хочется переключиться на новые задачи. А тут звонят какие-то пользователи и хотят то поправить, или это…
Честно признаемся, мы не стали исключением. Проект длился 45 дней и за это время наш адреналиновый восторг после запуска постепенно сменился на легкую апатию. Тем не менее, мы исправно мониторили проект, и если сервер присылал нам SMS, честно подключались по SSH и смотрели, что там случилось. Иногда надо было просто перезапустить скрипт, иногда позвонить в охрану, чтобы они покормили принтер бумагой (в нерабочее время эту почётную миссию выполняла служба безопасности, за что им огромное спасибо!), иногда спуститься и вытащить застрявший билет или заменить картридж. Иногда тревожное SMS настигало нас в самых неожиданных местах, например, в фитнес-центре:
Или за рулём:
Но сейчас, когда проект закончен, нельзя не признать того, что он был одним из самых интересных в нашей жизни, и у нас уже снова чешутся руки придумать что-то ещё более весёлое! Спасибо всем вам, не оставшимся к проекту равнодушными и принявшим участие в нашем конкурсе. ;)
Билетов оказалось очень много, и мы решили высыпать их в надувной бассейн. За каждым билетом приходилось буквально нырять.
This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.
Комментариев нет:
Отправить комментарий