2021年7月1日 星期四

在 ubuntu 上控制 ESC/POS 熱感式印表機


這是台 EPSON 的商用熱感式印表機, 他媽踢... TM-T88IV
是露天上撈到的 "新古機", 新機放到過保的, 盒子配件齊全, 外觀看起來應該是真的很少用
這貨新機價超貴, 約一萬五, 可是二手的就只剩三張小朋友, 和對岸的新機價錢差不多
不知道是原廠服務超棒還是怎樣, 有無保固價差非常大
這台的驅動 ubuntu 原生支援, 不用額外安裝任何工具, 但就只能印文字
把文字塞給 /dev/usb/lp0 這節點就會印, 使用 ESC/POS 協議, 這是個夾帶文字的協議
若在標準模式, 發文字過去發啥就印啥, 只有看到特殊字元才會當指令解讀
如果要印圖片那就有點麻煩了, 我們自己幹程式讓它動, 依照協議發送點陣圖給它印
程式不難, 看懂規格書比較難XD


這台是吃 80mm 和 58mm 寬的紙, 雙規的, 帶裁紙刀, 可下命令切紙
58mm 即是目前發票用的規格, 這可印 80mm 的, 寬了兩公分多, 這台體積比店家的大些


這台是 USB 界面, 旁邊有個像網路的那個不是 ethernet, 由於用不到就沒管了, 吃 24V 的直流電
USB 接口可拆卸, 網上有看到賣擴充卡, 可以換別種界面例如 parallel port 或 ethernet


上蓋打開裡面的樣子


箭頭指處應該是列印設備, 前方有小心燙!的貼紙, 這列印頭薄薄的一片, 可以精準發點熱能真神奇


箭頭指處為裁紙刀, 裁切方法和剪刀一樣, 這片是電動移動的刀片, 和上蓋另一片固定刀片組成剪刀結構

把紙捲裝入的樣子:

放上紙捲, 拉紙到出口後蓋上上蓋即可列印

指令集上網看就有: Commands in Code Order
程式控制就是打開節點寫入文字或數字, 如此而已
雖然是 EPSON 發明的協議, 但就算是自家機器, 各台機器能下命令有差異, 而且有些設定是死的
例如每行有幾個點, 這個就要看機器的規格, 放不同寬度的紙能印的點數也會不同
這應是固定 dpi 的機器, 通常也應該是這樣, 除非可自動換頭, 這種產品我沒看過
但若有應該超貴, 就像 CNC 機台, 加上自動換刀報價立刻多兩位數XD 不是一位, 是兩位, 百萬起

網站上指令集如下圖:

點選上方機器列表中的機器, 例如我的是 TM-T88IV, 箭頭指處, 型號若是灰底表示這指令不支援
點選型號後下方紅框處就會標記各台機器不同之處, 這文件相當詳細, 不過我個人還是偏好 pdf 文件
下載區有一堆文件沒看到像指令集的, 所以還是看網頁版, 若有 pdf 就可以本地庫存不用上網看
上圖這指令 GS ( L 就是本次我主要用的功能, 先附上程式源碼:escpos.zip
程式就是 escpos-send.c, 另外附兩張圖供測試
(2021.07.13更新源碼:疑似非 4 的倍數寬影像讀取有問題, 已更正, 舊的問題程式改名為 escpos-send-4.c)
程式是從前篇電子紙抄過來的, 一樣是從 bmp header 撈幾個關鍵值, 然後就直接讀圖片資料
所以不容錯! 這次多讀了檔案長寬, 用戶需依照自己的機器配置寬度限制, 主要這兩行:

#define TP_BUF_SIZE 4095
#define TP_MAX_WIDTH 512

如果是同系列機器, TP_MAX_WIDTH 設置每行點數, TP_BUF_SIZE 則是最大指令緩衝
例如上圖紅框裡:

(xL + xH * 256) = 1 - 2047

正常是設 2047, 不過我翻了一下規格, 這機器規格是 4K 記憶體, 所以我就硬給它塞 4095 試試
結果還真可以XD 然後再試 8191 結果就掉資料了, 所以我這台應該可以設 4K
2K 我猜可能是初版機器吧, 可能 4K 是後來升的, 規格書上寫 4K 或 45K, 應該還有特規版 45K
GS ( L 指令塞完資料後等 30ms, 程式寫在:

write(fd, buf, data_len + 15);
usleep(30000);

這是試出來的值, 比較正規的作法應該是讀取機器狀態, 這部份程式裡有寫, 在 READ_STATUS 定義裡
可是!我發現如果它在忙碌好像會沒有回應, 沒回應時我們的 read 就會等到 timeout
當然, 我們可以縮短 timeout, 但就麻煩, 還要多迴圈去探, 反正我知道它 30ms 後一定可再塞
所以別探了, 直接用 delay 的! 反正業餘玩具嘛, 能用就好XD
delay 是簡單粗暴的方案, 當我們在驅動裡發現奇怪現象時, 第一個試的常常就是 delay
"它可能還在忙, 我們晚一點再督它" 用人性的方式思考, 如果能堵住客戶的嘴那就這樣了, 沒事別再來煩XD
讀取的程式還是附上, 有興趣的用戶可以自己改

GS ( L 指令要下兩次, 兩個不同 function 的指令
function 112 是填入資料, function 50 則是列印放在緩衝裡的資料
列印等的時間反而比較短, 可能它有兩塊緩衝, 收到資料後整理確認內容再複製到列印緩衝, 我猜的
經過實驗列印只要等 10ms 即可

編譯不用參數, 這程式土砲刻成, 只用 C lib, 沒有依賴其他套件, 完成後執行:

$ ./pos /dev/usb/lp0 dpp.bmp
img size = 512 x 1024
image data offset = 36
escpos init
escpos STD
escpos Offset
total line = 1024, width = 64 byte
draw line 0
draw line 63
draw line 126
draw line 189
draw line 252
draw line 315
draw line 378
draw line 441
draw line 504
draw line 567
draw line 630
draw line 693
draw line 756
draw line 819
draw line 882
draw line 945
draw line 1008
cut

若 lp0 為 root 用戶, 可在 /etc/udev/rules.d 放一條 rule :

KERNEL=="lp*", MODE="0666"

這樣每次接上設備就會把 lp0 節點設 666, 一般用戶可存取
4K 緩衝一次可送 63 行, 送完 63 行立刻再送下一個 63 行直到全部送完
結果:

這張紙長約 15 公分, 印這長條圖加上切紙只要兩秒鐘, 這商用機就是快!

這樣的控制程式相當貼近驅動程式, 雖然我們是在 user space 的應用
對於現代作業系統來說其實是違反設計精神的, 既然是在 OS 上, 當然要抽象化
確實有些廠商有做, EPSON 也有, 只是...

只支援 ubuntu 14.04, 裡面只有 binary, 我連試都不想試
Windows 驅動就有更新到 Win10, 可能用這個的都是 Windows 用戶, Linux 用戶只能自立自強
不過還好有留指令集, USB 通道的驅動能用, 自己搞並不困難

買這台機器是為了印電路板圖案, 我以前買的噴墨印表機只有當兵時那台
為了怕無聊, 印資料縮小張進去軍營看, 那台有印到墨水耗盡, 有划算
不然, 學生時代買的機器大多是放到壞, 放到噴頭阻塞然後扔掉, 所以後來我都找超商印
不願意自己養機器, 因為實在太少用, 若印電路板圖案一大張 A4 就印一點點, 不只浪費紙
機器更不划算, 可是疫情開始後連去超商都麻煩, 所以買這台來搞
這個一捲 80mm 寬的熱感應紙只要 28 元, 不用怕壞, 而且還超便宜, 比運費還低
只買一捲我還覺得不好意思XD 所以買了五捲, 估計一輩子都用不完XD
紙寬 80mm, 本機可印寬 72mm, 把一張全黑的 BMP 塞進去印出來結果:

印電子零件絕對夠用, 畢竟長寬都大於 72mm 的零件我還真沒看過XD
若是 Q7 模組圖會超過一點點, 除此之外手邊沒有超過的零件, 不過要印這東西有點麻煩
首先, 以 Kicad 為例, 打開電路板圖案


選取上層銅箔和組裝層, 視需求而定, 想看哪層就選哪層


然後列印到檔案, 印成向量的 SVG 圖


輸出後用 inkscape 打開它, 我這台機器解析度是 180dpi, 因此選擇 180dpi 轉存圖片


圖片用 gimp 開啟後用 threshold 功能分成黑白兩色, 因為這台只能印黑白

這裡需要一點人體感覺調整臨界值XD 因為 180dpi 實在不高, 小零件的話不會每個點都對到圖上
印到 TQFP 封裝的還算勉強堪用, QFN 或 BGA 的就沒啥用了...
如果要用橡皮擦修整圖片記得如下圖勾選


若是文字則是如下圖取消反鋸齒


確保只有黑白兩色, 最後輸出 BMP 格式, 輸出時如下圖勾選:


印出來後放零件上去:

接腳對的上就能用

這流程看起來有點複雜, 但核心精神單純, 就是把向量圖依照列印解析度進行取樣
然後再把取樣後的圖片轉成機器可以支援的格式, 就這樣
意思就是如果熟悉 Kicad 的儲存格式, 寫一隻程式直接把 PCB 底圖繪製成黑白點陣圖一樣可印
不過這是大工程, 特別是那個曲線繪製, 影像取樣也是個困難點, 這台機器只有 180dpi
實在沒有價值投入心力做這XD 如果要能用至少要 1000dpi, 也就是可以印 1mil 的線
我以前買的印表機大多辦不到, 但我在查這機器時發現現代噴墨印表機似乎 1200dpi 是入門規格
是內插的還是精準的我是不知道, 反正我是不會買的, 買了只會放到壞
用這熱感應列印可以看一下有沒有選錯電路板圖案, 至少不要差太多
差異小的若出錯可以用一坨錫補齊, 應該問題不大XD

這取樣轉換流程在現代系統中肯定存在的, 雖然我沒去翻源碼
但該幹的活絕對少不了, 只是差在誰去幹, 可以是應用軟體自己做掉
也可以在系統列印服務裡做掉, 或是在驅動裡做掉
甚至在印表機韌體上做掉, 新式可用 Wifi 接手機列印的機器可能會這樣做
我們的土砲方案就是全部 DIY, 自己幹, 然後寫一土砲軟體發送處理好的資料
印表機和掃描器大概是常見電腦週邊裡對 Linux 最不友善的設備, 要使用它幾乎只能在 Windows
通常我們不會想去為 Linux 添加這種設備, 因為非常麻煩, 除非是既有設備反正不用白不用
這次之所以會選這東西是因為幾年前友人曾經借一台給我玩, 那是對岸製的低價機
用過它才知道有這種協議的機器可玩, 當時那台對岸製的不用特殊驅動, 它直接裝成 CDC ACM 設備
即是產出 ttyACM 節點, 當序列埠使即可, 一樣是開節點直接寫, 所以如果不是買 EPSON 的機器
可以觀察一下有沒有 ttyACM 或是 ttyUSB 產出, 若有, 那應該可以直接用
不過各家指令會不一樣, EPSON 自己家的都有差了, 別家的當然就不用說了
我一開始就是拿以前的程式測, 結果反應完全不一樣

剛開始寫時由於不知道 delay 該設多少, 試了一些大數值, 一行一行慢慢印, 結果:
上圖左是目前程式列印, 上圖右則是每行等 100ms 的結果, 隨便找本漫截一小塊來用, 內容不重要XD
如果慢慢印, 每行間會有空隙, 不知道是不是齒輪轉停貢獻的誤差, 只有連續印不停轉才不會有間隔線
所以緩衝發送的間隔 delay 要盡量短, 不要等太久
上圖左右兩張是不同紙, 左邊的是印表機賣家送的測試紙, 右邊是新買的, 底色看起來有一點點偏綠
這只有單色, 解析度又低, 如果整頁漫畫丟進來再經過轉黑白時就不太能辨識內容
雖然漫畫本身是黑白的, 若作者沒有用灰階材料只用網點, 正常應該是可以黑白列印
但前提是解析度夠高, 若不夠, 網點就變一片黑或是產生雜訊, 就像摩爾紋那樣
所以這方案拿來印漫畫是沒法用 (擼) 的, 除非線條單純


程式從電子紙那篇抄, 測試圖就順便抄過來用, 加上邊框看看有沒有少印行
印出後用相機以 600dpi 規格拍攝, 可以看到它有些許變形
這台機器沒有附紙捲架, 我記得超商店員換紙時有些機器是有紙捲架的, 但有些沒有
像這台就是沒有的, 抽紙時完全靠列印頭旁邊的橡膠輪抽取, 如果沒放正就會印歪
不過這應該是暫時的, 等印多張了應該會慢慢拉正...吧? 我猜的XD
但由於我們列印量很少, 所以放紙捲時仔細看, 把它放正就沒這問題了

Wiki: ESC/POS 上有提, 2014 年時, 用這種特殊字元夾 ASCII 的 EPSON 系列協議的印表機
大概就只剩 EPSON 自己, 以及熱感式印表機這類存在已久的設備還在使用
新式的設備用自定義協議或是頁面描述格式, 不過就我看來都算自定義協議
我覺得不管是 ESC/POS, 還是頁面描述格式, 看起來都是支援繪圖功能的格式
例如你可以叫印表機從 x1,y1 畫一條直線到 x2,y2, 然後印表機就會自動繪製
ESC/POS 的 GS ( Q fn48 指令就是做這個, 不過我這台不支援
若不支援, 那我要先產生一塊畫布緩衝, 然後調用繪圖函式劃上一直線
接著整塊畫布緩衝送去給印表機當點陣圖繪製, 這樣才能印出一直線
以前的螢幕設備也是這樣設計的, 早期的手機螢幕自帶 framebuffer
可以下命令畫線, 畫文字, 降低處理器負擔
不過隨著科技發展, 這兩種設備走了不同的發展路線
兩種設備的解析度都不斷升級, 但是螢幕卻朝著整片頁面一次更新發展
什麼繪圖功能, framebuffer 儲存, 幾乎都被消滅了
要畫螢幕, 請 "整頁畫布更新", 不收部份更新的, 為了傳輸大量資料, 傳輸速率不斷提昇
並且定義規範, 設備可以自適應, 管你是 arm 還是 x86, 接上 HDMI 就能看
就算不是外接設備, 看老廝修筆電用 eDP 屏的可以不改 BIOS 直接換一塊不支援的屏一樣可用
反而印表機還卡在複雜驅動出不來, 也可能是輸出產業限制? 由於對該產業不熟不知道有什麼限制
一樣都是產生畫面給人看的設備, 走的路線卻大不相同
還是說因為環保意識抬頭, 紙本已經不潮了, 麻煩都收數位版, 所以印表機沒有未來就不再進步?
這我就不清楚了, 我只知道本子網站出現很多 DL 版的XD

文章寫完, 列印樣本也紀錄了, 這堆測試頁就可以扔了
測試時有一次不小心刪了迴圈遞增, 結果就印出上圖右上那一堆 "大家怎麼看"XD
這機器真是印超快, 才幾秒就出一長條, 趕緊按下 Ctrl+C 停下來, 看這一長串問句真是煩躁XD
這要出現在某網站上可能就被亮 IP 囉XD 該站我已經停止訪問很久了
那種 1450 監管的網站有啥好逛的, 我們去本子網站擼比較實在, 沒必要窩那種小圈圈
應該接觸國際拓展視野, 不只擼日本的本子, 對岸的, 美帝的本子都擼看看, 培養多樣 XP(?)
看看昨天的留言, 這是個單純放肥宅房間照片的圖集, 下面留言...

拿別人房間照片當擼料, 真有這種人?XD 若有, 這就叫做跳脫框架XD
想起以前大中華小天使的故事, 家長申裝後小孩暴怒, 對著小天使圖片擼了一發嚇壞家長於是退租XD
雖然聽起來很唬爛但蠻好笑的, 能做出這種行為的小孩肯定也是非常跳脫框架的XD
爸!給我解鎖網路!不然我就拿別的東西來擼!信不信哪天媽...(ry

大約 2013 年附近我的庫存爆倉, 開始發展標籤檔案工具, 那時候被迫停止收本子, 實在處理不了
直到 2019 年開始重新上線, 結果才幾年過去, 本子的風格真是完全的改變
以前的本子中規中矩的, 黃本就是擼料嘛, 要能擼是重要賣點, 走特殊路線的比較少
可是幾年後的現代真是跳脫框架, 一堆牛頭人, 幼馴染以往都是純愛路線, 現在都畫成碧池XD
還有那種只看畫面能擼, 但仔細看劇情就胃痛的本子, 搞的我老二非常混亂無所適從
不過我相信有些本子劇情可能...應該說肯定是從社會新聞改來的
因為社會底層的世界絕對比本子勁爆, 我開始覺得看本子比看新聞有用XD
可以滿足需求, 又可作為案例參考, 看到相似情景時要提防(?)
現在新聞很多是黨的大內宣, 一堆假的, 還不如本子真實XD

4 則留言:

  1. 好吧
    既然你連動漫基地都不去了
    我只好在這裡講了
    =====================================
    lv1前年底的時候就掛過一次
    我那時還聯絡的上站長
    他說一個月贊助1000元就繼續做下去
    於是我贊助半年後
    因為生病所以沒打電腦了也沒贊助了
    在半年後也就是去年12月lv1就掛了
    而且站長完全連聯絡不上
    我寄mail他都不回了
    沒想到最近連a-c-g小站都上不去
    我想跟他頂下LV1.in根A-C-G.net的網域名稱
    但是就算是網站站主機掛了
    網域依然被佔用中
    ==============================================

    我最近從日本買了日製BD片
    2桶25GB 一桶50GB
    花了7千.有夠貴可是台灣好像也是賣這種價格而且台灣也沒貨
    重點是現在國際運費超級貴~真是妖受
    真是他媽的疫情

    對了
    最近再看藍光燒錄機
    先鋒在日本賣的BDR-S12J-BK根台灣機BDR-212EBK有啥差別阿
    BDR-212EBK能燒50GB的BD片子嗎

    我看你的片子
    你連錸德MELODY得爛片都買來燒阿
    我猜應該讀不到資料了吧

    回覆刪除
    回覆
    1. 撐一個網站一個月一張太少了...應該只是收意思的, 只能算是精神上的支持
      別頂啦, 這年頭可以撐網站的要超有錢才行, 除非純文字網站
      可是純文字網站沒有市場, 現在要有人流, 圖片影片都要有才行
      這根本不是散戶玩得起的, 如果堅持要做, 可以買另一網域
      那就是小站第一代:hgames.net 這個才是經典XD

      >日本賣的BDR-S12J-BK根台灣機BDR-212EBK有啥差別
      這個我也不知道, 以前還會看別人分析, 現在基本上隨便選XD
      在幾年前是聽說台版的比較差, 比對岸版的還差, 而日本賣的也是對岸製
      我現在燒錄用的是找人代購的 S12J-X, 號稱地表最強, 結果也是對岸製
      所以如果要挑不一定要從日本進來, 可以考慮 S12XLT 或 S12UHT
      50GB 現在應該都能燒, 但不建議燒這種片, 因為我用已經很成熟的 HTL 燒
      它都還是很快就放壞, 這東西看起來並不可靠

      錸德 melody 燒完發現染料不匀後就停用了, 庫存了一陣子
      後來發現錸德標準品也有問題
      就把標準品連同 melody 一起送給資源回收車了XD
      所以燒了能不能放我也不知道, 也沒興趣知道, 就是拉機
      拉機就該去拉機車才是XD

      刪除
  2. 好想哭,居然有這方面的文章教學

    回覆刪除
    回覆
    1. 這麼誇張?XD 就照原廠文件下命令就會動了

      刪除

注意:只有此網誌的成員可以留言。