ラズパイにプリンターを接続するのは以前に比べて簡単になりました。単に印刷するだけでは面白くありませんので、小さいラズパイに見合ったラベルプリンターが良いなと思ってました。ちょうどネットでポラロイドカメラが紹介されていましたので、熱転写式のサーマルプリンターなら面白そうだ!と思い調べてみました。
国内でも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汎用となっている有志のプリントドライバを入れる方法があります。
github:https://github.com/klirichek/zj-58
これだと設定もRaspbianから行えますし、何よりも分かり易い。日本語の印刷も大丈夫です。ただ、Pythonなどプログラムから制御しようとすると、これではできません。
もう一つの方法が、Linuxでは有名なpython-escposで利用する方法です。ESC/POSコマンドで処理されるプリンターにPythonアプリケーションからアクセスできるするライブラリです。これなら独自のスクリプトなどで利用可能です。
ドキュメント:https://python-escpos.readthedocs.io/en/latest/index.html
ただ、こちらの場合は日本語フォントがそのまま通りません。
どちらも一長一短ですが、両方を導入しても問題ありませんから、今回はどちらも環境をセットアップしてみました。
どちらかだけが必要なら、それぞれの項目を読んでください。
- プリントドライバの導入(今回はzj-58)
- 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")
SSDドライブ起動させたRaspberry Pi 4 サクサクと愛用中!
コスパが抜群のSSDドライブは内蔵型でいい
Crucial SSD 480GB BX500 SATA3 内蔵2.5インチ 7mm
Raspberry Pi4はメモリー8GBモデルなら余裕
【国内正規代理店品】Raspberry Pi4 ModelB 8GB 技適対応品
USBブートの構築方法を実践
ラズパイ4をUSB接続のSSDから起動する方法(USBブート)
何に利用するか?
ネットで探してみると、日本人ではあまり件数がありませんでした。特にRaspberry Pi とのセットだと更に少なく3〜4件です。
ネットと連携した買い物メモの印刷は実用的でスマートですね。
他にもTwitterでフォローさせていただいている(しろいとり子@siroitori0413)さんの息子さんも、サーマルプリンターで子供なのにスゴイことになっています・・・。
ラズパイダのおじさんは逆立ちしても叶わないぞ!
では、この制御出来るサーマルプリンターを何に活用するのか?
単に印刷だけではただのプリンターです。
そうですね、MPDと連携させて、曲のタイトルと歌詞を印字できたら便利かも?
または、デジタルデバイスが使えないご年輩の方にFAXのように伝えることができるツールとしても面白いかも知れません!(返事は受けられないけど・・・)
やはり紙として物体があることは大きい意味を持ちます。備忘録として、スマホへの通知だけではなく、印刷されたら?
個人的には手帳を使う派なので、手帳に貼りたいと思って購入しました!
調べてみて
日本語はどうしても鬼門になりますね。同じサーマルプリンターでも機種によって異なるモノもあります。特に同じLinuxでもx86系ではなくarm系のRaspberry Piだと検索してもなかなか出てきません。
それでも先人達が残してくれていたコードやフォーラムの書き込みを頼りにすれば、時間はかかりますが何とかなるもんですね。
購入した製品としては、Windows機に合わせてあり、同梱のドライバでそのまま使うことが可能です。セルフテストの用紙が入っていて、ちゃんとセットアップされていることが覗えます。

価格的に5,000円前後で購入できるサーマルプリンターは、個人としても便利に扱えるプリンターだと思っています。機能がお決まりのラベルプリンターも良いですが、自分で構築した環境だと、より一層の愛着が沸くのでオススメです。
今回は印字する内容だけを自由に連携できるだけですけど、制御できるということで、色んな仕組みに応用ができると思います。
プログラミングの知識がそれ程無くても大丈夫です。・・・私が非エンジニアですから!

サーマルプリンターとRaspbianでした。
参考1:https://qiita.com/kurikurisan/items/15660bed340504f02032
参考2:https://blog.cles.jp/item/10886#s10886-2
参考3:公式フォーラムの記事
コメント ご感想をお願いします。