
До устройства на работу в Креатив, я считал, что программисты — абсолютно не творческие люди. Но все изменилось в один день. Когда я узнал, что для собственного обеда прогеры придумали СВОЮ программу сбора, обработки и печати обеденного заказа. Апгрейд обеда на этом не закончился и они еще и принтер для печати этих самых заказов собрали! Мой мир изменился навсегда и стало по-настоящему интересно разобраться что к чему.

Все началось с переезда в новый офис и радости что по-соседству оказалась столовая. Радость была недолгой — места перекусить хватало не всем. Тогда один из сотрудников любезно согласился исполнять роль доставщика еды. На практике это выглядело так: ребята писали свои заказы на бумажке, курьер относил их в столовую вместе с деньгами, а через 30 минут забирал заказ. Итого 4 итерации, 2 из которых — поход в столовую.
Для программистов такой расклад не годился и они взялись оптимизировать процесс. Для начала сделали сайт, где можно оформить заказ на обед, который курьер распечатает и отнесет в столовую. Система оплаты была заменена на депозиты, баланс отражался в личном кабинете также на сайте. Коллективное бессознательное не могло не проявить себя и родилась идея — нужен принтер с мобильным интернетом, т.к. в столовой не было wifi (безумие).

И понеслось…Собственно сам процесс начался с прототипирования, все необходимое было закуплено за один раз на али, а именно:
- Принтер JP-QR701-TTL
- Arduino uno 328
- GSM/GPRS модуль sim800l + дополнительная антенна для него
И мое скромное вложение:
- Блок питания от монитора (14в 2а)
- Понижающие DC-DC модули
- Конденсаторы и прочая мелочь

Немного поясню по выбору железа:
Ребята выбрали именно этот принтер т.к. у него в описании значилась поддержка русской кодировки CP866, что показалось весьма убедительным фактом.
В процессе разработки естественно они пожалели о том, что остановились на Arduino и начался челлендж «впихнуть не впихуемое», ибо памяти катастрофически не хватало.
GSM модуль взяли самый дешевый и распространенный — чем востребованнее железка, тем больше топиков и готовых проектов с ней.
Примеров реализации sim800 + принтер + Arduino в сети не оказалось, но несмотря на это — руками программистов было написано лишь ~20% кода для проекта, в остальном — использовали библиотеки где все уже было сделано.

Общение с модулем sim800l происходит с помощью AT-команд через Serial-port, в ответ, если все в порядке — отвечает OK, если нет — ERROR, ребята использовали документацию которая гуглится по названию SIM800HL_Hardware_Design_V2.01 (есть много разных, но эта одна из самых полных)
Модуль крайне привередлив к питанию, ему необходимо 3.5 — 4.4в, иначе работать будет не стабильно, или может вообще выключится, предварительно написав предупреждение.
Для получения данных из всемирной, пока еще не заблокированной сети — есть несколько способов:
- HTTP соединение
- TCP соедниение
Остановились на втором варианте, т.к. использованная библиотека работает именно по этому принципу (ее пришлось немного доработать, об этом в части про спаривание принтера и модуля).
С модулем можно общаться напрямую через Serial-порт компьютера, используя программатор, но в арсенале был ардуино, и ребята успешно использовали скетч для отладки чтобы немного с ним пообщаться (идет в комплекте с библиотекой, появляется в Examples Arduino IDE).

Шаг первый: получить данные с api.
С момента подключения питания до успешного получения данных прошло 2 часа (но потом еще 2 дня этот результат программисты пытались повторить).
Сложности с sim800l перед тем, как все это получилось:
- Недостаточное питание: подавали 3.3в вместо 3.5, модуль обманчиво мигал, но сеть не находил.
- Пришлось настраивать прокси, т.к. модуль не может в ssl и большинство адресов вообще не открывалось.
- Мегафон ни в какую не хотел открывать адрес api, даже через прокси, сменили оператора — все заработало.

Принтер JP-QR701-TTL — самая распространенная модель, цифры/буквы в названии могут быть другие, главное что бы был TTL а не RS232, иначе придется подключать схему MAX3232 для конвертирования RS232 -> TTL. Когда тестовая страница была напечатана, то сначала более половины оказалось без кириллицы.
Дело как и в случае с GSM-модулем было в питании, подача была меньше 5в, ему же требуется 5-9в, увеличили напряжение — все заработало, но кириллицы не появилось.

Потратив несколько часов на поиски «как печатать на русском», изучив несколько десятков статей доблестные джедаи, то есть программисты нашли таки решение. И со свежей свежей версией программы все заработало — просто нужно выбрать CP866, нажать ОК, и ждать ОК от программы. Далее — печать и вуаля …все работает!
(Для общения с принтером использовали библиотеку Adafruit.)

Шаг второй: отправить полученные данные на печать
Итак, самая интересная часть, дано:
- Полностью рабочий принтер
- Полностью рабочий gprs модуль
Для этого был создан 2 Software Serial для команд примерно по такой схеме: Принтер <= Arduino <=> sim800. Было решено действовать поступательно. Сначала программисты получили данные уже с переносами строк, затем данные конвертировались из UTF-8 в CP866 и отправлялись на принтер.

И тут мы сталкиваемся с несколькими проблемами:
- Памяти у Arduino не хватит что бы сохранить список заказов который получался с сервера, как вариант — получать и отправлять данные частями, но это приводило к следующему.
- Модуль sim800 передает данные не пакетами и получался поток который нужно успеть прочитать, перекодировать и отправить на печать прежде чем он пришлет новые данные, и последняя проблема.
Решение оказалось гениальным и простым — решили уменьшить скорость потока данных при инициализации до 300 (хотя в документации сказано что ниже 900 нельзя) и все заработало!

Шаг третий: монтаж и сборка.
С получением данных и печатью вроде бы разобрались. А далее — печать платы для повышающих модулей и подключение блока питания. БП кстати должен выдавать минимум 1.5 — 1.7а, из-за высокого потребления принтера в момент печати. Изначально корпус решили напечатать на 3d принтере, но около месяца это все оставалось на уровне «надо-бы сделать», тогда парни решили сделать корпус из пвх пластика, за идею спасибо @OgnennoeTV, а за пластик — Юре.
Предварительно был сделан корпус из картона — что в дальнейшем это очень помогло, указало на косяки при высчитывании размеров. Далее были вырезаны детали из пластика и после подгонки — покрашены.
Крепления были куплены в строительном магазине и посажены на клей (потом все-таки поменяли на болты).

Предварительно согласовав с девушками из столовой формат печати, получили ОК и окончательно собрали принтер.

С момента выпуска принтера в «продакшн» прошло около месяца, в начале девушки в столовой были крайне удивлены черной коробке которая печатает им заказы, но потом привыкли, и даже выделили ей место.

Весь процесс реализации занял у наших Кулибиных примерно 4 месяца, в денежном эквиваленте это 2.5к, с учетом наличия расходников, паяльника и прочего, и без учета человеко-часов. Проект обеденного апдейта удался на 100 %. Даже боюсь представить, что они решат усовершенствовать в следующий раз…