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