試してみたブログ

AI関連・iPhone/Pixelなどのガジェット・音声入力・サーマルプリンタなど興味をある事をどんどん試してみた際の記録

MUNBYNレシートプリンターを購入して子どものタスクを毎朝印刷する+iPhoneからメモを印刷する

tameshitemita.hatenablog.jp

先日の記事で5,6年前に購入した上記のサーマルプリンタを久々に稼働させようと思ったら、どうもうまくいかなかった。 今回下記のサーマルプリンタをブラックフライデーで購入した。

raspberrypiでの稼働実績を探して、下記のサイトを参考にさせてもらった

qiita.com

事前知識

  • ドライバ方式・・・OS経由でプリンタに送られる。専用のドライバが必要。デフォルトではこの設定になっている。
  • ESC/POS方式・・・高速でリアルタイムな制御が可能。仮想ポートやRS232Cでのシリアル通信が必要。今回は仮想ポートで使用する為設定を変更する。
  • 安めのレシートプリンタは日本語フォントを内容していない。そのため、pythonのpillowなどでテキストを画像化した上での印刷が必要となる

MUNBYNレシートプリンターの所感

  • ビープ音がともかくうるさい
  • 印刷が驚くぐらい早い
  • 自動カット内蔵は体験が良い(変にやぶれない)
  • 筐体が思ったよりもデカイ
  • 80mmの感熱紙の方が情報量も多くて良い
  • ドライバのURLが死んでいる・・・付属のDVDから設定変更ツールをなんとか入手

やりたいこと

  • こどものタスクをiPhoneから簡単に印刷させる
  • 自分のタスクもiPhoen・Macから簡単に印刷させる
  • メモなどをiPhoneからサッと入力して印刷させる

そのために必要なこと

  • ビープ音を消す
  • 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)
  • やりたいことが出来るのが分かったのでiPhone側にショートカットでセットしていく
  • pythonの仮想環境でpipしているので実行するpythonは仮想環境配下のものになる
  • テキストダイアログを付けて入力した物を印字する+sshでワンコマンド送信
  • いい感じにやりたいことができるようになった!