サーマルプリンタで印刷する: Raspberry Piからのテスト印刷編

![hello.jpg](https://qiita-image-store.s3.amazonaws.com/0/58479/92ecbe96-e696-d335-33fc-4deb49ca4116.jpeg)

## 0. 前回までのあらすじ

サーマルプリンタ「[MunByn ITPP068USE-BK](https://www.amazon.co.jp/exec/obidos/ASIN/B078TCB8H2/x7edimv35x-22/)」を「仮想COMモード」に変更し、Linuxから利用できる状態にしました。

その他、概要、構成、セットアップ手順については『[セットアップ編](https://qiita.com/yuyakato/items/7d4db1c567d952a7ac91)』を参照してください。

これまでの記事については『[目次](https://qiita.com/yuyakato/items/288962fbc39446644668)』をご覧ください。

## 1. Raspberry Piのセットアップ

今回はサーマルプリンタを接続するマシンとして「Raspberry Pi 3 Model B+」を使用しました。

### 1.1. OSのセットアップ

OSには「Raspbian」を使用しました。詳細は以下の通りです。

```text
pi@raspi-3bp$ cat /etc/os-release
PRETTY_NAME="Raspbian GNU/Linux 9 (stretch)"
NAME="Raspbian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"

pi@raspi-3bp$ lsb_release -a
No LSB modules are available.
Distributor ID:	Raspbian
Description:	Raspbian GNU/Linux 9.4 (stretch)
Release:	9.4
Codename:	stretch

pi@raspi-3bp$ uname -a
Linux raspi-3bp 4.14.71-v7+ #1145 SMP Fri Sep 21 15:38:35 BST 2018 armv7l GNU/Linux
```

RaspbianのセットアップについてはWeb上に情報が多くの情報が存在しますので、適宜そちらをご参照ください。

### 1.2. Dockerのセットアップ

環境の構築を容易にするためにDockerを使用しました。詳細は以下の通りです。

```text
pi@raspi-3bp$ docker version
Client:
 Version:           18.06.1-ce
 API version:       1.38
 Go version:        go1.10.3
 Git commit:        e68fc7a
 Built:             Tue Aug 21 17:30:49 2018
 OS/Arch:           linux/arm
 Experimental:      false

Server:
 Engine:
  Version:          18.06.1-ce
  API version:      1.38 (minimum version 1.12)
  Go version:       go1.10.3
  Git commit:       e68fc7a
  Built:            Tue Aug 21 17:26:32 2018
  OS/Arch:          linux/arm
  Experimental:     false
```

Raspberry PiへのDockerのインストールについては『[Raspberry Pi 3 Model B(Raspbian)にDockerをインストールする - Qiita](https://qiita.com/yuyakato/items/1cdc7fa511f7767c95ac)』などをご参照ください。

## 2. ttyデバイスの確認

サーマルプリンタを「仮想COMポート」モードに変更すると、LinuxからUSB/シリアルデバイスとして認識されます。

サーマルプリンタの接続前、接続後の`lsusb`の結果は以下の通りです。`Bus 001 Device 007: ID 1fc9:2014 NXP Semiconductors`が該当のデバイスです。

```text
# サーマルプリンタ接続前:
pi@raspi-3bp$ lsusb
Bus 001 Device 005: ID 056e:001c Elecom Co., Ltd
Bus 001 Device 004: ID 413c:2003 Dell Computer Corp. Keyboard
Bus 001 Device 006: ID 0424:7800 Standard Microsystems Corp.
Bus 001 Device 003: ID 0424:2514 Standard Microsystems Corp. USB 2.0 Hub
Bus 001 Device 002: ID 0424:2514 Standard Microsystems Corp. USB 2.0 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

# サーマルプリンタ接続後:
pi@raspi-3bp$ lsusb
Bus 001 Device 005: ID 056e:001c Elecom Co., Ltd
Bus 001 Device 007: ID 1fc9:2014 NXP Semiconductors
Bus 001 Device 004: ID 413c:2003 Dell Computer Corp. Keyboard
Bus 001 Device 006: ID 0424:7800 Standard Microsystems Corp.
Bus 001 Device 003: ID 0424:2514 Standard Microsystems Corp. USB 2.0 Hub
Bus 001 Device 002: ID 0424:2514 Standard Microsystems Corp. USB 2.0 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

pi@raspi-3bp$ lsusb -v -d 1fc9:2014

Bus 001 Device 007: ID 1fc9:2014 NXP Semiconductors
Couldn't open device, some information will be missing
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass            2 Communications
  bDeviceSubClass         0
  bDeviceProtocol         0
  bMaxPacketSize0        64
  idVendor           0x1fc9 NXP Semiconductors
  idProduct          0x2014
  bcdDevice            1.00
  iManufacturer           0
  iProduct                0
  iSerial                 0
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength           67
    bNumInterfaces          2
    bConfigurationValue     1
    iConfiguration          0
    bmAttributes         0x80
      (Bus Powered)
    MaxPower               10mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass         2 Communications
      bInterfaceSubClass      2 Abstract (modem)
      bInterfaceProtocol      0 None
      iInterface             94
      CDC Header:
        bcdCDC               1.10
      CDC Call Management:
        bmCapabilities       0x01
          call management
        bDataInterface          1
      CDC ACM:
        bmCapabilities       0x02
          line coding and serial state
      CDC Union:
        bMasterInterface        0
        bSlaveInterface         1
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x83  EP 3 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0010  1x 16 bytes
        bInterval               2
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        1
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass        10 CDC Data
      bInterfaceSubClass      0 Unused
      bInterfaceProtocol      0
      iInterface             94
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x02  EP 2 OUT
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x82  EP 2 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               0
```

正常に認識されると、`/dev/ttyACM*`というttyデバイスが増えます。以下では`/dev/ttyACM0`として認識されていますが、抜き差しすると`/dev/ttyACM1`として認識されることもありました。固定化できると良いのですが。

```text
pi@raspi-3bp$ ls -l /dev/ttyACM*
crw-rw---- 1 root dialout 166, 0 11月  4 00:28 /dev/ttyACM0
```

## 3. テスト印刷

[nayutaya/thermal-printer](https://github.com/nayutaya/thermal-printer)リポジトリで公開している印刷ツールを使ってテスト印刷します。

### 3.1. Dockerイメージのビルド

上記の印刷ツールには`Dockerfile`が用意されているため、それをビルドします。

```text
pi@raspi-3bp$ git --version
git version 2.11.0

pi@raspi-3bp$ mkdir -p ~/repo/github.com/nayutaya
pi@raspi-3bp$ cd ~/repo/github.com/nayutaya/
pi@raspi-3bp$ git clone https://github.com/nayutaya/thermal-printer.git
pi@raspi-3bp$ cd ~/repo/github.com/nayutaya/thermal-printer/
pi@raspi-3bp$ git checkout tool-print-v1.0.0
pi@raspi-3bp$ git branch -v
* (HEAD detached at tool-print-v1.0.0) 51d10ed Merge pull request #6 from nayutaya/issue#1_print_tool
  master 51d10ed Merge pull request #6 from nayutaya/issue#1_print_tool

pi@raspi-3bp$ cd ~/repo/github.com/nayutaya/thermal-printer/tool/print/
pi@raspi-3bp$ ./build_image.sh
```

ビルドしたDockerイメージには`${USER}/thermal-printer/tool/print:latest`というタグが付いています。

### 3.2. 文字列と画像の印刷

ビルドしたDockerイメージを使って文字列と画像を印刷します。サンプル画像として同梱されている`hello.png`を使用しました。

```text
pi@raspi-3bp$ cd ~/repo/github.com/nayutaya/thermal-printer/tool/print/
pi@raspi-3bp$ ./run_bash.sh

root@ff877f47f4e9:/# echo $(ls /dev/ttyACM* | head -n 1)
/dev/ttyACM0

root@ff877f47f4e9:/# /root/main.py text $(ls /dev/ttyACM* | head -n 1) "Hello World"
device: /dev/ttyACM0
text: Hello World
Serial printer enabled

root@ff877f47f4e9:/# /root/main.py image $(ls /dev/ttyACM* | head -n 1) /root/hello.png
device: /dev/ttyACM0
path: /root/hello.png
Serial printer enabled
```

記事の先頭にある写真が、実際の出力結果です。

## 4. 参考

* [サーマルプリンタで印刷する: セットアップ編 - Qiita](https://qiita.com/yuyakato/items/7d4db1c567d952a7ac91)
* [Raspberry Pi 3 Model B(Raspbian)にDockerをインストールする - Qiita](https://qiita.com/yuyakato/items/1cdc7fa511f7767c95ac)