自家製 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 で、それを呼び戻すとか。
まあ、基本の部分が出来ているので、後は実装するだけだな。