SIM800L

Постов: 3 Рейтинг: 5011
3890

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

Развернуть

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

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

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

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


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

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


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

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

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

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

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

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


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

- Arduino uno 328

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


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

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

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

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

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

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

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

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

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


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

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

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


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

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

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


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

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

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


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


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

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

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


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


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

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

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

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

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

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


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


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


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

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

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


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

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

- Полностью рабочий 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 принтер для печати заказа в столовую

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

650

GSM сигнализация на Arduino и SIM800L и датчиком движения

Развернуть
Делаем охранную систему своими руками. Оповещать о тревоге "хозяина", а так же принимать команды устройство будет по СМС, так как это надежно и просто. Еще важно, чтобы устройство не зависело от постоянного наличия напряжения в сети, для питания.
GSM сигнализация на Arduino и SIM800L и датчиком движения
Чтобы устройство могло пару дней работать автономно, в нем предусмотрен аккумулятор и модуль заряда. GSM модуль - штука капризная к питанию, ему подавай напряжение в диапазоне от 3.6 до 4.2, что означает, что от ардуиновского выхода 3.3 вольта он работать не будет. Зато использование аккумулятора и модуля заряда избавляет от необходимости использовать дополнительный модуль стабилизации напряжения для GSM модуля, так как напряжения будет какраз от 4.2 и при разряде снижается до 3.7.

Управление очень простое: отправляем СМС с текстом "1" на номер симки, что установлена в устройстве, в ответ устройство отправляет "хозяину" СМС с подтверждением "Postanovka na ohranu", при первом обнаружении движения (датчиком движения), устройство отправит СМС с текстом "Wnimanie, dvijeniye na objekte!", и при повторном обнаружении движения, устройство включает сирену и отправляет "хозяину" текст "Sirena vluchena!". Чтобы снять с охраны достаточно отправить команду "0", в ответ устройство пришлет подтверждение о том, что снято с охраны.

Это устройство является одной из частей моей системы "умный дом", но работает совершенно не зависимо от системы, по этому может использоваться самостоятельно. Остальные WIFI-блоки системы "умный дом" я опишу чуть позже.

Устройство может рассылать СМС нескольким абонентам, в том числе охранному агентству, команды управления и тексты ответов легко редактируются в приведенном ниже скетче, который Вы можете скачать по ссылке:

А вот и видео по этой статье!
471

ARDUINO это просто краткие познавательные видео

Развернуть
Наткнулся на интересный канал, новичкам смотреть обьязательно