Термопринтеры в настоящее время находят широкое применение во всех заведениях, где требуется печать торгового (кассового) чека – магазины, торговые центры, системы электронной очереди и т.п. Они достаточно дешевы и отлично подходят для этих целей. Термопринтеры от других принтеров отличает специальный процесс печати, использующий термографическую бумагу (термобумагу). Головка принтера нагревается до определенной температуры и в местах, в которых она касается термобумаги, формируется точка черного цвета.
В данной статье мы рассмотрим подключение термопринтера CSN A1 к микроконтроллеру PIC16F877A. Для запуска процесса печати в нашем проекте будет использоваться тактильный переключатель, а светодиод будет показывать состояние печати – он будет загораться на время процесса печати.
Ранее на нашем сайте мы рассматривали подключение аналогичного термопринтера к плате Arduino.
Общие сведения о термопринтере CSN A1
В нашем проекте мы будем использовать термопринтер CSN A1 от компании Cashino, который относительно недорого стоит. Внешний вид торцевой части данного термопринтера приведен на следующем рисунке.
Технические характеристики термопринтера CSN A1 приведены в следующей таблице.
На обратной стороне термопринтера можно увидеть имеющиеся у него разъемы.
Разъем TTL можно использовать для подключения к последовательному порту микроконтроллера по протоколу RS232 (контакты Rx и Tx). Разъем питания используется для подачи питания на термопринтер, а кнопка – для самотестирования принтера, при ее нажатии принтер напечатает свои технические характеристики (спецификацию) как показано на следующем рисунке.
Как мы можем видеть, термопринтер использует скорость 9600 бод для взаимодействия с микроконтроллером. Принтер печатает ASCII символы.
Для работы принтера нужен источник питания 5V 2A поскольку во время процесса печати он потребляет достаточно большой ток – это является одним из самых существенных недостатков термопринтеров.
Необходимые компоненты
- Микроконтроллер PIC16F877A (купить на AliExpress).
- Термопринтер CSN A1 (купить на AliExpress).
- Программатор PICkit 3 (купить на AliExpress).
- Кварцевый генератор 20 МГц (купить на AliExpress).
- Конденсаторы 33 пФ (2 шт.) (купить на AliExpress).
- Резисторы 680 Ом, 4,7 кОм (2 шт.) (купить на AliExpress).
- Светодиод (купить на AliExpress).
- Тактильный переключатель (Tactile switch).
- Источник питания 5V 2A.
- Макетная плата.
- Соединительные провода.
Схема проекта
Схема подключения термопринтера CSN A1 к микроконтроллеру PIC16F877A представлена на следующем рисунке.
В схеме резистор 4,7 кОм используется для подключения контакта MCLR к питанию 5V. Также в схеме мы используем внешний кварцевый генератор на 20 МГц вместе с конденсаторами 33 пФ для задания тактовой частоты микроконтроллера. Светодиод подключен к контакту RB2 микроконтроллера PIC через токоограничивающий резистор 680 Ом. Тактильный переключатель (кнопка) подключен к контакту RB0 с помощью резистора на 4,7 кОм.
Термопринтер CSN A1 подключен к передающему контакту последовательного порта микроконтроллера PIC. Запитывается термопринтер через контакты 5V и GND.
Внешний вид собранной конструкции проекта показан на следующем рисунке.
Объяснение программы для микроконтроллера PIC
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
Первым делом в программе, как обычно, настроим биты конфигурации микроконтроллера.
1 2 3 4 5 6 7 8 9 10 11 12 |
// PIC16F877A Configuration Bit Settings // 'C' source line config statements // CONFIG #pragma config FOSC = HS // Oscillator Selection bits (HS oscillator) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled) #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled) #pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled) #pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3/PGM pin has PGM function; low-voltage programming enabled) #pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off) #pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control) #pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off) |
После этого зададим макросы для используемых контактов. Для работы с портом последовательной связи (UART) мы будем использовать заголовочный файл eusart1.h, внутри этого заголовочного файла последовательный порт будет конфигурироваться для работы на скорости 9600 бод.
1 2 3 4 5 6 7 8 9 |
#include <xc.h> #include "supporting_cfile\eusart1.h" /* * System hardware related macros */ #define _XTAL_FREQ 200000000 //Crystal Frequency, used in delay routine #define printer_sw PORTBbits.RB0 //this macro is for defining the printing switch #define notification_led PORTBbits.RB2 void system_init(void); |
В основной функции программы main мы будем проверять нажата ли кнопка и затем после небольшой задержки снова проверять нажата она или нет – это необходимо для устранения эффекта дребезга контактов. Если кнопка нажата, то бы будем зажигать светодиод и запускать процесс печати. Более подробно работу проекта вы можете посмотреть на видео, приведенном в конце статьи.
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 |
void main(void) { system_init(); while(1){ if(printer_sw == 1){ //switch is pressed __delay_ms(50); // debounce delay if (printer_sw == 1){ // switch is still pressed notification_led = 1; put_string("Hello! \n\r");//Print to Thermal printer __delay_ms(50); put_string("Thermal Printer Tutorial.\n\r"); __delay_ms(50); put_string("Circuit Digest. \n\r"); __delay_ms(50); put_string ("\n\r"); put_string ("\n\r"); put_string ("\n\r"); put_string ("---------------------------- \n \r"); put_string ("Thank You"); put_string ("\n\r"); put_string ("\n\r"); put_string ("\n\r"); notification_led = 0; } } } } |
Исходный код программы
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 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
/* * File: main.c * Project: Thermal Printer CSN-A1 Interfacing with pic16F877A * Author: Sourav Gupta. * Created on 08 September 2018, 16:15 */ // PIC16F877A Configuration Bit Settings // 'C' source line config statements // CONFIG #pragma config FOSC = HS // Oscillator Selection bits (HS oscillator) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled) #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled) #pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled) #pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3/PGM pin has PGM function; low-voltage programming enabled) #pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off) #pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control) #pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off) #include <xc.h> #include "supporting_cfile\eusart1.h" /* * System hardware related macros */ #define _XTAL_FREQ 200000000 //Crystal Frequency, used in delay routine #define printer_sw PORTBbits.RB0 //this macro is for defining the printing switch #define notification_led PORTBbits.RB2 void system_init(void); void main(void) { system_init(); while(1){ if(printer_sw == 1){ //если кнопка нажата __delay_ms(50); // задержка для устранения эффекта дребезга контактов if (printer_sw == 1){ // если кнопка все еще нажата notification_led = 1; put_string("Hello! \n\r");//Print to Thermal printer __delay_ms(50); put_string("Thermal Printer Tutorial.\n\r"); __delay_ms(50); put_string("Circuit Digest. \n\r"); __delay_ms(50); put_string ("\n\r"); put_string ("\n\r"); put_string ("\n\r"); put_string ("---------------------------- \n \r"); put_string ("Thank You"); put_string ("\n\r"); put_string ("\n\r"); put_string ("\n\r"); notification_led = 0; } } } } void system_init(void){ TRISBbits.TRISB0 = 1; // Setting Printing Switch as input (на ввод данных) TRISBbits.TRISB2 = 0; notification_led = 0; EUSART1_Initialize(); // инициализируем порт последовательной связи } |
Библиотеку eusart1.h для настройки последовательного порта связи можно скачать по следующей ссылке.