PCから八重洲無線 FT-991シリーズをシリアル通信で制御する

JA1YCG局にてアマチュア無線局のリモート運用を計画中のため、準備としてリグの隣にあるPCから制御を行ってみました。
FT-991シリーズをシリアル通信で制御するためのまとまった流れが書いてある記事が見つからなかったので、局内向けも兼ねて書いておきます。

# 用意するもの
- FT-991 シリーズ（当記事ではFT-991Mを使用しました）
- USBケーブル（タイプBコネクタ）
  + スマホ等に利用するものではなく、プリンタやスキャナなどの接続に使う大きめのアレです
- 任意の Windows PC （Macについてはそのうち検証します）
- 適切な免許（無線設備の操作には免許が必要です）

# 1. ドライバのインストール
[八重洲無線のWebサイト](http://www.yaesu.com/jp/amateur_index/driver/GetStart.html)から **仮想COMポートドライバー** をダウンロードし、インストールします。

# 2. PCと接続
FT-991シリーズをPCと接続します。デバイスマネージャを開き、「ポート(COM と LPT)」に

- `Silicon Labs Dual CP210x USB to UART Bridge: Enhanced COM Port (COMx)`
- `Silicon Labs Dual CP210x USB to UART Bridge: Standard COM Port (COMx)`

が追加されていればOKです。（COMポートの番号は環境によって異なりますが、シャットダウンや切断/再接続をしても変わることはありません。）
今回使うのは **Enhanced** の方なので、そちらのポート番号を覚えておいてください。

![DevMan.PNG](https://qiita-image-store.s3.amazonaws.com/0/185296/741c9a6e-538a-23e2-7e0e-ccb001a0a145.png)


# 3. ターミナルソフトをダウンロードする
慣れているソフトをご利用されている方はもちろんそれで構いません。

特にこだわりがなければ [Poderosa](https://sourceforge.net/projects/poderosa/) をおすすめします。

zipファイルをダウンロードしたら、 **zipファイルのプロパティから「ブロックの解除」にチェックを入れた上で** 展開し、 `Poderosa.exe` を起動してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/185296/72a5d054-1153-f472-2a64-08e0a6b7627f.png)

さもないとこういうダイアログが出てきて起動できなくなるはずです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/185296/1b344f19-a8b4-6780-7b01-3be6e517ed37.png)

# 4. リグと通信が確立できるかを確認する

Poderosa でシリアルポート接続をクリックします。
![poderosa-serial.png](https://qiita-image-store.s3.amazonaws.com/0/185296/6020cd20-a2d6-ed8d-cb05-f8a3798836f2.png)

FT-991 シリーズを接続する場合、特に FT-991 の設定を変更していなければ

- ポート: 先ほどデバイスマネージャで参照した、 Enhanced の方のポート番号
- ボーレート: 4800
- ストップビット: 2ビット

にしてください。また、自分が入力したコマンドを確認するため、ローカルエコーは「する」にしておくことをおすすめします。

![poderosa-serial1.png](https://qiita-image-store.s3.amazonaws.com/0/185296/442a2879-e13f-f557-31c7-bafaa4856baf.png)

設定が完了すればOKをクリックします。

続いて、無事接続できたら任意のコマンド（たとえば周波数を表示する `FA;` ）を入力し、`FA43306800;` のような表示や `?;` という表示が返ってくるようであれば通信は確立できています。
`?;` の場合はエラーなのですが、原因と対処を以下に示しますので設定を変更してください。

# 5. FT-991側の設定を変更する
少なくとも私の環境や状況においては、初期段階では何を打ってもエラー `?;` が返ってきて戸惑ったのですが、これはコマンドを入力している途中にリグ側がタイムアウトしてしまうのが原因のようです。
タイムアウトの初期値がかなり短くなっているので、FT-991側でメニューを開き、`032 CAT TOT` の設定値を `1000msec` や `3000msec` に変更します。（特に理由がなければ `3000msec` でいいと思います。）

![ft991m-cat.jpg](https://qiita-image-store.s3.amazonaws.com/0/185296/96838e4a-c19c-2cb0-b32d-fbbcbb5fb043.jpeg)


# 6. コマンドを入力してみる
コマンドに関しては、[FT-991 CAT オペレーションリファレンスマニュアル](http://www.yaesu.com/jp/manuals/yaesu_m/FT-991_CAT_OM_J.pdf) がオンラインで公開されていますので、これを参照してみましょう。

コマンドの終わりは `;` （コロン）となっており、Enterキーは入力する必要がありません。
コマンドの紹介はキリがないので、とりあえずここでは周波数を確認して終わりにしてみましょう。
`FA;` と入力すると現在の周波数が整数値（単位: Hz）で返ってくるはずです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/185296/6104c7ce-5ef0-23cd-eb18-e548bc8b5a94.png)

なお、 電源操作を行う `PS` コマンドを用いて `PS0;`（電源OFF） と入力したところ、電源は切れましたがやや不安定な挙動になりました。
当方の環境や知識不足に起因する問題なのか、そもそも FT-991 シリーズの問題なのか情報量が少なくて判断できないのですが、私は今のところ電源操作は避けているという感じです。

# 個人的な今後の課題
- .NET Framework の [SerielPortクラス](https://msdn.microsoft.com/ja-jp/library/system.io.ports.serialport(v=vs.110).aspx) を使えば制御するプログラムはかなり容易に書けそう
- [serialport](https://www.npmjs.com/package/serialport])を使ってNode.jsから制御してみたいところ
  + Electron を使えばクロスプラットフォームなリグコントロールソフトも夢じゃない？