自家製 FT-817コントローラー

もう年を越してしまったので昨年の事になるが、田舎へ引っ越してきた。寒いのを覚悟 していたけど思った程でもなくて一安心。

時々雪が降るけど根雪になる程でもなく、雪の苦労はなさそうである。でも、雪国なら ではの出費があるんよ。冬タイヤ装備が常識のこの地では、雪が無い時、路面が凍って いない時だけ車を動かすと言うズルを決め込む訳にもいかず。。。

冬タイヤを買ったよ。初回と言う事で、ホイル付きセット価格が82K円だった。 買いに行ったのが遅くて、在庫がほとんど掃けてしまっていて、お目当てのブリジストン 製は、展示品だけだった。店主の話では、いろいろなメーカーを試してみたけど ブリジストンが一番安心との事。タクシーもブリジストン製のやつを70%の車が装着 してるとか。プロが認める、ザックザックのブリザック。これで多い日も安心(かな)。

もう一つ思わぬ出費があった。引っ越してきた所は食器収納スペースが十分で無い為、 食器を入れる戸棚が欲しいと、女房からリクエスト。近くの家具屋を見て回ったんだけど、 思うようなのが無くて躊躇してたんだ。そしたら、務所で作られている物に掘り出し物が あるかも知れないから、見てきたらと実家からアドバイスが有った。

恐る恐る行ってみたけど、女房のお目にかなう物は無し。でも、親切な担当の方が カタログをくれた。通販ですな。これを見ていて、気 に入った物を見つけたみたい。代金を振り込んで物が用意出来たと連絡があったけど 、北海道からの輸送になるので数日かかるとの事。初荷にしてもらう事にした。

Webの引越し

とまあ、リアル世界の引越しは戸棚が届けば完了なんだけど、Webはどうする? 友人の 勧めで、geoの住民になる事にした。50Mまで無料との事だから、テキストしか載せない おいらには一生ものかな。前任地のISPに収納されたやつで新しめのやつを引越しした。

タイトルは、新規一転して変えてみた。

HAM es SPAM

esってのは、電信用語で、and の意味。よって翻訳すると

アマチュア無線と毒電波

ぐらいになろうか。なお、決して、私は蛇(Python)使いではありませんのであしからず。

FT-817 CAT コントロールプログラム

Webを巡回してたら、 FT-817をコントロールするもう一つのプログラムに出会った。 北海道アイコンからすると、北海道に思い入れのある方だな。ひょっとして、道民の方かしら。添付 されてたデータにNHK札幌が入っているって事は、やっぱり道民の方だ。(と、勝手にプロファイルング しちゃいました)

おいらも、ローカル用にデータの整備をして便利に使わして頂きます。どうもありがとうございました。

unix用のFT-817コントローラー

去年からの構想にあった、unix用のFT-817コントローラーを、しこしこと作ってみました。 ええ、FreeBSDとLinuxで動くやつです。

#!/usr/local/bin/ruby
# FT-817 controller

require 'fcntl'
require 'termios'
include Termios

DEV='/dev/cuad0'   # For FreeBSD 6.4 RS232C Line (Must be join group dialer)
#DEV='/dev/cuau0'   # For FreeBSD 8.X RS232C Line
#DEV='/dev/ttyS0'   # For Linux RS232C Line

FMT="\e[0;0H\e[K\tMode: %s  Freq: \e[33m%d.%03d\e[0m.%02d  S: %s\n"
MODE=["LSB","USB","CW","CWR","AM","-","WFM","-","FM","-","DIG","-","PKT"]
SM   =["0",
       "1      .",
       "2      ..",
       "3      ...",
       "4      ...o",
       "5      ...oo",
       "6      ...ooo",
       "7      ...oooO",
       "8      ...oooOO",
       "9      ...oooOOO",
       "9+10dB ...oooOOO*",
       "9+20dB ...oooOOO**",
       "9+30dB ...oooOOO***",
       "9+40dB ...oooOOO***!",
       "9+50dB ...oooOOO***!!",
       "9+60dB ...oooOOO***!!!" ]

def dev_open(path)
  dev = open(path, File::RDWR | File::NONBLOCK)
  mode = dev.fcntl(Fcntl::F_GETFL, 0)
  dev.fcntl(Fcntl::F_SETFL, mode & ~File::NONBLOCK)
  tio = Termios::new_termios()
  tio.ispeed = tio.ospeed = Termios::B9600
  tio.cc[Termios::VTIME] = 0
  tio.cc[Termios::VMIN] = 1
  tio.iflag = Termios::IGNPAR
  tio.cflag = (Termios::CSTOPB | Termios::CREAD | Termios::CS8)
  Termios.tcsetattr(dev, Termios::TCSANOW, tio)
  return dev
end

def read_back(c)
# below line for off-line debug
#if c =~ /\xE7/ then return "\x3F0000" else return "\x12\x34\x56\x78\x02" end
   COM.syswrite(c)
   sleep(0.05)
   rv = COM.sysread(5)
   return rv
end

def show(s,f,m)
  mhz = f[0]/16 * 100 + f[0]%16 * 10 + f[1]/16
  khz = f[1]%16 * 100 + f[2]/16 * 10 + f[2]%16
  chz = f[3]/16 * 10  + f[3]%16
  $stdout.printf(FMT, MODE[m], mhz, khz, chz, SM[s])
  $stdout.flush()
  return mhz * 100000 + khz * 100 + chz
end

def rx_status()
  r_fm  = read_back("0000\x03").bytes.to_a        # RX freq es mode
  r_sts = read_back("0000\xE7").bytes.to_a        # RX s-mater es etc
  rchz = show(r_sts[0] % 16, r_fm[0,4], r_fm[4])
  return rchz, r_fm[4]
end

def set_m(m)
  v = "0000\x07".bytes.to_a                        # set mode
  v[0] = m
  COM.syswrite(v)
  sleep(0.2)
end

def set_f(f)
   v = "0000\x01".bytes.to_a                       # set freq
   s = sprintf("%08d", f).split(//).map{|x| x.to_i - '0'.to_i}
   v[0] = s[0] * 16 + s[1]
   v[1] = s[2] * 16 + s[3]
   v[2] = s[4] * 16 + s[5]
   v[3] = s[6] * 16 + s[7]
   out  = v.pack("C*")
   COM.syswrite(out)
   sleep(0.2)                                      # Adj for B9600
end

def f_setup(c,f,m)
  c =~ /\d+/
  n = $& ? $&.to_i : 1
  fmp = false  ; fmp = true if (m == 6 or m == 8)
  case c[-1,1]
    when 'h' then d = fmp ?  -1000 : -10   # 10 := 100Hz, 1000 := 10KHz
    when 'l' then d = fmp ?   1000 :  10
    when 'j' then d = fmp ? -10000 : -100  # 100 := 1KHz, 10000 := 100KHz
    when 'k' then d = fmp ?  10000 :  100
    else     return
  end
  set_f(f + n * d)
end

def rec_m(c)
  s = c.upcase
  MODE.each_index{|m| set_m(m) if s == MODE[m]}
end

def rec_f(c) 
  if c =~ /\./o                    # case MHz
    f = (c.to_f * 100000).to_i
  else                             # case KHz
    f = c.to_i * 100
  end
  set_f(f)
end

def do_ex()
   c = $stdin.gets
   case c[0,1]
     when 'q' then exit
     when 'g' then rec_f(c[1..-1].strip)   # set absolute freq
     when 'm' then rec_m(c[1..-1].strip)   # set mode (by string)
     else       return
   end
end

def do_cmd(c,f,m)
  return "" if c == ""
  return c  if c[-1,1] =~ /[0-9]/o
  if c[-1,1] == ":"
     do_ex()
  else
     f_setup(c,f,m)                 # Realtime freq change by "hjkl" key
  end
  return ""
end

## main
d_on  = Termios::getattr($stdin)
d_off = d_on.dup()
d_off.lflag &= ~(Termios::ICANON | Termios::ECHO)  # Raw-mode es No-echo
COM = dev_open(DEV)
puts("\e[2J")                                      # clear screen
cc = ""
loop do
   rchz,rmd = rx_status()
   Termios.tcsetattr($stdin, Termios::TCSANOW, d_off)
     cc << $stdin.sysread(1) if IO.select([$stdin],nil,nil,0.01)
   Termios.tcsetattr($stdin, Termios::TCSANOW, d_on)
   cc = do_cmd(cc,rchz,rmd)
end

こやつを動かすには、 RAA - ruby-termiosが必要になります。 tar玉を取ってきて自分で入れるか、gemにもなっているようなので、入れてください。 また、シリアルラインを使うので、スクリプトの冒頭付近にあるDEVを適時指定の上、 シリアルデバイスのグループにあらかじめjoinしておいて下さい。

使い方

FT-817の通信スピードは、9600ボーに設定しておいて下さい。先にFT-817の電源を入れてから、 スクリプトを起動します。

     Mode: CW  Freq: 7.023.80  S: 9+40dB ...oooOOO***!

画面がクリアされて、画面の最上部に上記のような受信ステータスが表示されます。HAMの方なら 一目瞭然でしょう。Sメーターは、デジタル表示だけでは味気ないので、(趣味の悪い)絵文字に よるバーを付けてみました。S9以上はオーバーと言う事で、* を、うんと信号強度が強いと ! で びっくりの気持ちです。最近の若い人には分かるかなぁ?

スクリプトを終了するには、:q に続いて、ENTERキーを押します。CTRL-Cで強制終了させてしまうと 画面がおかしくなるかもしれないので注意してください。

このスクリプトは、メインダイヤルを(大幅に)回すのが面倒と言う人用(自分の事です。Hi)に 作っています。ダイヤルを回す代わりに下記のキーを押し下げます。

cmd       (W)FM      Other Mode
---      --------    ----------
 h          10KHz      0.1KHz
 l         -10KHz     -0.1Khz
 j         100KHz        1KHz
 k        -100KHz       -1KHz

それぞれのキーを1回押す毎に、受信周波数が上記のように変化します。コマンドキーの前に 数値を前置すると、キーを数値回数分だけ押すのと等価になります。例えば、モードがCWだった 場合、5j とキーインする事により、5KHz高い周波数を受信する。なお、キーインはecho されず即座に反映されます。(ちょっとゴミが残るけど、ご愛嬌って事で。。。)

また、周波数を大きく変化させる(バンド・チェンジ)場合は、コロンコマンドを使えば 楽チンだ。

:g 145.24
:g 7025

数値に小数点が混じっていると、MHzとして扱い、数値だけだとKHzで指定したものとみなし ます。(上の例だと、145.24MHzだし、下の例だと、7025KHzと解釈)なお、リターンキーを 押す前だと、修正できます。

:m cwr

等とすれば、受信モードを変更出来ます。これは、FT-817本体のモード切替SWを押した時の遷移を 覚えられなかったので付けてあります。

TODO

とまあ、viのコマンドに似せて、FT-817のコントローラーを作ってみた訳だけど、もう少し 便利にしたいぞ。と、viの説明書を開いてみる。

yだとかpだとか実装したいよね。yで受信周波数をコピーしといて、どこか他の周波数へ移動 した後、pで戻ってくるとか。

これを発展させると、nmで、マークして(nは任意の数字、複数をマーク出来るようにする)、n' で、任意の所に戻るとか。(ちょっと、viのコマンドとは違うけど、数値の前置の方が、プログラミング し易いから、勘弁な)

コロンコマンド(exモード)も拡張出来るな。:w file で、一時的にマークしてる周波数類を ファイルに落としておき、:r file で、それを呼び戻すとか。

まあ、基本の部分が出来ているので、後は実装するだけだな。