Мини GPRS принтер для печати заказа в столовую

Всем привет, мы с коллегой расскажем вам как мы мучились 4 месяца сделали своими руками принтер, который печатает то что вы от него хотите, без лишних проводов (только питание)

Мини GPRS принтер для печати заказа в столовую Принтер, Своими руками, Sim800l, Arduino, Рукоделие с процессом, Длиннопост

Небольшая предыстория (и зачем это вообще нужно)

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


Как это работало:

- Ребята пишут заказ на бумажке с подписью
- Андрей собирает бумажки и относит их в столовую с деньгами
- Через 30 минут возвращается и забирает заказ
- Ребята располагаются на кухне в офисе и дружно обедают


Итого 4 итерации, 2 из которых - поход в столовую.

Мини GPRS принтер для печати заказа в столовую Принтер, Своими руками, Sim800l, Arduino, Рукоделие с процессом, Длиннопост

Андрей, как прирожденный программист, решил это дело оптимизировать - сделал сайт где можно оформить заказ обеда, который он в дальнейшем распечатает и отнесет в столовую. Система оплаты была заменена на депозиты, баланс можно посмотреть в личном кабинете также на сайте.

Мини GPRS принтер для печати заказа в столовую Принтер, Своими руками, Sim800l, Arduino, Рукоделие с процессом, Длиннопост

(единственный обед который я могу себе позволить)

Позднее Олегом было предложено сделать «штуку которая будет печатать заказ в столовой», Андрей поделился со мной этой идеей, в дальнейшем мы пришли к выводу что нужна нам все-таки не штука, а принтер, желательно с мобильным интернетом, т.к. в столовой не было wifi (безумие).


Непосредственно сам процесс начался с прототипирования, все необходимое было закуплено за один раз на али, а именно:
- Принтер JP-QR701-TTL

- Arduino uno 328

- GSM/GPRS модуль sim800l + дополнительная антенна для него


И мое скромное вложение:

- Блок питания от монитора (14в 2а)

- Понижающие DC-DC модули

- Конденсаторы и прочая мелочь

Мини GPRS принтер для печати заказа в столовую Принтер, Своими руками, Sim800l, Arduino, Рукоделие с процессом, Длиннопост

Немного поясню по выбору железа:

- Выбрали именно этот принтер т.к. у него в описании значилась поддержка русской кодировки CP866, что показалось нам убедительным

- Миллионы раз в процессе разработки мы пожалели о том что выбрали Arduino, но в последствии лично для меня это превратилось в челлендж "впихнуть не впихуемое", ибо памяти очень не хватало

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


Примеров реализации sim800 + принтер + Arduino в сети не оказалось, но не смотря на это - руками мы написали лишь ~20% кода для проекта, в остальном - использовали библиотеки где все уже было сделано за нас.

Мини GPRS принтер для печати заказа в столовую Принтер, Своими руками, Sim800l, Arduino, Рукоделие с процессом, Длиннопост

Общение с модулем sim800l происходит с помощью AT-команд через Serial-port, в ответ, если все в порядке - отвечает OK, если нет - ERROR, использовали мы документацию которая гуглится по названию SIM800HL_Hardware_Design_V2.01 (есть много разных, но эта на мой взгляд самая полная)


Модуль крайне привередлив к питанию, ему необходимо 3.5 - 4.4в, иначе работать будет не стабильно, или может вообще выключится, предварительно написав предупреждение.

Мини GPRS принтер для печати заказа в столовую Принтер, Своими руками, Sim800l, Arduino, Рукоделие с процессом, Длиннопост

(картинка с сайта codius.ru)


Для получения данных из всемирной, пока еще не заблокированной сети - есть несколько способов:

- HTTP соединение

- TCP соедниение


Мы будем использовать второй вариант, т.к. библиотека которую мы используем работает именно по этому принципу (ее пришлось немного доработать, об этом в части про спаривание принтера и модуля)


С модулем можно общаться напрямую через Serial-порт компьютера, используя программатор, но у нас есть ардуино, и мы использовали скетч для отладки что бы немного с ним пообщаться (идет в комплекте с библиотекой, появляется в Examples Arduino IDE).

Мини GPRS принтер для печати заказа в столовую Принтер, Своими руками, Sim800l, Arduino, Рукоделие с процессом, Длиннопост

Шаг первый: получить данные с api.


С момента подключения питания до успешного получения данных прошло 2 часа (но потом мы потерли скетч и примерно 2 дня пытались повторить то что мы сделали).


Сложности с sim800l которыми мы столкнулись, перед тем как у нас это получилось:

- Недостаточное питание: подавали 3.3в вместо 3.5, модуль обманчиво мигал, но сеть не находил

- Пришлось настраивать прокси, т.к. модуль не может в ssl (или может, уже позже мы нашли документацию SIM800 Series_SSL_Application Note_V1.00), и большинство адресов вообще не открывалось

- Мегафон ни в какую не хотел открывать адрес api, даже через прокси, сменили оператора - все заработало

Мини GPRS принтер для печати заказа в столовую Принтер, Своими руками, Sim800l, Arduino, Рукоделие с процессом, Длиннопост

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


Дело как и в случае с GSM-модулем было в питании, подавали мы меньше 5в, ему же требуется 5-9в, увеличили напряжение - все заработало, но кириллицы не появилось.


Потратив несколько часов на поиски "как печатать на русском" мы наткнулись на статью 2013 года (не могу вставить ссылку из-за рекламы на сайте), где человечище с ником zhevak выложил ссылки на файл для прошивки принтера другими кодировками. Ссылки оказались не рабочими, но мы поняли куда рыть, и нашли свежую версию программы которой я делюсь с вами. Просто выбираем нужную - CP866, нажимаем ОК, и ждем ОК от программы, печатаем тестовую страницу - и все, вы восхитительны.


Для общения с принтером использовали библиотеку Adafruit

Мини GPRS принтер для печати заказа в столовую Принтер, Своими руками, Sim800l, Arduino, Рукоделие с процессом, Длиннопост

Шаг второй: отправить полученные данные на печать


Итак, самая интересная часть, имеем:

- Полностью рабочий принтер, печатает то что мы хотим

- Полностью рабочий gprs модуль

Нам нужно их спарить между собой.


Создаем 2 Software Serial для прокидывания команд примерно по такой схеме:
Принтер <= Arduino <=> sim800l


Действуем по этим шагам:

- Получаем данные уже с переносами строк

- Конвертируем данные из UTF-8 в CP866

- Отдаем данные на принтер


И тут мы сталкиваемся с несколькими проблемами:

- Памяти у Arduino не хватит что бы сохранить список заказов который мы получаем с сервера, как вариант - получать и отправлять данные частями, но это приводит нас к следующему:

- Модуль sim800 передает данные не пакетами, мы имеем поток который нужно успеть прочитать, перекодировать и отправить на печать прежде чем он пришлет нам новые данные, и последняя проблема:

- Мы понимаем что количество ненумерованных списков в этой статье почти переваливает за десяток


Решение (второй проблемы) оказалось гениальным и простым - уменьшаем скорость потока данных при инициализации до 300 (хотя в документации сказано что ниже 900 нельзя) и все работает. Пожалуйста не спрашивайте меня как и почему, главное что оно работает.


Несколько вещей которые обязательно нужно сделать для библиотеки GSM-модуля:

- В файле sim800.h который лежит в библиотеке для GSM-модуля смотрим на значения пинов (например SIM800_TX_PIN), тут 2 варианта - меняем их на те что нам нужны, либо просто подключаемся к тем что указаны

- Рядом, в файле gprs.h меняем baudRate = 9600 на baudRate = 300 не могу вспомнить сколько дней у нас ушло на то, что бы понять что данные передаются потоком, и что принтер просто не успевает их напечатать на более высокой скорости


Перед печатью данных с сервера мы вновь забыли проверить напряжение, результат нас одновременно обрадовал и удивил, т.к. мы получили печать страницы на башкирском языке (по крайней мере очень похоже)

Мини GPRS принтер для печати заказа в столовую Принтер, Своими руками, Sim800l, Arduino, Рукоделие с процессом, Длиннопост

Вот так выглядит печать в нормальном виде

Мини GPRS принтер для печати заказа в столовую Принтер, Своими руками, Sim800l, Arduino, Рукоделие с процессом, Длиннопост

Шаг третий: монтаж и сборка


С получением данных и печатью все, далее печать платы для повышающих модулей и подключение блока питания. БП кстати должен выдавать минимум 1.5 - 1.7а, из-за высокого потребления принтера в момент печати.

Мини GPRS принтер для печати заказа в столовую Принтер, Своими руками, Sim800l, Arduino, Рукоделие с процессом, Длиннопост

(шутка про фронтенд и бэкенд)

Мини GPRS принтер для печати заказа в столовую Принтер, Своими руками, Sim800l, Arduino, Рукоделие с процессом, Длиннопост

Изначально корпус решили напечатать на 3d принтере, но около месяца это все оставалось на уровне "надо-бы сделать", тогда я решил сделать корпус из пвх пластика, за идею спасибо @OgnennoeTV,  а за пластик - Юре.

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

Мини GPRS принтер для печати заказа в столовую Принтер, Своими руками, Sim800l, Arduino, Рукоделие с процессом, Длиннопост

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

Мини GPRS принтер для печати заказа в столовую Принтер, Своими руками, Sim800l, Arduino, Рукоделие с процессом, Длиннопост

Крепления были куплены в строительном магазине и с боков посажены на клей (потом все-таки поменяли на болты)

Мини GPRS принтер для печати заказа в столовую Принтер, Своими руками, Sim800l, Arduino, Рукоделие с процессом, Длиннопост

В момент сборки, на фото ниже - я представлял себя Робертом Фордом из мира дикого запада, который кряхтит над своим творением.

Мини GPRS принтер для печати заказа в столовую Принтер, Своими руками, Sim800l, Arduino, Рукоделие с процессом, Длиннопост

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

Мини GPRS принтер для печати заказа в столовую Принтер, Своими руками, Sim800l, Arduino, Рукоделие с процессом, Длиннопост
Мини GPRS принтер для печати заказа в столовую Принтер, Своими руками, Sim800l, Arduino, Рукоделие с процессом, Длиннопост

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

Мини GPRS принтер для печати заказа в столовую Принтер, Своими руками, Sim800l, Arduino, Рукоделие с процессом, Длиннопост

Весь процесс занял примерно 4 месяца, но мы выделяли время только в выходные, и изредка - после работы.


По стоимости проект вышел примерно в 2.5к, с учетом наличия расходников, паяльника и прочего, и без учета человеко-часов.

Спасибо всем кто как-либо помог в разработке принтера, словом и делом, и вам что дочитали, надеюсь вдохновить кого-нибудь собрать что-то свое.

Ссылка на скетч который использовали для Arduino: https://github.com/andrew72ru/remote_print

Рукодельники

55.3K поста58.9K подписчиков

Правила сообщества

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

0. Соблюдайте основные правила Пикабу.


1. Будьте вежливы, старайтесь писать грамотно.


2. В публикациях используйте четкие и красивые фотографии.


3. Автор поста с тегом [моё] может оставить ссылку на свой профиль, группу или канал на других источниках, при условии, что ссылки (активные и не активные) не ведут на прямые продажи. Допускается не больше четырёх ссылок и только в конце поста (п. 8.5 основных правил).


Запрещены:

-ссылки рекламного характера/спам;

-ссылки, ведущие на магазины с указанием стоимости товара/услуги;

-ссылки, ведущие на призывы, покупки, продажи, подписки, репосты, голосование и тому подобное.

(нарушение основных правил сайта, п.8.1 и п. 8.2).

При переходе по ссылке запрещено наличие активных (кликабельных) ссылок, ведущих на вышеперечисленное в п.3, содержание таких ключевых слов как «товар», «услуга», «купить», «продам», «в наличии», «под заказ» и т.п.


3.1 Размещение контактов автора (самим автором или другими пользователями) в комментариях запрещено и подлежит удалению (п. 9.1 и 9.3 основных правил).


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

Также помечайте свою работу тегом «Рукоделие с процессом» или «Рукоделие без процесса».


5. Пост-видео, пост-фото без текстового описания переносится в общую ленту. Даже если в видео показан подробный процесс изготовления, делайте краткое описание для тех, у кого нет возможности/желания смотреть видео.

Администрация оставляет за собой право решать, насколько описание соответствует п. 5.


6. Посты с нарушениями без предупреждения переносятся в общую ленту.

За неоднократные нарушения автор получает бан.

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