Наверняка многие из вас расплачивались где-нибудь картой или снимали с нее деньги в банкомате и после этого получали чек об произведенной операции. В большинстве случаев этот чек печатается с помощью термопринтера (Thermal Printer — термографический принтер, термопечатающее устройство (с матрицей, имеющей нагревательные элементы), устройство термопечати) или чекового принтера.
В настоящее время подобные термопринтеры достаточно дешево стоят и их сравнительно просто интегрировать в современные электронные устройства. Эти принтеры используют специальную термобумагу, которая меняет свой цвет на черный в тех местах, где к ней приложено определенное количество тепла. Термопринтеры используют специальный нагревательный процесс чтобы печатать на этой бумаге. Головка принтера нагревается электрическим током до определенной температуры и эта температура на ней поддерживается во время работы принтера. Когда термобумага проходит через эту головку принтера она меняет свой цвет на черный в тех местах, где ее нагрела головка принтера.
В этой статье мы рассмотрим подключение термопринтера к плате Arduino Uno. Для запуска процесса печати будет использоваться тактильный переключатель (tactile switch), а встроенный в плату Arduino Uno светодиод будет информировать о статусе печати – он будет гореть во время печати.
Общие принципы работы термопринтера
В этом проекте мы будем использовать термопринтер CSN A1 Thermal Printer от компании Cashino, который отличается невысокой стоимостью и его достаточно просто купить.
Технические характеристики данного принтера приведены на следующем рисунке.
На обратной стороне принтера мы можем увидеть следующие соединения.
TTL connector содержит контакты Rx и Tx для последовательной связи с микроконтроллером. Мы будем использовать протокол RS232 для связи с принтером. Power connector используется для подачи питания на принтер, а кнопка служит для самодиагностики принтера. Если на принтер подано питание и мы нажмем эту кнопку принтер напечатает следующий лист самодиагностики:
Как можно видеть из этого листа принтер использует скорость 9600 бод/с для связи с микроконтроллером. Принтер может печатать символы ASCII. Взаимодействие с принтером достаточно простое – для этого необходимо использовать последовательный порт связи (UART) и с его помощью передавать на принтер строки или символы.
Принтер работает от напряжения 5-9V, мы будем использовать источник питания 9V 2A, от которого можно запитать и принтер, и плату Arduino Uno. Принтер требует ток более 1.5A для того чтобы нагреть свою головку до нужной температуры. Большой потребляемый ток во время печати является недостатком термопринтеров.
Необходимые компоненты
- Плата Arduino Uno с USB кабелем (купить на AliExpress).
- Макетная плата.
- Соединительные провода.
- Компьютер с установленной Arduino IDE.
- Резистор 10 кОм (купить на AliExpress).
- Тактильный переключатель (tactile switch).
- Термопринтер Thermal Printer CSN A1 с рулоном бумаги (купить на AliExpress).
- Источник питания 9V 2A.
Работа схемы
Схема подключения термопринтера к плате Arduino Uno представлена на следующем рисунке.
После сборки схемы на макетной плате у вас должна получиться примерно следующая конструкция.
На следующем рисунке показан пример работы нашей программы по управлению термопринтером.
Объяснение программы для Arduino
Полный код программы и видео с демонстрацией работы проекта приведены в конце статьи, здесь же мы рассмотрим его основные фрагменты.
Сначала мы инициализируем контакт для подключения кнопки (Pin 2) и контакт, к которому подключен встроенный светодиод (Pin13).
1 2 |
int led = 13; int SW = 2; |
Также объявим переменную, в которой будет храниться задержка для устранения дребезга контактов, и переменную, в которой будет храниться статус (состояние) кнопки (нажата или отжата).
1 2 |
int is_switch_press = 0; // переменная для хранения состояния кнопки int debounce_delay = 300; //задержка для устранения дребезга контактов |
В функции setup мы зададим режим работы на вывод данных для контакта, к которому подключен светодиод, и режим работы на ввод данных для контакта, к которому подключена кнопки. Также установим скорость последовательного порта UART 9600 бод/с.
1 2 3 4 5 6 7 8 |
void setup() { /* * This function is used to set the pin configuration */ pinMode(led, OUTPUT); pinMode(SW, INPUT); Serial.begin(9600); } |
В основном цикле loop мы сначала будем проверять нажата ли кнопка или нет, затем ждем некоторое время и снова проверяем нажата ли кнопка или нет. Если и после задержки кнопка все еще остается нажатой мы начинаем печать на термопринтере.
При начале печати мы зажигаем светодиод, а после завершения печати мы его выключаем.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
void loop() { is_switch_press = digitalRead(SW); // Reading the Switch press status if (is_switch_press == HIGH){ delay(debounce_delay); // debounce delay for button press 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); } } |
Исходный код программы (скетча)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
/* * This code is to use in Arduino UNO for interfacing the Thermal Printer. * By:- Sourav Gupta * Date:- 14.11.2018 * Circuitdigest.com */ //объявления контактов int led = 13; int SW = 2; int is_switch_press = 0; // переменная для хранения состояния кнопки int debounce_delay = 300; //задержка для устранения дребезга контактов кнопки void setup() { /* * This function is used to set the pin configuration */ 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); } } |
2 ответа к “Подключение термопринтера (Thermal Printer) к Arduino Uno”
я не программист, но мне кажется, что после задержки нужно еще раз опросить состояние входа, иначе в переменной будет храниться первоначальное (до задержки) значение, я про этот код:
is_switch_press = digitalRead(SW); // чтение состояния нажатия кнопки
if (is_switch_press == HIGH)
{
delay(debounce_delay); // задержка устранения дребезга контактов при нажатии кнопки
is_switch_press = digitalRead(SW); // повторное чтение
if(is_switch_press == HIGH)
Да, скорее всего вы правы и подобную строчку целесообразно добавить в код скетча