Make Local Happiness

自分の幸せは自分で作る!!!

RaspberryPiでUSB接続でTM-30mプリンターを使う際に管理者権限以外で実行したい場合の対処

サーマルプリンターをUSB接続で使う際に、 node-thermal-printer を使用したのですが、普通に実行すると処理が終了しません。

これは権限の問題で、sudoを付けて実行すると実行できます。 ですが通常はsudo無しで実行したいので、 USBの権限を変更する方法について記載します。

USB権限の設定

USBデバイスのidVendorとidProductの確認

USBの権限を変更するためのruleファイルを作成するためには、 対象のUSBデバイスのidVendorとidProductの値が必要となります。

$ dmesg | grep usb

[    2.320512] usb 1-1.5: new full-speed USB device number 4 using dwc_otg
[    2.462682] usb 1-1.5: New USB device found, idVendor=04b8, idProduct=0e20
[    2.465600] usb 1-1.5: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[    2.468465] usb 1-1.5: Product: TM-m30 Bluetooth
[    2.471268] usb 1-1.5: Manufacturer: EPSON

ruleファイルを作成

$ sudo vim /etc/udev/rules.d/99-tm-m30.rules
SUBSYSTEMS=="usb", ATTRS{idVendor}=="04b8", ATTRS{idProduct}=="0e20", GROUP="dialout", MODE="0660"

再起動して試す

設定が反映されるよう一度再起動します。

$ sudo reboot

印刷用のプログラム作成

$ npm install node-thermal-printer 
$ vim printer.js

const printer = require("node-thermal-printer");
printer.init({
  type: 'epson',
  interface: '/dev/usb/lp0'
});
printer.alignCenter();
printer.println("Hello world");
printer.printQR("https://github.com/Klemen1337/node-thermal-printer");
printer.cut();
printer.execute((err) => {
  if (err) {
    console.error("Print failed", err);
  } else {
    console.log("Print done");
  }
});

印刷実行

$ node printer.js
> Print done

参考

http://thinkami.hatenablog.com/entry/2015/06/25/064658