フォーラムの表示方法を少し変更しました。引き続きご利用ください。
スポンサーリンク
和歌山県白浜町の小型コンピュータ専門店「NewLifeNewDesing」ストアページはこちら
NewLife NewDesingは和歌山県白浜町の小型コンピュータ専門店

Raspberry Piで使うサーマルプリンター基本動作編

ThermalPrinter-title公式Raspberry Pi OS
この記事は約16分で読めます。
スポンサーリンク

ラズパイにプリンターを接続するのは以前に比べて簡単になりました。単に印刷するだけでは面白くありませんので、小さいラズパイに見合ったラベルプリンターが良いなと思ってました。ちょうどネットでポラロイドカメラが紹介されていましたので、熱転写式のサーマルプリンターなら面白そうだ!と思い調べてみました。

国内でも3年くらい前からそれなりの事例が紹介されていて、デジタル化した現在なら、小さなメモ代わりに手帳に貼るのは良さそうだなと思っています。

このサーマルプリンターを利用した「何か」の仕組みにトライしてみようと思っても、スグに思い付かなかったので、取りあえず印刷を制御できる状態に持っていくことにしました。

自分への縛りとして、Windows機は使わない、なるべく簡単に、コスパ良く、をいつも通りに課してトライしたいと思います。

今回の環境

今回サーマルプリンターで選択したのは「Symcode 58MM USB サーマルレシートプリンター」です。

本当はシリアル接続の「Nano Thermal Receipt Printer」や「Mini Thermal Receipt Printer」が欲しかったのですが、ちょうど売り切れの時で仕方なく別のを探しました。

今回はお手軽なUSB形式の中でも情報が多い製品が絶対条件です。メーカーからRaspberry Pi でも使えるプリンタドライバが用意されていることはありませんから、有志の方が作られたドライバなりのソフトウェアが必要です。

幸い、国内での動作報告も多かったのでヨシとします。

Raspberry Pi は今回はRaspberry Pi 4です。どうもRaspberry Pi Zero W系やLiteでは大変そうでしたので、テスト用として使いやすいRaspberry Pi 4のRaspbianデスクトップで行いました。最終的にはRaspberry Pi Zero Wと合わせて設置したいと思っています。

口コミにもありましたが、用紙であるレジロールは一緒に買った方が無難です! テスト用に付属しているレジロールは1つだけで、それも短いので、アレコレ試しているとあっという間になくなります。この機種の婆は幅58mmで直径40mm以下ならOKだと思います。

Symcode 58MM USB サーマルレシートプリンター ESC/POS プリント指令セットと両立
Symcode
①:強い機能:レジ駆動をサポートし、ESC/POSプリント指令を兼用し、ビットマップや図形ダウンロードして印刷することをサポートし、データの緩衝地帯を内蔵します(プリンティングする時データを受信ため)。

事前確認

結果論として、記事下部に記載している参考としたサイトやフォーラムを読んで、ほとんど全てはコトが足りました。感謝です。

特に、最後に見付けられたQiitaの「pythonでレシートプリンターを操作する」の記事は、6/20更新でまさにそのまんま!でした。他のサイトでも同様の内容はありましたが、細切れでして、全てまとまっているのはこちら記事だけでした。

(ある一行の記載を見て、謎は解けた!の感覚になった)

USBデバイスを確認

この後の設定に必要な情報を調べておきます。もちろん、USBデバイスUSBケーブルを抜き差ししても同じように使うためにも必要です。

今回のサーマルプリンターはどうやら、0416:5011というIDのようです。

USBデバイスとして登録(udev)

登録するにはudevにルールを記述します。

ちなみに、ルールのデフォルトは/usr/lib内で、/etc/内にカスタマイズルールを作成するのがお作法?だそうです。

sudo nano /etc/udev/rules.d/99-usbescpos
SUBSYSTEM=="usb", ATTRS{idVendor}=="0416", ATTRS{idProduct}=="5011", MODE=="0666", GROUP="plugdev"

99-usb〜のように2桁の任意の数字を付けますけど、同じデバイスのルールでは数字が大きい方が有効となるため、最大の99をよく見かけますね。複数の同名ルールがある場合は番号に注意してください。

念のためリロード

sudo udevadm control --reload-rules
スポンサーリンク

\ すぐに始められるセット品が便利 /

2通りのやり方

色々調べてみて、プリントドライバを導入してRaspbianデスクトップから、いわゆるプリンターとして設定したいならば、EPSON汎用となっている有志のプリントドライバを入れる方法があります。

githubhttps://github.com/klirichek/zj-58

これだと設定もRaspbianから行えますし、何よりも分かり易い。日本語の印刷も大丈夫です。ただ、Pythonなどプログラムから制御しようとすると、これではできません。

もう一つの方法が、Linuxでは有名なpython-escposで利用する方法です。ESC/POSコマンドで処理されるプリンターにPythonアプリケーションからアクセスできるするライブラリです。これなら独自のスクリプトなどで利用可能です。

ドキュメントhttps://python-escpos.readthedocs.io/en/latest/index.html

ただ、こちらの場合は日本語フォントがそのまま通りません。

どちらも一長一短ですが、両方を導入しても問題ありませんから、今回はどちらも環境をセットアップしてみました。
どちらかだけが必要なら、それぞれの項目を読んでください。

  1. プリントドライバの導入(今回はzj-58)
  2. python-escposでPythonから制御する

zj-58のプリントドライバを入れる場合

Raspbianのデスクトップで動くようなアプリケーションから、プリンターとして今回のサーマルプリンターを利用するには、こちらの方法が良いでしょう。

以下、順番に実行でOKでした。

sudo apt-get update
sudo apt install build-essential cmake libcups2-dev libcupsimage2-dev
sudo apt install -y system-config-printer
git clone https://github.com/klirichek/zj-58.git
cd zj-58
sudo apt install cups-ppdc
mkdir build && cd build && cmake /home/pi/ZJ-58
cmake --build .
sudo make install

(もしもcmake --build .がエラーなら絶対パス指定でOKだと思います。cmake --build /home/pi/ZJ-58

system-config-printerでプリンターの設定画面がメニューから選んで使えるようになります。

プリンターの登録&設定はGUIで進めます。
入力しなくてはならない箇所は「zj58」にしました。設定でいくつか、またはこれ以外も設定

オプションの用紙をカットする機能は、今回のサーマルプリンターにはありませんでしたからOFFにしています。キャッシュドロワーも同様です。

参考https://scruss.com/blog/2015/07/12/thermal-printer-driver-for-cups-linux-and-raspberry-pi-zj-58/

こちらの場合はこれだけです。任意のアプリケーションから印刷を選んだ先に、今回のサーマルプリンターが出ていると思います。

コマンドからも印刷できます。テストはこちら。

echo "This is a test." | lp

lpで通りましたが、lprもあるみたいですね。どちらも試してみてください。
最初から入っているRaspberry Pi のロゴを印刷する場合。

lp -o fit-to-page /usr/share/raspberrypi-artwork/raspberry-pi-logo.png

同じようにテキストファイルなんかも指定すれば印刷できます。日本語は豆腐になります。

python-escposを使う場合

こちらは少し面倒な設定がありますが、同じように設定すれば、少なくても今回と同じサーマルプリンターであればOKです。他のモデルはベンダーIDなど異なる点は変更して読み替えてください。

インストール

では、日本語が印刷できないので、Python Imaging Libraryを使いフォントを読み込ませ画像として印刷させます。

sudo pip3 install python-escpos
sudo pip3 install Pillow

公式だと、python3 -m pip install --upgrade Pillowともあります。どちらも試しましたが、同じなのかな??

取りあえず、これでOKです。いくつかのサイトにあった、サンプルプログラムを実行してみましょう。

from escpos.printer import Usb
from escpos import *

from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont

width = 500
height = 250

image = Image.new('1', (width, height), 255)
draw = ImageDraw.Draw(image)
font = ImageFont.truetype('clamp-1m-w4-regular.ttf', 50, encoding='unic')
draw.text((0, 0), "日本語" + " ", font=font, fill=0)
font = ImageFont.truetype('clamp-1m-w4-regular.ttf', 28, encoding='unic')
draw.text((0, 82), "abcdefghijklmnopqrstuvwxyz", font=font, fill=0)
draw.text((0, 112), "ABCDEFGHIJKLMNOPQRSTUVWXYZ", font=font, fill=0)
draw.text((0, 142), "1234567890" + " ", font=font, fill=0)
draw.text((0, 172), "!\"#$%&'()=~|+*<>?_{}" + " ", font=font, fill=0)

p = Usb(0x0416, 0x5011, 0, 0x81, 0x03)
p.text(" Hello World\n")
p.image(image)
p.cut()

適当に名前を付けて保存(test.py)

この中でフリーフォントを指定しています。(clamp-1m-w4-regular.ttf)

[http://mix-mplus-ipa.osdn.jp/mplus/]

同階層にフォントを置いて、他のフォントなども試してみてください。

これで実行すれば印刷されると思います。

ベンダーID、プロダクトID、エンドポイントの指定

p = Usb(0x0416, 0x5011, 0, 0x81, 0x03)の記述でプリンターを指定しているのですが、どうやら、今回購入したSymcode 58MM USB サーマルレシートプリンターは同じみたいですね。

0x0416, 0x5011, 0, 0x81, 0x03

これは一覧をコマンドで出せます。今回と異なるサーマルプリンターであれば調べてみてください。冒頭のlsusbで調べたIDで調べられます。

lsusb -vvv -d 0416:5011
Bus 001 Device 009: ID 0416:5011 Winbond Electronics Corp. Virtual Com Port
Couldn't open device, some information will be missing
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass            0 
  bDeviceSubClass         0 
  bDeviceProtocol         0 
  bMaxPacketSize0        64
  idVendor           0x0416 Winbond Electronics Corp.
  idProduct          0x5011 Virtual Com Port
  bcdDevice            2.00
  iManufacturer           1 
  iProduct                2 
  iSerial                 0 
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength       0x0020
    bNumInterfaces          1
    bConfigurationValue     1
    iConfiguration          5 
    bmAttributes         0xc0
      Self Powered
    MaxPower              100mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass         7 Printer
      bInterfaceSubClass      1 Printer
      bInterfaceProtocol      2 Bidirectional
      iInterface              4 
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        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     0x03  EP 3 OUT
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               0
パイレッド
パイレッド

色々と試行錯誤した結果、エンドポイントINとエンドポイントOUTも無いとダメでした。また、間にある0は、インターフェイスらしいですが、私の場合4と出てまして、4で実行しても動くには動くものの、その後に反応しなくなりました。0で良いみたいですね。

画像の印刷

画像も印刷可能です。

用意した画像は白黒のPNGファイルです。サイズは400x111pxとテキトーですみません。

p.image("raspidalogo.png")

Pythonスクリプトと同階層に置いてください。

補足

draw.text((0, 82)で指定している数字は、それぞれ(左上のx座標, 左上のy座標)です。これで位置調整してみてください。

また、なぜかテキストの最初の1文字消えてしまうため、敢えて空白を1つ入れています。

p.text(" Hello World\n")

何に利用するか?

ネットで探してみると、日本人ではあまり件数がありませんでした。特にRaspberry Pi とのセットだと更に少なく3〜4件です。

ネットと連携した買い物メモの印刷は実用的でスマートですね。

他にもTwitterでフォローさせていただいている(しろいとり子@siroitori0413)さんの息子さんも、サーマルプリンターで子供なのにスゴイことになっています・・・。

パイレッド
パイレッド

ラズパイダのおじさんは逆立ちしても叶わないぞ!

では、この制御出来るサーマルプリンターを何に活用するのか?

単に印刷だけではただのプリンターです。
そうですね、MPDと連携させて、曲のタイトルと歌詞を印字できたら便利かも?

または、デジタルデバイスが使えないご年輩の方にFAXのように伝えることができるツールとしても面白いかも知れません!(返事は受けられないけど・・・)

やはり紙として物体があることは大きい意味を持ちます。備忘録として、スマホへの通知だけではなく、印刷されたら?

個人的には手帳を使う派なので、手帳に貼りたいと思って購入しました!

調べてみて

日本語はどうしても鬼門になりますね。同じサーマルプリンターでも機種によって異なるモノもあります。特に同じLinuxでもx86系ではなくarm系のRaspberry Piだと検索してもなかなか出てきません。

それでも先人達が残してくれていたコードやフォーラムの書き込みを頼りにすれば、時間はかかりますが何とかなるもんですね。

購入した製品としては、Windows機に合わせてあり、同梱のドライバでそのまま使うことが可能です。セルフテストの用紙が入っていて、ちゃんとセットアップされていることが覗えます。

価格的に5,000円前後で購入できるサーマルプリンターは、個人としても便利に扱えるプリンターだと思っています。機能がお決まりのラベルプリンターも良いですが、自分で構築した環境だと、より一層の愛着が沸くのでオススメです。

今回は印字する内容だけを自由に連携できるだけですけど、制御できるということで、色んな仕組みに応用ができると思います。

プログラミングの知識がそれ程無くても大丈夫です。・・・私が非エンジニアですから!

テストプリントの様子アニメーションGIF

サーマルプリンターとRaspbianでした。

アニメーションGIFのコード内容は、後でラズパイダフォーラムに記載しておきます!

参考1https://qiita.com/kurikurisan/items/15660bed340504f02032

参考2https://blog.cles.jp/item/10886#s10886-2

参考3https://www.raspberrypi.org/forums/search.php?keywords=ZJ-58&sid=cb6de65cf44a5ea3ef7123914436cb12

コメント

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