読者です 読者をやめる 読者になる 読者になる

RaspberryPiでREX-USB60F(USBシリアルコンバータ)とIGMB56KS(DATA/FAX MODEM)を使用する

python コンピュータ RaspberryPi 開発

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モジュールを使用するのが簡単のようです。

【参照】

github.com

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()