Наверняка многие из вас расплачивались где-нибудь картой или снимали с нее деньги в банкомате и после этого получали чек об произведенной операции. В большинстве случаев этот чек печатается с помощью термопринтера (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.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Работа схемы
Схема подключения термопринтера к плате Arduino Uno представлена на следующем рисунке.
Как видите, схема достаточно проста. Мы используем резистор 10 кОм чтобы обеспечить требуемое состояние по умолчанию (при не нажатой кнопке) на контакте D2. При нажатии кнопки (тактильного переключателя) на D2 подается напряжение высокого уровня (HIGH) – это условие для того чтобы принтер начал печатать. Источник питания 9V 2A используется для питания термопринтера и платы Arduino. Внимательно проверьте полярность источника питания перед подключением его к плате Arduino. Плата Arduino имеет штекер разъема питания с положительным контактом в центре.
После сборки схемы на макетной плате у вас должна получиться примерно следующая конструкция.
На следующем рисунке показан пример работы нашей программы по управлению термопринтером.
Объяснение программы для 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); } } |
я не программист, но мне кажется, что после задержки нужно еще раз опросить состояние входа, иначе в переменной будет храниться первоначальное (до задержки) значение, я про этот код:
is_switch_press = digitalRead(SW); // чтение состояния нажатия кнопки
if (is_switch_press == HIGH)
{
delay(debounce_delay); // задержка устранения дребезга контактов при нажатии кнопки
is_switch_press = digitalRead(SW); // повторное чтение
if(is_switch_press == HIGH)
Да, скорее всего вы правы и подобную строчку целесообразно добавить в код скетча