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

公式Raspberry Pi OS

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

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

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

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

今回の環境

今回サーマルプリンターで選択したのは「Symcode 58MM USB サーマルレシートプリンター ESC/POS プリント指令セットと両立」です。

本当はシリアル接続の「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だと思います。

コクヨ 感熱ロールペーパー ハンディターミナル用 20m 幅58×直径40mm RP-TH584HはOKでした。

事前確認

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

特に、最後に見付けられた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()

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

フリーフォント:http://mix-mplus-ipa.osdn.jp/mplus/

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

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

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

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

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でした。

参考1https://qiita.com/kurikurisan/items/15660bed340504f02032
参考2https://blog.cles.jp/item/10886#s10886-2
参考3:公式フォーラムの記事

ラズパイダ

ラズパイダ

学べる楽しむ便利になる。小さいくせにヤケにパワフル。そんなRaspberry Pi をまだ知らない人に伝えたい。様々な場所で利用されているRaspberry Pi を知って「あっ、これもラズパイだっ!」だからラズパイダ!

関連記事

特集記事

コメント

この記事へのコメントはありません。

最近の記事 はじめて向け
  1. ラズベリーパイは小さなホームサーバーに最適、自分好みはプライスレスな4選

  2. あのMX LinuxがRaspberry Pi 向けイメージMXFBPをリリース

  3. OMV5のアップデートエラー回避

  4. Raspberry Pi Pico マイコンボード、僅か4ドルで登場

  5. お掃除ルンバのアイロボットから教育用ロボット「Root」発表

  1. お掃除ルンバのアイロボットから教育用ロボット「Root」発表

  2. 【初心者向け】Raspberry Pi 4との接続方法(電源、HDMI)

  3. 【初心者向け】はじめてRaspberry Pi OS をダウンロードする人へ

おすすめの記事

  1. DAZNをラズパイのLibreELECで観る方法

  2. ラズパイ4にも対応している軽量でクールなOS「Manjaro」はアリ

  3. NextcloudとRaspberry Pi 3B+で作る自分専用クラウド

  4. ラズパイ4とOMV5(openmediavault5)で作る自宅NASサーバーの設定方法

  5. Raspberry Pi とLibreELEC9.0で作るAmazonプライム・ビデオプレイヤー

  6. ラズパイ(Raspberry Pi)を使ってできるメディアセンター3選

今月の人気記事

  1. 1

    Raspberry Pi で動く様々なOS一覧まとめ13種類!

  2. 2

    ラズパイ4をUSB接続のSSDから起動する方法(USBブート)

  3. 3

    初心者でもラズパイでNASサーバーを作ってみよう!

  4. 4

    Raspbian のWi-Fi設定(Raspberry Pi 初期設定)

  5. 5

    Raspberry Pi 4の初期設定2020年版

  6. 6

    Raspberry Pi 4を起動したのにモニターに画面が映らない対処法

  7. 7

    ラズパイ4はPCライクな性能になったけどPCではないよという話

  8. 8

    ラズパイ4とOMV5(openmediavault5)で作る自宅NASサーバーの設定方法

  9. 9

    Raspberry Pi 4のOSをデスクトップPCとして使うためにUbuntuMATEをインストールしてみた

  10. 10

    ラズパイで使うmicroSDカードの選び方

記事ランキングページ

TOP