半導体って「導体と絶縁体の中間」って説明されるけど、実感としてよくわからなかった。自分の中では導体か絶縁体しかなくて、半導体は特別なイメージがあった。

しかし、調べてみると、まさに「導体と絶縁体の中間」という説明がそのままイメージとして理解できた。2種類の半導体 (N型、P型) について理解するのがてっとりばやかった。なぜ今までこれを理解しようと思わなかったのか、恥ずかしい。普通に Wikipedia に載っている画像がわかりやすかった。

導体は自由に動ける電子がたくさんある物質、絶縁体は逆に自由に動ける電子が殆どない物質、半導体はその中間。

N型 (Negative)

http://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB:N-doped_Si.svg

電子が多少余っている半導体。電子の電荷はマイナスなので、電子が多いと全体としては負、すなわちネガティブになる。

P型 (Positive)

http://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB:P-doped_Si.svg
電子が足りていない半導体。電子がない分、相対的に正、すなわちポジティブになる。この穴のことを正孔といい、電流と同じ方向に移動する。

PN接合ダイオード

P型とN型を接合すると、片方には電子が余り、片方には電子が足りていない状態になる。
接合部付近では、電子と正孔が結合してしまうので、何もない部分ができる。これが空乏層。

ここで、P型側に+、N型側に-の電圧をかける (順方向) と、ダイオード内に正孔・電子が供給され、空乏層が狭くなり、電流が流れはじめる。

逆に、P型側に-、N型側に+の電圧をかける (逆方向) と、ダイオード内の正孔・電子が減少し、空乏層が電圧に応じて増え、電流は流れない。

アマチュア局は、第8章とそこから示されている第4章だけ読めばいい。ぼーっとしていて、ほかの章をうかつに読むと微妙に違う規則があって紛らわしいので、読みかたに注意する必要がある。

http://www.tele.soumu.go.jp/search/area/all_index.htm

  1. トップ
  2. ham
  3. 無線局運用規則の読み方

ひととおり法規をやってみると、この3つがどうしても意味不明だった。

電波法施行規則 第二条

五十六  「割当周波数」とは、無線局に割り当てられた周波数帯の中央の周波数をいう。
五十七  「特性周波数」とは、与えられた発射において容易に識別し、かつ、測定することのできる周波数をいう。
五十八  「基準周波数」とは、割当周波数に対して、固定し、かつ、特定した位置にある周波数をいう。この場合において、この周波数の割当周波数に対する偏位は、特性周波数が発射によつて占有する周波数帯の中央の周波数に対してもつ偏位と同一の絶対値及び同一の符号をもつものとする。
五十九  「周波数の許容偏差」とは、発射によつて占有する周波数帯の中央の周波数の割当周波数からの許容することができる最大の偏差又は発射の特性周波数の基準周波数からの許容することができる最大の偏差をいい、百万分率又はヘルツで表わす。
|

http://law.e-gov.go.jp/htmldata/S25/S25F30901000014.html

割当周波数、特性周波数はなんとなくわかるような気がするけど、基準周波数の説明が意味不明すぎる。そのうえで、「周波数の許容偏差」を読むと、全く意味がわからない。

ググってみたり、よく理解に努めようとして要約すると以下のようになるようだ。

  • 特性周波数 → 外部から測定できる周波数 (実際出てる電波の周波数)
  • 割当周波数 → 免許状に書かれているやつ。アマチュアの場合帯域が広いのでイメージしずらい。許可された帯域の中央の周波数
  • 基準周波数 → 無線機に表示されている周波数

こう考えたうえで

五十九 「周波数の許容偏差」とは、発射によつて占有する周波数帯の中央の周波数の割当周波数からの許容することができる最大の偏差又は発射の特性周波数の基準周波数からの許容することができる最大の偏差をいい、百万分率又はヘルツで表わす。

は言葉のイメージさえ掴めれば、あとよく読めば実用上(?)十分に理解できるレベルになる

  • 発射した電波と割当周波数とを比べた値 (発射した電波が占有する周波数帯の中央の周波数、割当周波数)
  • 外部から観測できる周波数と無線機が表示している周波数を比べた値 (特性周波数、基準周波数)

が、一定の許容範囲にあること。現実と理想を比べてる。搬送波ありの信号で考えたら言葉さえわかれば言ってることは難しくない。

しかし、「発射によつて占有する周波数帯の中央の周波数」と「特性周波数」の違いがわかりにくい。AM (A3E) の場合はどちらも一緒になりそうだけど、単側波帯の場合は違いそう。USB の場合上にずれるのかな。調べてもよくわからなかった。

  1. トップ
  2. ham
  3. 法規:特性周波数・割当周波数・基準周波数

Mac の場合 AVR Studio を使えないので、いろいろ不便である。しかし一応開発環境がととのった。結構ググったけど、このようにして開発している人は少ないのか、はたまた情報発信しないのか、あまり gdb まで使ってやってる記事がなかった。

CrossPack-AVR のインストール

avr-gcc (AVR 用のクロスコンパイラー) や avrdude (書きこみツール) の Mac 向けにコンパイル済みパッケージ。配ってるのでインストールするだけでいい。

CrossPack for AVR を普通にダウンロードしてインストーラーからインストールするだけ。

普通 OS X の path_helper によって自動的に PATH が通るので、そのまま Terminal.app で avr-gcc が実行できるようになる。path_helper のパーミッションを落として使ってる場合自力で /usr/local/CrossPack-AVR/bin のパスを通す。

これさえ入れておけば実機開発はできる。

simavr の build

まずレポジトリを clone する。

$ git clone git://gitorious.org/simavr/simavr.git
$ cd simavr/simavr

simavr のビルドは CrossPack-AVR + Mac だと1発では通らない。以下のようにパスの指定が必要。あと、なんか変な状態になったりするので make clean と make を何回かやってみたほうがいいと思う。

make all V=1 AVR_ROOT=/usr/local/CrossPack-AVR AVR_INC=/usr/local/CrossPack-AVR/avr


これでシミュレーションまでできるようになった。

avr-project の Makefile 書き換え

CrossPack-AVR に avr-project というコマンドがついてくる。

$ avr-project Foo

とかやると Foo/firmware 以下に Makefile とかを作ってくれる。Foo.xcodeproj というのも作ってくれるけど、ハマりそうなので使ってない。

デバッグオプション付きでコンパイルするようにする。RELEASE=1 をつけない場合デバッグモード。最適化オプション -Os はどっちも付けてるんだけど、ちょっとどうすべきかわからない。デバッグ時 -Os をつけずに書きこむときだけ -Os をつけたらループが意図せず削除されたとき大変ハマりそうだなーと思う。いっそ -O0 のほうがいいのかもしれないけど……

ifeq ($(RELEASE),1)
COMPILE_OPT = -Os
else
COMPILE_OPT = -Os -g3 -gdwarf-2
endif

AVRDUDE = avrdude $(PROGRAMMER) -p $(DEVICE)  
COMPILE = avr-gcc -Wall $(COMPILE_OPT) -DF_CPU=$(CLOCK) -mmcu=$(DEVICE)

でもってターゲットも足す

run:	all
	~/project/simavr/simavr/run_avr -g -mcu $(DEVICE) -freq $(CLOCK) main.hex &
	avr-gdb

さらに .gdbinit ファイルをつくる

file ./main.elf
target remote localhost:1234
load
break main
continue

make run をするとコンパイルされて、simavr をバックグランドで起動し、それにGDB接続する、とりあえず main 関数の最初で止まる (はず)。

自分は avr-project は使っていなくて、自作のテンプレート作成ツールを使っている AVR のテンプレート

実際のデバッグ

普通に GDB を使うだけだけどメモ

  • p foobar
    • 変数を表示
  • p/t PORTB
    • PORTB を2進数で表示
  • p set_bit(PINB, 1)
    • PINB の 1 bit 目を立てる (set_bit は自分で定義したもの)
    • 外部入出力をシミュレーションさせるのは結構骨が折れる感じなので、簡易的には、これで外部入力をシミュレーションできる
    • 外部入出力とかはもうさっさと書きこんでデバッグしたほうがトータルで早いと思う…

実機書き込み

書き込み装置は、ここで変にハマると自分には問題解決できる能力がないところなので、純正の AVR ISP Mark II を使った。

この場合 Makefile の PROGRAMMER は以下のようになる

PROGRAMMER = -c avrispmkII -P usb

DEVICE はチップ名にあわせる。ATTiny2313 なら、そのまま DEVICE = attiny2313 でいける。

AVR ISP Mark II は 3x2 PINヘッダなので、このままだとブレッドボートで使えない。なので 1x6 PINヘッダに適当に変換してる。手元にあったピンヘッダがついてる余ってる平行ケーブルを使った。持ってるブレッドボートが狭くてつらい。

その他メモ

avr-gdb 上での _delay_ms() が非常に遅い。

これはいわゆるビジーループなので、動作周波数を下げることで早くデバッグすることができる。

make run CLOCK=10
  1. トップ
  2. tech
  3. Mac で simavr + avr-gdb を使い AVR プログラムを PC 上でデバッグする
  1. トップ
  2. avr
  3. Mac で simavr + avr-gdb を使い AVR プログラムを PC 上でデバッグする
  1. トップ
  2. arduino
  3. Mac で simavr + avr-gdb を使い AVR プログラムを PC 上でデバッグする

アンテナの設計とか測定とかをしているうちに、もうちょっとちゃんと無線工学を学んでみようということで、いろいろやってる。

しかし、実際はじめてみると、そもそも中学生レベルの数学がぜんぜんできないことがわかったので、高校受験用中学生向けドリルを買ってきてやってみた。やってみると、解きかたが全くわからないというわけではなくて、うる覚えであったとしてもだいたい答えまでは導ける (あるいは単に考えて式をつくれる)。ただ、とにかくひどく計算ミスが多い。とにかく多い。分配法則を適用するとき文字を1つかけわすれるとか、符号を間違えるとか、本当にひどい。

原因を考えみると、数字の計算(だいたいは九九だけど、足し算・引き算も)に意識がいきすぎていて、ほかのことまで考えが及んでいない。つまり、九九がまともにできてない。大変、根本的な問題である。先日は計算中に 7 × 9 がパっと出てこなくてあせった。ひどいとしか言いようがない。

普段の生活だと、まず暗算に頼ることがない。第一に自分の計算能力を全く信用していないというのがあり、計算機が手元にないことがまずないので、2桁以上の数字の四則演算からして全部計算機に丸投げしてる。全く計算について考えないで生きてる。おかげでこのザマだと思う (小学校のとき体に沁みわたりまで九九をやらなかったのがそもそもだけど)。

教訓としては、九九は本当に大事なので100万回ぐらいやったほうがいいし、できないと人生が終わると全国のこどもたちに伝えたい。

  1. トップ
  2. ham
  3. 勉強

Scala から JOGL (Java で OpenGL を使うやつ)

JOGL はどれをダウンロードしていいのかサッパリわからないが、jogamp-all-platforms.7z というのが全部入りっぽいのでこれをダウンロードする。このファイルのありかがそもそも見つけられないと思うけど、http://jogamp.org/deployment/jogamp-current/archive/ にある。ほんとどれをダウンロードしたらいいかサッパリわからないし、どこからこのページに辿りついたのかよくわからないけど、とにかくこのページから jogamp-all-platforms.7z をダウンロードすれば良い。jogamp って何?って感じだけどとにかくこれでいい。

ぐ〜ぐるで調べると、情報が古いのがたくさんでてくるのでつらい。これが公式?っぽいので、ここを見るのが良さそう。これまたこのページに辿りつくが難しい。

クラスパスには2つファイルを指定するだけでいい。これ以外はむしろ指定すると scala がぬるぽ出したりしてよくわからないことになる。横着して *.jar とかしてはいけない。

-classpath /path/to/jogamp-all-platforms/jar/gluegen-rt.jar:/path/to/jogamp-all-platforms/jar/jogl-all.jar

JOGL のチュートリアル にあるサンプルを移植すると以下のような感じになるっぽい。なんとなく awt ではなく newt を使うようにも変えてる。

チュートリアルだと animator.add() が余計でエラって動かない。あとなんかいろいろハマったけど忘れてしまった。とにかくこれで動く。

//#!scala -classpath /path/to/jogamp-all-platforms/jar/gluegen-rt.jar:/path/to/jogamp-all-platforms/jar/jogl-all.jar

import javax.media.opengl._
import com.jogamp.newt.event.WindowAdapter
import com.jogamp.newt.event.WindowEvent
import com.jogamp.newt.opengl.GLWindow
import com.jogamp.opengl.util.FPSAnimator

object Sketch {
	def main (args: Array[String]) {
		val glp = GLProfile.getDefault
		val caps = new GLCapabilities(glp)

		val window = GLWindow.create(caps)
		window.setSize(300, 300)
		window.setVisible(true)
		window.setTitle("TEST")

		window.addWindowListener( new WindowAdapter() {
			override def windowDestroyNotify (e : WindowEvent) {
				exit(0)
			}
		})

		window.addGLEventListener( new GLEventListener () {
			var theta : Double = 0
			var s : Double = 0
			var c : Double = 0

			override def display (drawable : GLAutoDrawable) {
				println("display")
				update
				render(drawable)
			}

			override def dispose (drawable : GLAutoDrawable) {
				println("dispose")
			}

			override def init (drawable : GLAutoDrawable) {
				println("init")
			}

			override def reshape (drawable : GLAutoDrawable, x : Int, y : Int, w : Int, h : Int) {
				println("reshape")
			}

			def update () {
				theta = theta + 0.01
				s = Math.sin(theta)
				c = Math.sin(theta)
			}

			def render (drawable : GLAutoDrawable) {
				println("render")
				val gl = drawable.getGL().getGL2();

				gl.glClear(GL.GL_COLOR_BUFFER_BIT);

				gl.glBegin(GL.GL_TRIANGLES);
				gl.glColor3f(1, 0, 0);
				gl.glVertex2d(-c, -c);
				gl.glColor3f(0, 1, 0);
				gl.glVertex2d(0, c);
				gl.glColor3f(0, 0, 1);
				gl.glVertex2d(s, -s);
				gl.glEnd();
			}
		})

		val animator = new FPSAnimator(window, 60);
		animator.start();

	}

}
  1. トップ
  2. tech
  3. Scala で JOGL (OpenGL)

をつくった。

だいたい、符号って長点短点を可視化して見せてしまっていることが多いんだけど、あれはモールス学び初めの人には害でしかないので、そういったものが一切ない、すなわちそれぞれ音だけ聞けるページが欲しくて、作った。

20wpm 固定で鳴らしてる。Web Audio なので対応ブラウザならスムーズに鳴るし、スマートフォンでも問題なく鳴る。

  1. トップ
  2. ham
  3. モールスコードを再生できるだけのページ
  1. トップ
  2. モールス
  3. モールスコードを再生できるだけのページ

途中まで作業をしてしまってから気付いたけど、ExFAT のディスクは TimeMachine のバックアップ対象にできないらしい。ひどい…… 以下の方法ではダメ

現状

2TB のディスクが2つ

  • 2TB
    • Backup (ExFAT)
  • 2TB
    • 1TB Backup2 (ExFAT)
    • 1TB Time Machine

Backup と Backup2 は基本的に同じもの (ミラーリング) しているつもりだけど、スクリプト以外でバックアップしたものは、めんどうくさくてちょっとずつずれてきてしまっている。これでは意味がない。

また、Backup ディスクは Windows からでも読み書きできるように ExFAT にしているのだけれど、これはジャーナリングができないせいか、USB から不意に外すと確実に fsck を要求されるのでだるい。2つ ExFAT のパーティションがあるだけで、fsck を2本走らせないといけない。アホだ。

なんとなく、Time Machine で外部ディスクもバックアップできないかな、と思ってググったら、それもできるということを知った。なのでバックアップ方法を変えることを考えた。

理想

  • 2TB
    • Time Machine
  • 2TB
    • Backup (ExFAT)

として、Time Machine のバックアップ対象に Backup (ExFAT) を含めるようにする。これで何も考えなくてもよくなりそう。Backup ディスクの取り扱いさえちゃんとすればよくなるので、今よりはだいぶマシだし、Time Machine に入れこむことで信頼性が上がる。

Time Machine ディスクが死ぬと悲しいけど、それはそもそもそういうものだし、最新の版については必ず2系統存在する感じなのでいいかな。

手順

しかし、現状で Backup2 + Time Machine というパーティションがあり、これを Time Machine パーティション1個にしくても、動かすことができない。別に1本ディスクがあればいいんだけど、あいにくないのでなんとかしないといけない。

  1. Time Machine を止める
  2. Time Machine パーティションのディスクイメージを Backup (ExFAT) に作成する
    • ExFAT なのでパーミッションとかが怪しい気がするのでディスクイメージ化してバックアップ
  3. Backup2 + Time Machine が入ってるディスクを Time Machine パーティション1個 にしてフォーマット
  4. Backup (ExFAT) にとった Time Machine.dmg から Time Machine パーティションを復元
  5. Time Machine の設定で「ディスクの選択…」で新しい Time Machine パーティションを指定
  6. Time Machine を有効化して今まで通りバックアックが効くか確認
  7. Backup (ExFAT) にとった Time Machine.dmg は消す
  8. Time Machine のバックアップ対象に Backup ディスクを追加する
  9. Time Machine フルバックをかける

備考

  • ディスクをフォーマットするときは GUID パーティションテーブルすること

23wpm で文字+数字、数字だけ、文字だけ、をそれぞれ90%なんとかとったので24wpmでやりはじめてる。20wpmだと完全ランダムでだいたい90%前後がとれるようになったけど、普通文だとそれほどとれないので辛い。十分単語に慣れた人なら普通文のほうがとれるみたいだけど、単語に慣れていない場合、普通文のほうが短い符号の文字が多いので頭が追いつかない。

これが、実際に交信になると、テンパってしまって速度が遅くてもほぼ聴き覚えがある符号しかとれなくなる。599BK 式で、余計な符号がほぼ入らなければなんとか交信できる。CQ を出して、呼んでもらう場合、18〜20wpm なら2回コールしてもらえばとれる感じ…… CQ を出している局は 22〜30wpm あることが多いので4回〜6回聴かないと確定できない……

599BK で CQ を出している局を呼ぶか、自分で CQ を出して 599BK に付きあってもらうか、どっちもメリットデメリットがあってつらい。

CQ 出している局を呼ぶ場合

大抵、599BK でやっている局は JCC サービスなので、パイルになってることが多い。この場合、こちらからの電波が相手に十分届いているか、ある程度パイルが捌けるまでわからないので、非常に効率が悪い。

コールサイン、JCC などまで聴きとった状態で呼ぶので、ほぼ聴きとる必要がなくて気は楽だけど、何か想定外のことを打たれた場合、速度が早くて返せないので、その点で緊張する。

自分で CQ を出す場合

まず第一に、相手にメリットがほぼない (こちらのロケーションは政令指定都市なので別に珍しくもないし)。なおかつ、18wpm 程度で CQ を出すと、相手はラバースタンプ程度の長さを期待する (と思われる) ので、599BK で終わらせると偲びない。

ちょっとやった感じだと、相手の QTH が JCC/JCG で送られる場合、案外聴きとれるけど、それ以上に何か送られるとつらい。なのでだんだん申し分けない心持ちになってくる。

今後の予定

とにかく結構辛いんだけど、CQ 出している局を呼んで、自分のコールサインが呼ばれたとき結構嬉しいのがいい。電波届いたのも嬉しいし、「あっおれだ」っていうのが分かるのも嬉しい。

訓練は続けつつ、599BK であっても CQ を出すのに慣れるのがいいかなあとは思ってる…… けどほんとメンタルが弱すぎて聞きとれるものも聞きとれない。メンタルを強くする方法はわからないので、とにかく聞きまくって慣れるしかないかなと思う。それまで続けられるか心配。

  1. トップ
  2. ham
  3. 最近のモールス訓練
  1. トップ
  2. モールス
  3. 最近のモールス訓練

交信履歴をつけるツールにいろいろ機能をつけてる。

(というかそもそも記録するという一番大事な部分にバグがあって一部の交信が消えた感じがするけど、ようやく直ったような……)

コールサイン地域補完


コールサインのプリフィックスを入力した時点で、どのあたりの地域の人かわかるように。日本の局の場合エリアまで出すようにしてるので便利。慣れてる人は覚えているからこんなのいらなそう。

これは typeahead.js で実装してある。

JCC 補完

国内の場合、だいたいの人が JCC/JCG を送っているので、それを補完してどこかわかるようにした。JARL が提供してる .txt (クソフォーマット) をパースして JSON にしてる。取得時にソートしてインデックスを作ってるのでJS側はかなり簡単。

これは jQuery.textcomplete で実装してる。いろいろ補完できそうで夢が広がる。

  1. トップ
  2. tech
  3. ログ管理ツール
  1. トップ
  2. ham
  3. ログ管理ツール

CW 以外殆ど聞いてない。アパマンハムはやはり厳しいなあという感じ。聞こえてこないぶん、卑屈になる。

7MHz

深夜以外はだいたい聞こえる。

深夜はDXが聞こえるらしいんだけど、うちのような2m程度のアンテナの環境だと殆ど聞こえない。たまに韓国の局が聞こえてくるけど、あちらはかなりパワー入れてるみたいで、こちらから呼んでもとってくれない感じ (実際 JA の局が呼んでるけど、向こうは一切反応なし、というのを何度か見た)。

その他のDXは聞こえたことがない。

18MHz

太陽が昇ってる時間だとときどき DX が聞こえる。一方日本の局はあんまり聞こえない。バンド狭いのでちょくちょくコンディションが良さそうなときに聞いてるけど、あんまり聞こえてこない……

ビーコンも殆ど聞こえない。中国のビーコン100Wがかすかに聞こえたことがあるかな〜 程度。せめてビーコンがちゃんと聞こえるぐらいのアンテナを張りたい……

21MHz

クラスタを見てて 21MHz が多いな〜 と思ったら見る程度で、こっちも昼間たまに DX が聞こえてくる。けど基本殆ど聞こえない。結構バンド広くて、なおかつ慣習がいまいちよくわからないので、どのへんを聞いたらいいのかわからず。

こちらもビーコンがあるけど聞こえてこない。

28MHz

聞こえたことがない。バンドが広いので探すのも大変。

どこを重視すべきか

まだわからない。7MHz は賑やかなので今でもそれなりに聞いてて楽しい。ただ、夜になると全く聞こえなくてつまらない。

18MHz, 21MHz は、うちのようなショボい設備でも DX のチャンスが多そうかもしれない。もっとずっと聞いててもいいかもしれないけど、基本何も聞こえてこないので面倒くさい。アンテナが7MHzに比べたら短いので、モノバンド短縮アンテナを作ってみたら今より良くなるかもしれないし、いずれやってみたい。

まだ聞いたことがないバンド、特にローバンドの1.9MHz, 3.5MHzも聞いてみたい。マイクロバートアンテナなら効率はともかく一応送信もできるのが作って設置できそう。3.5MHz は夜・冬に使えるバンドみたいなので、次 7MHz のアンテナと交換する形で作ってみる。

ベランダなのであんまりいっぱいアンテナを設置すると怪しすぎるので避けたい。4本程度が本当に限度だと思う。なのでマルチバンドホイップ (UHV-6) は大変便利に使ってるし、割と性能もいい感じで気に入ってる。

うちのベランダは本当に狭くて、横方向にも3mぐらいしかないので、ダイポールを上げるのはどんな手を使っても不可能。しばらくは長さに自由度があるマイクロバートアンテナをバンド別に何度も作ってみたい。

  1. トップ
  2. ham
  3. バンドごとの印象

ほんと明らかに何もかもに対して度胸というか自信が足りていなくて、どうしようもない。

というのをちょっと前に作ったけど日記に書いていなかった。

デモ (音アリじゃないとよくわからない):

デフォルトだと、信号がありそうなところを適当に追跡してデコードする。上のスペクトラムをクリックで、その周辺の周波数領域のデコードだけをするようになる。一度に1つのデコーダーだけが動く。

何もハッシュをつけない場合マイク入力からになる。あと Chrome でしか見てない。

Web Audio で信号処理

Web Audio を使って、マイク入力を信号処理しようと思うといくつか躓くところがあった。

  • サンプリング周波数を指定できない
  • AnalyserNode を任意のサンプリングタイミングで呼ぶことができない?
    • あとサンプリング周波数が指定できないので分解能に限界がある

モールスのデコードに高いサンプリング周波数は必要ない。しかしサンプリング周波数は Web Audio 側で固定になっているので、自力でダウンサンプリングしている。これは ScriptProcessorNode の onaudioprocess を使い、Float32Array にリングバッファ状に落としこんでる。なんかもっといい方法ありそうだけど、わからなかった。

まだ onaudioprocess の挙動が不安定で、データがこなくなったりすることがある。毎回 onaudioprocess に対してコールバックを代入しなおしたりいろいろやったけど、最近直ったような気がしないでもない。

FFT も AnalyserNode のを使うのではなく、このダウンサンプリングした信号に対し、JS レベルで実行してる。これは dsp.js を使ってる。

モールスデコード部

それなりに工夫して作った。最初のころ Description of RSCW's algorithms というのを見つけてよく読んでみたけどよくわからないことも多くて、僕でも実装できる程度に落としこんで結局以下のようになってる。

  • 適当にデコードしたい周波数を決める
    • 直近で信号強度が強い周波数
    • または手動 (スペクトラムをクリック)
  • その周波数に対し、2位相ロックインアンプ相当の処理をする
    • 本当に単純にその周波数の矩形波を90°ずらして合成してローパスフィルタにかけて、、というのをナイーブにやってる
  • 適当に閾値を決めて2値化する (むずかしい……)
    • ここまでで 0/1 になる
  • 0 の連続または 1 の連続のうち、最小の長さを見つける (モールスの符号単位)
  • 符号単位の2倍以上なら長点、そうでなければ短点として表から符号をデコードする

デモのようなホワイトノイズ + それなりの強さの信号でかつ、機械的に綺麗な符号なら、結構いい感じにデコードできるけど、実際の交信だと思ったより厳しい。

  • SN比がもっと悪い。フェージングで信号強度がよく変化する
  • 符号が綺麗なことが少ない

なので、なんらかの統計的な、機械学習のような要素を入れこんで (隠れマルコフモデルとか?) やりたいけど、そのような技術力がない。あと、別に全域常時 FFT して全チャンネル同時デコードとかも、ギジュツリョクがあればできるだろうけど、できてない。

  1. トップ
  2. tech
  3. HTML5 Web Audio でモールスを解読する
  1. トップ
  2. html5
  3. HTML5 Web Audio でモールスを解読する
  1. トップ
  2. audio
  3. HTML5 Web Audio でモールスを解読する
  1. トップ
  2. dsp
  3. HTML5 Web Audio でモールスを解読する
  1. トップ
  2. ham
  3. HTML5 Web Audio でモールスを解読する
  1. トップ
  2. モールス
  3. HTML5 Web Audio でモールスを解読する

なんかエクセルで計算できるのがでまわっているっぽいのだけれど、HTML で計算したいので JavaScript で書きなおした。

自分で書いたら欲しい機能増やせるし便利。特に、計算したパラメータから、必要な材料の長さを出したりしたかったので canvas で全体像をレンダリングしている。

コイルも密巻きの場合を簡単に求められるようにしたりした。ただ、細長いコイルはQ値がさがってよくないらしいので低い周波数では調整する必要があるのかもしれない。でもそれでどの程度効率が変わるのかがわからない。

7MHz MicroVert アンテナを制作

φ25mm φ22mm のアルミパイプそれぞれを 1m ずつ買ってきて作った。設計上は 1m + 0.85m で 15cm ほど重ねるイメージ。

コイルを設計通りに巻くのがかなり難しく、はじまりとおわりの処理の仕方がよくわからなくて、これはうまくできたとは言い難い。

7MHz だとカウンターポイズが 8.3m 必要だけど、なんとなく買っておいた 10m の 5D-2V があったので頑張って計って切った。コアは 50MHz 用のコブラアンテナを試作したときのを流用した (12ターン 3D-2V がW1JR巻きで FT240 #44 に巻いてある)

ちなみに、設置ロケーションは給電点地上高 2m 程度で、建物からは 30cm 程度しか離すことができないので全く SWR が落ちないような予感がしていた。やってみなければわからない、と自分を励ましつつやったが、案の定全く下がらなかった。

複素インピーダンスを広域で一覧するとだいぶ下 (6.8MHzヘルツぐらい) に同調しているような感じだったのでエレメントを短くしてみたりしたが、なかなかうまくいかず。

カウンターポイズのはわせかたを変えたり、エレメントの長さを変えたりいろいろ試行錯誤しまくったあげく、7MHz 付近でエレメントは共振しているようだが SWR は下がらない (リアクタンスがないけどインピーダンスの実数が低すぎる)、という状態になったので、カウンターポイズを動かし、ようやく 1.5 程度まで下がった。

インピーダンスが低めに出ていたので、カウンターポイズをできるだけエレメントから離すように置いたら効果があった。

エレメントの長さによっては、特定の周波数 (だいたい6.8MHzぐらい) で SWR が 1.0 程度になったりした一方、7MHz 以上では SWR が下がりきらなかった。たぶんコイルの巻きすぎ?だと思うが、ほどくのが大変面倒なので、一度コイルには手をつけずエレメントだけで調整し、7.000〜7.200MHz、すなわち 7MHz 帯全域で SWR 2.0 以下にできた。最低 SWR 点が 1.5 程度なのがちょっと微妙だけど、とりあえず気にしない。

しかしその後一旦コイルの固定やらで取り外すことにしたので、コイルも1ターン巻き戻して再調整したところ、7.0MHz 付近で SWR 1.1〜1.2 ぐらいまで落とすことができた。もう1ターン戻してもよかったかもしれないが、メインで運用しているのはバンド下限あたりなのでこれでよさそう。

帯域が広いのは事前情報で知ってはいたけど、なんとなく信じていなかったので、設計時に 7MHz をターゲットにしたのがよくなかった。今回の場合 7.1MHz ぐらいをターゲットにして作る (計算上はコイルが1ターン減るだけ) と丁度よかったかもしれない。

制作上思ったこと

  • できれば調整部分は手の届く範囲にすべき
    • 1段目を短めにしたほうが調整しやすい (70cmぐらい?)
  • LCR メータがあったほうがいい (自分は持っていないのでコイルのインダクタンスがどんなものなのか、計算でしか求められない。アナライザーでも一応測れるけど結構ナイーブで値が信用しにくい)
  • アナライザーなしでは調整が困難
    • カウンターポイズを使うアンテナでは必須だと思った
  • マストと固定するため、塩ビパイプのコイルから下側は長めにしたほうがいい

使用感

UHV-6 という 2m 程度の短縮マルチバンドアンテナとの比較しかできないが、今のところ感じるのは以下の通り

  • 信号は UHV-6 と同じか、それより弱く聴こえる
  • SN は UHV-6 より少しよく感じる
    • 特に、7.01MHz 未満では、UHV-6 はなぜかノイズが常時ひどくで聴こえなかったのが、MV で聴こえるようになった。設置位置の関係かもしれない
  • とにかく帯域が広くて 7MHz ならどこにでも出れる。UHV-6 はチューナーなしだと 7.00 から 7.025 ぐらいまでしか出れないので、嬉しい感じ。

ベランダのスペースの関係上、UHV-6 と今回作った MicroVert アンテナは開けている方角が違うので、相手局の位置によって変わりそう。もうすこし耳が良いのを期待したけど、それに関しては少し期待はずれだった。短いアンテナなので、結局その点に関しては短縮ホイップと同じなのかもしれない。

  1. トップ
  2. ham
  3. MicroVert アンテナの設計ツール
  1. トップ
  2. javascript
  3. MicroVert アンテナの設計ツール

まずやはり終わって思うのは、LTとしてすら発表しなかったのが反省だな〜 と思った。「今年 Perl 関係でおもしろいことしてないし……」と思って応募できなかったけど、わりとみんな Perl 関係ないこと話してるので、堂々と JS の話すればよかったと後悔。他人が話しているのを見ると話したくなる。というか Teng の話があったな!と会期中に思いだした。

結構毎年顔ぶれが変わっているのか、オープニングで今年初めて参加した人として手を上げた数が想像よりもずっと多いことに驚いた。なんとなく印象としては普段 Perl を書きまくっている人というよりは、他のコミュニティの人が Perl 文化を見にきてる感じがした。

Google

  • https://plus.google.com/connectedaccounts で、接続して公開設定にしていると、プロフィールに表示される (これは確実にアイデンティティが関連付けされている)
  • ↑ とは別に任意のURLをプロフィールに登録できる

Facebook

  • メッセンジャーアプリのID、任意のURLしか登録できない

Hatena

  • 任意のURLが登録できる
  • Twitter、Facebook と連携でき、公開される可能性があることに留意しろという注意書きはでるが、一覧ページなどはなく、プロフィールにも表示されない

Github

  • 任意のURLが登録できるだけ

Twitter

  • 外部連携機能がない。リンクは1つのみで、だいたいの人は自分のサイトへのリンクぐらいしか貼ってない

アイデンティティ抽出

それぞれのサイトで任意のURLの登録は比較的自由。なので、それらが一致するものを抽出できればある程度アイデンティティが関連づけられそう。ただ、クロールしないとできないのでつらい。

それなりにユニークなのはメールアドレスだけど、表示されないことが多い。なにかいい方法はないか

交信ログの一部を公開するようにした。ずっとやってないと恥ずかしい感じになる。

交信ログのとりかた

Windows なら Turbo HAMLOG for Windows というのがあって、大変使いやすいし、それでいいのだれど、Mac だと無料で丁度いいのがない。有料で超高機能、みたいなのはあるけど、そこまで必要がないし、こういう「データ」が主のもので、データ管理とかが実際どうなっているのかもよくわからないソフトウェアに金を払いたいと思わない。

なので、自分に必要最低限の機能を実装しようと、SignalReports というロギングツールを自分で書いて使ってる。ローカルで動くウェブアプリの形式にした。

機能的には大変シンプルでただとにかく記録していくだけの機能がついてる。あえて「機能」と呼べるようなものはコールサインを入れると地域を表示したりするぐらい。この程度でも別に困ってない。QSL カードを発行する人は印刷機能とかいるんだろうけど、当面発行する予定もないのでこれでいい。

データのもちかた

データは単に SQLite の DB に入れるようにしてる。プロジェクトディレクトリをまるごと Dropbox に入れているので、DB ファイルも Dropbox 上でバックアップ・履歴管理される。

交信ログ公開の仕組み

Dropbox 上に DB ファイルが置いてあるので、Dropbox の API でその DB をダウンロードして、Perl で適当に HTML にして static に吐いている。特に変なことはしていなくて、あとは cron に登録してある。

  1. トップ
  2. ham
  3. 交信ログを公開