先日の記事で5,6年前に購入した上記のサーマルプリンタを久々に稼働させようと思ったら、どうもうまくいかなかった。 今回下記のサーマルプリンタをブラックフライデーで購入した。
raspberrypiでの稼働実績を探して、下記のサイトを参考にさせてもらった
事前知識
- ドライバ方式・・・OS経由でプリンタに送られる。専用のドライバが必要。デフォルトではこの設定になっている。
- ESC/POS方式・・・高速でリアルタイムな制御が可能。仮想ポートやRS232Cでのシリアル通信が必要。今回は仮想ポートで使用する為設定を変更する。
- 安めのレシートプリンタは日本語フォントを内容していない。そのため、pythonのpillowなどでテキストを画像化した上での印刷が必要となる
MUNBYNレシートプリンターの所感
- ビープ音がともかくうるさい
- 印刷が驚くぐらい早い
- 自動カット内蔵は体験が良い(変にやぶれない)
- 筐体が思ったよりもデカイ
- 80mmの感熱紙の方が情報量も多くて良い
- ドライバのURLが死んでいる・・・付属のDVDから設定変更ツールをなんとか入手
やりたいこと

そのために必要なこと
- ビープ音を消す
- raspberrypiからサーマルプリンタがESC/POSで印刷できること
- ワンコマンドでiPhoneから印刷+任意のテキストが送れる事
試してみた
- まずはWindowsからprinter testの設定プログラムを実行
- amazonのコンテンツにも載っている下記を実行

1F 1B 1F B8 13 14 01を入力して仮想ポートの使用に変更- raspberrypi側で下記を実行
from escpos.printer import Serial
from PIL import Image, ImageDraw, ImageFont
# 日本語フォント(ラズパイにデフォルトで入っているものや、外部フォントファイルを指定)例: /usr/share/fonts/truetype/fonts-japanese-gothic.ttf
font_path = '/usr/share/fonts/truetype/fonts-japanese-gothic.ttf'
font = ImageFont.truetype(font_path, 40)
width = 384 # プリンタの印刷幅(ピクセル単位、機種に合わせて調整)
height = 100
img = Image.new('1', (width, height), 1) # '1'は白黒2値
draw = ImageDraw.Draw(img)
draw.text((10, 20), 'こんにちは世界', font=font, fill=0)
img.save("japanese_text.png") # 確認用
p = Serial(devfile='/dev/ttyACM0', baudrate=9600)
p.image("japanese_text.png")
p.cut()
- いったん最低限日本語で動く事を確認出来た
- 引数を渡して引数をそのまま印刷出来る様に変更
from escpos.printer import Serial
from PIL import Image, ImageDraw, ImageFont
from datetime import datetime
def print_text(text):
if not text:
return # 文字列がない場合は終了
font_path = '/usr/share/fonts/truetype/fonts-japanese-gothic.ttf'
font_item = ImageFont.truetype(font_path, 28)
font_date = ImageFont.truetype(font_path, 20)
WIDTH = 384
head_margin = 10
date_height = 30
text_height = 38
foot_margin = 20
lines = text.split('\n')
HEIGHT = head_margin + date_height + len(lines)*text_height + foot_margin
img = Image.new('1', (WIDTH, HEIGHT), 1)
draw = ImageDraw.Draw(img)
# 日付
now = datetime.now()
date_text = now.strftime("%Y/%m/%d %H:%M")
date_bbox = draw.textbbox((0, 0), date_text, font=font_date)
draw.text((WIDTH - date_bbox[2] - 10, head_margin), date_text, font=font_date, fill=0)
# 文字列印字
y = head_margin + date_height
for line in lines:
draw.text((10, y), line, font=font_item, fill=0)
y += text_height
img.save("text_thermal.png")
# 印刷
p = Serial(devfile='/dev/ttyACM0', baudrate=9600)
p.image("text_thermal.png")
p.cut()
if __name__ == "__main__":
import sys
# コマンドライン引数を結合して一つの文字列にする
text = ' '.join(sys.argv[1:])
print_text(text)



