Mac で RS232C の制御をするなら FTDI を使え

未だに実験室には RS232C 制御の実験装置というのは溢れていて、そしてしかし、そんな端子を持った Mac なんてのは売ってないわけです。有名メーカーの定番商品を新品で買っても、昔からの端子構成のままでちっとも背面パネルが更新されていない。じゃあどうやって制御するかと言うと、USB と RS232C を変換するケーブルを使って USB 経由で制御するわけです。

この電子機器制御の分野では Mac なんて顧みられることはなく、当然メーカーも Windows 対応しかしていません。Mac で USB to RS232C 変換ケーブルを使うにしても、そのケーブルがちゃんと Mac に対応していなくてはいけない。変なケーブルを買うと Mac じゃ動きません。

で、お薦めは FTDI の USB to RS232C 変換チップを搭載した製品で、例えば iBUFFALO の BSUSRC0610BS は完璧に動作します。購入してみないとどこのチップが使われているのか分からず不安ですが、これなら FTDI なので Mac でも大丈夫です。

FTDI の変換チップは色々な場所で使われていて、経験的には 8 割くらいの製品がここの USB to RS232C の変換チップを使ってます。カタログに USB 端子内蔵の装置と書かれている場合、背面パネルの USB 端子の奥にこの FTDI のチップが載っていることが多いです。そうすると、通信コマンドは RS232C で経験したのと同じ作法で送信できるので利用者側の敷居も低くなります。

さて、FTDI の何が良いかと言うと Windows は当然として、OS X にも Linux にもちゃんと device driver を公開してくれているところ。少なくとも OS X 用の 2.2.18 は Mountain Lion で、Linux の 1.5.0 は Scientific Linux 5.5 (64 bit) で問題なく動作しています。

他のメーカーだと device driver がなかったり、あっても有志が開発しているのを自分で build しないといけなかったりで、面倒です。公式に device driver を FTDI が出してくれているのは非常にありがたい。

FTDI のチップにはそれぞれに serial number が書き込まれており、例えば FT123456 という S/N であれば、device driver を入れた MacBSUSRC0610BS を接続すると /dev/tty.usbsrial-FT123456 という device file が自動生成されます (OS X の場合)。あとは、この device に対して好きなように読み書きすれば良し。

Linux の場合は、lsusb という command で USB 機器の接続を確認できます。Mac の場合は system_profiler という command を代わりに使います。

Mac の場合。

[oxon@Mac ~]$ system_profiler SPUSBDataType
(略)
    USB 3.0 Hi-Speed Bus:

      Host Controller Location: Built-in USB
      Host Controller Driver: AppleUSBXHCI
      PCI Device ID: 0x1e31 
      PCI Revision ID: 0x0004 
      PCI Vendor ID: 0x8086 
      Bus Number: 0x14 

        USB HS SERIAL CONVERTER:

          Product ID: 0x6001
          Vendor ID: 0x0403  (Future Technology Devices International Limited)
          Version: 4.00
          Serial Number: FT123456
          Speed: Up to 12 Mb/sec
          Manufacturer: FTDI
          Location ID: 0x14100000 / 1
          Current Available (mA): 500
          Current Required (mA): 44
[oxon@Mac ~]$ ls /dev/tty.usbserial*
/dev/tty.usbserial-FT123456

Linux の場合 (VMware 上の virtual machine です)。

[oxon@Linux ~]$ lsusb 
Bus 001 Device 001: ID 0000:0000  
Bus 002 Device 003: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC
Bus 002 Device 001: ID 0000:0000  
Bus 002 Device 002: ID 0e0f:0002 VMware, Inc. Virtual USB Hub
[oxon@Linux ~]$ ls /dev/ttyUSB*
/dev/ttyUSB0

で、実際に使用する時は僕は基本的に PySerial を使っていて、↓こんな感じにやります。

import serial
keithley = serial.Serial(port="/dev/tty.usbserial-FT123456",
                         baudrate=57600,timeout=1,writeTimeout=1)

keithley.write('*RST\n')
keithley.write(':SENS:FUNC "VOLT"\n')
keithley.write(':SOUR:FUNC VOLT\n')
keithley.write(':OUTP ON\n')