Zorin OS 18 Core × Cat Printer - Pythonで動かす自分専用印刷環境 -

>100 Views

January 19, 26

スライド概要

Docswellを使いましょう

(ダウンロード不可)

関連スライド

各ページのテキスト
1.

Zorin OS 18 Core × Cat Printer で動かす自分専用印刷環境 〜以前の失敗を乗り越え、実用的なGUIアプリを 作るまで〜 Python 1 / 20

2.

今回の主役:猫型プリンター 等で人気の「Mini Pocket Printer」。 手のひらサイズでインク不要のガジェット 印刷方式: 感熱式(サーマル) 通信方式: Bluetooth Low Energy (BLE) 有効幅: 384ドット(約48mm) 価格: だいたい1300円くらい AliExpress 2 / 20

3.

今回の主役:猫型プリンター 等で人気の「Mini Pocket Printer」。 手のひらサイズでインク不要のガジェット 印刷方式: 感熱式(サーマル) 通信方式: Bluetooth Low Energy (BLE) 有効幅: 384ドット(約48mm) 価格: だいたい1300円くらい AliExpress 今回の目標: スマホアプリ(FunPrint等)を使わず、 Zorin OSから直接「画像」と「日本語テ 3 / 20 キスト」を印刷する!

4.

使用環境(My Machine) 少し古めのノートPCを最新OSで蘇らせた環境です。 PC: Lenovo ThinkPad A285 CPU: AMD Ryzen 5 2500U RAM: 8GB OS: Zorin OS 18 Core (Ubuntu 24.04 ベース) 4 / 20

5.

使用環境(My Machine) 少し古めのノートPCを最新OSで蘇らせた環境です。 PC: Lenovo ThinkPad A285 CPU: AMD Ryzen 5 2500U RAM: 8GB OS: Zorin OS 18 Core (Ubuntu 24.04 ベース) ポイント: 以前の別のライブラリ利用で失敗。 今回は、より柔軟な rbaron/catprinter を選択 しました。 5 / 20

6.

なぜ以前は失敗したのか? 原因は「通信の窓口(UUID)」にありました。 以前のソフト: 特定の窓口(0000ae02)しか見ない固定設計。 今回のソフト: 複数の窓口候補(ae30, af30等)を自動で探す設計。 6 / 20

7.

なぜ以前は失敗したのか? 原因は「通信の窓口(UUID)」にありました。 以前のソフト: 特定の窓口(0000ae02)しか見ない固定設計。 今回のソフト: 複数の窓口候補(ae30, af30等)を自動で探す設計。 教訓: 海外製の格安ガジェットは、中身(UUID)が微妙に違う「亜種」が多い。 「決め打ち」 ではなく「柔軟な探索」をするライブラリ選びが重要! 7 / 20

8.

【重要】img.py の修正内容 そのままだと Linux 環境ではプレビュー表示でフリーズしたり、 画像が正しく表示されない ことがあります。 修正のポイント: 元のコードは cv2.imshow(OpenCV)を使っていましたが、 これを Pillow (PIL) を使った表示に書き換えました。 の修正イメージ ではなく で表示させる # img.py def show_preview(img_data): # OpenCV Pillow from PIL import Image preview_img = Image.fromarray(img_data) preview_img.show() # OS 標準のビューアーが開く これにより、Zorin OS 標準の画像ビューアーで安全に確認できるようになります。 8 / 20

9.

ライブラリのPythonコード解説:画像の二値化 プリンターは「白か黒か」しか判断できません。 グレーの画像を「ドットの密度」で表現する コードの一部です。 より抜粋 # catprinter/img.py from PIL import Image import numpy as np def read_img(path, width, algo): img = Image.open(path).convert('L') # # 384px img = img.resize((width, int(width * img.height / img.width))) 指定の幅( )にリサイズ グレースケール化 法で網点(ドット)にする これにより写真も新聞紙のような質感で印刷可能に! # Floyd-Steinberg # return binarize(np.array(img), algo) 9 / 20

10.

ライブラリPythonコード解説:BLE通信の仕組み でデータを送る「心臓部」です。 asyncio という仕組みを使って、非同期でデータ を送ります。 Bluetooth より抜粋 プリンターを探して接続 データを バイト程度の塊(チャンク)に分ける プリンターの「書き込み窓口」にデータを送信 送りすぎ防止の休憩 # catprinter/ble.py async def run_ble(data, device_name): # async with BleakClient(address) as client: # 200 for chunk in chunkify(data, client.mtu_size - 3): # await client.write_gatt_char(TX_UUID, chunk) await asyncio.sleep(0.02) # 10 / 20

11.

GUI アプリとしての統合 ターミナルを使わずに済むよう、 Tkinter を使ってボタン一つで操作できるGUIを作成。 11 / 20

12.

テスト時の動画 https://youtu.be/nr53_kSStwk 12 / 20

13.

GUI アプリの特徴 画像選択ボタン: filedialog で画像かテキストファイルを選択 確認ダイアログ: messagebox.askyesno で「プリンタの電源いれてください」を表示 ステータス表示: 画面下部に「送信中...」などの状態を表示 13 / 20

14.

アプリPythonコード解説:日本語テキストの画 像化 GUI プリンター自体は日本語フォントを持っていません。 そこで、「PC側で日本語を画像にしてか ら送る」という処理を追加しました。 に実装した機能 # gui_print.py from PIL import ImageDraw, ImageFont def text_to_image(text): # Zorin OS font = ImageFont.truetype("NotoSansCJK-Regular.ttc", 24) img = Image.new('RGB', (384, 500), "white") draw = ImageDraw.Draw(img) draw.text((10, 10), text, fill="black", font=font) return img の日本語フォントを指定 14 / 20

15.

デスクトップからGUI一発起動設定 毎回コマンドを打つのは大変です。 .desktop ファイルを作って「アプリ化」しました。 # ~/Desktop/catprinter.desktop [Desktop Entry] Type=Application Name=Cat Printer # 1 Exec=bash -c "source ~/catprinter/venv/bin/activate && python3 gui_print.py" Icon=printer Terminal=false 仮想環境を起動してからプログラムを走らせる魔法の 行 15 / 20

16.

デスクトップからGUI一発起動設定 毎回コマンドを打つのは大変です。 .desktop ファイルを作って「アプリ化」しました。 # ~/Desktop/catprinter.desktop [Desktop Entry] Type=Application Name=Cat Printer # 1 Exec=bash -c "source ~/catprinter/venv/bin/activate && python3 gui_print.py" Icon=printer Terminal=false 仮想環境を起動してからプログラムを走らせる魔法の 行 これで、デスクトップのアイコンをダブルクリックするだけで、 いつでも印刷準備が整いま す。 16 / 20

17.

トラブルシューティング:2台ある場合 もし猫型プリンターを2台持っていたら? 現在の挙動: スキャンして最初に見つかった方に接続します。 解決策: device 引数に MAC アドレスを指定します。 例:特定の個体に固定する # run_ble(data, device="01:23:45:67:89:AB") 17 / 20

18.

トラブルシューティング:2台ある場合 もし猫型プリンターを2台持っていたら? 現在の挙動: スキャンして最初に見つかった方に接続します。 解決策: device 引数に MAC アドレスを指定します。 例:特定の個体に固定する # run_ble(data, device="01:23:45:67:89:AB") 初心者の方は、まずは「1台だけ電源を入れる」のが一番確実です! 18 / 20

19.

まとめ:Pythonで広がる世界 の壁を越える: Zorin OS 18 Core という最新環境でも、Pythonなら自由自在。 ライブラリの再利用: 優秀な rbaron/catprinter を土台に、自分の「欲しい」を肉付け。 日本語対応の実現: 自分でコードを書くことで、海外製品に日本語機能を付与できた。 OS 見た目かわいい超小型PCプリンターができました 19 / 20

20.

ありがとうございました! Zorin OS で 楽しい Cat Printer ライフを! 20 / 20