Взаимодействие Arduino с термопринтером
Вы только что совершили платеж в ресторане и получили небольшой чек или сняли наличные в банкомате и получили квитанцию об операции. Эти чеки печатаются с помощью термопринтера или чекового принтера.
Термопринтер – это доступное и экономически эффективное решение для печати небольших чеков или квитанций. Это простое в интеграции решение доступно везде. В принтере используется термохромная бумага, особый тип бумаги, которая при воздействии определенного количества тепла становится черного цвета. Для печати на этой бумаге термопринтер использует специальный процесс нагрева. Головка принтера нагревается специальным электрооборудованием для поддержания определенной температуры. Когда термобумага проходит через его головку, ее тепловое покрытие чернеет там, где головка нагрета.
В данном руководстве мы будем связывать термопринтер с платой Arduino Uno. Проект будет работать следующим образом:
- принтер будет подключен к Arduino Uno;
- тактильная кнопка будет подключена к плате Arduino для обеспечения опции «нажмите для печати»;
- встроенный светодиод на Arduino сообщит о состоянии печати, он будет светиться только во время печати.
Характеристики и подключение принтера
Мы используем термопринтер CSN A1 от Cashino, который легко доступен, а цена не слишком высока.
Если мы посмотрим его спецификацию на официальном сайте, то увидим таблицу с подробными характеристиками.
Печать | Метод печати | Тепловая линия |
---|---|---|
Скорость печати | 50-80 мм/с | |
Разрешение | 8 точек/мм, 384 точки/строка | |
Эффективная ширина печати | 48 мм | |
Символы | Набор символов | ASCII, GB2312-80 (китайский) |
Шрифт печати | ANK: (8x16, 9x17, 9x24, 12x24), GBK: (16x16, 24x24) | |
Характеристики бумаги | Тип бумаги | Термобумага |
Ширина бумаги | 57,5 ± 0,5 мм | |
Диаметр рулона бумаги | максимум 40 мм | |
Надежность | MCBF | 5 миллионов линий |
Интерфейс | Последовательный (RS-232, TTL), USB | |
Источник питания | Постоянное напряжение 5В–9В/12В | |
Физические характеристики | Размеры (ширина x глубина x высота) | 76,8 x 77,4 x 47,7 мм |
Размер поверхности под установку | 72,8 x 73,26 мм | |
Цвет | Бежевый/черный | |
Окружающая среда | Рабочая температура | 5°C – 560°C |
Влажность воздуха при работе | 10% – 80% | |
Температура хранения | -20°C – 60°C | |
Влажность воздуха при хранении | 10% – 90% |
На обратной стороне принтера мы видим следующие разъемы.
Разъем TTL обеспечивает соединение Rx/Tx для связи с микроконтроллерным блоком. Мы также можем использовать интерфейс RS232 для связи с принтером. Разъем питания предназначен для подачи питания на принтер, а кнопка используется для тестирования принтера. Когда на принтер подано питание, если мы нажмем кнопку самотестирования, принтер распечатает лист, на котором будут распечатаны характеристики и образцы строк. Лист самотестирования показан ниже.
Как мы видим, для связи с микроконтроллерным блоком принтер использует скорость 9600 бит/с. Принтер может печатать символы ASCII. Взаимодействие очень простое, мы можем напечатать что угодно, просто используя UART и передавая через него строку или символ.
Принтер работает от блока питания 5–9В, мы будем использовать источник питания 9В 2А, который может запитать как принтер, так и Arduino Uno. Принтеру требуется ток более 1,5 А для нагрева головки. Это является его недостатком, так как он потребляет огромный ток во время процесса печати.
Что нам понадобится
Чтобы выполнить данный проект, нам понадобится следующее:
- макетная плата;
- перемычки;
- плата Arduino Uno с USB кабелем;
- компьютер с Arduino IDE;
- резистор 10 кОм;
- тактильная кнопка;
- термопринтер CSN A1 с рулоном бумаги;
- источник питания 9В 2А.
Принципиальная схема и пояснения
Схема управления принтером с помощью Arduino Uno показана ниже.
Схема проста. Мы используем резистор для обеспечения состояния по умолчанию на входном выводе кнопки D2. Когда кнопка нажата, уровень на D2 станет высоким, а это условие используется для запуска печати. Для питания термопринтера и платы Arduino используется один источник питания 9В 2А. Важно проверить полярность источника питания перед его подключением к плате Arduino Uno. У данного источника используется разъем баррель с положительным выводом в центре.
Мы собрали схему на макетной плате и проверили ее.
Программа Arduino
Полный код программы Arduino и демонстрационное видео приведены в конце статьи. Здесь мы объясним несколько важных фрагментов кода.
Во-первых, мы объявляемы выводы кнопки (вывод 2) и светодиода на плате (вывод 13).
int led = 13;
int SW = 2;
Затем устанавливаются несколько переменных для задержки для устранения дребезга контактов и состояния нажатия кнопки.
int is_switch_press = 0; // Для обнаружения состояния нажатия кнопки
int debounce_delay = 300; // Задержка для устранения дребезга контактов
В функции setup
мы настроили вывод светодиода на выход, а вывод кнопки на вход. Также мы настроили UART на скорость 9600 бит/с.
void setup()
{
pinMode(led, OUTPUT);
pinMode(SW, INPUT);
Serial.begin(9600);
}
В основном цикле мы сначала проверяем, нажата ли кнопка, затем снова ждем некоторое время и снова проверяем, действительно ли кнопка нажата; если кнопка всё еще нажата даже после задержки, мы печатаем настроенные строки в UART, то есть на термопринтере.
В начале печати мы зажигаем светодиод на плате, а после печати гасим его.
void loop()
{
is_switch_press = digitalRead(SW); // чтение состояния нажатия кнопки
if (is_switch_press == HIGH)
{
delay(debounce_delay); // задержка устранения дребезга контактов при нажатии кнопки
if(is_switch_press == HIGH)
{
digitalWrite(led, HIGH);
Serial.println("Hello");
delay(100);
Serial.println("This is a Thermal printer interface");
Serial.println("with Arduino UNO.");
delay(100);
Serial.println("Circuitdigest.com");
Serial.println ("\n\r");
Serial.println ("\n\r");
Serial.println ("\n\r");
Serial.println ("---------------------------- \n \r");
Serial.println ("Thank You.");
Serial.println ("\n\r");
Serial.println ("\n\r");
Serial.println ("\n\r");
digitalWrite(led, LOW);
}
}
else
{
digitalWrite(led, LOW);
}
}
Смотрите полный код Arduino и демонстрационное видео ниже.
Код
// Объявление выводов
int led = 13;
int SW = 2;
// Переменные
int is_switch_press = 0; // Для обнаружения состояния нажатия кнопки
int debounce_delay = 300; // Задержка для устранения дребезга контактов
void setup()
{
pinMode(led, OUTPUT);
pinMode(SW, INPUT);
Serial.begin(9600);
}
void loop()
{
is_switch_press = digitalRead(SW); // чтение состояния нажатия кнопки
if (is_switch_press == HIGH)
{
delay(debounce_delay); // задержка устранения дребезга контактов при нажатии кнопки
if(is_switch_press == HIGH)
{
digitalWrite(led, HIGH);
Serial.println("Hello");
delay(100);
Serial.println("This is a Thermal printer interface");
Serial.println("with Arduino UNO.");
delay(100);
Serial.println("Circuitdigest.com");
Serial.println ("\n\r");
Serial.println ("\n\r");
Serial.println ("\n\r");
Serial.println ("---------------------------- \n \r");
Serial.println ("Thank You.");
Serial.println ("\n\r");
Serial.println ("\n\r");
Serial.println ("\n\r");
digitalWrite(led, LOW);
}
}
else
{
digitalWrite(led, LOW);
}
}