Tutorial Bermain dengan Printer Thermal di Raspberry PI 4 menggunakan Python 3

Sebuah panduan bagi yang menggunakan Printer Thermal di Raspberry PI 4 menggunakan Python 3

Hudya
5 min readApr 1, 2020

Halo agan-agan kembali lagi bersama saya Kiddy, nah pada kesempatan kali ini saya kembali ngulik mengenai salah satu controller, ya Raspberry PI 4. Siapa sih yang belum kenal?

src: https://www.review1st.com/news/raspberry-pi-4-telah-hadir-didukung-ram-4gb/

Computer super mini ini emang cukup powerful untuk digunakan sebagai server lokal, eits ngga cuma server lokal loh, Raspberry PI biasanya juga dipakai sebagai otak yang bisa menggerakan motor servo, apasih motor servo? Ituloh yang biasa dipake anak IoT hahaha.

Nah pada kesempatan kali ini, saya dapet kesempatan untuk ngulik Raspberry PI dimana harus dihubungkan dengan Printer Thermal, hmm gimana caranya ya saya pikir? Saya ngga habis pikir, printer thermal yang biasanya dihubungkan sama Mobile apps, atau biasanya sama aplikasi desktop, malah harus dihubungkan sama server kecil kaya begini.

Awal-awal sih pede, begitu googling mau cari referensi, JEGERRRRRR!!!!

Tau kenapa? NGGA ADA REFERENSI DAN PANDUAN YANG JELAS!

Alhasil sakit kepala udah ini sih fix, nyari di internet, ngulik-ngulik akhirnya bisa juga wkwkwk then saya tulis lah tutorial ini hasil dari ngubek-ngubek jagat raya Internet.

Referensi di Internet kebanyakan menggunakan EPSON, which is Epson emang udah nyediain Librarynya, tapi saya ngga pake Epson, pakenya yang murah-murah aja, ya ngirit-ngirit lah xixixi.

src: https://www.tokopedia.com/pandaretail/printer-kasir-ppob-thermal-58mm-panda-prj-58d-android-usb-bluetooth

Saya ngga bermaksud promosi loh, asli! Saya beli kebetulan karena harganya pas dikantong aja hehehe.

Oke ketika saya membeli ini, saya ngeliat Printer thermal ini support Windows, Android, iOS. Pertanyaannya, LINUX USER GIMANA? 😢

Karena kita menggunakan Raspberry PI dimana OSnya merupakan Raspbian yaitu turunan dari Debian, udah pasti kita harus menggunakan Linux. Nah yang jadi isu adalah, banyak referensi di Internet yang kurang oke bagi saya, alhasil saya berkelana surfing di internet sambil ngubek-ngubek hutan belantara (forum).

Tapi tetep aja banyak ngebingungin asli, bagi yang pernah nyoba pasti kalian akan ketemu sama Adafruit printer thermal, yep ini Librarynya Printer Thermal punya si Adafruit. Terus apakah ini works sama punya saya?

TETOTTTTT! Salah besar, setelah saya kulik, ngga works sama sekali.

Lalu gimana cara memastikan printer thermal kalian ngga sia-sia terbeli?

Pertama, cek dulu kabel belakangnya, usahakan ada kabel USB, karena di tutorial ini, saya ngasih panduannya dalam bentuk kabel USB. Sebenernya selain USB pun, ya bisa pake Serial kabel atau pake Network (RJ-45), yang support bluetooth biasanya hanyalah Android & iOS.

Kedua, buka buku panduannya, cari bagian spesifikasi, dan liat bagian printing command. Kalo tulisannya compatible with POS/ESC command set berarti aman, lanjut aja tutorialnya, kalo ngga, minggir gan saya ngga bisa jamin xixixi.

Ketiga, siapkan Raspberry PI kalian, dan sambungkan ke Printer Thermal milik kalian.

Keempat, siapin virtual environment di projek yang kita gunakan dan nyalakan environmentnya.

Kelima, install library yang kita butuhkan

pip install python-escpos

Keenam, agan perlu cek tuh Product ID and Vendor ID, caranya ketik command lsusb command di terminal, hasilnya sebagai berikut:

# lsusb 
Bus 002 Device 001: ID 1a2b:1a2c Device name (cth: ST Micro Electronic)
1a2b merupakan product ID agan
1a2c merupakan vendor ID agan

Habis itu jalanin lagi perintah dibawah dan CATAT EP OUT kalian, di saya EP_OUTnya adalah 0x03, bisa jadi kalian 0x01 atau 0x02. Ini adalah output keluar dari si thermal printer.

# lsusb -vvv -d xxxx:xxxx | grep iInterface
iInterface 0
# lsusb -vvv -d xxxx:xxxx | grep bEndpointAddress | grep OUT
bEndpointAddress 0x01 EP 1 OUT

Nah kita perlu membuat sebuah dialout, apasih dialout? Intinya kita ngizinin user raspberry untuk ngakses USB tanpa pake user root.

Kedelapan, kita perlu ngebuat sebuah file, letak + namanya kaya gini.

/etc/udev/rules.d/99-escpos.rules

Gunanya biar kita bisa ngebuat rules utama tanpa perlu nyetting-nyetting terus. Abis dibuat, isi rules dengan data berikut:

SUBSYSTEM=="usb", ATTRS{idVendor}=="1a2b", ATTRS{idProduct}=="1a2c", MODE="0664", GROUP="dialout"

Jangan lupa tuh diganti datanya pake data vendor dan product ID kalian.

Habis itu kita reboot rulesnya,

sudo service udev restart

atau coba

sudo udevadm control --reload

Kesembilan, ada baiknya kita coba dapetin package yang kurang di raspberry PI kita, copas aja codenya.

sudo apt-get install python3 python3-setuptools python3-pip libjpeg8-dev

Kesepuluh, setelah semuanya keinstall, sekarang kita siapin sebuah file baru, buat aja main.py

from escpos import *

def run():
p = printer.Usb(0x{product_id},0x{vendor_id} , timeout=0, in_ep=0x81, out_ep={ep_out})
# Print text
p.set(align='CENTER')
p.text("\nHELLO WORLD\n")
p.text("-------------------------------\n")
p.qr('QR Code', size=6, native=True)
# Print image
#p.image("logo.gif")
# Cut paper
p.cut()
#p.close()

run()

Pertama jangan lupa agan ganti product id, vendor id, dan ep_out yang menyesuaikan dengan raspberry PI agan, lalu kita akan set agar tulisannya ada di tengah. Setelah itu akan melakukan print dengan tulisan Hello World. Kalian juga dapat melakukan print QR Code dengan mudah menggunakan fungsi qr, parameter pertama adalah teks yang akan dijadikan QR Code, sisanya opsi parameter bisa kalian oprek, tapi ngga ada gunanya (Karena saya udah ngoprek wkwkwk), yang bener-bener kepake cuma size untuk lebarin pixel si QR Code kalian, dan native yang membuat si code akan ngirim perintah ke printer untuk ngafalin bytes si QR dulu abis itu dikerjain pake perintah internal printer.

Silahkan dicoba dulu native-nya True, karena kalo diset False biasanya akan ada Pipe error atau USB error, ini karena si printer macet dan ngga bisa nerima fungsi, so harus dipaksa dengan fungsi native si printer.

Untuk logo image saya comment, kenapa? Karena saya udah coba dan melakukan print image di printer thermal hanya bikin macet dan menyebabkan pipe/usb error (Ini emang error library ESCPOS).

Kalo agan-agan maunya pake barcode bisa diliat disini fungsinya.

fungsi cut() adalah fungsi yang digunakan untuk memotong kertas otomatis, biasanya sih untuk printer thermal yang mahal WKWKWK (kaum miskin minggirrrr!). Agan bisa comment aja kok fungsi cutnya.

Sekarang jangan lupa jalanin:

python main.py

Kalo masih error permission direboot aja dulu Raspberry PI-nya.

Hasil:

Contoh tiket parkir dengan QR Code
Contoh ngeprint tiket sayanya narsis.

Sekian dari saya, semoga bermanfaat, dan happy coding ^^.

--

--

Hudya

Which is more difficult, coding or counting? Not both of them, the difficult one is sharing your knowledge to people without asking the payment.