mmote.ru/content/posts/niimbot-d110-pc/index.md

13 KiB
Raw Blame History

title date draft categories featured_image lastmod tags telegram_entry_id description
Niimbot D110 - печатаем этикетки с компьютера 2024-05-31T19:54:14+03:00 false
misc
miniature.jpg 2024-06-04T21:49:08+03:00
bluetooth
python
windows
niimbot
термопечать
mmotium/10 Пробуем печать на Bluetooth принтере этикеток с помощью компьютера, Bluetooth адаптера и Python

Захотелось мне компактный принтер этикеток приобрести. Чтобы там коробочки и бутылочки всякие маркировать. Выбор пал на нынче популярный Bluetooth принтер Niimbot D110.

Приложение для него существует только для телефона. Это удобно в тех условиях, когда нет компьютера под рукой. И в случае, если приложение сделано хорошо.

А пока мы имеем:

  • при каждом входе в приложение нужно посмотреть рекламу;
  • в приложении для сохранения шаблонов требуется регистрация;
  • шрифты при пикселизации выглядят жутковато, непонятно как будет выглядеть этикетка до печати;
  • дизайнить этикетки с помощью пальца - то ещё удовольствие;
  • для просмотра заготовок, иконок требуется включать VPN;
  • оптимизация оставляет желать лучшего, всё тормозит.

Поэтому попробуем напечатать этикетки при помощи компьютера.

Существует проект AndBondStyle/niimprint (доработанный форк kjy00302/niimprint) на Python. Проект реализует протокол обмена принтера и позволяет печатать картинки с компьютера по Bluetooth. Если последнего на компьютере нет, то необходим адаптер. У меня такой:

UB500.jpg

Ко всему прочему при печати этим способом игнорируется проверка оригинальности ленты, поэтому можно печатать на чём попало. Для тестов я вставлял куски чеков, чтобы не тратить этикетки.

Определение mac адреса принтера

Данные моего принтера:

Серийный номер: G326030306
Аппаратная версия: 13.10
Версия прошивки: 13.10

У принтера два mac адреса. Один обычный, другой - BLE. В моём случае это:

  • 03:26:03:C3:F9:11 - нужный
  • 26:03:03:c3:f9:11 - BLE

Нужный нужный адрес я нашёл с помощью BluetoothView. Утилита не показывает BLE устройства, а это как раз нам и надо.

BluetoothView

Настройка niimprint

Теперь займёмся niimprint. Инструкция для Windows.

  1. Устанавливаем Python 3.11+, если ещё это не сделали. Открываем окно команд.

  2. Клонируем или скачиваем репозиторий

    git clone https://github.com/AndBondStyle/niimprint
    
  3. Переходим в директорию репозитория

    cd niimprint
    
  4. Создаем и активируем виртуальное окружение, чтобы не засорять глобальный список пакетов

    python -m venv venv
    
    venv\Scripts\activate
    

    cmd_venv

  5. Теперь устанавливаем зависимости. Тут уже как больше хочется.

    • Напрямую

      pip install -r requirements.txt
      

      Далее из-за того, что проект выполнен в виде модуля, чтобы всё работало, нужно выполнить

      set PYTHONPATH=<текущий путь>
      

      Например

      set PYTHONPATH=D:\Apps\niimprint
      :: или
      set PYTHONPATH=%cd%
      
    • Через Poetry как задумывалось автором

      pip install poetry
      
      poetry install
      
  6. Запускаем печать

    • Напрямую

      python niimprint --model d110 --conn bluetooth --addr 03:26:03:C3:F9:11 --rotate 90 --density 2 --image template_15x30.png
      

      --model d110 — модель принтера d110

      --conn bluetooth — тип соединения bluetooth

      --addr 03:26:03:C3:F9:11 — bluetooth адрес

      --rotate 90 — использовать альбомную ориентацию картинки

      --density 2 — плотность 3 (1-3 для d110)

      --image template_15x30.png — изображение для печати

      cmd_print

    • Через Poetry

      poetry run <команда выше>
      

    В первый раз появится запрос сопряжения

    new_device

    pairing

    Если mac адрес указан верно, то сопряжение завершится успешно и сразу начнётся печать.

Упрощение печати - добавление принтера в меню "Отправить"

  1. В адресной строке проводника ввести shell:sendto и нажать Enter.

  2. В открывшейся директории создать файл niimprint.cmd или с другим именем по желанию.

  3. Содержимое файла отредактировать под себя:

    @echo off
    
    set NIIMPRINT_DIR=D:\Apps\niimprint
    
    set PYTHONPATH=%NIIMPRINT_DIR%
    cd /d %NIIMPRINT_DIR%
    venv\Scripts\python.exe niimprint --model d110 --conn bluetooth --addr 03:26:03:C3:F9:11 --rotate 90 --density 2 --image "%1"
    
    if %errorlevel% neq 0 pause
    

Теперь кликаем правой кнопкой по картинке и выбираем niimprint.cmd

sendto

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

Подготовка изображений

Разрешение печати у D110 - 8 пикселей на мм (~203 dpi). Максимальная высота печати - 15 мм.

Максимальная высота картинки: 8 пикс. * 15 мм = 120 пикс.

Но на деле - немного меньше - 96 пикс. Это максимальное разрешение печатающей головки.

Итак, для этикетки шириной 30 мм и высотой 15 мм разрешение картинки должно быть 240 x 96 пикс. Также нужно отступить немного от краёв, так как позиционирование не совсем точное.

Картинки лучше сразу преобразовывать в чёрно-белые, без оттенков серого. Так можно сразу понять как будет выглядеть этикетка. Вот, например, как будет выглядеть шрифт, у которого остались оттенки серого:

aa1in

aa1out

Шрифт стал страшным и зубастым (как и происходит при печати с телефона). А теперь изначально сделаем картинку чёрно-белой:

aa2in

aa2out

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

Как выглядит градиент и пиксельная сетка без постобработки (слева артефакт от прошлой печати, повторно использовал этикетку):

gridin

gridout

Мои шаблоны для этикеток

Шаблон 15x30мм (240x96)

label15x30

Шаблон 15x30мм (240x96) - проект для Krita. В проекте есть фильтрующие слои для растрирования изображения в псевдополутоновое.

{{< video src="krita_template_15x30.webm" >}}

Прочее полезное

Как печатать с телефона на любой термобумаге

Может пригодиться для проверки что получится при печати, а этикетки тратить не хочется.

  1. Вставить замену бумаги лицевой стороной вниз

    fakepaper

  2. Приложить оригинальную ленту этикеткой к корпусу

    paperontop

  3. Закрыть крышку.

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

⚠ Нужно понимать, что принтер каким-то образом понимает, сколько он отпечатал этикеток с конкретного картриджа (записывает в RFID метку или в собственную память). И, скорее всего, не станет печатать с телефона, когда посчитает, что исчерпал количество этикеток.

Печати через niimprint это не касается, проверка картриджа происходит на стороне клиента. Сам принтер проверяет только есть ли лента рядом с головкой (оптический датчик).

Дамп RFID метки оригинального картриджа (Mifare Ultralight)

original15x30

1DAB437D
D38C0000
5FA380FF
E1101200

Альтернативы оригинальным наклейкам

Что плохо в данном принтере - этикетки стоят каких-то дурных денег. Например, в данный момент за этикетки 15x30 хотят около 450р за катушку (210 этикеток). Расходники по стоимости трети от принтера - не здорово. Поэтому неплохо бы поискать варианты замены.

Своими руками

Первым делом я провёл эксперимент.

Купил я такую катушку с термоэтикетками ECO (можно и TOP). Размер 58x40, 400шт. Обошлось мне это в 60р.

ecostrickers

Далее я смоделировал и напечатал каркас для катушки, как в оригинале.

Затем отмерил и разрезал ленту вдоль, чтобы получилась полоса 15 мм.

cut

Ленту намотал на катушку.

spool

В итоге получилась катушка с наклейками 15х40, на которых принтер вполне себе спокойно печатает, при этом датчик в принтере успешно обнаруживает промежуток между наклейками.

Тест печати с разной плотностью. Последняя получилась после нажатия кнопки на принтере:

spool

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

От других производителей

Насколько известно, могут подойти ленты от принтера Phomemo Q30.