2016년 8월 2일 화요일

영수증 인쇄용 감열식 프린터를 라즈베리 파이에서 사용하기 (Using Thermal Printer for Receipt printing in Raspberry Pi)

라즈베리 파이에서 CUPS를 사용해 감열식 프린터를 연결해 보도록 하겠다.

CUPS는 Common Unix Printing System의 약자로 오픈소스로 개발된 유닉스용 프린터 스풀링 및 스케쥴링 시스템이다. 이 CUPS의 재미있는 점 중에 하나는 filtering system을 가지고 있어 프린팅 시 다른 포맷간의 변환이 가능하다는 것이다. 예를 들어 포스트 스크립트를 지원하지 않는 프린터에 출력하기 위해 PDF 그래픽을 rasterizing 할 수 있다.

인터넷을 찾아보면 감열식 프린터용 CUPS 필터를 구할 수 있다. 약간의 설정 과정을 거치면 영수증 인쇄용 감열식 프린터에서도 지금껏 보지 못했던 깨끗한 그래픽 이미지를 출력할 수 있게 된다.

이 포스트는 Stewart Russell의 튜토리얼을 기반으로 작성되었다.

필요한 아이템

* 라즈베리 파이
* Thermal Printer
* 감열지 롤
* 5V Adapter (최소 2A 이상이 필요)
* 최신 버젼 Raspbian Jessie

감열식 프린터는 알리 익스프레스 등에서 쉽게 구할 수 있고 (약 $50 정도), 감열지 롤은 옥션등에서 구하면 된다.


감열식 프린터를 케이스에 집어넣은 사진이다. 


왼쪽의 바를 들어 올리면 케이스가 열려 감열지 롤을 집어 넣을 수 있다.


프린터 바닥 면에 두개의 커넥터가 있다. 왼쪽 커넥터는 전원 공급용으로 5V 2A 이상의 아답터를 연결해 줘야 한다. 충분한 전류를 공급해 주지 못하면 프린터가 제대로 동작하지 않는다.

오른쪽 커넥터는 출력 데이터를 받기 위한 시리얼 포트이다. 커넥터 위쪽에 쓰여져 있는것처럼 TTL 레벨이므로 라즈베리 파이의 UART 핀과 직접 연결(이 경우 디바이스 명은 '/dev/ttyAMA0'가 됨)하거나 또는 라즈베리 파이에 USB-to-Serial 컨버터를 통해 연결(이 경우 디바이스 명은 '/dev/ttyUSB0'가 됨)해 주면 된다.


라즈베리 파이의 UART에 직접 연결하는 경우이다.


이 경우 40핀 커넥터에서 GND, TxD, RxD의 위치는 위의 그림을 참조하면 된다.





라즈베리 파이에 USB-to-Serial 컨버터를 통해 연결하는 경우이다.

위의 사진과 같은 USB-to-Serial 컨버터를 라즈베리 파이에 USB 케이블로 연결해 주고 왼쪽의 핀들 중에 GND, RXI(RxD), TXO(TxD) 만 프린터에 연결해 주면 된다. 주의할 것은 위의 모듈에서도 +5V 전원이 나오긴 하지만 공급할 수 있는 전류가 작기 때문에 감열식 프린터의 VH핀에 저 모듈의 5V를 연결해도 프린터가 제대로 동작할 수 없다. 꼭 별도의 전원 아답터를 사용해 줘야만 한다.

이제 프린터에 전원을 넣어주는데 만일 첫번째 경우(라즈베리 파이의 UART에 집접 연결)에서 이상한 값들을 막 찍어내면 곧바로 프린터 전원을 끄고 raspi-config를 실행시킨 후 'disable the serial console'을 선택한 다음 리부팅 시켜주면 된다.






프린터가 테스트 페이지를 출력하도록 하고 싶으면 감열지 롤을 넣어 준 다음 Feed 버튼을 누른 상태로 전원을 연결시켜 주면 된다. 출력된 테스트 페이지를 보면 baud rate이라는 부분을 확인할 수 있는데 이게 바로 라즈베리 파이와 프린터가 시리얼 통신을 하기 위한 통신속도이다. 대부분의 경우 9600 baud일 것이지만 다른 값일수도 있다.

이제 프린터가 연결되고 전원을 공급했으면 먼저 간단한 글자를 출력해 본다.

$ stty -F /dev/ttyAMA0 9600
$ echo -e "Hello World.\\n\\n" > /dev/ttyAMA0

위에서 빨간색 부분이 baud rate이므로 테스트 페이지에서 확인한 값으로 바꿔주면 된다. 파란색 부분은 프린터 연결 방법에 따라 라즈베리 파이의 UART에 집접 연결한 경우는 ttyAMA0, USB-to-Serial을 통해 연결한 경우는 ttyUSB0를 사용하면 된다.

만일 프린터가 이상한 글자를 출력한다면 통신속도가 틀린 것이므로 다시 한번 baud rate를 확인해 봐야 한다.

때로 출력되는 내용의 앞 부분에 약간의 깨진 글자가 나올 수도 있는데 그건 시리얼 버퍼에 남아있는 데이터 때문이다. 프린터가 완전히 설정되고 나면 앞으로는 그런 문제는 발생하지 않는다.

아무 반응이 없다면 다음을 확인해 봐야 한다.

* 전원이 제대로 연결 되었는가? 5V 2A이상의 전원이 공급되어야만 한다.
* 감열지가 프린터 베이에 제대로 넣어 져 있는가
* 프린터와 라즈베리 파이간에 TxD/RxD가 연결되어 있고 서로 크로스 되어 있는가 (즉 한쪽의 Rx는 다른쪽의 Tx로 연결) 프린터와 라즈베리 파이의 GND가 연결되어 있는가

프린터의 기본 설정이 끝났으면 CUPS 소프트웨어를 설치해야 한다.

$ sudo apt-get update
$ sudo apt-get install libcups2-dev libcupsimage2-dev git build-essential cups system-config-printer

파일이 크지는 않지만 여러개의 작은 조각으로 나뉘어 있어 설치에는 상당한 시간이 걸린다.

설치가 끝나면 감열식 프린터를 위한 CUPS filter를 다운받아 설치해 준다. 

$ git clone https://github.com/klirichek/zj-58.git
Cloning into 'zj-58'...
remote: Counting objects: 23, done.
remote: Total 23 (delta 0), reused 0 (delta 0), pack-reused 23
Unpacking objects: 100% (23/23), done.
Checking connectivity... done.
$ cd zj-58/
$ make
gcc -Wl,-rpath,/usr/lib -Wall -fPIC -O3 -c rastertozj.c
gcc  -o rastertozj rastertozj.o -lcupsimage -lcups

$ sudo ./install
[....] Stopping cups (via systemctl): cups.serviceWarning: Stopping cups.service, but it can still be activated by:
  cups.path
  cups.socket
. ok
/home/pi/tmp/zj-58
[ ok ] Starting cups (via systemctl): cups.service.
$


이제부터는 GUI환경에서 진행한다.


Pi의 메뉴에서 Preferences -> Print Settings를 선택한다. 만일 Print Settings가 보이지 않는다면 ZJ-58 CUPS filter가 설치되지 않은 것이다. 그 경우 위의 단계를 다시 한번 확인하고 재시도 해 본다.


아직 설정된 프린터가 없으므로 위와 같은 화면이 나올 것이다. 여기서 'Add' 버튼을 클릭한다.


USB 프린터(USB-to-Serial로 연결한 경우)인 경우는 왼쪽의 'Devices' 부분에 'USB Serial Port #1'이 보일 것이다. 이 항목을 선택하고 'Forward' 버튼을 클릭하면 된다.


TTL 프린터(라즈베리 파이의 Tx/Rx를 직접 연결한 경우)인 경우는 'Enter URI'를 선택해 주고 오른쪽의 Enter device URI 필드에 'serial:/dev/ttyAMA0?baud=19200' 을 넣어주면 된다. 물론 19200은 통신속도이므로 자신에게 맞는 값으로 바꿔주면 된다. 다 입력한 후 'Forward' 버튼을 클릭하면 된다.


이제 프린터 목록에서 자신의 프린터를 선택해 주면 된다. 목록을 아래로 스크롤 해 보면 맨 아래쪽에 'Zijiang'가 보일 것이다. 이 항목을 선택하고 'Forward'를 클릭한다.


프린터에 해당하는 드라이버를 선택하는 화면인데 Zijiang ZJ-58 하나밖에 없으므로 첫번째 항목을 선택하고 'Forward'를 클릭하면 된다.


프린터의 이름, 설치 위치 등을 지정할 수 있는 화면이다. 변경을 원하면 해도 되고 그냥 넘어가도 된다.


설정이 끝났으므로 Print Settings List에 다음과 같이 ZJ-58 프린터의 아이콘이 생긴걸 볼 수 있다.


ZJ-58 아이콘을 선택한 다음 Printer 메뉴에서 Properties를 선택한다.
 

Cut Options에서 'Feed distance after print' 항목을 'feed 12 mm'로 변경하고 'OK' 버튼을 클릭한다.

이제 모든 프린터 설정이 완료되었으므로 라즈베리 파이에서 'lp' 또는 'lpr' 명령으로 프린터를 사용할 수 있다.

터미널에서 다음 명령을 입력해 본다.

$ echo "Hello world." | lpr

감열지에 'Hello world.'를 출력하지만 이전의 출력과는 다르게 프린터 내부의 폰트를 사용하지 않았다. 라즈베리 파이의 프린팅 시스템에서 텍스트를 비트맵 이미지화 해서 출력했기 때문에 글자 크기등의 설정을 원하는대로 변경할 수 있다.

비트맵 이미지 출력도 테스트 해 본다.

$ lpr -o fit-to-page /usr/share/raspberrypi-artwork/raspberry-pi-logo.png

위의 명령에서 파란색 부분 '-o fit-to-page'이 중요하다. 이 옵션이 없으면 실제 크기로 출력하기 때문에 대부분의 경우 전체 이미지 중에 왼쪽의 좁은 영역만 출력하게 된다.


거의 대부분의 raster format을 지원하고 PDF도 지원한다. SVG 포맷은 아직 지원하지 않아 SVG 이미지를 출력하려고 하면 매우 긴 텍스트가 출력된다. SVG를 출력하고 싶으면 LibreOffice Draw같은 어플리케이션에서 SVG를 열어 PDF로 저장한 다음 출력하면 된다.

--
* Adafruit 사이트의 Networked Thermal Printer using Raspberry Pi and CUPS를 참고하여 작성하였음

댓글 없음:

댓글 쓰기