Raspberry Pi 2 との接続のためにお遊びで USB シリアル変換ケーブルを買ってみたのですが、 Windows 8.x 以降ではいろいろな問題のために使えないというシロモノでした。普段の環境は Windows7 だったりするので問題に直面しているわけではないですが、今後のことも考えて対策を考えてみました。
その結果が Ubuntu で使用する!です。こちらならばドライバの問題はなさそうなので。今回はその設定についてメモしておこうと思います。
USBシリアルのデバイス設定
接続するだけで簡単に認識して使えるものの、root権限がないとアクセス不可能な状態なので設定を変更します。
まずはデバイスの確認をしておきます。この中の PL2303 Serial Port となっている部分が USB シリアルデバイスのものなので、ID 箇所のペアを覚えておきます。
$ lsusb Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 002 Device 004: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port Bus 002 Device 003: ID 0e0f:0002 VMware, Inc. Virtual USB Hub Bus 002 Device 002: ID 0e0f:0003 VMware, Inc. Virtual Mouse Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
ルールファイルを作成します。なければ新規作成、ファイルがあれば末尾にでも追記
$ sudo vi /etc/udev/rules.d/60-usbser.rules
中身には以下のように記述します。改行してこちらには書いてありますが実際には1行で記入します。
KERNEL=="ttyUSB*", ATTRS{idVendor}=="067b", ATTRS{idProduct}=="2303", GROUP="uucp", MODE="0666"
設定できたらこの設定を反映させるために一度デバイスを抜き差しします。うまく設定できていればパーミッションが変更されているのが確認できると思います。
$ ls -l /dev/ttyUSB0 crw-rw---- 1 root dialout 188, 0 11月 3 11:53 /dev/ttyUSB0 ↓変更後 crw-rw-rw- 1 root uucp 188, 0 11月 3 12:19 /dev/ttyUSB0
ターミナルソフトをインストール
インストールはいつものコマンドでできます。
$ sudo apt-get install minicom
$ sudo minicom -s で起動すると以下のように画面が崩れるので、LANG=C 付きで起動させます. また設定ファイルを作るため sudo 付きで今回は起動します.
$ LANG=C sudo -E minicom -s
“Serial port setup” を選んでデバイスやら速度やらを設定します。今回は以下のように設定しました。
また minicom の標準設定ではモデム初期化文字列(コマンド?)が付与されてしまうようなので、これを無効化します。”Modem and dialing” のメニューを選択して、Dialing prefix/suffix あたりを削除しておきます(下図参照)
“Save setup as dfl” を選択して、 “Exit from minicom” で抜けます。これで /etc/minicom/minirc.dfl という設定ファイルができます。この後のためにこのファイルの中身を確認しておきます。
$ sudo vi /etc/minicom/minirc.dfl # Machine-generated file - use "minicom -s" to change parameters. pu port /dev/ttyUSB0 pu baudrate 38400 pu bits 8 pu parity N pu stopbits 1 pu mdialpre pu mdialsuf pu mdialpre2 pu mdialsuf2 pu mdialpre3 pu mdialsuf3
こんな感じなのでまた必要に応じて値を書き換えればよさそうです。
動作チェック
minicom では Ctrl+A, Z の順序でキーを押すと説明画面が出てきます。ここでさらに Q を押すと終了できます。
minicom を起動して、つないだ何かからデータをとってみます。ここでは目的の Raspberry Pi とつないで、 Raspberry Pi の中で以下のようなスクリプトを実行して、受信の確認をしてみました。
import serial import datetime def main(): con = serial.Serial( 'dev/ttyAMA0', 38400, timeout=1 ) print con.portstr while 1 : str = con.readline(); tim = datetime.datetime.now().strftime('%M:%S') ret = "send: " + tim + str + "\r\n" con.write( ret ) if __name__ == '__main__' : main()
これを実行しつつ Ubuntu 側での結果は以下のようになりました。 Ubuntu側で入力したキーも送信&受信で送り返されてくるのが確認できました。
以上で一応通信ができているっぽいことは確認できたので使えそうな感じがします。
ドライバの問題とは
どうも PL2303 のチップがデッドコピーのようなものが出回ったので本家が対策したとの流れのようです。詳しくは検索してみてください。安くて手軽だったのはいいですが、 Windows8以降の今後のことを考えると、FTDIの変換ケーブル+αで通信できるようにしておくべきかなと感じました。
[amazonjs asin=”B014CA59P4″ locale=”JP” title=”USB to TTLシリアルケーブル 1M (PL2303HX)”]