サーマルプリンターをpython-escpos経由でTouchDesignerから動かす(Windows10)
2年前にMacで動かしたときの記事
サーマルプリンターをTouchDesignerで動かす
ただ日常的なツールとしてサーマルプリンターを使うのであれば、そもそもプリンタ付属のドライバで印刷すればいいし、IoT化するならArduinoなどを使ったほうが便利なのかな?と思いますし、そういう記事は他に結構あったりします。
ただ自分はパフォーマンスとしてサーマルプリンターを使いたかったので、MIDI制御などとも相性がいいTouchDesignerから印刷する方法にこだわっています。
最近2年ぶりにサーマルプリンターを使ってパフォーマンスする機会があり、また前回とは違いWindowsの環境でやる必要があったのですが、そこで多少つまづく点があったので前回とは別に備忘録として記事を書くことにしました。
結果的にはMac同様にpython-escposを用いて印刷可能なのですが、必要な作業が少し増えています!
また、再度検証していないので不要な作業がある可能性も正直あります。申し訳ありません。ご指摘があればぜひコメントにお願い致します。
主な環境
Windows 10
TouchDesigner (2022.32660) (python3.9系)
サーマルプリンター(Symcode 58MM USB サーマルレシートプリンター)
動かすまでの準備
まずTouchDesignerでpythonの外部ライブラリが使えるようにしてある必要があります。
Windowsだと別にHomebrewは使わないのですが、それ以外は概ね同じです。
pythonをインストール(TouchDeisgnerで使っている系と同じものをインストールして下さい)
TouchDesigner側で外部ライブラリを使えるようにパスを通すhttp://satoruhiga.com/post/extending-touchdesigner/
こちらを参考に
python-escpos、pyusbをpipインストール
libusbのインストール
またlibusbも必要なのですが、libusbは以下のサイトで説明されているような手順で導入する必要がありそうでした。
上記のサイトでは以下のようにlibusbを導入することを勧めています。
SourceForgeからlibusbのバイナリを入手https://sourceforge.net/projects/libusb/
MS64\dll\libusb-1.0.dll を(64bitであれば)以下の直下にペースト
C:\Windows\System32
C:\Windows\SysWOW64
libusb1.libをpythonのライブラリ(libs)にペースト
python-escposのデータを一部いじる
このサイトでも言及しているのですが、python-escposはWindowsでのサポートが十分ではないため一部修正して使う必要があるそうです。
具体的には、python-escposのライブラリの中にあるprinter.pyのうち、以下のコードをコメントアウトなどして使わないようにさせます。
try:
check_driver = self.device.is_kernel_driver_active(0)
except NotImplementedError:
pass
if check_driver is None or check_driver:
try:
self.device.detach_kernel_driver(0)
except usb.core.USBError as e:
if check_driver is not None:
print("Could not detatch kernel driver: {0}".format(str(e)))
ZadigでWinUSBのドライバをダウンロード
自分の使っているプリンターではこうする必要がありました。
サーマルプリンターをUSB接続した後、Zadigというアプリケーションを使ってサーマルプリンターをWinUSBデバイスとして生まれ変わらせます。
https://zadig.akeo.ie/
マウスやキーボードなどと間違えないように気をつけて、よく確認してデバイスを選択した後、ドライバーをWinUSBにリプレイスします。
TouchDesignerで動かす
ここから先は前回の記事と同じです。
Windowsの場合、プリンターのベンダー(製造元)IDとプロダクト(製品)IDはデバイスマネージャーなどから確認できます。デバイスのプロパティの「詳細」タブで「ハードウェアID」を選択したときに表示される「~VID_XXXX&PID_XXXX~」部分がベンダー(製造元)IDとプロダクト(製品)IDです。
Text DATを立ち上げ、以下のコマンドを入力します。
from escpos.printer import Usb
p = Usb(0x0416, 0x5011, 0)
p.text("Hello World\n")
pは(ベンダーID,プロダクトID,0)なので、自分のプリンタに合わせて適宜変更してください。p.text()の中に印刷したいテキストを入力します。
コマンドを打ち込めたらcmd+Rなり何なりでスクリプトを実行します。
結果
(未解決)印刷中、TD自体が固まってしまう
この件についてはまだ未解決なのでなんとかしたいと思ってます。
有識者の方いましたら助けてください、、、
おわり
この記事が気に入ったらサポートをしてみませんか?