WordPressからHugoに移行しました。 ついでにこの記事を書き直す。

TM-T90

2015年にTM-T90というEPSONのサーマルプリンタを手に入れたらしい。 これは、いわゆる「レシートプリンタ」で、この手のプリンタはESC/POSというコマンド体系によって制御できる。 ぜひ制御して、レシートを印刷してみたい。

ESC/POS

ESC/POSはEPSONが定めたプリンタ制御用のコマンド体系です。 その仕様は非公開で、商用に利用する場合のみ開示されます。 とはいえ、ググればだいたいの仕様が分かります。 EPSONからライセンスを受けた互換プリンタがあり、その仕様は公開されているためです。

あとはその仕様を素直に実装すれば良いだけです。 もっとも、特定の言語に向けたライブラリ、例えばpython-escposnode-escposが用意されていることもあり、これらを使うだけで済むこともあります。

日本語の印字

python-escposnode-escposでは、日本語の印字をあまり考慮していません。 Shift_JIS(実際はCP932だったりすることも…)が通るプリンタの場合、最初に次のコマンドを送ると日本語モードになります。

  1. 国際文字セットを「日本」へ (0x1B 0x52 0x08)
  2. 拡張ASCIIテーブルを「カタカナ」へ (0x1B 0x74 0x01)
  3. 文字コードを「Shift_JIS」へ (0x1C 0x43 0x01)

この後に、Shift_JISでエンコードされた文字列を送ることで印字が完了します。

また、ESC/POSには文字を拡大して印字するモードがあります。 おそらく手元のレシートにも「合計」など、倍幅で印字された文字があることでしょう。それです。 これは、文字装飾コマンドで実現します。

文字装飾コマンドは、0x1C 0x21 bitflagで表現されます。 bitflagは1Byte、倍幅文字は2ビット目を立てる、縦倍文字は3ビット目を立てることで実現できます。 これを設定し、印字したい文字列を送信することで設定どおりに印字されます。

印字の様子

python-escposを少し変えてみました。 lrks/python-escposです。 (※残念ながら、全くメンテナンスされていません。いまはSIGCOWW/satynode-escposを使っています。)

samples/receipt/receipt.pyを実行するとこんな感じです。

レシート

なお、手元のTM-T90は少し壊れているかもしれません。 ボタンから起動後、30秒程度でOFFになってしまいます。 幸い、ボタンに関わらず常時ONになるモードがあり、それで回避できました。

さらに、(LAN接続タイプの)TM-T90ではネットワーク設定をWindows向けユーティリティから行えます。 ここでアドレス取得を「DHCP」にすると、Wiresharkか何かでbootpSEIKOEPSONに関するパケットを眺める羽目になります。

おまけ

ここまでの話と、さらにカスタマディスプレイの制御についてまとめた同人誌を発行しています。 これです。COSMIC L0 Vol.2

また、東芝テックのB-EP2DLなどShift_JISでは印字できないプリンタも制御したいことでしょう。 ついでに、秋月で売っていた電子棚札のピンアサインも知りたくなってきませんか。 これらについても、まとめた同人誌があります。 (COSMIC L0 Vol.4) しかもこれって、委託があります。 (COMIC ZIN)

あとは、ESP-WROOM-02によるHTCPCPサーバから、ネスカフェバリスタ内部のI2Cバスを操作してみたくないですか。 あります。 COSMIC L0 Vol.1

ほか、BOOTHCOMIC ZINにも何かあるんですか。