คลังเก็บหมวดหมู่: ไม่มีหมวดหมู่

ว่าด้วยเรื่องของ thermal printer

ไม่ได้เขียนลงที่นี่ซะนานเลย เนื่องด้วยเพราะเวลาเขียนอะไรสั้นๆ หรือแนะนำสินค้า ตอนนี้มีหน้าเพจ iot e-shop ด้วย ก็เลยไปโพสลงในนั้น รวมถึงถ้าเกี่ยวข้องกับ kiosk ก็ยังมีเพจ bangkokdev ให้ลงอีกด้วย

ตั้งแต่ตั้งใจมาทำตู้ kiosk ขาย สิ่งหนึ่งที่พยายามหาโซลูชั่นมาตลอดนั่นก็คือเรื่องของ thermal printer โจทย์เรื่องนี้นั้นแยกย่อย ไปได้หลายประเด็น คือ
1. ใช้งานอยู่บนระบบปฎิบัติการอะไร Windows, Linux, Android รวมถึง สถาปัตยกรรม CPU อะไร x86 หรือ ARM
2. รองรับภาษาไทย
3. interface port ที่ต้องการใช้ USB หรือ Serial port
4. ใช้งานผ่าน driver (หมายถึงเราต้องลงหรือทำการ install driver ปรินเตอร์จากผู้ผลิตก่อนใช้งาน) หรือ ESC/POS command
5. ราคา

ถ้าไม่ต้องคำนึงถึง ข้อ 5. มีงบเหลือๆ ใช้ EPSON หรือยี่ห้ออื่นๆ ที่รองรับภาษาไทยได้ดี ทั้ง ESC/POS และ driver ก็จบได้เลย
แต่ถ้าคิดว่า คุณต้องการทำตู้บัตรคิว ที่สามารถพิมพ์บัตรคิวหรือสลิปขนาดหน้ากระดาษกว้าง 58 มม. มีการพิมพ์ไม่กี่คำ ไม่กี่บรรทัด รูปแบบตายตัว มีปรินท์เตอร์สำหรับตู้คีออสที่ราคาถูกกว่ากันหลายพันบาทเมื่อเทียบกับระดับ EPSON สักตัวนึง ถ้าคุณสามารถทำให้มันรองรับงานได้ ก็ลดต้นทุนไปได้ ทั้งในระยะเริ่มต้นและการบำรุงรักษา
ข้อจำกัดที่ปรินท์เตอร์จีนราคาถูก ไม่สามารถทำได้ดี คือ ข้อ 2 การพิมพ์ภาษาไทย บวกกับข้อ 4 คือในกรณี ที่ใช้ ESC/POS นั่นเอง เนื่องจากภาษาไทยมีการพิมพ์ 3 แถวสำหรับ 1 บรรทัด เพราะมีทั้ง สระ และวรรณยุกต์ ถึงแม้ว่า ตัวปรินท์เตอร์จะฝังฟ้อนท์ไทยมาให้ แต่ตัวเฟิร์มแวร์ ไม่ได้รองรับ เราจึงต้องเขียนโปรแกรมเพื่อแก้ไขปัญหานี้เอาเอง

ถ้าว่ากันในเรื่อง software และ programming ก็จะเกี่ยวข้องกับ ข้อ 3 และ 4 โดยเฉพาะบน Linux และการใช้งาน printer ที่เป็น USB interface
หลายคนเขียนระบบคิวแบบ web app และใช้โมดูล escpos-php ในการติดต่อกับปรินท์เตอร์ โดยเบื้องหลังนั้น ถ้าใช้ USB printer บน windows นั้น เป็นการเขียนคำสั่งลงบน mapped file โดยเราต้องทำการ share printer ก่อนจึงจะใช้งานได้ ส่วนบน Linux นั้นใช้ CUPS command line ในการพิมพ์

แล้วถ้าเป็น C++ ละ ผมเคยนั่งเขียนโค้ดด้วย Qt/C++ โดยใช้ escpos-php เป็นไกด์ไลน์ เพื่อใช้กับ printer ผ่านทาง serial port
แต่สำหรับ USB printer บน Linux ผมนั่งหาในกูเกิ้ล จนเจอ escpospp เมื่อลองศึกษาดูโค้ดแล้ว ก็พบว่า ใช้การเขียนข้อมูลไปที่ printer โดยใช้ libusb อาจจะเรียกได้ว่าเป็น user mode driver ก็ได้ครับ นอกจากนั้นยังมีโปรเจ็ค QtUSB ที่ทำให้สามารถใช้งาน libUSB บน Qt ได้ ทำนองเดียวกันกับ QtSerialport
สำหรับการใช้งาน libUSB จำเป็นต้องรู้จัก USB device ว่าประกอบด้วยอะไรบ้าง เช่น interface, endpoint เพื่อให้สามารถระบุปรินท์เตอร์ที่เราต้องการเชื่อมต่อได้ รวมถึงวิธีการหรือฟังก์ชั่นในส่งข้อมูลให้กับ device (ในกรณีส่ง ESC/POS command เห็นใช้ bulk transfer กัน)

สุดท้าย ถ้าต้องการจะพิมพ์ด้วยฟ้อนท์ไทยสวยๆ หลากหลายแบบและขนาด ก็คงต้องเขียนโปรแกรมสั่งพิมพ์ผ่าน driver เอา อย่างเช่นใน Qt ก็มีโมดูล QPrinter ให้ใช้ครับ