体調不良で土曜日の午前中の短い時間しか参加してないが、少し交信した。
大きな収穫はブラジルとの交信成功だと思う。ちゃんと交信できたか心配だったけど LoTW でも QSL になっていた。
ブラジルといえば日本から最も遠いわけで、ベランダ設置のショボいアンテナに50Wで交信できたのは感動的だ (相手の耳が非常に良いということ)
体調不良で土曜日の午前中の短い時間しか参加してないが、少し交信した。
大きな収穫はブラジルとの交信成功だと思う。ちゃんと交信できたか心配だったけど LoTW でも QSL になっていた。
ブラジルといえば日本から最も遠いわけで、ベランダ設置のショボいアンテナに50Wで交信できたのは感動的だ (相手の耳が非常に良いということ)
なんかしらんが Mac の時計が狂う。JT65 というプロトコルは時刻に強く依存しているため、1秒以内に時計があっていないとうまく交信できない。
$ vim /etc/ntp.conf server ntp1.jst.mfeed.ad.jp iburst server ntp2.jst.mfeed.ad.jp iburst server ntp3.jst.mfeed.ad.jp iburst
デフォルトから書きかえて3つ設定しつつ、iburst (initial burst = 起動時の時刻急速修正) するようにしておく。
$ sudo killall ntpd $ tail -F /var/log/system.log # 正常に起動してるか確認する
kill するだけで自動的に再起動される
$ watch ntpq -pn
remote refid st t when poll reach delay offset jitter
==============================================================================
*210.173.160.27 172.29.2.50 2 u 46 64 3 57.774 -6.802 30.130
210.173.160.57 172.29.2.50 2 u 45 64 3 72.701 2.007 30.066
210.173.160.87 172.29.3.60 2 u 46 64 3 58.001 -6.619 49.201
SWR 計を作ったので、これと連携して、MLA のモーター動かして自動的に同調させる。
SWR 計つくったのは、そもそも本来これがやりたかったからなので、完全に yak-shaving
である。
SWR の大きさに応じて、一度に動かす量を可変する。
既にアンテナ切替器などを Raspberry Pi に接続して管理しているので、これもそのようにする。つまり
まず I2C でステッピングモーターを制御する基板をつくった。
特筆するようなことはなく、I2C 経由で方向とステップ数を書くとその通りにステッピングモーターを動かすというもの。
モーターとの接続は DIN 8PIN の一部にピンを使って行ってる。
SWR 計は USB Serial として接続し、モータードライバは Raspberry Pi の I2C バスに接続しているので、ソフトウェアは Raspberry Pi 上の Ruby で気軽に書ける。適当に書いたら動いた。
SWR の測定誤差の関係で、連続送信していないと、どうしてもちょっと振動したり、同調点から離れすぎていると挙動不審になったりするのが改善点だが、このようなやりかたで概ねうまく動くことがわかった。
汎用パワーリレーによる同軸切替器を使っているが、やはり問題点がある
そこで、市販の回転スイッチ式同軸切替器をリモート化するということを考えた。この場合
問題は切替器のスイッチをどう動かすかという点
定番の第一電波工業の CX-210A
3接点のものもあり、スイッチ部は同じなのでうまくいけば、応用も効きそう。
切替器のスイッチを駆動するには多くとも半回転すれば十分なので、お手軽にやるならサーボモータが良さそう。
問題はトルクだが、試したところそこそこ低価格のものでも十分すぎるトルクはでることがわかった。
使ったのは GWS03T/2BBMG/JR 7.4kg・cm (4.8V) で、1000円。
ちなみに、さらに安価な SG90 (1.80 kg・cm) ではトルク不足だった。
これが一番面倒。機械的にしっかり力が伝わるようにしないといけない。
CX-210A のスイッチ部は 6mm の固定幅なため、適当に 3mm 厚のアクリルを切ってはりあわせるだけで、ぴったりの大きさの治具を作ることができる。あとはこれにサーボホーンを固定して (M3 のタップを切った) やれば、結構綺麗にいく。
あとはサーボモータ本体と切替器を相対的に固定することが必要だが、100均の100cm四方のMDF材と100mm M3 のビス3本でなんとかした。サーボモータを固定するため、四角い穴をあけなければならないのがネックだが、MDF材は割と加工性が良く、カッターやプラスチックカッターでなんとかなる。
でもって冒頭のような感じになった
CX-210A は約40度で2接点が切り替わるようだった。マイコンには設定モードをつけ、位置を補正する仕組みが必要になる。今回はとりあえず試しただけなので、そのへんの実装はしてない。
また、RCサーボモータは負荷がかかっていると完全に停止せず、ブブブブと鳴ってしまうことがあるみたいなので、これを対策する必要がある。具体的にはサーボの移動速度は決まっているので、一定時間後になったらサーボモータへの電源供給を切ってしまえばいいと思う。つまり
みたいなサイクルでスイッチを行う。
サーボモータで市販の同軸切替器を回すのは案外簡単だった。メリットは冒頭に書いた通りだが、複数台作って組合せようと思うと案外金と労力がかかる。ただしメンテナンスは比較的しやすいように思う。
あと、市販の同軸切替器の罠は、グラウンドが全て共通になってしまう点で、アンテナによっては調整が難しくなりそう。これはどうしようもなくてつらい。
KX3 は 8.8cm x 18.8cm x 4.1cm と、スマフォとして考えると大きすぎるし、タブレットとして考えると厚さが多すぎるという大きさなので、市販の殆どのマウントアームは直接使用できない。
任意のガジェットを任意の位置に固定するためのもので「RAM マウント」というのがある。例えばスマフォを自転車に固定したいとか、車椅子にモニターをつけたいとか、そういう場合に使うやつ。
RAM マウントはアメリカの会社が作っていて、いくつかのパーツを組合せて使うようになっている。ちなみに個々のパーツが案外高価なので、別にお得ではない。ただ、かなり強靭な作りになっている。
で、RAM マウントのシリーズの RAM-HOL-UN4U (ユニバーサルフィンガーグリップ) というのだと、KX3 でもぎりぎり保持することができる。この製品は Elecraft 公式のモービル運用マニュアルにも紹介されており、安心感がある。
それに加え
を買ってセッティングした。クランプベース以外はヨドバシ、クランプベースは PDF 工房にて購入した (amazon.co.jp では殆ど売ってない。amazon.com だと売ってるけど日本へ発送しないことが多い。いろいろ見たがヨドバシが品揃えと価格面で最強だった)
机を少しでも広くして、なおかつ掃除しやすくするというのが目的だったが、これは叶った。
RAM マウントはかなり強力に固定ができるが、ボタンを押すときはやはり揺れる。
その手の人には有名?らしいけど「フルフルネクスト」というのがあって、これはマジで効く…… 今まで薬局で最安だし痒くなりにくいと謳っている「メリット」を使ってたけど、すぐ体感できるレベルで違う。
僕はストレス耐性が低く、頭をガリガリ掻きがちなので大変頭皮環境が悪く、
という悪循環に陥りやすく、一旦入ると抜けだしにくかった (季節が変わる・ストレスの原因がなくなるなどしないと抜けれない) けど、これのおかげでハゲへを道を遠ざけられた気がする。
Cable Matters 製造中止商品 cho45
これ最近6本ぐらい買った。1セット2本で900円なので、一本あたり450円、金メッキコネクタかつシールドケーブルなんだけど、自作しようとするとコネクタだけで700円ぐらい余裕でかかるので、かなりコストパフォーマンスが高い。
フォーンプラグが好きで、汎用のコネクタとしてさえも良く使う。なので無限にフォーンプラグのケーブルがあっても困らないし、無限にフォーンプラグのコネクタがあってほしい。以下のようなメリットがある
とはいえ、3線しか配線できないので、それ以上必要になると4極フォーンプラグとか少し特殊なものになってしまう。
自作していると、ケースに取り付けるタイプのコネクタで汎用性が高いものが欲しくなる。つまり
を満たすようなコネクタが欲しくなる。
いろいろ調べてみたが結局のところあまり選択肢はない。
基本はミニプラグ3極が最も入手性が高い
メリット
デメリット
9ピン〜50ピンまで手に入る。9ピンものもは RS-232C ケーブルとして有名なので入手性が非常に良い
メリット
デメリット
ノーマルのDINコネクタ、2ピンから9ピンまでの規格があるが、入手性的には6〜8ピンぐらいが使いやすい。価格が同じならピンが多くて困ることはなく、8ピン一択でたくさん買うと良い。
メリット
デメリット
6ピンのものはPS/2 キーボード・マウスで使われているのでケーブルの入手性は高い
メリット
デメリット
LAN ケーブルとかのやつ
メリット
デメリット
いわゆる電話線のモジューラジャック。最大6ピンなんだけど、実際は6ピンのものはあまり流通しておらず、LAN ケーブルよりも高価だったりする。
メリット
デメリット
3極以下ならフォーンプラグ一択。極数が多い場合安くて入手性の良い D-sub 9ピンを検討するのが良さそう。ただ、D-sub はちょっとかっこわるいので、次点で DIN コネクタは良い。
いくつかサーボモータを購入していたのだけど、ようやく試した。持っているのは上記 SG90 と GWS03T/2BBMG/JR。どちらも動かしてみた。
これらはどちらも JR というタイプ (ピンアサインの種類)。種類はこのページの線のタイプついてを見た。
典型的なプロトコルとしては 20ms ごとに 1000μs〜2000μs (1500μs が中立) のパルスを送るというものらしい (可動角度60度)。
とりあえず試そうと、16bit PWM タイマーを使ってやってみた。
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define clear_bit(v, bit) v &= ~(1 << bit)
#define set_bit(v, bit) v |= (1 << bit)
#define INPUT_NOR PB0
#define INPUT_REV PB1
static inline void setup_io () {
/**
* Data Direction Register: 0=input, 1=output
* 必要なポートだけインプットポートにする。
*/
DDRB = 0b11111100;
DDRC = 0b11111111;
DDRD = 0b11111111;
PORTB = 0b00000011;
PORTC = 0b00000000;
PORTD = 0b00000000;
uint16_t TIMER1_MODE = 14;
TCCR1A = (0<<COM1A1) | (0<<COM1A0) | (1<<COM1B1) | (0<<COM1B0) | (((TIMER1_MODE>>1)&1)<<WGM11) | ((TIMER1_MODE&1)<<WGM10);
TCCR1B = (((TIMER1_MODE>>3)&1)<<WGM13) | (((TIMER1_MODE>>2)&1)<<WGM12) | (0<<CS12) | (1<<CS11) | (0<<CS10);
ICR1 = 20000; // Top
OCR1B = 1500;
TIMSK1 = (0<<OCIE1B) | (0<<OCIE1A) | (0<<TOIE1);
sei();
}
static inline void set_position(uint16_t angle) {
int base = 600;
int max = 2400;
uint16_t n = ((uint32_t)angle * max) / 180 + base;
if (n < base) {
n = base;
} else
if (n > max) {
n = max;
}
OCR1B = n;
}
int main(void) {
setup_io();
set_position(0);
for (;;) {
if (bit_is_clear(PINB, INPUT_NOR)) {
set_position(0);
}
if (bit_is_clear(PINB, INPUT_REV)) {
set_position(180);
}
_delay_ms(10);
}
} ググると 1000μs〜2000μs のパルスというサイトばかりヒットするが、これは可動角度60度の場合で、実際は 600us〜2400μs までのパルスを受け付け、180度可動可能なものが多いみたい? よくわからないけど、手元の2種類についてはだいたいこの範囲のパルスを受けつけた。範囲外のパルスを入力すると「ジジジジ」とか「ブブブブ」とかいって止まり、消費電力が多くなる。
電圧が足りないと、指定した角度付近まで移動したあと「ジジジジ」と止まってしまうことがあった。
16bit PWM だと1つの AVR で2つまでしか駆動できないので、割込みを使った別の方法を検討してもよさそう。
Arduino だと特に何も考えなくてもたくさんサーボを制御できるみたい。
最近「超小型USBシリアル変換モジュール」というのが秋月から出たみたいで、買ったのはいいけど、そのままだとちょっと使いにくいわけです。 ケースに組込むにしても MicroUSB だし取り付け用の穴もあいてないので難儀する。ブレッドボードで使うのがメインの用途なんでしょうけど…
なんかいいのないかと思いましたが、タカチ SW-20 (15x15x20) を買ってみたら完全にピッタリだったのでオススメです。ケースの蓋についている溝にピッタリハマってくれるサイズなので、ケースを少し削るだけで MicroUSB にアクセスでき、適当にエポキシで固めてしまえば便利。一応電源LED用の穴もあけたけど、なくてもよさそう。
KX3 と PC だけで SWR グラフにできたら便利なのになー と思っていたけど、少し前に調べたところ SWR を直接読む方法がなく、諦めていた。
しかし、KX3 Utility で Power Calibration を実行すると、SWR を読んでいるっぽい挙動が確認でき、読める方法があるということがわかった。KX3 Utility は親切にも全部のコマンドを出力してくれてるので、それを読んだだけでうまいこといけた。
やりかたとしては
という感じだった。いろいろとコードを追加して、現在周波数の±を指定してSWRを取得するコードを書いてみた。結構いい感じ
#!ruby
require 'serialport'
@port = SerialPort.new(
"/dev/tty.usbserial-A402PY11",
38400,
8,
1,
0
)
@port.set_encoding(Encoding::BINARY)
TEXT_MAP = {
'<' => 'L',
'>' => '-',
'@' => ' ',
'K' => 'H',
'M' => 'N',
'Q' => 'O',
'V' => 'U',
'W' => 'I',
'X' => 'c-bar',
'Z' => 'c',
'[' => 'r-bar',
'\\' => 'λ',
']' => '',
'^' => '',
}
def get_swr(step=3)
ret = 0
step.times do
@port << "DS;"
data = @port.gets(";")
t, a, f = *data.match(/DS(........)(.)(.)/).captures
t = t.split(//).reduce("") {|r, i|
chr = (i.ord & 0b01111111).chr
r << ( ( (i.ord & 1<<7) != 0) ? ("." + chr) : (chr) )
}.gsub(Regexp.new(TEXT_MAP.keys.map {|i| Regexp.escape(i) }.join("|")), TEXT_MAP)
# KX3 displays SWR to main display as following : "1.2-1"
if m = t.match(/([\d]+.[\d]+)-I/)
swr = m[1]
else
return nil
end
ret += swr.to_f
# p [t, a, f, swr]
end
ret / step
end
def get_freq
@port << "FA;"
res = @port.gets(";")
freq = res.match(/FA(\d{11})/)[1].to_i
end
def set_freq(freq)
@port << ("FA%011d;" % freq)
get_freq == freq or raise "Failed to set freq"
end
def bypass_atu(&block)
@port << "MN023;"
@port << "MP;"
current = @port.gets(";")
current =~ /^MP\d{3}/ or raise "Unknown Responde #{current}"
@port << "MP001;MP;"
res = @port.gets(";")
res == "MP001;" or raise "Failed to set KAT3 bypass: #{res}"
@port << "MN255;"
block.call
ensure
@port << "MN023;"
@port << current
@port << "MN255;"
end
def tune(&block)
# Switch Hold Emulation 16 = TUNE
@port << 'SWH16;'
sleep 0.5
@port << 'TQ;'
@port.gets(";") == 'TQ1;' or raise "Band END"
sleep 0.3
block.call
ensure
@port << "RX;"
sleep 0.5
@port << "TQ;"
@port.gets(";") == 'TQ0;' or raise "Failed to back to RX"
end
def scan_swr
result = []
@port << "PC;"
current_power = @port.gets(";")
@port << "PC001;PC;"
@port.gets(";") == "PC001;" or raise "Failed to set power"
bypass_atu do
freq = get_freq
step = 20e3
range = Range.new(freq - 100e3, freq + 100e3)
catch(:done) do
begin
set_freq(range.first)
tune do
range.step(step) {|n|
set_freq(n)
swr = get_swr(3)
if swr.nil?
throw :done
end
r = [n, swr]
p r
result << r
}
end
rescue => e
if e.message = "Band END"
range = Range.new(range.first + step, range.last)
retry
end
ensure
set_freq(freq)
end
end
end
result
ensure
@port << current_power
@port << "PC;"
@port.gets(";") == current_power or raise "Failed to back to power"
end
p scan_swr
WLI-UC-GNM を使ってたんだけど、24時間つけっぱなしのサーバみたいな用途だと、過熱しすぎて止まってしまうことが多々あり、ぶっちゃけ使いもんにならんよ! という感じだった。つけっぱにしないなら使えるんだけど……
ので、GW-USNANO2A を買ってみた。
が、めちゃくちゃ接続が切れまくる。
ping を打ち続ければ大丈夫なので、またパワーマネジメント系の問題か…と思ったが、iwconfig の結果は Power Management:off となっており、よくわからなかった。
調べてみると、このドライバに関してはカーネルモジュールに対するオプションによってパワーマネジメントを決めるらしい……
現在の状態は sysfs を通し
$ cat /sys/module/8192cu/parameters/rtw_power_mgnt 1
で確認できる。1 だとパワーマネジメントが効いている。
$ sudo su # echo 'options 8192cu rtw_power_mgnt=0' > /etc/modprobe.d/8192cu.conf # reboot
すると、パワーマネジメントを切って起動させることができる。
$ cat /sys/module/8192cu/parameters/rtw_power_mgnt 0
これで切れることがなくなった。
これ安いし1個あるととても便利。USB 充電がちゃんと急速充電になっているか? とか実測でわかる。
充電専用というわけではなくて、普通の USB 機器に挟んでも使えるので、どのUSBデバイスがどれぐらい電力食っているかを実測できる。
似たようなのを自分で作ろうかと思っていたけど、買ったほうが遥かにやすい例