"KXPD3 Keyer Paddle" は普通の KEY 端子とは別に、下部で4ピンで出ているのを使っている。マニュアルにも回路図にもピン配置が書いていないので調べた。(KXPD3 は持ってない)
ピン番号は回路図に倣った。KX3SchematicDiagramDec2012.pdf の9ページ
3V3 は何のためについているかわからないけど、330Ωがついているので10mAしか流れない。実測したけど9mAしか流れない。
GND はケースに導通しているのと共通
"KXPD3 Keyer Paddle" は普通の KEY 端子とは別に、下部で4ピンで出ているのを使っている。マニュアルにも回路図にもピン配置が書いていないので調べた。(KXPD3 は持ってない)
ピン番号は回路図に倣った。KX3SchematicDiagramDec2012.pdf の9ページ
3V3 は何のためについているかわからないけど、330Ωがついているので10mAしか流れない。実測したけど9mAしか流れない。
GND はケースに導通しているのと共通
と思いはじめ、いろいろ調べてみた。移動といっても車も自転車もないので、バッテリーやアンテナなども含め徒歩や公共交通機関で運搬可能な範囲でなければならない。
国内だと FT-817ND というリグがこの用途ではスタンダードなようでかなりたくさんの人が使っている。FT-817ND は2001年発売とかなので、おそろしく長く売ってる無線機となっていて、国内には競合製品がない。
ほかにも候補があるか?と思ってさらに調べてみると、アメリカ Elecraft 社の KX3 というのが良さそうだということがわかった。こちらは2012年?ごろに発売された比較的新しい無線機で、FT-817ND と同じぐらい小さい。
結論からいうと表題の通り KX3 を買ったが、以下のポイントで決めた
問題は主にコスト面で、FT-817ND がフィルタ込みで9万円ぐらいで買えるのに対し、KX3 は必要なオプションを入れていくと1.5倍ぐらいになる。また、技適を取得していない無線機なので、局免をとるのに結構ハードルがある。
特に何も考えず Elecraft に直で注文した。
国外にあるうちは USPS のほうが細かくステータスがアップデートされるけど、国内に入った瞬間からJPのほうが早く更新されるようになるみたい。2時間ぐらい遅れてUSPSにも反映される。
モジュールキットと完成品とがあるんだけど、せっかくなのでモジュールキットにした。地味にこういうの苦手なのでちょっと心配なんだけど、Elecraft の About ページ 見てたらキットにしなければならない気がしてきたのでそうした。
ケーブルセットは案外 L 型のコネクタが手に入りにくいので買っておいた。ルーフィングフィルターは自分の用途だとたぶん必要ないけど、CW メインでやるという意気込みをもって追加した (あとから追加すると調整が面倒)。アンテナチューナーはワイヤーアンテナでもいける感じのやつなので、最悪長いケーブルさえあれば出れるように追加した。
なかなかかかる。無線機に関税はかからないけど、消費税は税関でかかる。
注文しちゃったあとで調べたら国内代理店だと、ちょうど代理店の手数料分1万ちょいだけ浮く感じだった。直販だと届くまでに日数がかかるのと、ちゃんと届くのが不安とかがあるので、代理店で買ってもいいレベルの差ではあるかもなあという印象。
思いのほか小さい箱で届く。
検品からはじめて、最初に動かすまで4時間ぐらいかかってしまった。めちゃくちゃ難しいみたいなことはないんだけど、小さいだけあって中身が狭いので、ビス締めるのが微妙にむずかったり、ケーブルの接続がしにくいとかがあった。とりあえずちゃんと動いたのでよかった。
ビスの長さが一部 (スピーカーまわり) で違ったんだけどなんとかなったっぽい。アメリカンな感じ…
ファームウェアはなぜか最初から最新 (2014-07-11) の beta 版 (production 版と別れてるんだけど) が書きこまれていたのでアップデートはしていない。
よくあるツールなんだけど、なかなか希望に叶うものというと見つけにくく、どうせなら自分で書いたらいいかと思ったので書いてみた。やってみたら割とすぐ書けた。
MacRuby のインストールが必要。1ファイルにしたかったので、XCode なしで使っている。あんまり XCode なしでの作例がないが普通に NSApplication.sharedApplication を取得したらいいだけだった。
NSEvent.addGlobalMonitorForEventsMatchingMask:handler: は「システム環境設定」→「セキュリティとプライバシー」→「アクセシビリティ」で macruby を許可しないと使えない。これができるということは、すなわちキーロガーが実装できるということなので、必要なときだけ許可するほうがいいと思う。
#!macruby
framework "Cocoa"
class MainView < NSView
def init
super
@log = ""
end
def drawRect(rect)
super
NSColor.clearColor.set
NSRectFill(bounds)
font = NSFont.boldSystemFontOfSize(24)
shadow = NSShadow.alloc.init
shadow.setShadowColor(NSColor.blackColor)
shadow.setShadowBlurRadius(2)
shadow.setShadowOffset([0, 0])
attrs = NSMutableDictionary.alloc.initWithDictionary({
NSForegroundColorAttributeName => NSColor.whiteColor,
NSFontAttributeName => font,
NSShadowAttributeName => shadow,
})
y = 0
@log.split(/\n/).reverse.each do |line|
storage = NSTextStorage.alloc.initWithString(line, attributes: attrs)
manager = NSLayoutManager.alloc.init
container = NSTextContainer.alloc.init
manager.addTextContainer(container)
storage.addLayoutManager(manager)
range = manager.glyphRangeForTextContainer(container)
10.times do
manager.drawGlyphsForGlyphRange(range, atPoint: [0, y])
end
rect = manager.boundingRectForGlyphRange([0, manager.numberOfGlyphs], inTextContainer: container)
y+= rect.size.height
end
end
def <<(log)
@log << log
@log = @log.split(/\n+/, -1).last(5).join("\n")
end
def clear
@log.clear
end
end
class AppDelegate
attr_accessor :window
def applicationDidFinishLaunching(a_notification)
@enable = true
prevKeyed = 0
unless AXIsProcessTrusted()
$stderr.puts "Require setting"
system('open', '/System/Library/PreferencePanes/Security.prefPane')
exit
end
NSEvent.addGlobalMonitorForEventsMatchingMask(NSKeyDownMask, handler: lambda {|e|
return unless e.type == NSKeyDown
mod = ""
if e.modifierFlags & NSShiftKeyMask != 0
mod += "⇧"
end
if e.modifierFlags & NSControlKeyMask != 0
mod += "⌃"
end
if e.modifierFlags & NSAlternateKeyMask != 0
mod += "⌥"
end
if e.modifierFlags & NSCommandKeyMask != 0
mod += "⌘"
end
if (e.modifierFlags & NSControlKeyMask != 0) && (e.modifierFlags & NSCommandKeyMask != 0) && e.charactersIgnoringModifiers == 'l'
@enable = !@enable
@view.clear
@view << (@enable ? "[enabled]" : "[disabled]")
@view.needsDisplay = true
return
end
if @enable
if e.modifierFlags & (NSControlKeyMask | NSAlternateKeyMask | NSCommandKeyMask) == 0
char = readable(e.characters)
if Time.now.to_i - prevKeyed > 1
@view << "\n#{char}"
else
@view << char
end
else
@view << "\n#{mod}#{readable(e.charactersIgnoringModifiers).upcase}\n"
end
@view.needsDisplay = true
end
prevKeyed = Time.now.to_i
})
rect = [0, 0, 800, 500]
@window = NSWindow.alloc.initWithContentRect(rect, styleMask: NSBorderlessWindowMask, backing: NSBackingStoreBuffered, defer: 0)
@window.opaque = false
@window.hasShadow = false
@window.level = 1000
@window.movableByWindowBackground = true
# @window.ignoresMouseEvents = true
@window.makeKeyAndOrderFront(nil)
@window.orderFrontRegardless
@view = MainView.alloc.initWithFrame(rect)
@view.init
@view << "Initialized"
@window.contentView = @view
end
REPLACE_MAP = {
"\r" => "↵\n",
"\e" => "⎋",
"\t" => "⇥",
"\x19" => "⇤",
" " => "␣",
"\x7f" => "⌫",
"\x03" => "⌤",
"\xEF\x9C\xA8" => "⌦",
"\xEF\x9C\x84" => "[F1]",
"\xEF\x9C\x85" => "[F2]",
"\xEF\x9C\x86" => "[F3]",
"\xEF\x9C\x87" => "[F4]",
"\xEF\x9C\x88" => "[F5]",
"\xEF\x9C\x89" => "[F6]",
"\xEF\x9C\x8A" => "[F7]",
"\xEF\x9C\x8B" => "[F8]",
"\xEF\x9C\x8C" => "[F9]",
"\xEF\x9C\x8D" => "[F10]",
"\xEF\x9C\x8E" => "[F11]",
"\xEF\x9C\x8F" => "[F12]",
"\xEF\x9C\x80" => "↑",
"\xEF\x9C\x81" => "↓",
"\xEF\x9C\x82" => "←",
"\xEF\x9C\x83" => "→",
"\xEF\x9C\xAC" => "⇞",
"\xEF\x9C\xAD" => "⇟",
"\xEF\x9C\xA9" => "↖",
"\xEF\x9C\xAB" => "↘",
}
def readable(char)
p char
re = Regexp.new(REPLACE_MAP.keys.map {|i| Regexp.escape(i) }.join("|"))
char.gsub(re, REPLACE_MAP)
end
end
app = NSApplication.sharedApplication
app.delegate = AppDelegate.new
app.run