Raspberry Pi 5에서 POS-5890K 영수증 프린터로 사진 프린트하기

webnautes
By -
0

 Raspberry Pi 5에서 POS-5890K 영수증 프린터를 사용하여 사진 프린트를 해봤습니다..



2025. 11. 6  최초작성



참고

https://arnon.dk/printing-to-a-pos-5890k-thermal-printer-from-a-raspberry-pi/ 





1. 라즈베리파이의 USB 포트에 영수증 프린터를 연결하고 권한 설정을 해야합니다. .


우선 프린터가 정상적으로 라즈베리파이에 연결되었는지 확인합니다.

lsusb -vvv 명령을 실행한 후, 프린터가 잡힌 항목을 다음처럼 찾습니다.

여러 장치가 잡히는데 출력 결과에서 프린터만 남겨두었습니다. 노란색 부분이 보여야 합니다. 


$ lsusb -vvv

Bus 003 Device 002: ID 0416:5011 Winbond Electronics Corp. Virtual Com Port
Couldn't open device, some information will be missing
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass            0
  bDeviceSubClass         0
  bDeviceProtocol         0
  bMaxPacketSize0        64
  idVendor           0x0416 Winbond Electronics Corp.
  idProduct          0x5011 Virtual Com Port
  bcdDevice            2.00
  iManufacturer           1 STMicroelectronics
  iProduct                2 POS58 Printer USB
  iSerial                 3 Printer
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength       0x0020
    bNumInterfaces          1
    bConfigurationValue     1
    iConfiguration          5
    bmAttributes         0xc0
      Self Powered
    MaxPower              100mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass         7 Printer
      bInterfaceSubClass      1 Printer
      bInterfaceProtocol      2 Bidirectional
      iInterface              4
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x03  EP 3 OUT
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               0



위 로그에서 노란색으로 보이는  idVendor와 idProduct가 아래처럼 보이는 경우를 진행해봅니다. 


 idVendor           0x0416 Winbond Electronics Corp.

  idProduct          0x5011 Virtual Com Port



다음 경로의 파일을 생성합니다. 여기에선 nano 편집기를 사용합니다.

파일을 생성하려면 root 권한이 필요해서 sudo를 사용해야 합니다.


$ sudo nano /etc/udev/rules.d/99-usb.rules



다음 내용을 추가하는대 앞에서 빨간색으로 표시한 숫자를 여기에 똑같이 적어줘야 합니다. 


SUBSYSTEM=="usb", ATTR{idVendor}=="0416", ATTR{idProduct}=="5011", MODE="666"



Ctrl + O 누르고 엔터 눌러 저장하고 Ctrl + X를 눌러 nano편집기에서 빠져나옵니다.



적용하기 위해 라즈베리파이를 재부팅합니다.


$ sudo reboot 





2. 간단한 코드로 영수증 프린터로 문자열을 출력해봅니다.  



우선 필요한 파이썬 패키지를 설치합니다.

파이썬 패키지를 설치하려면 가상환경을 사용해야 합니다.




다음처럼 가상 환경 생성하면 escpos_env 폴더가 생성됩니다. 


pi@raspberrypi:~ $ python -m venv ~/escpos_env





가상 환경을 활성화합니다. 라즈베리파이를 재부팅하거나 터미널을 새로 열었다면 코드를 실행하기 위해  가상환경을 다시 활성화 해야합니다.


pi@raspberrypi:~ $ source ~/escpos_env/bin/activate




escpos 패키지를 설치합니다.


(escpos_env) pi@raspberrypi:~ $ pip install escpos



다음 코드를 test.py로 저장합니다.


from escpos.printer import Usb


# 0x416와 0x5011는 앞에서 lsusb로 확인한 값을 적어야합니다.
# 0x81와 0x03는 입출력을 위한 bEndpointAddress입니다.
p = Usb(0x416, 0x5011, in_ep=0x81, out_ep=0x03, profile="POS-5890")

p.text("Hello world!\n")
p.text("This print should work!\n")
p.text("---------------\n\n\n")


p.close()




실행해봅니다.


(escpos_env) pi@raspberrypi:~ $ python test.py




잠시후 프린트가 되는데 영수증 종이가 절단되지 않네요. 수동으로 프린터에 있는 톱날에 영수증 종이 당겨서 잘라줘야 했습니다.





3. 이번엔 qrcode를 출력해봅니다.



다음 코드를 test_qrcode.py로 저장합니다.



from escpos.printer import Usb
import qrcode

# 0x416와 0x5011는 앞에서 lsusb로 확인한 값을 적어야합니다.
# 0x81와 0x03는 입출력을 위한 bEndpointAddress입니다.
p = Usb(0x416, 0x5011, in_ep=0x81, out_ep=0x03, profile="POS-5890")

# Create a QR code
qr = qrcode.make('https://arnon.dk')
qr.save('qrcode.png')

# Print the image
p.image('qrcode.png')

p.ln(5)

p.close()



실행해봅니다.


(escpos_env) pi@raspberrypi:~ $ python test_qrcode.py



잠시후 프린트가 됩니다.





4. 이미지를 출력해봅니다.


프린트할 이미지를 다운로드합니다.


(escpos_env) pi@raspberrypi:~ $ wget https://upload.wikimedia.org/wikipedia/commons/a/a9/221125_%EC%B2%AD%EB%A3%A1%EC%98%81%ED%99%94%EC%83%81_%EB%A0%88%EB%93%9C%EC%B9%B4%ED%8E%AB_01_%28cropped%29.jpg -O downloaded_image.jpg



이제 다음 코드를 test_image.py로 저장합니다.


from escpos.printer import Usb
from PIL import Image

p = Usb(0x416, 0x5011, in_ep=0x81, out_ep=0x03, profile="POS-5890")

# 이미지 처리
img = Image.open('downloaded_image.jpg')
target_width = 384
aspect_ratio = img.height / img.width
new_height = int(target_width * aspect_ratio)
resized_img = img.resize((target_width, new_height), Image.Resampling.LANCZOS)
bw_img = resized_img.convert('1')
bw_img.save('processed_image.png')

# 이미지 출력
p.image('processed_image.png', impl='bitImageColumn'

# 공백 텍스트 출력
p.text("\n\n\n\n\n\n\n\n\n\n")

p.close()




실행해봅니다.


(escpos_env) pi@raspberrypi:~ $ python test_image.py



잠시후 프린트가 됩니다.





사용 후 가상환경을 비활성화합니다. 코드를 실행할땐 다시 가상환경을 활성화해야 합니다.


(escpos_env) pi@raspberrypi:~ $ deactivate

pi@raspberrypi:~ $





댓글 쓰기

0 댓글

댓글 쓰기 (0)