راه اندازی پرینتر حرارتی با رزبری پای (چاپ متن، عکس و…)
محتویات
در این پروژه یاد می گیریم که چگونه با استفاده از یک ارتباط سریال سخت افزاری، یک چاپگر حرارتی را به Raspberry Pi وصل کنیم تا یک رسید آزمایشی را چاپ کنیم که حاوی عناصر مختلفی مانند یک لوگو، یک کد QR یا بارکد به همراه متن و کاراکترهای گرافیکی مختلف است. همانطور که همه ما می دانیم، Raspberry Pi یک برد توسعه قابل حمل است و ما قبلاً پروژه های زیادی بر اساس رزبری پای ساخته ایم. در این پروژه، ما یک چاپگر حرارتی را به Raspberry Pi متصل می کنیم، سپس با استفاده از ارتباط سریال و کتابخانه python-escpos، چاپگر حرارتی را با رزبری پای کنترل می کنیم و متن و تصاویر گرافیکی را چاپ می کنیم. شما باید مقالات قبلی ما را بررسی کنید، ما پرینتر حرارتی را با آردوینو نیز راه اندازی کردیم.
قطعات مورد نیاز
قطعه | تعداد |
---|---|
پرینتر حرارتی MAXIM PNP-500 | 1 |
رزبری پای 3، 4 یا 0 | 1 |
سیم جامپر نری – مادگی | به تعداد لازم |
آداپتور 9 ولت 1 آمپر | 1 |
هنگام انتخاب آداپتور برای پرینتر حرارتی به جزئیات آن دقت کنید.
پرینتر حرارتی چیست؟
چاپگر حرارتی پرینتری است که از کاغذهای حرارتی گرمایشی برای تولید تصاویر استفاده می کند. کیفیت چاپ، سهولت نصب، حداقل استفاده از اجزای خارجی و مصرف انرژی کم، باعث محبوبیت بیشتر آن برای پیشخوان های ارائه بلیط، خواربارفروشی ها، مراکز تفریحی، مراکز بهداشتی، درمانی، صنایع شرکتی و … شده است.
این پرینتر عملکرد بدون نویز را همراه با چاپ تک رنگ ارائه می دهد. اطمینان حاصل کنید که از چاپگر با دمای بهینه چاپ استفاده کنید زیرا ممکن است در هنگام کار با دمای بالا آسیب ببیند.
ما از یک چاپگر حرارتی استفاده می کنیم که می تواند با استفاده از حالت RS232 یا سریال TTL متصل شود. من از یک آداپتور 9 ولت برای روشن کردن آن استفاده می کنم. به طور پیش فرض، نرخ باود اکثر چاپگرها 9600 است. در این مورد از حالت ارتباطی TTL استفاده خواهیم کرد.
فعال کردن پورت سریال رزبری پای
در ترمینال دستور زیر را بنویسید و سپس اینتر را فشار دهید.
sudo raspi-config
صفحه پیکربندی را می بینید، سپس از طریق کلیدهای جهت دار به “interfacing option” بروید. پس از فشردن enter، به گزینه “Serial port enable/disable” بروید. برای فعال کردن serial login shell، گزینه “No” را فشار دهید و سپس “Yes” را برای فعال کردن “Hardware Serial port” فشار دهید. روی “ok” کلیک کنید و سپس بر روی “Finish” کلیک کنید تا رزبری پای شما راه اندازی مجدد شود.
اکنون با انجام این کار، ارتباط سریال سخت افزاری خود را فعال کرده اید، یعنی «/dev/serial0» که برای «ttyAMA0» اختصاص داده شده است. این را می توان با وارد کردن دستور زیر در Pi-3 مشخص کرد.
ls -l /dev
اسکرین شات زیر را خواهید دید. سریال 1 توسط بلوتوث داخلی Raspberry Pi 3 استفاده می شود. بنابراین، ما فقط از سریال 0 برای چاپگر حرارتی استفاده می کنیم که قرار است به GPIO 14 و GPIO 15 به عنوان TX-D0 و RX-D0 متصل شود.
اکنون پرینتر را به Raspberry Pi خود وصل می کنیم و منبع تغذیه 9 ولت را به چاپگر می دهیم.
مدار اتصال چاپگر حرارتی به رزبری پای
در اینجا می بینید که RXD پرینتر به TXD برد Raspberry Pi و TXD چاپگر به RXDبرد Raspberry Pi متصل است.
همچنین، می توان توجه داشت که TDR و GND از هم اکنون روی GND تنظیم شده اند. چاپگر من تا زمانی که TDR را روی GND قرار ندادم چاپ نمی کرد.
کد ارتباط رزبری پای با پرینتر حرارتی
چاپگر حرارتی را می توان با دستور ESC POS مناسب کنترل کرد. اما در حال حاضر، ما از یک کتابخانه برای رابط استفاده می کنیم، زیرا این کتابخانه داده ها را با استفاده از همان دستورات ارسال می کند و چاپ مورد نظر شما آسان می شود. درک ماهیت اولیه چاپگرهای مبتنی بر دستور ESC بسیار پیچیده است، اما زمانی که اصول اولیه را یاد بگیرید، برای شما بسیار آسان خواهد بود.
اکنون برای نصب کتابخانه دستور زیر را در ترمینال بنویسید.
sudo pip install python-escpos
با این کار می توانید از کتابخانه استفاده کنید. ما از پروتکل سریال UART برای ارتباط استفاده خواهیم کرد.
چاپ متن روی چاپگر حرارتی
در اینجا ما اولین کد خود را روی چاپگری آزمایش خواهیم کرد که متن “Hello World” و سپس یک کد QR را چاپ می کند.
from escpos.printer import Serial """ 9600 Baud, 8N1, Flow Control Enabled """ p = Serial(devfile='/dev/serial0, baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=1.00, dsrdtr=True) p.text("Hello World\n")
تنظیم ویژگی های متن در چاپگر حرارتی
تابع “set()” برای تنظیم ویژگی های متن مانند سبک (“a” یا “b”)، تراز یا اندازه قلم استفاده می شود.
p.set( underline=1, align="left", font="a", width=2, height=2, density=3, invert=0, smooth=False, flip=False, ) p.textln(“Hello World”)
متن همچنین می تواند بولد یا معمولی باشد، به سیاه و سفید معکوس شود، یا به صورت وارونه یا نزولی برگردانده شود.
چاپ بارکد
barcode(data, code_type, pos) که پارامتر های آن به صورت زیر خواهد بود.
data= “هر داده ای که به بارکد تبدیل شود” code_type=”نوع بارکد مثلا CODE39, CODE128, UPC-1, etc. “ POS=”موقعیت بارکد
یعنی یک نمونه کامل میشود:
p.barcode('123456', 'CODE39')
با این کار بارکدی که “123456” را نشان میدهد چاپ می شود. همچنین این بارکد از نوع CODE39 خواهد بود. علاوه بر این، برای تراز کردن بارکد، میتوانید از تابع set() همانطور که قبلاً صحبت کردیم استفاده کنید.
چاپ کد QR
اکنون شگفت زده خواهید شد که بدانید کتابخانه ESCPOS این امکان را دارد که داده های شما را مستقیماً با عبور دادن رشته مورد نظر به یک کد QR تبدیل کند. برای چاپ یک کد QR از اطلاعات مورد نظر خود می توانید از تابع زیر استفاده کنید.
p.qr("IRENX",native=True,size=12)
شما میتوانید سایز، متن و Native بودن را تنظیم کنید.
چاپ تصویر با استفاده از چاپگر حرارتی
اکنون زمان چاپ تصویر است، می توانید تصویر را پیدا کنید و مکان را به عنوان آرگومان تابع ()image ارسال کنید.
p.image("/home/pi/Raspberry_Pi_logp.png",impl="bitImageColumn")
به خاطر داشته باشید که عرض تصویر نباید بیشتر از 360 باشد.
چاپ رسید با پرینتر حرارتی
بنابراین، اکنون زمان آن است که اولین رسید خود را با استفاده از چاپگر حرارتی چاپ کنیم.
کد چاپ رسید به شرح زیر است:
from escpos.printer import Serial from time import * from datetime import date from datetime import datetime now = datetime.now() dt_string = now.strftime("%b/%d/%Y %H:%M:%S") print("Today's date:", dt_string) """ 9600 Baud, 8N1, Flow Control Enabled ""' p = Serial(devfile='/dev/serial0', baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=1.00, dsrdtr=True ) p.set( underline=0, align="left", font="a", width=2, height=2, density=3, invert=0, smooth=False, flip=False, ) p.text("\n") p.set( underline=0, align="center", font="a", width=2, height=2, density=2, invert=0, smooth=False, flip=False, ) #Printing the image # here location can be your image path in “ ” p.image("/home/pi/proj on pi0/CD_new_Logo_black.png",impl="bitImageColumn") #printing the initial data p.set( underline=0, align="left", ) p.textln("CIRCUIT DIGEST\n") p.text("AIRPORT ROAD\n") p.text("LOCATION : JAIPUR\n") p.text("TEL : 0141222585\n") p.text("GSTIN : \n") p.text("Bill No. : \n\n") p.set( underline=0, align="left", font="a", width=2, height=2, density=2, invert=0, smooth=False, flip=False, ) # print the date and time of printing every time p.text("DATE : ") p.text(dt_string) p.textln("\n") p.textln("CASHIER : ") p.textln(" ===========================") p.textln(" ITEM QTY PRICE GB") p.textln(" --------------------------") p.textln("IR SENSOR 2 30 60") p.textln("ULTRASONIC 2 80 160") p.textln("RASPBERRY 1 3300 3300") p.textln("ADOPTOR 2 120 240") p.textln(" --------------------------") p.textln(" SUBTOTAL: 3760") p.textln(" DISCOUNT: 0.8") p.textln(" VAT @ 18%: 676.8") p.textln(" ===========================") p.textln(" BILL TOTAL: 4436.8") p.textln(" TENDERD: 0.8") p.textln(" BALANCE: 676.8") p.textln(" --------------------------") p.textln(" THANK YOU") p.textln(" ===========================") p.set( underline=0, align="center", font="a", width=2, height=2, density=2, invert=0, smooth=False, flip=False, ) p.qr("Circuit Digest",native=True,size=12) p.textln("") p.barcode('123456', 'CODE39') #if your printer has paper cuting facility then you can use this function p.cut() print("done")
ما میتوانیم ایدههای متعددی برای چاپ متن در فونتهای مختلف و اندازههای مختلف روی چاپگر حرارتی داشته باشیم. در این مقاله، ما با برخی از عملکردهای اساسی چاپگر حرارتی آشنا شده ایم و فهمیدیم که از چه دستوراتی پشتیبانی می کند. همچنین، می دانیم که پرینترهای حرارتی در استفاده روزانه راحت ترین هستند، عمر طولانی دارند و تعمیر و نگهداری کمتری دارند.