- LinuxでUSBシリアルケーブルを使う方法について知りたい
- USBシリアルケーブルは認識したがパーミッションの問題で悩んでいる
今回の例でインストールしているUbuntuのバージョンは14.04 LTSですが、Ubuntu 17や18、20でもやり方に変わりありません。USBシリアルケーブルは、infrapod.netでお勧めしているiBUFFALO製品 を利用しています。
LinuxでUSBシリアルケーブルを使う方法
デバイスが認識されている事を確認する
USBシリアルケーブルをLinuxマシンにUSB接続したらdmesgコマンドを実行してください。一番最後の行で「ttyUSB0」としてデバイスファイルが認識された事がわかります。
usb 5-2: new full-speed USB device number 2 using uhci_hcd usb 5-2: New USB device found, idVendor=0403, idProduct=6001 usb 5-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3 usb 5-2: Product: USB HS SERIAL CONVERTER usb 5-2: Manufacturer: FTDI usb 5-2: SerialNumber: ABCDE74 usbcore: registered new interface driver usbserial usbcore: registered new interface driver usbserial_generic usbserial: USB Serial support registered for generic usbcore: registered new interface driver ftdi_sio usbserial: USB Serial support registered for FTDI USB Serial Device ftdi_sio 5-2:1.0: FTDI USB Serial Device converter detected usb 5-2: Detected FT232BM usb 5-2: Number of endpoints 2 usb 5-2: Endpoint 1 MaxPacketSize 64 usb 5-2: Endpoint 2 MaxPacketSize 64 usb 5-2: Setting MaxPacketSize 64 usb 5-2: FTDI USB Serial Device converter now attached to ttyUSB0
シリアルコンソールで通信する
わたしは昔からUnix系OSでシリアルコンソール接続する場合はcuコマンドを使っています。cuコマンドを使ってCiscoルーターへ接続するためには次のようにします。
$ cu -l ttyUSB0 cu: open (/dev/ttyUSB0): Permission denied cu: ttyUSB0: Line in use $
パーミッションで弾かれてしまいました。パーミッションを調べてみましょう。
$ ls -l /dev/ttyUSB0 crw-rw---- 1 root dialout 188, 0 2月 6 16:08 /dev/ttyUSB0
一般ユーザーにも読み書きの権限をつけてやります。
$ sudo chmod o+wr /dev/ttyUSB0 $ ls -l /dev/ttyUSB0 crw-rw-rw- 1 root dialout 188, 0 2月 6 16:08 /dev/ttyUSB0
それではもう一度接続してみます。
$ cu -l ttyUSB0 Connected. Router>show ip route Codes: C - connected, S - static, R - RIP, M - mobile, B - BGP D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2 E1 - OSPF external type 1, E2 - OSPF external type 2 i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2 ia - IS-IS inter area, * - candidate default, U - per-user static route o - ODR, P - periodic downloaded static route Gateway of last resort is not set Router>
今度は接続できましたね。面倒なので恒久的にパーミッションを設定しましょう。デフォルト設定は次のファイルに記載されています。
/lib/udev/rules.d/50-udev-default.rules
これを直接いじるのは不作法なので、次のファイルを編集(なければ新規作成)します。
/etc/udev/rules.d/50-udev-default.rules
今回は/dev/ttyUSB**のパーミッションと所有者を変更したいので、次の1行を追加しました。GROUPとMODEは環境に合わせて変更してください。わたしは使用している端末のユーザー名とグループ名が「foo」なので次のように設定しています。
KERNEL=="ttyUSB[0-9]*", GROUP="foo", MODE="0666"
この設定を行うと、パーミッションと所有グループが設定したものになります。
$ ls -l /dev/ttyUSB0 crw-rw-rw- 1 root foo188, 0 2月 11 14:14 /dev/ttyUSB0
cuコマンドで接続するときは「-l」オプションでデバイスファイルを指定します。デバイスファイルは先ほどdmesgコマンドで確認した「ttyUSB0」です。
接続を切る方法
コンソール接続を切るためには「~.」を入力します。~(チルダ)の後に.(ピリオド)です。
Router> Router>~. Disconnected. $
ログをとりたい
cuコマンドはログを取得する機能はないので、scriptコマンドで端末の入出力をすべて保存してください。
まとめ
LinuxでUSBシリアルケーブルを利用する際に発生するトラブルは主に「ドライバがない」「パーミッションではじかれる」の2点です。
これらのトラブルは実績のあるUSBシリアルケーブルを利用する事と、パーミッションを設定する方法を知る事です。
- USBシリアルケーブルはWindowsでもMacでもLinuxでも使えるiBUFFALO製品がおすすめ。
- パーミッションの問題が発生したら/dev/ttyUSBのパーミッションを変えるかdialoutグループに参加する
起動時に、sudo 等でroot権限でArduinoIDEを動かしましょうという記事が多い中、きちんと権限を付与する方法を教えていただきまして感謝です。スッキリスマートにエレガントに使用することができました。ありがとうございます。
この記事が参考になってなによりです。droneさんのサイトを拝見しました。
大して深く考えず自分の環境に合わせて「GROUP=shj」という設定を記載していたので、反省して記事を修正しました。
大変遅くなりましたが、本当にありがとうございました。グループ権限の件も疑問が解けてすっきりしております。多分ご使用の環境のグループ(署名みてあとで気づきました)だとは思ったのですが、オープンソース系のアルアルで「実はそのようなグループが必要だった。」とか「呪文的に入れるのが慣例」かもなぁと思い、そのままとして降りました。ありがとうございました。