RaspberryPiでREX-USB60F(USBシリアルコンバータ)とIGMB56KS(DATA/FAX MODEM)を使用する
たまたま家を掃除していて見つけたので使えるかどうかの確認をしてみました。 この実験で思いついたことがあるので今後はそれに向けて形にしてみたいと思います。
以前はUSBタイプのモデムの接続を行っていましたが、基本的にはかわらないようです。
認識させる
基本的には接続させるだけでREX-USB60F(以下USBシリアルコンバータ)は/dev/ttyUSBデバイスとして認識します。
lsusb
コマンドでUSBデバイスを確認します。
$ lsusb (省略) Bus 001 Device 005: ID 0584:b020 RATOC System, Inc. REX-USB60F #←追加されたデバイス (省略)
接続すると/dev/ttyUSB*デバイスが生成されます。
そこで、以下のコマンドで認識をさせます。
~ $ sudo modprobe usbserial vendor=0x0584 product=0xb020
これで一応デバイスが認識できます。
起動時に認識させるには/etc/rc.localファイルに
/sbin/modprobe usbserial vendor=0x0584 product=0xb020
を追加します。
前回のモデムと同じ処理になります。
~ $ sudo vim /etc/rc.local
変更内容
#!/bin/sh -e # # rc.local # # This script is executed at the end of each multiuser runlevel. # Make sure that the script will "exit 0" on success or any other # value on error. # # In order to enable or disable this script just change the execution # bits. # # By default this script does nothing. # Print the IP address _IP=$(hostname -I) || true if [ "$_IP" ]; then printf "My IP address is %s\n" "$_IP" fi /sbin/modprobe usbserial vendor=0x2019 product=0xab27 /sbin/modprobe usbserial vendor=0x0584 product=0xb020 #←追加部分 exit 0
動作テスト
cu
コマンドをを使用してIGMB56KS(以下モデム)へのアクセスをします。
~ $ cu -s 9600 -l /dev/ttyUSB0 Connected. atz OK atdt117 NO DIALTONE atx3 OK at OK atdt177 NO CARRIER ~. Disconnected.
初期設定がダイアルトーン検知モードになっているので普通にダイヤルコマンドをたたいても "NO DIALTONE"になってしまうので"atx3"でダイアルトーンの検知をキャンセルすると ダイアルができます。(モジュラーにつながなくてもダイアル音が聞こえますが、このままだと"NO CARRIER"になります。)
pythonでATコマンドでダイヤルしてみる
pythonのコマンドラインインターフェースでATコマンド実行を行ってみます。 pythonでシリアルポートを使用するときはpyseriaモジュールを使用するのが簡単のようです。
【参照】
Examples — pySerial 3.0 documentation
現在のパッケージをpipコマンドで確認します。
~ $ pip list (中略) pyserial (2.6) (中略)
このようになっていればインストール済みです。インストールされていなかったら以下のコマンドでインストールを行います。
~ $ pip install pyserial
pyserialは以下のように使用します。
~ $ python Python 2.7.9 (default, Mar 8 2015, 00:52:26) [GCC 4.9.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import serial >>> ser = serial.Serial('/dev/ttyUSB0', baudrate=115200, timeout=3) >>> ser.write("atz\r\n") 5 >>> ser.read(16) 'atz\r\n\r\nOK\r\n' >>> ser.close() >>> quit() ~ $
生成時にtimeout値を使用していますが、これがあると呼び出し時に規定のバイト数に満たない場合でもtimeout秒数Waitをもって結果を返してくれます。ほかにも改行コードまで読み取るreadline()を使用してもよいのですが、ATコマンドではCRもLFも改行として読み取ら出るので何度も読み取りコマンドを行うハメになるので、read()で受信バイト数を多めにするのが楽かもしれません。
以下のプログラムで一応ダイアルができました。sleepの部分が美しくないので、もう少しきれいにしたいところです。
#!/usr/bin/env python # -*- coding: utf-8 -*- import serial import time ser = serial.Serial('/dev/ttyUSB0', baudrate=115200, timeout=3) ser.write("atx3\r\n") print(ser.read(16)) ser.write("atdt117\r\n") print(ser.read(16)) print('---wait---') time.sleep(60) print(ser.read(16)) ser.close()