Мини GPRS принтер для печати заказа в столовую
Всем привет, мы с коллегой расскажем вам как мы мучились 4 месяца сделали своими руками принтер, который печатает то что вы от него хотите, без лишних проводов (только питание)
Небольшая предыстория (и зачем это вообще нужно)
После переезда в новый офис мы были рады наличию столовой на первом этаже здания, но места в ней было немного, и все желающие отобедать там не умещались. Андрей предложил свою кандидатуру на роль курьера.
Как это работало:
- Ребята пишут заказ на бумажке с подписью
- Андрей собирает бумажки и относит их в столовую с деньгами
- Через 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в, иначе работать будет не стабильно, или может вообще выключится, предварительно написав предупреждение.
(картинка с сайта codius.ru)
Для получения данных из всемирной, пока еще не заблокированной сети - есть несколько способов:
- HTTP соединение
- TCP соедниение
Мы будем использовать второй вариант, т.к. библиотека которую мы используем работает именно по этому принципу (ее пришлось немного доработать, об этом в части про спаривание принтера и модуля)
С модулем можно общаться напрямую через Serial-порт компьютера, используя программатор, но у нас есть ардуино, и мы использовали скетч для отладки что бы немного с ним пообщаться (идет в комплекте с библиотекой, появляется в Examples Arduino IDE).
Шаг первый: получить данные с api.
С момента подключения питания до успешного получения данных прошло 2 часа (но потом мы потерли скетч и примерно 2 дня пытались повторить то что мы сделали).
Сложности с sim800l которыми мы столкнулись, перед тем как у нас это получилось:
- Недостаточное питание: подавали 3.3в вместо 3.5, модуль обманчиво мигал, но сеть не находил
- Пришлось настраивать прокси, т.к. модуль не может в ssl (или может, уже позже мы нашли документацию SIM800 Series_SSL_Application Note_V1.00), и большинство адресов вообще не открывалось
- Мегафон ни в какую не хотел открывать адрес api, даже через прокси, сменили оператора - все заработало
Принтер JP-QR701-TTL - самая распространенная модель, цифры/буквы в названии могут быть другие, главное что бы был TTL а не RS232, иначе придется подключать схему MAX3232 для конвертирования RS232 -> TTL. когда мы распечатали тестовую страницу (нужно зажать на нем кнопку и подать питание) то в начале мы получили половину страницы, где нет кириллицы.
Дело как и в случае с GSM-модулем было в питании, подавали мы меньше 5в, ему же требуется 5-9в, увеличили напряжение - все заработало, но кириллицы не появилось.
Потратив несколько часов на поиски "как печатать на русском" мы наткнулись на статью 2013 года (не могу вставить ссылку из-за рекламы на сайте), где человечище с ником zhevak выложил ссылки на файл для прошивки принтера другими кодировками. Ссылки оказались не рабочими, но мы поняли куда рыть, и нашли свежую версию программы которой я делюсь с вами. Просто выбираем нужную - CP866, нажимаем ОК, и ждем ОК от программы, печатаем тестовую страницу - и все, вы восхитительны.
Для общения с принтером использовали библиотеку Adafruit
Шаг второй: отправить полученные данные на печать
Итак, самая интересная часть, имеем:
- Полностью рабочий принтер, печатает то что мы хотим
- Полностью рабочий 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 не могу вспомнить сколько дней у нас ушло на то, что бы понять что данные передаются потоком, и что принтер просто не успевает их напечатать на более высокой скорости
Перед печатью данных с сервера мы вновь забыли проверить напряжение, результат нас одновременно обрадовал и удивил, т.к. мы получили печать страницы на башкирском языке (по крайней мере очень похоже)
Вот так выглядит печать в нормальном виде
Шаг третий: монтаж и сборка
С получением данных и печатью все, далее печать платы для повышающих модулей и подключение блока питания. БП кстати должен выдавать минимум 1.5 - 1.7а, из-за высокого потребления принтера в момент печати.
(шутка про фронтенд и бэкенд)
Изначально корпус решили напечатать на 3d принтере, но около месяца это все оставалось на уровне "надо-бы сделать", тогда я решил сделать корпус из пвх пластика, за идею спасибо @OgnennoeTV, а за пластик - Юре.
Предварительно был сделан корпус из картона - что в дальнейшем очень помогло, указало на косяки при высчитывании размеров.
Далее были вырезаны детали из пластика и после подгонки - покрашены, хотели предварительно выровнять неровности но мы понимали что тогда это затянется еще на несколько дней (а мы уже очень хотели закончить)
Крепления были куплены в строительном магазине и с боков посажены на клей (потом все-таки поменяли на болты)
В момент сборки, на фото ниже - я представлял себя Робертом Фордом из мира дикого запада, который кряхтит над своим творением.
Предварительно согласовали с девушками из столовой формат печати, получили ОК и окончательно собрали принтер.
С момента выпуска принтера в "продакшн" прошло около месяца, в начале девушки в столовой были крайне удивлены черной коробке которая печатает им заказы, но потом привыкли, и даже выделили ей место.
Весь процесс занял примерно 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. Посты с нарушениями без предупреждения переносятся в общую ленту.
За неоднократные нарушения автор получает бан.
Автор может размещать новую публикацию в сообществе, не допуская полученных ранее замечаний.