Термопринтер Adafruit: характеристики и подключение к Arduino

Чековый термопринтер печатает текст, штрих-коды и картинки на ленте 57 мм. Разбираем характеристики, подключение по UART и печать кириллицы.
Что умеет принтер
Термопринтер Adafruit выводит на чековую ленту текст, в том числе русский, штрих-коды и растровые изображения. Используется термальная бумага стандартной ширины 57 мм в рулонах диаметром до 36 мм. Чернил и картриджей нет: изображение создаёт нагретая печатающая головка, температура которой доходит до 200 °C. В местах контакта бумага темнеет, и на ленте появляется нужный рисунок.

Питается устройство постоянным напряжением 5–9 В, а данные получает по интерфейсу UART с TTL-уровнями.

Органы управления и самотестирование
На нижней стороне корпуса расположена кнопка тестирования. По её нажатию принтер распечатывает собственные характеристики — это самый простой способ убедиться в исправности механизма до подключения к контроллеру.

На верхней панели находится зелёный светодиод, по которому определяют состояние устройства:
- не горит — принтер выключен;
- мигает — принтер включён;
- горит постоянно — спящий режим.
Кнопка прокрутки продвигает ленту на 10 мм за одно нажатие.
Технические характеристики
| Напряжение питания | 5–9 В |
| Потребляемый ток | до 1,5 А при печати, до 10 мА в ожидании |
| Интерфейс | TTL UART |
| Метод печати | прямая термическая печать |
| Ширина бумаги / диаметр рулона | 57 мм / 36 мм |
| Ширина печати | 48 мм |
| Скорость печати | до 80 мм/с |
| Разрешение | 203 DPI (8 точек на мм, 384 точки в линии) |
| Форматы штрих-кодов | UPC_A, UPC_E, EAN13, EAN8, CODE39, CODE93, ITF, CODABAR, CODE128 |
| Рабочая температура | +5...+45 °C |
| Температура хранения | -20...+60 °C |
| Габариты | 111x65x59 мм |
Размер одного пикселя составляет 1/8 мм. Принтер поддерживает ASCII и набор GB2312-80 с большим количеством кодовых таблиц, среди которых CP437, CP850, CP866, WCP1251, WCP1252, KATAKANA, THAI и другие. Для русского текста важны таблицы CP866 и WCP1251.
Подключение к Arduino
С платой Arduino принтер связывается по UART. Можно задействовать аппаратный порт на контактах 0 и 1 либо программный, организованный библиотекой SoftwareSerial. В примерах используется второй вариант: программный порт создаётся на выводах 5 и 6 и работает на скорости 19200 бод.

Для управления печатью удобна библиотека Adafruit_Thermal. Объект принтера получает ссылку на программный последовательный порт, после чего инициализируется вызовом begin(). Кодовая страница выбирается методом setCodePage, например thPr.setCodePage(CODEPAGE_CP866) для кириллицы. Первый проверочный скетч печатает таблицу всех символов CP866 в виде сетки 16х16 с шестнадцатеричными индексами строк и столбцов, заменяя управляющие коды меньше 32 пробелами, а затем возвращает принтер к настройкам по умолчанию методом setDefault().
Проект: случайная цитата по кнопке
В качестве практического примера собирается устройство, которое по нажатию кнопки печатает случайно выбранную цитату. Для него нужны:
- плата Arduino;
- плата прототипирования;
- термопринтер;
- блок питания 5 В 2 А;
- кнопка и резистор 10 кОм;
- соединительные провода.
Кнопка подключена к выводу 9, принтер — к тем же выводам 5 и 6. Строки с цитатами хранятся в скетче. В setup() принтер инициализируется, сбрасывается к настройкам по умолчанию и переводится в сон методом sleep(). В основном цикле опрашивается кнопка с программным подавлением дребезга (повторное чтение через 5 мс). При нажатии номер цитаты выбирается как остаток от деления millis() на количество цитат, принтер пробуждается вызовом wake() — без этого печать после сна не начнётся, — выбирается страница CP866 и текст отправляется на печать.
Перекодировка русского текста
Строки в Arduino IDE хранятся в UTF-8, а принтер ожидает CP866, поэтому перед печатью текст пропускают через вспомогательную функцию RUS(). Она просматривает строку и заменяет двухбайтовые последовательности кириллицы однобайтовыми кодами: для пары с первым байтом 0xD0 и вторым в диапазоне 0x90–0xBF из второго байта вычитается 0x10 (буквы А–Я и а–п), для пары с 0xD1 и вторым байтом 0x80–0x8F к нему прибавляется 0x60 (буквы р–я). Буквы Ё и ё получают коды 0xF0 и 0xF1. Остальные символы остаются без изменений, а освободившийся хвост строки заполняется нулями.
Если принтер не работает
- Зелёный светодиод не мигает после подачи питания — следует проверить соединение с блоком питания.
- Принтер не печатает — проверяют питание, правильность подключения к контроллеру и мощность блока питания: он должен выдавать не менее 2 А.