Взаимодействие Arduino с термопринтером

Добавлено 2 января 2019 в 04:15

Вы только что совершили платеж в ресторане и получили небольшой чек или сняли наличные в банкомате и получили квитанцию об операции. Эти чеки печатаются с помощью термопринтера или чекового принтера.

Термопринтер – это доступное и экономически эффективное решение для печати небольших чеков или квитанций. Это простое в интеграции решение доступно везде. В принтере используется термохромная бумага, особый тип бумаги, которая при воздействии определенного количества тепла становится черного цвета. Для печати на этой бумаге термопринтер использует специальный процесс нагрева. Головка принтера нагревается специальным электрооборудованием для поддержания определенной температуры. Когда термобумага проходит через его головку, ее тепловое покрытие чернеет там, где головка нагрета.

В данном руководстве мы будем связывать термопринтер с платой Arduino Uno. Проект будет работать следующим образом:

  1. принтер будет подключен к Arduino Uno;
  2. тактильная кнопка будет подключена к плате Arduino для обеспечения опции «нажмите для печати»;
  3. встроенный светодиод на Arduino сообщит о состоянии печати, он будет светиться только во время печати.
Взаимодействие 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 мм
НадежностьMCBF5 миллионов линий
ИнтерфейсПоследовательный (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 А для нагрева головки. Это является его недостатком, так как он потребляет огромный ток во время процесса печати.

Что нам понадобится

Чтобы выполнить данный проект, нам понадобится следующее:

  1. макетная плата;
  2. перемычки;
  3. плата Arduino Uno с USB кабелем;
  4. компьютер с Arduino IDE;
  5. резистор 10 кОм;
  6. тактильная кнопка;
  7. термопринтер CSN A1 с рулоном бумаги;
  8. источник питания 9В 2А.

Принципиальная схема и пояснения

Схема управления принтером с помощью Arduino Uno показана ниже.

Схема подключения термопринтера к Arduino Uno
Схема подключения термопринтера к 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);
  }    
}

Видео

Теги

ArduinoПринтерТермопринтер

На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.

В случае комментирования в качестве гостя (без регистрации на disqus.com) для публикации комментария требуется время на премодерацию.