아두이노 열전사 프린터 사용기
아두이노

아두이노 열전사 프린터 사용기

반응형

 

 

 

알리에서 주문한 열전사 프린터가 먼저 도착하여 (지금껏 주문한 물건중 제일 오래 걸렸지만) 테스트겸 사용해보았다. (TTL 방식)

 

구입처는 링크를 참고하자.

 

(판매 링크)

반응형

 

구성품은 열전사 프린터, 케이블, 감열지 1롤이다. 감열지는 그리 많은 양이 아니기 때문에 추가로 넉넉하게 구매해야할 것 같다.

 

프린터의 뒷면에는 각 핀의 배치가 적혀있다. 뒷면을 감싸는 판은 플라스틱인데 두께가 매우 얇고 부실하다는 것이 좀 아쉽다.

 

뒷면을 열어보면 내부가 훤히 보인다. 프린터는 TTL방식과 RS232방식 2가지로 판매되는데, 아두이노로 작동시킬 계획이면 TTL방식으로 구매해야한다. RS232는 TTL과 달리 메인보드에 변환 칩이 하나 추가된다.

 

그밖의 다양한 스펙 등은 아래 파일을 참고하면 된다.

mini-thermal-receipt-printer.pdf
다운로드

 

 

이제 열전사 프린터를 테스트 해보자 아두이노와의 배선은 위의 회로를 참고하자.

 

전원은 5~9V에서 사용가능하지만 5V사용시 2A이상의 전원에 연결해야 안정적으로 사용가능하다. 필자의 경우 5V 2A출력의 휴대폰 충전기를 이용했다.

 

감열지는 프린터의 뚜껑을 연뒤 감열지를 밖으로 조금 빼낸뒤 롤러로 누르듯이 뚜껑을 닫으면 된다. 

 

프린터를 켜기전 프린터의 버튼을 누른 상태로 전원을 연결하면 테스트 출력이 시작된다.

 

 

위는 테스트 출력된 용지의 모습이다. 여기서 말풍선으로 표시한 부분의 숫자를 잘 기억해두자. 이 숫자가 바로 프린터의 통신 속도이다. 구매한 프린터의 종류에 따라 이 값은 달라질 수 있다.

 

아두이노를 이용해 열전사 프린터를 제어하기 전에 라이브러리 하나를 추가해야한다.

Adafruit-Thermal-Printer-Library-master.zip
다운로드

 

라이브러리를 추가한뒤 예제 파일 중 A_printer test를 실행시켜 보자 아래는 해당 예제코드의 일부이다.

 

/*------------------------------------------------------------------------
  Example sketch for Adafruit Thermal Printer library for Arduino.
  Demonstrates a few text styles & layouts, bitmap printing, etc.

  IMPORTANT: DECLARATIONS DIFFER FROM PRIOR VERSIONS OF THIS LIBRARY.
  This is to support newer & more board types, especially ones that don't
  support SoftwareSerial (e.g. Arduino Due).  You can pass any Stream
  (e.g. Serial1) to the printer constructor.  See notes below.

  You may need to edit the PRINTER_FIRMWARE value in Adafruit_Thermal.h
  to match your printer (hold feed button on powerup for test page).
  ------------------------------------------------------------------------*/

#include "Adafruit_Thermal.h"
#include "adalogo.h"
#include "adaqrcode.h"

// Here's the new syntax when using SoftwareSerial (e.g. Arduino Uno) ----
// If using hardware serial instead, comment out or remove these lines:

#include "SoftwareSerial.h"
#define TX_PIN 3 // Arduino transmit  YELLOW WIRE  labeled RX on printer
#define RX_PIN 2 // Arduino receive   GREEN WIRE   labeled TX on printer

SoftwareSerial mySerial(RX_PIN, TX_PIN); // Declare SoftwareSerial obj first
Adafruit_Thermal printer(&mySerial);     // Pass addr to printer constructor
// Then see setup() function regarding serial & printer begin() calls.

// Here's the syntax for hardware serial (e.g. Arduino Due) --------------
// Un-comment the following line if using hardware serial:

//Adafruit_Thermal printer(&Serial1);      // Or Serial2, Serial3, etc.

// -----------------------------------------------------------------------

void setup() {

  // This line is for compatibility with the Adafruit IotP project pack,
  // which uses pin 7 as a spare grounding point.  You only need this if
  // wired up the same way (w/3-pin header into pins 5/6/7):
  pinMode(7, OUTPUT); digitalWrite(7, LOW);

  // NOTE: SOME PRINTERS NEED 9600 BAUD instead of 19200, check test page.
  mySerial.begin(9600);  // Initialize SoftwareSerial
  //Serial1.begin(19200); // Use this instead if using hardware serial
  printer.begin();        // Init printer (same regardless of serial type)

  // The following calls are in setup(), but don't *need* to be.  Use them
  // anywhere!  They're just here so they run one time and are not printed
  // over and over (which would happen if they were in loop() instead).
  // Some functions will feed a line when called, this is normal.

  // Test inverse on & off
  printer.inverseOn();
  printer.println(F("Inverse ON"));
  printer.inverseOff();

  // Test character double-height on & off
  printer.doubleHeightOn();
  printer.println(F("Double Height ON"));
  printer.doubleHeightOff();

  // Set text justification (right, center, left) -- accepts 'L', 'C', 'R'
  printer.justify('R');
  printer.println(F("Right justified"));
  printer.justify('C');
  printer.println(F("Center justified"));
  printer.justify('L');
  printer.println(F("Left justified"));

  // Test more styles
  printer.boldOn();
  printer.println(F("Bold text"));
  printer.boldOff();

  printer.underlineOn();
  printer.println(F("Underlined text"));
  printer.underlineOff();

  printer.setSize('L');        // Set type size, accepts 'S', 'M', 'L'
  printer.println(F("Large"));
  printer.setSize('M');
  printer.println(F("Medium"));
  printer.setSize('S');
  printer.println(F("Small"));

  printer.justify('C');
  printer.println(F("normal\nline\nspacing"));
  printer.setLineHeight(50);
  printer.println(F("Taller\nline\nspacing"));
  printer.setLineHeight(); // Reset to default
  printer.justify('L');

  // Barcode examples:
  // CODE39 is the most common alphanumeric barcode:
  printer.printBarcode("ADAFRUT", CODE39);
  printer.setBarcodeHeight(100);
  // Print UPC line on product barcodes:
  printer.printBarcode("123456789123", UPC_A);

  // Print the 75x75 pixel logo in adalogo.h:
  printer.printBitmap(adalogo_width, adalogo_height, adalogo_data);

  // Print the 135x135 pixel QR code in adaqrcode.h:
  printer.printBitmap(adaqrcode_width, adaqrcode_height, adaqrcode_data);
  printer.println(F("Adafruit!"));
  printer.feed(2);

  printer.sleep();      // Tell printer to sleep
  delay(3000L);         // Sleep for 3 seconds
  printer.wake();       // MUST wake() before printing again, even if reset
  printer.setDefault(); // Restore printer to defaults
}

void loop() {
}

  

 

 

예제 코드에서 해당 부분을 아래와 같이 수정해야한다. 특히 통신속도는 19200으로 되어있는데, 자신의 프린터에 맞게 수정해야한다. 필자는 9600으로 수정했다.

 

#define TX_PIN 3 // Arduino transmit  YELLOW WIRE  labeled RX on printer
#define RX_PIN 2 // Arduino receive   GREEN WIRE   labeled TX on printer

mySerial.begin(9600);  // Initialize SoftwareSerial

 

예제 파일을 실행하면 위의 사진과 같이 출력된다. (Adafruit에서 제작한 라이브러리이기 때문에 해당 로고가 같이 출력된다.)

 

 

 

 

 

이제 열전사 프린터를 사용할 준비는 끝났다. 여기서 라이브러리의 모든 기능을 설명하긴 어렵고 간단하게 이미지를 출력하는 방법을 소개하려고 한다.

 

열전사 프린터로 이미지를 출력하기 위해서는 이미지를 비트맵 형식으로 변환해야 한다. 우선 아래의 프로그램을 다운받는다.

ezBMP.exe
다운로드

 

다음으로 변환할 이미지를 그림판으로 불러온 뒤, 이미지의 크기를 가로폭이 400픽셀 이하로 설정하자. 크기가 너무크면 아두이노에 업로드가 되지 않을 가능성이 크다.

 

위의 프로그램을 실행한 뒤,  크기가 변환된 이미지를 불러오자.

 

이미지는 흑백 즉 명암이 뚜렷한 이미지가 좋다. 이미지를 불러왔다면 상단 메뉴에서 W/B 1bit로 설정하고 변환 버튼을 누른다.

 

 

변환된 모습이다. 프린터에 출력될때는 흑백이 반전되어 출력 된다는 것을 알아두면 좋다. 이제 저장 버튼을 누른다.

 

 

1200px-PEO_M14_EBR.c
다운로드

 

저장된 파일은 C코드 파일이므로 적당한 프로그램으로 열면된다. 필자의 경우 간단한 프로그램인 DEV C++를 이용해 파일을 열었다. (파일도 같이 첨부했다.)  

 

코드의 내용중 초반에 등장하는 const unsigned char IMG_1200px-PEO_M14_EBR[] = { } 안의 내용을 전부 복사해둔다. (IMG_1200px-PEO_M14_EBR는 이미지 파일 이름이다.)

 

이제 아두이노 IDE로 돌아와  A_printer test 예제를 다시한번 실행한다. 그리고 코드를 아래와 같이 수정한다.

/*------------------------------------------------------------------------
  Example sketch for Adafruit Thermal Printer library for Arduino.
  Demonstrates a few text styles & layouts, bitmap printing, etc.

  IMPORTANT: DECLARATIONS DIFFER FROM PRIOR VERSIONS OF THIS LIBRARY.
  This is to support newer & more board types, especially ones that don't
  support SoftwareSerial (e.g. Arduino Due).  You can pass any Stream
  (e.g. Serial1) to the printer constructor.  See notes below.

  You may need to edit the PRINTER_FIRMWARE value in Adafruit_Thermal.h
  to match your printer (hold feed button on powerup for test page).
  ------------------------------------------------------------------------*/

#include "Adafruit_Thermal.h"
#include "adalogo.h"
#include "adaqrcode.h"

// Here's the new syntax when using SoftwareSerial (e.g. Arduino Uno) ----
// If using hardware serial instead, comment out or remove these lines:

#include "SoftwareSerial.h"
#define TX_PIN 3 // Arduino transmit  YELLOW WIRE  labeled RX on printer
#define RX_PIN 2 // Arduino receive   GREEN WIRE   labeled TX on printer

SoftwareSerial mySerial(RX_PIN, TX_PIN); // Declare SoftwareSerial obj first
Adafruit_Thermal printer(&mySerial);     // Pass addr to printer constructor
// Then see setup() function regarding serial & printer begin() calls.

// Here's the syntax for hardware serial (e.g. Arduino Due) --------------
// Un-comment the following line if using hardware serial:

//Adafruit_Thermal printer(&Serial1);      // Or Serial2, Serial3, etc.

// -----------------------------------------------------------------------

void setup() {

  // This line is for compatibility with the Adafruit IotP project pack,
  // which uses pin 7 as a spare grounding point.  You only need this if
  // wired up the same way (w/3-pin header into pins 5/6/7):
  pinMode(7, OUTPUT); digitalWrite(7, LOW);

  // NOTE: SOME PRINTERS NEED 9600 BAUD instead of 19200, check test page.
  mySerial.begin(9600);  // Initialize SoftwareSerial
  //Serial1.begin(19200); // Use this instead if using hardware serial
  printer.begin();        // Init printer (same regardless of serial type)

  // The following calls are in setup(), but don't *need* to be.  Use them
  // anywhere!  They're just here so they run one time and are not printed
  // over and over (which would happen if they were in loop() instead).
  // Some functions will feed a line when called, this is normal.

  // Print the 75x75 pixel logo in adalogo.h:
  printer.printBitmap(adalogo_width, adalogo_height, adalogo_data);

}

void loop() {
}

 

이제 같이 열린 adalogo.h의 헤더파일을 아래와 같이 수정한다.

#ifndef _adalogo_h_
#define _adalogo_h_

#define adalogo_width  300
#define adalogo_height 688

static const uint8_t PROGMEM adalogo_data[] = {


};

#endif // _adalogo_h_

static const uint8_t PROGMEM adalogo_data[] = { } 의 내용을 아까 복사한 비트맵을 붙여넣어주면 된다.

 

#define adalogo_width  300 , #define adalogo_height 688 이 부분의 숫자는 이미지의 가로와 세로의 픽셀수를 입력하면된다.

 

이제 아두이노에 업로드를 하면, 바로 인쇄가 시작된다.

 

완성된 출력물이다. 출력 품질을 높이려면 좀더 고용량의 전원에 연결하면 된다.

 

추가로 블로그의 로고도 출력해 보았다. 이제 이 프린터로 몇가지 프로젝트를 더 진행해볼 계획이다.

반응형
    # 테스트용