aitendoのサーマルプリンタを使う

# はじめに
[aitendo で EH-601 というサーマルプリンタ](http://www.aitendo.com/product/16099)を購入しましたので、Arduino UNO で使ってみました。

![q2017110401.jpg](https://qiita-image-store.s3.amazonaws.com/0/171026/a00a5475-43e9-fd2f-4f30-689ee648f9c2.jpeg)

サーバルちゃんのデータで Arduino Uno の Flashメモリを容量をほぼ使い切りましたので、サーバルちゃんしか印刷できない**「サーバルプリンタ」**となりました。

……はい。このネタがやりたかっただけですとも^^;

ということで、EH-601 が Arduino から使えるようになるまでを書いていきます。

先にネタバラシをしてしまいますが、このEH-601というプリンタは 千石電商などでも購入できる [Sparkfun COM-10438](https://www.sparkfun.com/products/10438) と同等と思われます（「思われます」なのは、私は COM-10438 を確認していないためです。COM-10438 のシリアルはTTLレベルなのかな？）。

# 確認作業

実際に作業に入る前にいろいろ確認しておきます。

aitendo のページで仕様を確認しますと

> <dl><dt>仕様・機能</dt><dd>サーマルプリンタユニット、熱転写、203dpi、対応ロールペーパー：幅58mm/直径40mm以下、8ドット/mm、384ドット/行、印刷速度：60mm/秒、外形寸法：111x65x57mm、接続インターフェース：RS-232、ESC/POSコマンド、動作電源：5〜9V</dd></dl>

とあります。
RS-232 ということなので、Arduino につなぐにはレベル変換が必要です。手元に[ADM3202 を使った RS232 レベル変換基板変換基板](http://akizukidenshi.com/catalog/g/gK-06464/) がありましたのでこちらを使うことにします
電源は、こちらも手元にありました、どこの御家庭にもある9V2AのACアダプタを使うことにします

EH-601の裏蓋を見ます
![q2017110402.jpg](https://qiita-image-store.s3.amazonaws.com/0/171026/64e32839-406e-2160-4ca9-5dd21c2e2a15.jpeg)

丁寧に、電源や信号のピンがわかるようになっています。ついでなので裏蓋を開けて見てみます
![q2017110403.jpg](https://qiita-image-store.s3.amazonaws.com/0/171026/2481b235-c813-5942-37b7-2ec8050037f9.jpeg)

UT3232 と書かれた石があります。これは RS-232トランシーバーということなので、やっぱりレベル変換必要ですね。
写真の左の方にタクトスイッチが見えるのわかるでしょうか？電源と紙をセットした状態でこれを押すと、テスト印刷がされます。
![q2017110404.jpg](https://qiita-image-store.s3.amazonaws.com/0/171026/02ba0593-454a-49a3-687b-464025e6e604.jpeg)

この中に「波特率」なる文字列が見えます。これはシリアルの通信速度になります。9600bps で通信すればいい、ということです。
このテスト印刷がされたものと同じような印刷がされた紙は購入時に一緒に入っていますので、普通は必要ないですし、下手に基板に付いてるスイッチを押すのは危険ですので注意^^;

# 接続
これで動作に必要そうな情報である、電源・ピン配置・入力信号仕様・通信速度がわかりました。
あとは接続していきます。

Arduino と ADM3202 レベル変換基板、そしてサーマルプリンタ EH-601 を次のように接続します

|Arduino|ADM3202レベル変換基板 CN1|
|:--:|:--:|
|GND|1: GND|
|D6（TX）|2: TX-IN|
|D5（RX）|3: RX-OUT|
|5V|4: Vcc|

|ADM3202レベル変換基板 CN2|EH-601|
|:--:|:--:|
|2: TXD|RX|
|3: RXD|TX|
|5: GND|GND|

Arduino（ADM3202）の TX と EH-601 の RX をつなぎ、Arduino（ADM3202）の RX と EH601 の TX をつなぐ、というのを間違えないようにしてください。
今回は Arduino UNO の D5 を RX、D6 を TX として使いましたが、他の Arduino では SoftwareSerial で利用できるピンに制限があるようですので、そのときは適宜変更する必要があります。

とりあえず簡単に、EH-601 にテキストを送るだけのコードを書きます。

```cpp:ThermalTest.ino
#include "SoftwareSerial.h"
#define TX_PIN 6
#define RX_PIN 5

SoftwareSerial Thermal(RX_PIN, TX_PIN);

void setup() 
{
  Thermal.begin(9600);
  
  Thermal.println("The quick brown fox jumps over the lazy dog.");
  Thermal.write(10); //Send LF
  Thermal.println("Even pig will try to climb a tree if you flatter him.");
  Thermal.write(10);
  Thermal.write(10);
}

void loop()
{
}
```
Arduino UNO へ転送、実行すると、次のようになります
![q2017110405.jpg](https://qiita-image-store.s3.amazonaws.com/0/171026/51228746-efc1-6183-72a6-d566ba035840.jpeg)
ここまでできればとりあえず、勝利、です

# ライブラリ使用での印刷
このサーマルプリンタを制御する ESP/POS コマンドというのは非常に簡単なものなので、ゴリゴリと書いていってもいいのですが。
arduinoのライブラリで見つけられる [Adafruit-Thermal-Printer-Library](https://github.com/adafruit/Adafruit-Thermal-Printer-Library)  がそのまま使えました。せっかくなので利用してしまいましょう。

画像を印刷するのは以下のコードになります（ほぼライブラリサンプルそのまま）。
includeで指定されている thermal_demo.h というのが印刷しようとする画像（今回はサーバルちゃん）データを変換したヘッダファイルです。画像のサイズは横 384pixel 以下になるようにします（プリンタの横幅限界が384pixel ）。
このファイル、今回、私は PNG 等の一般的な画像ファイルから変換するスクリプトを別途Perlで書いたのですが、ライブラリのサンプルの中に変換プログラムが用意されてました……無駄足。簡単なデータ形式で手間ではなかったからいいのですが、なんか悔しい（あなたの確認不足です）。

```cpp
#include "Adafruit_Thermal.h"
#include "thermal_demo.h"

#include "SoftwareSerial.h"
#define TX_PIN 6
#define RX_PIN 5

SoftwareSerial Thermal(RX_PIN, TX_PIN);
Adafruit_Thermal printer(&Thermal);

void setup() {
  pinMode(7, OUTPUT);
  digitalWrite(7, LOW);

  Thermal.begin(9600);
  printer.begin();

  printer.printBitmap(thermal_demo_width, thermal_demo_height, thermal_demo_bits);

  printer.feed(2);

  printer.sleep();
  delay(3000L);
  printer.wake();
  printer.setDefault();
}

void loop() {
}
```

# 終わりに
これでサーマルプリンタ、というかレシートプリンタが自在に使えるようになったわけです。コレでなにができるか？というと、領収書が偽造できるようになるわけで、年末・年度末に向けたこれからの季節にピッタリです（絶対やらないでね？

冗談はともかく。シリアルでかなり手軽に使えますので、センサーの値を逐次出力・記録していったり、バーコード・QRコードなどをその場で個別に払い出したり、かなり多用途に使えるのではないのでしょうか？
なんだかんだで紙出力はあれば強いですし。

# 余談
Adafruit-Thermal-Printer-Library のサンプルに入ってたロゴ画像のファイルを見て「あれ？どこかで見た形式だな？」と思い、それをそのまま試してみたのですが……
![q2017110406.jpg](https://qiita-image-store.s3.amazonaws.com/0/171026/a1ce287d-34c4-7961-bacb-6a11c9a6363a.jpeg)
やっぱり違いましたね。
XBitmap（xbm）形式、Webブラウザで使えなくなって久しいですし、使いどころ無くなってますねぇ……