サーマルプリンタで使うコード一覧まとめ


サーマルプリンタでさまざまなものを印刷するときに使うコードを忘れてしまうので備忘録です。
`Adafruit Thermal Printer library` のサンプルコードを参考にしています。

# 使用したサーマルプリンタ
![qiita_thermal_m5stack.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529505/e21388cb-b7f6-44ce-3e6d-a6857f259676.jpeg)

スイッチサイエンスで購入したもの([サーマルプリンタ CSN-A2-T](https://www.switch-science.com/catalog/5202/))を使用しています。

M5Stackで印刷した際は上の図のようにセッティングしました。（Arduinoの場合は黄色のコードを6,緑のコードを7へ差し込む）

また、初期設定として[Adafruit Thermal Printer library](https://github.com/adafruit/Adafruit-Thermal-Printer-Library)をインストールします。M5Stackで使用する際は[EspSoftwareSerial](https://www.arduino.cc/reference/en/libraries/espsoftwareserial/)のライブラリもインストールしておきましょう。

# コード一覧
## 基本の文字/画像のプリント(参考:A_printertest)
![スクリーンショット 2020-11-17 20.26.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529505/c106ae4a-281e-99c7-7f62-f6c30e9a5bd3.png)

### 白抜き文字
黒背景で白抜きの文字

```c
// 白抜き文字設定
printer.inverseOn();
// プリント
printer.println(F("Inverse ON"));

// 設定をデフォルトに戻す
printer.inverseOff();
```

### 高さ２倍文字
高さが２倍の文字

```c
// 高さ２倍設定
printer.doubleHeightOn();
// プリント
printer.println(F("Double Height ON"));

// 設定をデフォルトに戻す
printer.doubleHeightOff();
```

### 右・中央・左寄せ
それぞれの寄せの文字

```c
// 右寄せ
printer.justify('R');
printer.println(F("Right justified"));

// 中央寄せ
printer.justify('C');
printer.println(F("Center justified"));

// 左寄せ
printer.justify('L');
printer.println(F("Left justified"));
```

### 太字
太字の文字

```c
// 太字の設定をする
printer.boldOn();
// プリント
printer.println(F("Bold text"));

// 設定をデフォルトに戻す
printer.boldOff();
```

### アンダーラインのある文字
アンダーラインのある文字

```c
// アンダーラインの設定をする
printer.underlineOn();
// プリント
printer.println(F("Underlined text"));

// 設定をデフォルトに戻す
printer.underlineOff();
```

### 文字サイズ
文字の大きさ3種類

```c
// Lサイズ
printer.setSize('L');
printer.println(F("Large"));

// Mサイズ
printer.setSize('M');
printer.println(F("Medium"));

// Sサイズ
printer.setSize('S');
printer.println(F("Small"));
```

### 行間サイズ
![スクリーンショット 2020-11-17 20.26.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529505/2f57bf1f-7d9b-d280-c196-ee51c269467a.png)

行間のサイズを変更する

```c
// 通常サイズの行間
printer.println(F("normal\nline\nspacing"));

// 大きいサイズの行間
printer.setLineHeight(50);
printer.println(F("Taller\nline\nspacing"));

// 行間サイズをデフォルトに戻す
printer.setLineHeight();
```

### ビットマップ画像
![スクリーンショット 2020-11-17 20.28.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529505/5805d712-c01c-6684-e1e6-5ea86aeaca46.png)

画像を印刷する際には、別ファイルにビットマップ化した画像データを保存して呼び出します。

ビットマップ画像化する際には `ファイル->スケッチ例->Adafruit Thermal Printer library->Processing->bitmapImageConvert` に格納されているProcessingコードを活用できます。

このファイルをProcessingで開き、実行して画像を選択するとProcessingのコンソールに

```
Loading image...
Writing output to 画像パス
Done!
```

と表示され、新しくビットマップ化された `画像ファイル名.h` ファイルが生成されます。
中のファイルを見てみると以下のようになっています。

画像データの設定ファイルの中身

```adalogo.h
#ifndef _adalogo_h_
#define _adalogo_h_

#define adalogo_width  75
#define adalogo_height 75

static const uint8_t PROGMEM adalogo_data[] = {
  0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,
  0x00,0x00,0x00,0x00,0x01,0xf0,0x00,0x00,0x00,0x00,
  0x00,0x00,0x00,0x00,0x03,0xf0,0x00,0x00,0x00,0x00,
  // 途中省略 //
  0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x00,0x00
};

#endif // _adalogo_h_
```

このファイルをArduinoに書き込むファイルで呼び出し、width,height,dataを引数として渡すことで印刷ができるようになります。

```c
// 画像データのファイルを読み込む
#include "adalogo.h"

// 画像の幅と高さ、ビットマップデータを引数として渡す
printer.printBitmap(adalogo_width, adalogo_height, adalogo_data);
```

また、写真などの画像はそのまま印刷すると濃淡がわかりにくくなるため、[こちらのサイト](https://ditherit.com/)などで誤差拡散法などを用いて画像を加工したのちにビットマップ化を行うと綺麗な印刷ができるようになります。

### QRコード
![スクリーンショット 2020-11-17 20.28.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529505/0a247952-5eea-7c00-87cf-e8bb58e78bbc.png)

別ファイルにQRコードデータを保存して呼び出す

```c
// QRコードデータのファイルを読み込む
#include "adaqrcode.h"

// QRコードの幅と高さ、QRコードデータを引数として渡す
printer.printBitmap(adaqrcode_width, adaqrcode_height, adaqrcode_data);
```
QRコードデータの設定ファイルの中身

```adaqrcode.h
#ifndef _adaqrcode_h_
#define _adaqrcode_h_

#define adaqrcode_width 135
#define adaqrcode_height 135

static const uint8_t PROGMEM adaqrcode_data[] = {
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    // 途中省略 //
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00};

#endif // _adaqrcode_h_
```
## 特殊な文字コードのプリント(参考:B_charsets)

関数dumpを以下のように設定すると文字コードのすべての文字の一覧を表示できるようになります。

```c
void dump() {
  uint8_t major, minor, c;

  printer.println(F("        01234567  89ABCDEF"));
  for(major=0; major<16; major++) {
    printer.print(F("     "));
    printer.print(major, HEX);
    printer.print(F("- "));
    for(minor=0; minor<16; minor++) {
      c = (major << 4) | minor;
      if(c < 32) c = ' '; // Skip control codes!
      printer.write(c);
      if(minor == 7) printer.print(F("  "));
    }
    printer.println();
  }
}
```

![スクリーンショット 2020-11-17 20.29.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529505/e0f08105-efce-0d85-0952-2abb7ab3896c.png)

```c
// デフォルトの文字コードをすべて一覧で印刷
dump();
```

![スクリーンショット 2020-11-17 20.29.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529505/e505901d-ae10-8d3c-6eed-e122c8765090.png)

```c
// ノルウェー語の文字コードを設定する
// Charset selection alters a few chars in ASCII 0x23-0x7E range.
printer.setCharset(CHARSET_NORWAY);

// カタカナ文字コードを設定する
// Code page selects alt symbols for 'upper' ASCII 0x80-0xFF.
// There's a TON of these, best to check datasheet!
printer.setCodePage(CODEPAGE_KATAKANA);

// 変更した文字コードの文字をすべて一覧で印刷
dump();
```

## バーコードのプリント(参考:C_barcodes)

### バーコードのサイズ変更

```c
// バーコードの高さ設定
printer.setBarcodeHeight(100);
// UPC_Aでバーコードのプリント
printer.printBarcode("123456789123", UPC_A);
```


### UPC_A
![スクリーンショット 2020-11-17 20.35.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529505/97424789-9ed7-4fd0-f6c3-e220bbaf51ea.png)

```c
// UPC-A: 12 digits
printer.printBarcode("123456789012", UPC_A);
```

### EAN-13
![スクリーンショット 2020-11-17 20.35.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529505/3d170ec6-510d-6f66-b466-6b3bc681c637.png)

```c
// EAN-13: 13 digits (same as JAN-13)
printer.printBarcode("1234567890123", EAN13);
```

### EAN-8
```c
// EAN-8: 8 digits (same as JAN-8)
printer.printBarcode("12345678", EAN8);
```

### CODE 39
![スクリーンショット 2020-11-17 20.36.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529505/b436c7ce-41f0-335d-6112-cab0f8cc4089.png)


```c
// CODE 39: variable length w/checksum?, 0-9,A-Z,space,$%+-./:
printer.printBarcode("ADAFRUT", CODE39);
```

文字数は７文字が限度でした。（それ以上だと印刷できません）

### ITF
![スクリーンショット 2020-11-17 20.36.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529505/187b731c-413f-8ff9-dd3d-757e0ed09113.png)

```c
// ITF: 2-254 digits (# digits always multiple of 2)
printer.printBarcode("1234567890", ITF);
```

### CODABAR
![スクリーンショット 2020-11-17 20.36.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529505/0c6cef40-078f-f0b7-b567-0b3a13824bf0.png)

```c
// CODABAR: variable length 0-9,A-D,%+-./:
printer.printBarcode("1234567890", CODABAR);
```

### CODE 93
![スクリーンショット 2020-11-17 20.36.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529505/e1b427f4-df98-1b8b-2857-e83b8ed56cd8.png)

```c
// CODE 93: compressed version of Code 39?
printer.printBarcode("ADAFRUIT", CODE93);
```

### CODE128
```c
// CODE 128: 2-255 characters (ASCII 0-127)
printer.printBarcode("Adafruit", CODE128);
```