サーマルプリンター(HS-QR71/DP-EH600/CSN-A2)を使ってみる

サーマルプリンター 電子工作

衝動買い

サーマルプリンターって味があってなんかいいよねー、と前々から気になっていたのですが、「1枚1円の安さが正義、レシート現像のトイカメラが楽しい|ベストバイ2019」という記事を見たら、 サーマルプリンター をすごく欲しくなってしまい、衝動買いしました。

「DP-EH600」という型番のものが電子工作の定番として有名なようなのですが、ちょっと高かったり、送料がかかったりと、安く手に入れられるところが見つかりませんでした。なので、見た目が同じに見えた「HS-QR71」というのを AliExpressで $18.80(送料込み) で買ってみました。同一のものでなくてもいいや、と思って買ったのですが、同一のものでした。

参考にした記事

Maker向けサーマルプリンタ『DP-EH600』を爆速化する」を参考にしました。また、参考記事に詳しく書かれている内容については、本記事では簡潔に書かれている場合があります。

サーマルプリンターの仕様については 以下のpdfを参考にしてください。https://thermalprinter.readthedocs.io/en/latest/_downloads/Embedded%20printer%20DP-EH600%20Technical%20Manual.pdf

プリンターとPCの接続

このサーマルプリンターはいくつかタイプがあって、 インターフェースが「TTL」か「RS232C」 、電源が「5~9V」か「12V」から選べるのですが、私は使いやすそうな「TTL 5~9V 」を購入しました。

今回はPCと接続して実験をしました。PCにUSBシリアル変換器を接続し、PC側のGNDとプリンター側のGND、PC側のTXとプリンター側のRX、PC側のRXとプリンター側のTXを接続、5~9Vの電源を接続するだけでOKです。後述しますが、電圧は高めの方が高速に印刷できます。電流は1.5~2A程度の容量はあったほうがいい気がします。信号はTTLレベルなので、今回は5V系のシリアルで接続しましたが、プリンターのTX出力レベルを測定したところ約3.3Vでしたので、5Vトレラントでない3.3V系の回路とも直接つなぐことができそうです(未確認)。

接続図
接続図
接続した様子
実験用に接続した様子

紙送りボタンを押しながら電源を入れると、キャラクターコード、キャラクターテーブルと通信のボーレートなどが印刷されます。キャラクターコードとボーレートは https://learn.adafruit.com/mini-thermal-receipt-printer/downloads の「update_firmware.zip」の中にある、「AClasTool.exe」で変更できます。私は115.2kbps、UTF-8に設定しました。

設定を印刷したもの
設定を印刷したもの

プリンターと通信

多くのレシート用サーマルプリンターは「ESC/POS」という規格の通信をします。簡単にいうと、キャラクターコードと改行を送信すればそのまま印字され、さらに制御コードを送ることで、フォントを変えたりグラフィックを印刷したりといった拡張機能も使えます。

PCでの通信設定は設定したボーレート、バイトサイズ8bit、ストップビット1bit、パリティ無しにします。 試しに Serister というソフトを使って、文字列と改行を送信してみたのが以下の画像になります。

文字列印刷テスト
文字列の印刷テスト

グラフィック印刷

グラフィック出力コマンド

次はグラフィックの印刷をします。グラフィック出力のコマンドは何種類かありますが、今回は「GS v 0 m xL xH yL yH d1 … dk」というコマンドを使用します。

最初の3バイトが制御コマンド「GS v 0」は16進数で「0x1D 0x76 0x30」です。

続く「m」はドットの大きさで通常の大きさなら「0」を指定します。

「xL xH yL yH」は画像サイズになります。幅は8の倍数になり、(x*8)ドットの場合に、xの下位バイトをxL、上位バイトをxHに指定します。同様に高さがyドットなら、yの下位バイトをyL、上位バイトをyHに指定します。このサーマルプリンターは幅384ドットなので、最大幅だと x = 384/8 = 48、よって xL = 48、xH = 0 になります。

さらに続く「d1 … dk」は画像データです。x*yバイトのデータになります。左上から横に8ドットは d1 に対応し、その右8ドットがd2に対応します。8ドットの左端がMSB、右端がLSBで、ビットが1の部分が黒く印刷されます。

データ構造
画像のデータ構造

このコマンド・データーをプリンターに送信すればグラフィックが印刷される、はずなのですが、実際にはうまく印刷されません。いくつかの問題をクリアする必要があります。

バッファオーバーフロー対策

ボーレートを115.2kbpsなど高速にしてグラフィックの印刷をすると、印刷速度が追いつかず、データがあふれて正常に動作しません。

仕様書にはバッファが「16K」と書かれていますが、バッファのあふれるタイミングを調査したところ、バッファ容量は多分「16Kbit」です。最大幅のグラフィックを印刷する場合では、高さ43ドット以上だとバッファがあふれる可能性があります。

プリンタの基盤からフロー制御用の信号を引き出して、フロー制御することもできるようなのですが、今回はソフト的に回避します。

方法としては、まず40ドットなどバッファがあふれない高さごとに画像を分割してデータを送ります。例えば高さ100ドットなら、40・40・20の高さの3つの画像に分けてを出力します。ここで、各画像の出力コマンドを送信する前に、ステータスをチェックするコマンドを送り、返信を待ちます。こうすることで、各画像を出力する前にバッファを空にすることができます。

ステータスを確認するコマンドは、「GS r (n)」を使いました。コマンドの詳細は省略します。「0x1d 0x72 0x01」と送り、1バイトの返信を待てば、バッファが空になります。

電圧降下対策・印刷設定変更

電源電圧が5Vで印刷設定がデフォルトの場合、安定してグラフィックの印刷ができません。印刷ヘッドを加熱するために多くの電流を流し、内部で電圧降下が起きて不安定になっていると思われます。電源電圧が8V程度だと大丈夫です。

また、デフォルト設定でグラフィックの印刷をすると、とても濃く印刷されます。本来レジなどで使うことを想定したプリンターで、文字の出力がメインであり、グラフィックの印刷もロゴなど白黒のくっきりしたものを出力することが想定されているためでしょう。

以上の問題を解消するため、印刷設定を調節します。印刷設定のコマンドは「ESC 7 n1 n2 n3」(16進数だと「0x1B 0x37 n1 n2 n3」)で、3つのパラメーターを指定します。値の範囲は0~255になります。

  • n1 : the most heated point : 初期値3
  • n2 : heating time : 初期値80
  • n3 : heating time interval : 初期値2

n1 は印刷速度に影響します。大きいほど高速になりますが、消費電力も増します。また、n1が一定でも、電源電圧が高いと印刷が速くなるようです。

n2 は印刷の濃さに影響します。大きいほど濃くなりますが、消費電力も増加します。

n3 を大きくすると、印刷がクッキリするが速度が低下する、ということなのですが、実際に変更しても変化がわかりませんでした。

n1 と n2 が共に大きいと電力を多く消費し、動作が不安定になる場合があります。

グラフィック用の設定としては、n2=50 程度がちょうど良い濃さでした。その場合、n1=4 で電源電圧が5Vでも安定して動作しました。電源電圧が高い場合は n1 をより大きい値にして高速化してもいいと思います。n3 は変更しても違いがわからないので、初期値の 2 にしています。

ディザリング

このプリンターは白黒の2値で印刷しますので、一般的なの画像を印刷する場合は、白黒2値へ変換する必要があります。ディザリングをして、グレーも表現できるようにします。

ディザリングの方法はいろいろありますが、今回は4×4ドットのパターンを使う方法にしました。

  1/17 ,  9/17 ,  3/17 , 11/17
 13/17 ,  5/17 , 15/17 ,  7/17
  4/17 , 12/17 ,  2/17 , 10/17
 16/17 ,  8/17 , 14/17 ,  6/17

印刷する元画像は適切なサイズにし、グレースケールに変換しておきます(各ドットの明るさは0~1とする)。各ドットの値が上記のような4×4のパターンを用意し、画像と同じサイズに敷き詰めます。各々のドットの値を比較し、画像のほうが暗い場合には黒、そうでない場合には白に変換します。

以上の処理をすることで、17階調の疑似グレースケール表現ができます。また、白黒の輪郭線などは細かく表現できます。ただし、元画像に周期性がある場合、良くない結果になる可能性があります。パターンのサイズ・値を工夫することで、面白い表現もできます。

ディザリング
ディザリングによる階調表現
グラデーションの印刷テスト
グラデーションを印刷例

その他コマンド

他に、プログラム冒頭で初期化コマンドを送信しています。「ESC @」16進数では「0x1B 0x40」になります。

また、最後に改行コードを送って、紙送りしています。

印刷例

印刷例
印刷例

まとめ

サーマルプリンターは、味があって良い。ランニングコストもとても安い。

今後は、bluetoothでスマホにつなぎ、モバイルプリンターにしたいなあ。

更新履歴

2020.01.29 公開

コメント

タイトルとURLをコピーしました