✖
Mac OS X でリグコントロール 基本 (YAESU FT-450D)
いろいろ接続方法はあるけど、汎用・簡単なのは iBUFFALO USBシリアルケーブル (BSUSRC0610BS) とメスメス変換コネクタを使って無線機のCAT端子とコンピュータを接続する方法っぽい。ストレートに普通に接続すればいい。コネクタ一緒に買っても2000円ぐらい。
BSUSRC0610BS は FTDI チップを使っている。Mac はバッファロー公式にはサポートされてはいないけど、FTDI のサイトで Mac 用のドライバも提供されていて、普通に使える。
ドライバをインストールした上で、接続すると、/dev/tty.usbserial-FTB3L9UG とかデバイスファイルができる。
Ruby で呼び出してみる。
Ruby でシリアルポート (RS-232C) を扱う場合、gem install serialport を使うと簡単なようだ。以下のようなコードでなんとなく操作できる。
プロトコルのマニュアルは八重洲のページからダウンロードできる。特に pack/unpack をする必要もないし、ASCII データのやりとりだけなので、プロトコル自体は難しくなく、そのまま読むことができる。
この例では、
- VFO-A に切替え
- AI をオン (こちらから要求しなくてもリグの状態が変化すると通知される)
- VFO-A の周波数を設定
- 上方向にスキャン開始
- AI で送られてくる FA (周波数変化情報) が指定した周波数以上になるまで待つ
- スキャンを停止
- AI をオフ
ということをしている。
class CAT
BAUDRATE = 4800
DATABIT = 8
STOPBIT = 2
PATITYCHECK = SerialPort::NONE
Message = Struct.new(:cmd, :params)
def initialize(args)
@port = SerialPort.new(
args[:port],
BAUDRATE,
DATABIT,
STOPBIT,
PATITYCHECK
)
@read_queue = Queue.new
@read_thread = Thread.start do
while message = @port.gets(";")
_, cmd, params = *message.match(/^(..)(.+);/)
@read_queue.push(Message.new(cmd, params))
end
end
end
def command(cmd, param="")
@port.write "#{cmd}#{param};"
sleep 1
end
def scan(start, finish)
# SELECT VFO-A
command "VS", "0"
# AUTO INFORMATION
command "AI", "1"
# SET FREQUENCY
command "FA", "%08d" % start
# START SCAN
command "SC", "1"
while m = @read_queue.pop
next unless m.cmd == 'FA'
if finish < m.params.to_i
break
end
end
# STOP SCAN
command "SC", "0"
# DISABLE AUTO INFORMATION
command "AI", "0"
end
end
cat = CAT.new({ :port => '/dev/tty.usbserial-FTB3L9UG' })
cat.scan(7_000_000, 7_030_000)
このように、連続してコマンドを送ったりする場合、適当に sleep を入れないとだめとか、そういうのがあるようで、ちょっと面倒くさい。うまくできるまで試行錯誤が必要そう。何かもっと正しいやりかたがあるかもしれない。
あと、応答が存在するコマンドを、こちらから一方的に連続して送りつけると、受信できるデータがまざっておかしなことになる。どんな実装になってんだよ、って感じだけど、コマンドを送るときは1つずつ確認しながら送る必要がある。ただし、応答がないコマンド (単にセット) は、応答がないので、いかんともしがたい。よくわからん!
さらにいえば、このような一連のコマンドでオートコントールしようとするなら、無線機側の操作を全 LOCK する必要がありそう。LOCK コマンド自体はあるけど、部分的にしかロックできなかったりするのでめんどい。