Python
RaspberryPi
RS232C
pyserial

RaspberryPiでRS232C機器を制御した

配線が果てしなく面倒だったので、RS232Cの機器をラズパイで制御したいなーと。
Ethernetでラズパイを通してコマンドを送れれば新たに配線の必要ありませんし、どのPCからでもアクセスできたりといろいろと嬉しいことがあるかと思います。

概要

ググったらいろいろと記事がありました。

Pythonとハードウェア ー PythonでRS232Cを利用する -
https://qiita.com/nonbiri15/items/2211547da4dc9abcc321
Raspberry Pi でシリアル通信
https://hack-le.com/44765804-2/
などなどいろいろと参考にさせていただきました。ありがとうございます。

で、どうやらラズパイとRS232C機器の入出力方式には、
- GPIO (ラズパイの一般入出力インターフェイス) を用いる
- USB-RS232C変換チップを用いる
の二つのやり方があるようです。GPIOはちょっと面倒なので、後者にしました。

USB-RS232C変換チップはFTDI社FT232RLを用い、実際にはそれを実装した変換ケーブルを使います。
Windowsしかサポートされてませんが、Linuxであれば標準で認識してくれます。
このデバイスに向かってPythonのライブラリPySerialでコマンドを送るということにしました。

用意したもの

Raspberry Pi 3
Python2.7 + PySerial
FT232 USB-シリアル変換ケーブル VE488 (FT232RLを利用するものならなんでもいいです)
http://akizukidenshi.com/catalog/g/gM-08343/

RS232C機器、外部制御用のPCなど。

実装

ラズパイと変換ケーブルを繋ぐと、

/dev/ttyUSB0

このttyUSB0が変換チップで、ちゃんと認識されます。
変換ケーブルをさらにRS232C機器に接続して、その後ラズパイでttyUSB0に向かってコマンドを送ります。

serial.py
import serial    #    PySerial

dev = "/dev/ttyUSB0"    #    デバイス名
rate = 9600    #    レート (bps)
ser = serial.Serial(dev, rate, timeout=10)

string = "Hello World"
string = string + "\r\n"    #    ターミネーターを付ける
ser.write(string)    #    コマンド送信

res = ser.readline()    #    コマンド受信
res = res.encode()    #    エンコード
print res

こんな感じで。実行すればRS232C機器にコマンドが送られます。

pythonの文字型はpython2と3で違うようなので十分注意してください。
僕もよくわかってないのですが、とりあえず2の場合は上のような感じで送れば大丈夫かと思います。
後はsshでラズパイに接続して直接スクリプトを動かすなり、サーバーを立てるなりすればいいのではないでしょうか。

まとめ

RS232C機器はちゃんと動いてくれました。これが万が一できなかったら30m以上の配線が必要だったのでハッピーです。IoTの息吹を感じる。