Yeni projemde kullanmak üzere CSN-A2 mikro termal yazıcı satın aldım. Yazıcı ölçüleri 103mm × 57mm × 50mm dir. Maksimum 39mm çapında ve 58mm genişliğinde termal kağıt kullanır. Google aramasıyla (micro thermal printer) bir çok farklı firmanın benzer ürünleri sattığını görebilirsiniz. Projemi geliştirme aşamasında kullanacağım ürünü aliexpress‘ ten satın aldım. Adafruit, Sparkfun vb firmaların sattıkları 19200 baud görünüyor ancak bendeki 9600 baud hızında, TTL arayüzüne ve 5-9 volt besleme aralığında, DP-EH600/2 model termal yazıcı. 12 volt beslemeli, USB veya RS232 arayüzlü, 19200 baud veri iletişim hızlı seçenekleri de bulabilirsiniz.  Yazıcı hakkında daha fazla teknik bilgi için buradaki ve buradaki dosyalara bakabilirsiniz. github.com‘ da, tüm fonksiyonlarını içermeyen bir kaç kütüphane ve örnek dışında pek bilgi bulmak mümkün değil, Türkçe bilgi ise hiç yok. O yüzden bu yazı ilk, Türkçe ve en kapsamlı yazı olma özelliği de taşıyor. Buradaki bazı kodlar eski versiyonlarda çalışmayabilir. Versiyona ait orijinal dokümanları da incelemek faydalı olacaktır.

printer-arduino_baglantisi

     Öncelikle, yazıcının nasıl çalıştığını öğrenmem gerektiği ve bunu işimden arta kalan kısıtlı dinlenme zamanlarımda yapmam gerektiği için hızlı olmalıydım. Yazıcımı, bana hız kazandıracağını bildiğim Arduino Uno‘ ma bağlayıp tüm fonksiyonlarını teker teker çalıştırdım. Nasıl yapılacağını anlamadığım, önemsemediğim, yazıcı modeliyle uyumsuz, işime yaramayacak ya da kullanmayı beceremediğim fonksiyonlar dışındakilerin tümünü öğrendim, çıktısını aldım ve kullanımını not ettim. Aşağıda Arduino ile kullanımını göreceksiniz. Yazıcıya (CSN-A2 ya da benzerleri), USB-TTL çevirici ile bilgisayardan da komut gönderebilirsiniz.

     Mikro termal yazıcımızı, istersek arduino’ nun fiziksel seri bağlantı noktasına (dijital 0 RX  ve 1 TX pinleri) bağlayabileceğimiz gibi softwareserial kullanmak istersek istediğimiz herhangi dijital IO pinlerine bağlayabiliriz. Başlangıç kodlarımız aşağıdadır. Bu tanımlamalardan sonra yazıcıyı yapılandıracak kodları göndereceğiz.

ESC 7 n1 n2 n3
[Name] Setting Control Parameter Command (ısı ayarı ve yazdırma hızı ayarı).
[Format]
ASCII: ESC 7 n1 n2 n3
Decimal: 27 55 n1 n2 n3
Hexadecimal: 1B 37 n1 n2 n3

İlk iki değer komut, sonraki üç değer ise parametrelerdir.

n1: Yazdırma kafasının ısıtılacak maksimum nokta sayısı için kullanılır. 0-255 arasında değer alır. Her bir değer 8 noktayı ifade eder. 8×(n1+1) formülü ile ısıtılacak olan nokta sayısı bulunur. Varsayılan değer 7 (64 nokta)  dir. Değer yükseldikçe, yazıcının çektiği akım artar.

n2: Isıtma süresi için kullanılır. 3-255 arası değer alır. Her bir değer 10µs dir. Varsayılan değer 80 (800µs) dir. Isıtma süresi uzadıkça yazı yoğunluğu artar, ancak yazdırma hızı düşer. Süre çok kısa tutulursa da boş karakterler oluşabilir.

n3: Isıtma aralığı. Bu değer iki ısıtma arasındaki süreyi belirtir. Süre uzadıkça yazı daha temiz, ama yazdırma daha yavaş olur.

DC2 # n
[Name] Set printing density (yazı yoğunluğunu ayarlar).
[Format]
ASCII: DC2 # n
Decimal: 18 35 n
Hexadecimal: 12 23 n

bit_haritasi, bit_map

n: Verilecek değerin ilk beş biti (D4-D0) yazı yoğunluğu için kullanılır; son üç biti (D7-D5) ise bekleme süresidir. Yoğunluk 50% + 5% × n(D4-D0) formülüyle hesaplanır. Bekleme süresi n(D7-D5)×250µs formülüyle hesaplanır. Yoğunluk 0-31 arası 32 adet değer alabilir. Bekleme 0-7 arası 8 değer alabilir.

     Yukarıdaki kodda; yapılacak işlemi bildiren kodları gönderdikten sonra “n” parametresini gönderiyoruz. “bekleme” değişkeninin değerini beş bit sola kaydırdıktan sonra oluşan değeri “yogunluk” değişkeninin değeri ile “OR” işlemine tâbi tutuyoruz. Böylece “yogunluk” değişkeninin değerini ilk beş bite atamış oluyoruz. “bekleme” değişkenine 5, yogunluk değişkenine de 15 değeri verdiğimiz için oluşan sayının ondalık değeri 175 oluyor. Son olarak, oluşturduğumuz sayıyı “dgr” değişkenine atayıp (değişken kullanmadan direkt te gönderilebilir) yazıcımıza gönderiyoruz.

DC2 T
[Name] Printing test page (test çıktısı yazdırır).
[Format]
ASCII: DC2 T
Decimal: 18 84
Hexadecimal: 12 54

ESC ! n
[Name] Select print mode (karakter özelliklerini ayarlar).
[Format]
ASCII: ESC ! n
Decimal: 27 33 n
Hexadecimal: 1B 21 n

n: 0-255 arası değer alabilir. Verilen değerin her bir bitinin durumu karakterlere değişik bir özellik kazandırır. Bit durumuna göre etkilenen özellikleri aşağıdaki tablodan görebilirsiniz.

Character Setting Commands
ESC E n
[Name] Turn emphasized mode on/off (Karekterleri vurgulu yazdırır).
[Format]
ASCII: ESC E n
Decimal: 27 69 n

MSB_LSB

n: Atanan değerin LSB (en düşük değerlikli bit) bitine göre işlem yapar. LSB 1 ise yazı vurgulu (daha kalın), LSB 0 ise yazı vurgusuz yazdırılır. Diğer vurgulu yazdırma seçenekleriyle aynı sonucu verir.

ESC G n
[Name] Turn on/off double-strike mode (her vuruşu çifter yapar).
[Format]
ASCII: ESC G n
Decimal: 27 71 n
Hexadecimal: 1B 47 n

n: Atanan değerin LSB (en düşük değerlikli bit) bitine göre işlem yapar. LSB 1 ise yazı vurgulu (daha kalın), LSB 0 ise yazı vurgusuz yazdırılır. Diğer vurgulu yazdırma seçenekleriyle aynı sonucu verir.

ESC – n
[Name] Turn underline mode on/off (karakterleri altı çizili yazdırır).
[Format]
ASCII: ESC – n
Decimal: 27 45 n
Hexadecimal: 1B 2D n

n: 0-2 ya da 48-50 arası değer alır.ne değeri 0 veya 48 ise normal, 1 veya 49 ise karakter altına tek çizgi, 2 veya 50 ise karakter altına çift çizgi çizer.

GS B n
[Name] Turn white/black reverse printing mode (karakterlerin arka planını siyah yazdırır).
[Format]
ASCII: GS B n
Decimal: 29 66 n
Hexadecimal: 1D 42 n

n: Atanan değerin LSB (en düşük değerlikli bit) bitine göre işlem yapar. LSB 1 ise arka plan siyah, LSB 0 ise arka plan beyaz yazdırılır. Altı çizili yazdırmaya göre önceliği olan bir komuttur. Altı çizili yazı modu aktifse, siyah arka plan yazdırma modu kapatılıncaya kadar altı çizili yazdırma modu askıya alınır. siyah arka planlı yazdırma devre dışı bırakıldığında altı çizili yazdırmaya devam eder.

ESC SO n
[Name] Select Double Width mode (karakterleri iki kat büyük yazdırır).
[Format]
ASCII: ESC SO
Decimal: 27 14
Hexadecimal: 1B 0E

ESC DC4 n
[Name] Disable Double Width mode (karakterleri iki kat büyük yazdırmayı iptal eder).
[Format]
ASCII: ESC DC4
Decimal: 27 20
Hexadecimal: 1B 14

Not: Decimal: 27 10 komutu da iki kat büyük yazdırmayı iptal eder.

GS ! n
[Name] Select character size (karakter enini ve boyunu değiştirir).
[Format]
ASCII: GS ! n
Decimal: 29 33 n
Hexadecimal: 1D 21 n

n: D0-D3 bitleri karakterlerin yüksekliğini, D4-D7 bitleri ise karakterlerin genişliğini değiştirir. Hangi bitin, karakter boyutunu nasıl etkileyeceğini tablodan bulabilirsiniz.

Genislik_Yukseklik_tablosu

ESC SP n
[Name] Set right-side character spacing (karakterlerin sağındaki boşluğu değiştirerek karakterler arasındaki boşluğu ayarlar).
[Format]
ASCII: ESC SP n
Decimal: 27 32 n
Hexadecimal: 1B 20 n

n: 0-255 arası değer alır. Boşluk, n×0,125mm formülüyle hesaplanır. “İki kat büyütme” modunda boşluk ta iki kat artar.

ESC V n
[Name] Turn 90° clockwise rotation mode on/off (karakterleri 90° döndürür).
[Format]
ASCII: ESC V n
Decimal: 27 86 n
Hexadecimal: 1B 56 n

n: Atanan değer 1 veya 49 ise karakterler 90° sağa dönük yazdırılır. Atanan değer 2 veya 50 ise karakterler 90° sola dönük yazdırılır. Atanan değer 0 veya 48 ise karakterler normal yazdırılır.

ESC { n
[Name] Turns on/off upside-down printing mode (karakterleri 180° dönük yazdırır).
[Format]
ASCII: ESC { n
Decimal: 27 123 n
Hexadecimal: 1B 7B n

n: D0 biti (LSB) 0 ise yazı normal, 1 ise 180° derece dönük yazdırılır.

ESC a n
[Name] Select justification (yazıları sola, ortaya ya da sağa yaslar).
[Format]
ASCII: ESC a n
Decimal: 27 97 n
Hexadecimal: 1B 61 n

n: Atanan değer 0 ya da 48 ise yazıları sola yaslar; 1 ya da 49 ise yazıları ortalar; 2 ya da 50 ise yazıları sağa yaslar.

justification

ESC D n1…nk NUL
[Name] Set horizontal tab positions (TAB posizyonunu belirler).
[Format]
ASCII: ESC D n1…nk NUL
Decimal: 27 68 n1…nk 00
Hexadecimal: 1B 44 n1…nk 00

n: 1-255 arası değer alır, ilk TAB pozisyonunu belirler. Her bir TAB, (karakter genişliği × “n”) kadardır.
k: Sonraki TAB pozisyonlarını belirler. 32 taneye kadar tab pozisyonu tanımlanabilir.
Not: TAB tanımlaması, yazıcı yapılandırılırken tanımlanır. Metne TAB uygulamak istersek yazıcıya “DEC 9” değeri göndermeliyiz. Her bir gönderilen “DEC 9” bir sonraki tanımlamayı kullanır. Örneğin; ilk TAB’ ımız 2, ikinci TAB’ ımız 5 ise ilk “DEC 9” u gönderdiğimizde (karakter genişliği × “2”) karakter ileriden, sonraki “DEC 9” u gönderdiğimizde ise (karakter genişliği × “5”) karakter ileriden yazdırırız. ESC D NUL komutu tüm TAB tanımlamalarını iptal eder.

HT
[Name] Horizontal tab
[Format]
ASCII: HT
Decimal: 9
Hexadecimal: 09

Gönderilen her bir “HT” yazıyı tanımlanan TAB değeri kadar ileriden yazdırır. Ayrıntılı bilgi bir önceki komutta verildi.

GS L nL nH
[Name] Set left margin (tüm satırları soldan girintili yazdırır).
[Format]
ASCII: GS L nL nH
Decimal: 29 76 nL nH
Hexadecimal: 1D 4c nL nH

nL: 0-255 arası değer alır. Girintiye doğrudan etki eder, etkisi küçüktür.
nH: 0-255 arası değer alır. Girintiye doğrudan etki eder, etkisi nL’ den çok daha büyüktür.
Sol tarafta oluşacak girinti (nL+nH×256) ×0,125 mm formülüyle bulunur. Her iki değere de sıfır verilirse satırlar girintisiz başlar.

left_margin

ESC $ nL nH
[Name] Set absolute print positions (satır başı girintisinin pozisyonunu belirler).
[Format]
ASCII: ESC $ nL nH
Decimal: 27 36 nL nH
Hexadecimal: 1B 24 nL nH

nL: 0-255 arası değer alır. Girintiye doğrudan etki eder, etkisi küçüktür.
nH: 0-255 arası değer alır. Girintiye doğrudan etki eder, etkisi nL’ den çok daha büyüktür.
Sol tarafta oluşacak girinti (nL+nH×256) ×0,125 mm formülüyle bulunur. Her iki değere de sıfır verilirse satır başı girintisiz başlar.

satir_basi

ESC 3 n
[Name] Set line spacing (satır yüksekliğini belirler).
[Format]
ASCII: ESC 3 n
Decimal: 27 51 n
Hexadecimal: 1B 33 n

n: 0-255 arası değer alır. Satır yüksekliği n×0,125 mm formülüyle bulunur.

ESC 2
[Name] Select default line spacing (satır yüksekliğini varsayılan yüksekliğe getirir).
[Format]
ASCII: ESC 2
Decimal: 27 50
Hexadecimal: 1B 32

ESC t n
[Name] Select character code table (karakter seti seçer)
[Format]
ASCII: ESC t n
Decimal: 27 116 n
Hexadecimal: 1B 74 n

n: Kullanılacak olan karakter setini belirler. Karakter seti kodları için buraya ya da link verdiğim pdf dosyalarına bakabilirsiniz. Türkçe için 29 ya da 32 değeri vermek gerekir. CP857 kod seti (page 29) karakterleri HEX değerleri için buraya; WCP1254 kod seti (page 32) karakterleri HEX değerleri için ise buraya bakabilirsiniz. Örneğin; “Ç” harfi, CP857 için 0X80, WCP1254 için 0XC7. “İ” harfi, CP857 için 0X98, WCP1254 için 0XDD HEX değerleri ile yazdırılabilir.

ESC J n
[Name] Print and feed paper (belirtilen ölçüde, dışarı yazılmamış kağıt çıkartır).
[Format]
ASCII: ESC J n
Decimal: 27 74 n
Hexadecimal: 1B 4A n

n:0-255 arası değer alır. Bellekteki bilgiyi yazdırıp, n×0,125 mm kadar dışarı yazılmamış kağıt çıkartır.

ESC d n
[Name] Print and feed n lines (belirtilen satır sayısı kadar, dışarı yazılmamış kağıt çıkartır)
[Format]
ASCII: ESC d n
Decimal: 27 100 n
Hexadecimal: 1B 64 n

n: 0-255 arası değer alır. Bellekteki bilgiyi yazdırıp, n değeri kadar satır sayısında, dışarı kağıt çıkartır. Örneğin; n=5 ise dışarı 5 satır yazılmamış kağıt çıkartır.

ESC = n
[Name] Set peripheral device
[Format]
ASCII: ESC = n
Decimal: 27 61 n
Hexadecimal: 1B 3d n

n: Atanan değerin LSB (en düşük değerlikli bit) bitine göre işlem yapar. LSB 0 ise yazıcı devre dışı kalır. Herhangi bir bilgi alamaz, gönderemez, kağıt çıkartamaz. LSB 1 ise yazıcı tekrar devreye girer ve tüm işlemleri yapabilir.

ESC 8 n1 n2
[Name] Sleep parameter (yazıcının uyku modunu aktifleştirir).
[Format]
ASCII: ESC 8 n1 n2
Decimal: 27 56 n1 n2
Hexadecimal: 1B 38 n1 n2

n1: 0-255 arası değer alır. Uyku süresini belirlemede kullanılır, etkisi küçüktür.
n2: 0-255 arası değer alır. Uyku süresini belirlemede kullanılır, etkisi n1′ den büyüktür.
Bu komut yazıcıyı, yazdırma sonrasında, belirtilen süre zarfında yazıcıya hiç bir iş yaptırılmazsa, süre sonunda yazıcıyı uyku moduna geçirir. Uyku süresi n1+n2×256 formülüyle hesaplanır. Sonuçta çıkan her bir değer 10ms’ ye eşittir. Yazıcıyı uyku modundan çıkartmak için yazıcıya 0xff (255) değeri gönderilir, 50 ms beklenir ve sonra tekrar yazdırma yapabiliriz. Yazıcı, uyku modundayken çok az enerji harcar.

ESC @
[Name] Initialize the printer
[Format]
ASCII: ESC @
Decimal: 27 64
Hexadecimal: 1B 40

Mikro termal yazıcı belleğini temizleyip tüm ayarları var sayılana sıfırlar.

LF
[Name] Print and line feed (bellekteki veriyi yazdırıp 1 satır kağıt çıkartır)
[Format]
ASCII: LF
Decimal: 10
Hexadecimal: 0A

     Mikro termal yazıcımıza, yazdırılacak bilgiyi gönderdiğimizde direkt yazma işlemine başlamaz. Yazma işlemine başlamak için yazdırma ve besleme komutlarından herhangi birisini bekler. Bu komutlar, yukarıda detaylarını verdiğimiz LF, ESC J nESC d n komutlarıdır. Arduino için, yazıcımıza bilgileri ve komutları “print” ve “println” komutlarıyla gönderebiliriz. Arduino’ dan print ve println ile veri gönderdiğimizde yazdırma işlemine direkt başlar, ancak bilgisayardan ya da herhangi bir mikro denetleyiciden bilgi gönderdiğimizde yazdırma ve besleme komutları kullanmak zorundayız.

     Yazımıza burada son veriyoruz. Bir sonraki yazı, termal yazıcıdan resim bastırma üzerine olacak. Barkod konusunda çalışmayacağım için bu konuya değinmeyeceğim. Hoşça kalın!