1397/05/01

پرینتر یا چاپگر یکی از متداول ترین واحدهای خروجی سیستم های کامپیوتری می باشد که برای تهیه یک سند چاپ شده مورد استفاده قرار می گیرد. یکی از ساده ترین پرینترهای موجود پرینتر حرارتی است که نیازی به جوهر نداشته و می تواند با مکانیزم ایجاد حرارت بر روی کاغذهای مخصوص (و البته ارزان قیمت) عباراتی را چاپ نماید. امروزه این نوع پرینترها به وفور در دستگاه های کارت خوان (POS) فروشگاهی، سیستم های نوبت دهی بانک ها، سیستم های چاپ فاکتور فروشگاه ها، باسکول های بزرگ تعیین وزن بار خودرو و ... مشاهده می شود. در این مقاله تصمیم داریم پرینتر حرارتی TTL سریال CSN-A2 را با کمک میکروکنترلر ATmega8 از خانواده AVR و کامپایلر Bascom (بسکام) راه اندازی نماییم. پرینتر استفاده شده از فونت فارسی نیز پشتیبانی می کند و عباراتی با زبان فارسی نیز چاپ خواهیم کرد.



سخت افزار پرینتر:

پرینتر حرارتی CSN-A2 دارای دو پورت در قسمت زیرین می باشد که یک پورت مربوط به تغذیه و پورت دیگر مربوط به پورت سریال است. همانطوریکه در تصویر زیر مشاهده می شود پورت سمت چپ مربوط ورودی تغذیه 5 ولت می باشد. پایه وسط به جایی متصل نمی شود و تغذیه باید به دو پایه کناری متصل شود. این پرینتر دارای هیتر بوده و جریان زیادی مصرف می کند؛ پس برای راه اندازی این پرینتر به یک منبع تغذیه آمپر بالا احتیاج خواهید داشت (ما برای راه اندازی از تغذیه 5 ولت 4 آمپر استفاده کردیم). پورت سمت راست نیز همان پورت سریال با پایه های RX و TX و GND می باشد که منطق آن 5 ولت بوده (TTL) و عملا فقط دو پایه RX و GND به میکرو متصل می شود. (به TX و GND میکرو). باودریت (BAUD) این پرینتر در حالت پیشفرض 19200 می باشد و سایر تنظیمات به صورت پیشفرض هستند: یعنی 8 بیت دیتا No Parity و 1 بیت هم STOP bit.

پورت هاي پرينتر حرارتي CSN-A2

شماتيک پرينتر حرارتي CSN-A2

برنامه بسکام:

برنامه این پرینتر با بررسی سورس کدهای آماده آردوینو و نیز مطالعه دیتاشیت پرینتر حرارتی CSN-A2 نوشته شده و از زبان C به BASIC برگردانده شده است. برای راحتی کار با این پرینتر، تنظیمات فونت و غیره بصورت توابعی در انتهای برنامه نوشته شده که با فراخوانی آنها می توان اثر آن را در برنامه مشاهده کرد. تعداد 10 سابروتین در این برنامه تعریف شده که مهمترین آنها Init_printer می باشد. با فراخوانی این تابع در ابتدای برنامه، پرینتر تنظیم شده و آماده استفاده می شود. زیربرنامه Align سه رشته right,middle,left را دریافت می کند و برای راست چین، وسط چین و چپ چین کردن متن بکار می رود. سابروتین Font_w2_h2_b یک رشته بصورت"000" الی "111" دریافت می کند که برای فعال یا غیر فعال کردن همزمان سه خصلت "فونت ضخیم"، "فونت با ارتفاع دوبرابر" و "فونت با پهنای دوبرابر" به کار میرود. مثلا با تنظیم این زیربرنامه به صورت "101" فونت BOLD با عرض دوبرابر (متن کشیده)خواهیم داشت. سابروتین بعدی inverse نام دارد که دو "عدد" 0 یا 1 را قبول می کند. در صورت 1 شدن رنگ نوشته ها و پس زمینه عوض می شود، یعنی بک گراند متن مشکی می شود و خود متن سفید خواهد بود. این کار برای جلب توجه متن در برخی موارد لازم است. مثلا عبارت: "تراکنش ناموفق". زیربرنامه Font_bold نیز یک عدد 0 یا 1 را پذیرفته و در صورت 1 شدن فونت BOLD می شود، شبیه زیربرنامه Font_w2_h2_b می باشد ولی بصورت مجزا فقط برای تغییر ضخامت نوشته بکار می رود. زیربرنامه Font_width_x2 نیز یک عدد 0 یا 1 را گرفته و درصورت 1 شدن عرض متن را دوبرابر می کند و متنها به صورت کشیده چاپ می شود. زیربرنامه Font_x2 طول و عرض متن را باهم دوبرابر می کند و فونت به طور یکسان دوبرابر می شود. سابروتین Font_updown متن را برعکس چاپ می کند، کاملا سر و ته. سابروتین Font_underline سه عدد 0 یا 1 یا 2 را دریافت می کند. 0 یعنی نوشته های بدون زیرخط، 1 یعنی نوشته با زیرخط نازک و 2 یعنی نوشته با زیرخط ضخیم. سابروتین Line_spacing عددی بین 0 تا 255 را دریافت می کند که تعیین کننده فاصله بین خصوص است. پیشفرض آن 32 می باشد ولی برای رسم اشکال کاراکتری بهتر است روی 0 تنظیم شود تا خطها به هم بچسبند.

پس از انجام تنظیمات نوبت به چاپ متن می رسد. برای چاپ متون لاتین به راحتی با دستور print "test" می توان متن مورد نظر را چاپ کرد. برای متن های فارسی باید کد کاراکترها را که بین 128 تا 255 می باشد با دستور print chr(128) چاپ کرد. مثلا برای چاپ سلام که از سه حرف س لا م تشکیل شده باید کدهای حروف را به ترتیب از آخر به اول مطابق این عبارت در جلوی دستور پرینت نوشت: Print Chr(244) ; Chr(242) ; Chr(168)

به عنوان نکته آخر دستور print chr(10) باعث می شود کاغذ بصورت سفید به اندازه ی حدود یک سانت از پرینتر خارج شود که اصطلاحا به آن فید گفته می شود. در این قسمت کد کامل راه اندازی پرینتر TTL حرارتی فارسی CSN-A2 با بسکام/بیسکام (BASCOM) و میکروی AVR آورده می شود:

'CSN-A2 Thermel Printer By Behnam Zakizadeh @ 97/03/05 [2018]
'avr64.com
'convert from Arduino:
'Ref:
'Adafruit &:
'Example 38.1 - Sparkfun Thermal Printer Test (COM-10438)
'http://tronixstuff.com/tutorials > chapter 38
'Based On Code By Nathan Seidle Of Spark Fun Electronics 2011

$regfile = "m8adef.dat"
$crystal = 11059200
$hwstack = 64
$swstack = 64
$framesize = 64
$baud = 19200

'************************ Vars / Const ************************
Const Heattime = 80
Const Heatinterval = 255
Const Printdensity = 15
Const Printbreaktime = 15

'***************************** Sub ****************************
Declare Sub Init_printer()
Declare Sub Align(byval A As String)                        'A=right,middle,left
Declare Sub Font_w2_h2_b(byval F As String)                 'F= "000" to "111"
Declare Sub Font_inverse(byval R As Byte)                   'R= 0 OR 1
Declare Sub Font_bold(byval B As Byte)                      'B= 0 or 1
Declare Sub Font_width_x2(byval W As Byte)                  'W= 0 or 1
Declare Sub Font_x2(byval F As Byte)                        'F= 0 or 1
Declare Sub Font_updown(byval U As Byte)                    'U= 0 OR 1
Declare Sub Font_underline(byval U As Byte)                 'U= 0 (no) OR 1 (thin) OR 2 (thick)
Declare Sub Line_spacing(byval L As Byte)                   'L=0 to 255 (default=32)

'==================== main prog:
Waitms 500

Call Init_printer()
Call Align( "middle")
Call Font_w2_h2_b( "000")

Call Font_bold(1)
Call Font_width_x2(0)
Call Font_x2(1)

Call Font_inverse(0)
Call Font_updown(0)
Call Font_underline(0)
Call Line_spacing(32)

Print Chr(144) ; Chr(162) ; Chr(161) ; " " ; Chr(244) ; Chr(145) ; Chr(247) ; _
    " " ; Chr(249) ; Chr(147)

Print "www.AVR64.com"

Call Font_bold(0)
Call Font_x2(0)

Print "CSN-A2 Printer & BASCOM-AVR"
Print Chr(244) ; Chr(242) ; Chr(168)


'feed paper
Print Chr(10)

End

'_______________________________________________________________________________

Sub Init_printer()
   Local Printsetting As Byte
   'Modify the print speed and heat
   Print Chr(27);
   Print Chr(55);
   Print Chr(7);                                            'Default 64 dots = 8*('7'+1)
   Print Chr(heattime);                                     'Default 80 or 800us
   Print Chr(heatinterval);                                 'Default 2 or 20us
   'Modify the print density and timeout
   Print Chr(18);
   Print Chr(35);
   Shift Printdensity , Left , 4
   Printsetting = Printdensity Or Printbreaktime
   Print Chr(printsetting);                                 'Combination Of Printdensity And Printbreaktime
End Sub
'_______________________________________________________________________________

Sub Align(byval A As String)
   Select Case A
      Case "left":
         Print Chr(27) ; Chr(97) ; Chr(0);
      Case "middle":
         Print Chr(27) ; Chr(97) ; Chr(1);
      Case "right":
         Print Chr(27) ; Chr(97) ; Chr(2);
   End Select
End Sub
'_______________________________________________________________________________

Sub Font_w2_h2_b(byval F As String)
   F = "00" + F + "000"
   Local Tmp As Byte
   Tmp = Binval(f)
   Print Chr(27);
   Print Chr(33);
   Print Chr(tmp);
End Sub
'_______________________________________________________________________________

Sub Font_bold(byval B As Byte)
   Print Chr(27) ; Chr(69) ; Chr(b);
   'Print Chr(27) ; Chr(32) ; Chr(b);
End Sub
'_______________________________________________________________________________

Sub Font_width_x2(byval W As Byte)
   If W = 1 Then
      Print Chr(27) ; Chr(14);
   Else
      Print Chr(27) ; Chr(20);
   End If
End Sub
'_______________________________________________________________________________

Sub Font_x2(byval F As Byte)
   If F = 1 Then
      'Print Chr(29) ; Chr(33) ; Chr(119);                   'MAX= 0111-0111 [W-H]
      Print Chr(29) ; Chr(33) ; Chr(17);                    '0001-0001 [W-H]
   Else
      Print Chr(29) ; Chr(33) ; Chr(0);
   End If
End Sub
'_______________________________________________________________________________

Sub Font_inverse(byval R As Byte)
    Print Chr(29) ; Chr(66) ; Chr(r);
End Sub
'_______________________________________________________________________________

Sub Font_updown(byval U As Byte)
   Print Chr(27) ; Chr(123) ; Chr(u);
End Sub
'_______________________________________________________________________________

Sub Font_underline(byval U As Byte)
   Print Chr(27) ; Chr(45) ; Chr(u);
End Sub
'_______________________________________________________________________________

Sub Line_spacing(byval L As Byte)
   Print Chr(27) ; Chr(51) ; Chr(l);
End Sub

خرید پرينتر حرارتی CSN-A2
خرید پرينتر حرارتي CSN-A2



دانلود رایگان سورس و شماتیک و PDF راه اندازی پرینتر حرارتی سریال CSN-A2 TTL فارسی با بسکام BASCOM AVR


© 2009-2018 AVR64.com