2014年8月30日土曜日

WSPRコード生成手順を探る(訂正あり)

Weak Signal Propagation Reporter ; WSPRはK1JT Joe Taylor氏が開発した低電力ビーコン送受信プログラムで、数Hz帯域幅でSNR-28dBの信号までデコード可能な136kHz帯でもよく使われるデジタルモードのひとつです。

WSPRコードの生成はPCのソフトで行いますが、PCをつかわず送信機単体か外部コントローラーのPIC内で生成できないものか模索中です。

幸いなことにWSPRのソースコードは公開されておりユーザーマニュアルにWSPRコード生成の概要が記されていますが、ソースコードやマニュアルを見ても拘束長?畳み込み?などなど素人の自分には最初なんのこっちゃわかりませんでした。

ネットで手がかりを探った結果、G4JNT Andy Talbot氏のサイトにWSPRコーディングに関する具体的な手順の解説を見つけました。あと、前方誤り訂正(Forward Error Correction ; FEC)も少し勉強してようやくつかんできました。

備忘録としてソースコードを読んで解説を訳しながらまとめてみることにします。

1.送出キャラクタの圧縮
基本様式は、コールサイン(原則6文字)、グリッドローケータ(4文字)、送出電力(2文字)の計12文字(=12バイト=96ビット)ですが、これらをまとめて50ビットに圧縮します。

1)コールサイン部の数値化
 ①文字の種類と対応する番号
  数字、アルファベット、スペース記号を0から36の数値に割り当てます。
 i)数字(0~9)⇒ 0~9
 ii)アルファベット(A~Z) ⇒ 10~35
 iii)スペース記号 ⇒ 36

 ②注意点
  コールサインの1文字目はスペースを含め全キャラクタ使用可能
  コールサインの2文字目はスペース記号のみ使用不可
  コールサインの3文字目は数字以外使用不可
  サフィックス(4~6文字目)はいずれも数字は使用不可

 ③ユニーク数
  37 x 36 x 10 x 27 x 27 x 27 = 262177560 < 268435456 = 2^28 = 28ビット

 ④各数値化キャラクタをCh1~Ch6とすると、数値化コールサインNは、
  N = ((((Ch1 x 36 + Ch2) x 10 + Ch3) x 27 + (Ch4 - 10)) x 27 + (Ch5 - 10)) x 27 + (Ch6  - 10)

2)グリッドローケータ部と送出電力部の数値化
 ①文字の種類と対応する番号
 i)数字(0~9)⇒ 0~9
 ii)アルファベット(A~R) ⇒ 0~17

 ②グリッドローケータ部の数値化
  ユニーク数は、
  AA00~RR99 ⇒ 18 x 18 x 10 x 10 = 32400通り < 32768 = 2^15 = 15ビット

 各数値化キャラクタをLoc1~Loc4とすると、数値化グリッドローケータM1は、
 M1 = (179 - (Loc1 x 10 + Loc3)) x 180 + Loc2 x 10 + Loc4
 (余談:素直にM1 = (((Loc1 x 18) + Loc2) x 18 + Loc3) x 10 +Loc4にしなかったのはなぜなのでしょう?^^;)

 ③送出電力部と数値化グリッドローケータ部の組み合わせ
 電力値Pwr(dBm) = 0~60 (ただし、一桁目が0,3,7のみソフトで認識されます)

 数値化グリッドローケータと電力部の組み合わせ値Mは、
 M = M1 x 128 + Pwr + 64
 で、最大値が4124287 < 4194304 = 2^22 = 22ビット となります。
 (余談:最後の「+ 64」は、拡張用の予備部分なのかもしれませんが未確認)

これで数値化コールサイン部と数値化グリッドローケータ・電力部で
 N28ビット + M22ビット = 50ビット
に圧縮されました。

2.1バイト値1元配列化
 後の前方誤り訂正処理(FEC)を行うため、圧縮した50ビットを1バイト値の1元配列として割り当てます。 FECに入力するデータの大きさは拘束長32、レート1/2から50 + 32 - 1 = 81ビットになります。したがって11バイト = 88ビットの器が必要になります。
 その器に上から数値化コールサインNと数値化グリッドローケータ・電力Mを隙間無く入れ、残りの器(7番目の3ビット目以降)はすべて0とします。

3.FECエンコード
 32ビット長のシフトレジスタを2つ用意して、データの最初のバイトのMSBから1ビットとりだして、各々のシフトレジスタを右に1シフトさせてからLSBに格納します。そして、一つ目のシフトレジスタと0xF2D05351とのANDをとり、ビット間のXORをとった結果を別のレジスタに格納。もうひとつのシフトレジスタと0xE4613C47とのANDをとって同様にビット間のXORをとった結果をレジスタに格納。この操作を81回繰り返すことによって162ビットのコードが生成されます。

4.インターリーブ
 無線による信号伝送においてランダムエラーとバーストエラーに対してFECはランダムエラーには強いが、バーストエラーにはあまり強くないのでインターリーブを施します。
ビットの並びをある法則によってシャッフルして隣同士のビットを離すことによりバーストエラーに対抗する手法です。
 WSPRの場合は、162ビットのコードに順番にビットに番号を振って、その番号を8ビットであらわしてビットの並びを逆さにして並び替えます。
まず符号なし8ビット整数0から255まで順番にビット並びを反転します。
たとえば、"1"なら、b00000001 ⇒ b10000000 = "128"
     "18"なら、b00010010 ⇒ b01001000 = "72"
並び替えられた番号順にビットを並び替えます。
ビット並びを反転した整数が162未満の場合、その整数の番号の位置にFEC処理したコードを順番に1対1で割り当てていきます。
これをコード数である162回繰り返します。
 これで162ビットのデータシンボルが生成完了です。

5.同期シンボルとの連結
 最後にあらかじめ求められた擬似ランダム同期シンボルとデータシンボルを連結して1シンボル2ビット(4階調)の最終送出データが完成します。
 
 【162ビット同期シンボル】

1 1 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 0 1 0 0 1 0 1 1 1 1 0 0 0
0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 1 0 1 1 0 0 1 1 0 1 0 0 0 1
1 0 1 0 0 0 0 1 1 0 1 0 1 0 1 0 1 0 0 1 0 0 1 0 1 1 0 0 0 1
1 0 1 0 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1
0 1 0 0 0 1 1 1 0 0 0 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0 1 1 0
1 0 1 1 0 0 0 1 1 0 0 0

 最終送出データシンボル(n) = 同期シンボル(n) + データシンボル(n) x 2

間違っているところがあるかもしれないので逐一修正しますが、この手順をCでコーディングしてみようと考えています。

2014年8月27日水曜日

ムーミン谷の国から

ハムフェアも終ってまだ1週間も経っていないのに、遠い過去のような感じがするのは気のせいでしょうか。

みなさんいかがお過ごしでしょうか。

TX-136でおなじみのフィンランドにあるJUMAでは長らくすべてのキットがSold Outになっていましたが、今年7月過ぎからキットのサプライヤーを新しくして少しずつキットの販売を再開しています。

以前から475.5kHz帯開放を見据えてTX-136の兄弟機TX-500を購入しようとしばらくアンテナを張っていたところ、ハムフェア直前にTX-500キットの在庫5セットを確認したのでこのタイミングで1セット購入に踏み切りました。ここのところの円安でTX-136を購入した頃に比べて10,000円以上高くついてしまいましたがこの送信機シリーズの完成度の高さには疑いもないのでまだまだコストパフォーマンスは高いと思っています。

今回もPayPalを使いましたが、適度な自制心(笑)があれば海外通販にはとても便利ですよね。

そんなわけで、本日到着しました。注文してからほぼ1週間。早いです。

消費税はしっかり取られますhi
ずっしりと重さを感じるパッケージ TX-500の書き文字が
中身ちょっとだけ 電源ケーブルも同梱されてます
 TX-136のときはパーツの欠品何点かと基板のパターンが一部切れたりとあまりよろしくなかったのですが、今回は果たして...

 製作過程は逐一ブログで報告します。

あとKeyer Mini-V2ブログに書きましたが、試験的に基板の発注先をかえて基板を発注することにしました。プログラム済みPICとのセットを再販しますのでよろしくお願いします。

2014年8月25日月曜日

夏が終わりました

先日の23,24日はハムフェア2014に参加していました。


 展示機材をリュックに詰め込んで家を出て1時間ほどで会場に到着しました。秋の気配がするとはいえまだまだ蒸し暑く汗だくになりました。出展入場時間前に全日本長中波倶楽部の7L1RLL若鳥さんとお会いして入場。設営開始しました。

ブースはこんな感じでした
 一般入場開始後から早速twitterやGoogle+でお世話になっておる方々が多数訪ねていただいてありがとうございましたm(_ _)m
やはり、向かって左端の大きなローディングコイルやリッツ線できれいに巻かれた135kHz,475.5kHz帯短縮コイル&マッチングトランス整合システムに注目が集まっていました。自分もFSK改造TX-136、外部コントローラー実機とプログラム、そしてMini-Whipを展示させていただきましたが、マニアックすぎたのかほとんど質問されませんでした^^;;;

 まぁでもhamlife.jpの記事でも入場者数が昨年より増えたそうで、たくさんの方がこちらのブースにも足を運んでいただいたようです。記帳もおそらく80名くらいはいったのではないでしょうか。

 ブースで訪問された方を相手にするのは今回初めてなので、いろいろと勉強になりました。多くの方は、「このコイルはなんですか?」という切り出し。あとは「135kHzやってみたいんですけどね~」などなど。バンドが解放されて5年経過していますが総じて自分たちが当たり前と思っていることもまだまだぜんぜん認知されていないなという印象でした。一方LF帯が盛んなEUではイギリスのGSGBからLF TodayというLF帯のバイブルの3rd editionが発刊されたそうです。購入して勉強するつもりですが、今までの自分や135kHzで活躍されている皆さんの運用経験を踏まえて何か日本でも手引きになるような書がもうそろそろあってもいいんじゃないのかなぁとひしひしと感じています。

 やはり、もう少し導入しやすいように標準の設備の準備方法とか運用の実際とか自分もこれならできそうだという気持ちにさせるようなものがないと今後も局数は伸びないでしょう。来年は475.5kHz帯も開放される予定なのでなおさらそのように思います。

 ハードウエア面でもメジャーなメーカーがわざわざこの周波数帯の機器を開発するとは到底期待できないので、JUMAまでとはいかないまでもまじかるくらぶさんのように135kHz関連のキットも何かどこかで出してみたいなぁと思います。

 話が思いっきりそれてしまいました^^;

 お昼で中座したときに、すこしだけ会場を回ってみました。うわさになっていたこれ


 ばっちり見てきました。コンパクトで良いですね。モービルでFT-857を使っていますが、後継機期待できそうです^^写真にはありませんでしたが、CQ出版から発売予定のTRX305でしたっけ、こちらの実機も触ってきました。フルディジタル機ということでしたがメーカー機と比べても受信音の雰囲気など引けをとらない印象です。こちらは200k円弱になりそうで、ちょっと高めですが弄るのにはよさそうだなーと思いました。

 あと、期間中の唯一の戦利品はこれ。


1.2GHzの中古IC-120を先日の関ハムでゲットしたのでV/Uで使えるアンテナを探してこちらを購入しました^^ゆっくり設置して楽しみたいと思います。長波だけでなくほかのバンドも出ますよ~

 あと、1日目のアフターでは突発的に数名の有志で新橋の鳥料理居酒屋で飲み始め、2次会以降はコンテスターが集まる某飲み会に無謀にも乱入して夜中2時近くまで飲み歩いてしまいました^^;;

何とか鳥(名前忘れた(汗)を炭火で。美味。
 そんなわけで、非常に充実した2日間でした。アイボールいただきました各局どうもありがとうございました。またお空で会いましょう(^-^)/

なぜか物寂しい...

 追伸:Keyer mini-V2基板セット無事すべて完売いたしました。ありがとうございました。

2014年8月19日火曜日

TX-136再進化計画とハムフェアの準備

JUMA製135kHz帯CW送信機キットTX-136のFSK対応ファームウエア改造を見直し整理して第一弾が完成しました。

 一口にFSKといってもさまざまなモードがあるため、汎用性を持たせるように外部からのコントロールはDDSのレジスタから引き算する値をシリアル通信経由でダイレクトに入力する形に変更しました。コントロールはPCから操作する場合を想定した場合でも、PCのソフト側でTX-136用の通信コマンドフォーマットに対応させれば、WSPRだろうがJT9だろうがWSQだろうが(笑)

 最小周波数偏移は、20MHz駆動AD9833出力を2分周して目的周波数を得ているので、

 20,000,000 / 2^28 / 2 = 0.037252902984619140625Hz ≒ 0.0373Hz

 と、TCXOの精度1ppm(0.136Hz)よりも小さい値になり十分以上でしょう。これでサムウエイのTX-2200Aオプション2と比肩する(それ以上?)機能が備わったことになります。

 外部コントローラー側も、各モードのプロトコールに見合うシフト量を送信するようにプログラムを修正しました。

 ところで今週末23日(土)、24日(日)に東京ビッグサイトで行われるハムフェア2014全日本長中波倶楽部ブースに実機展示させていただけることになりましたので、具体的な手法についてをそちらで公開します。他にも475.5kHz帯やアクティブアンテナなどの展示もあるそうなのでご興味ありましたらぜひブースまで足を運んでいただけると幸いです。自分もブースでお手伝いさせていただく予定です。

 閑話休題。

 タイトルにTX-136再進化計画とありますが、次の第二弾ファームウエア改造計画を備忘録兼ねて。

 次の目標はTX-136スタンドアロンでQRSS, DFCW, WSPRモード対応です。TX-136のファームウエアをビルドしたときの消費プログラムメモリはおよそ33%とまだまだ余裕があります。QRSSとDFCW対応はとりあえずいけそうです。WSPRはコード変換プロトコールやソースは公開されていますがライセンス上公開されたソースの引用改変ができず、自分で変換プログラムを作って本体のPICに入れ込みたいので前の2モードが完成してから手をつけます。最終的には、GPSユニットからシリアル通信経由で自動送信とグリッドローケータ自動取得できると良いなと妄想しています(笑)

 そんなわけで、今年のハムフェアの資料作りやたまったカード発行準備をこれから^^;

追伸:先月関ハムで頒布したKeyer Mini-V2の基板プログラム済みPICセットのお取りおき分と残り分を持参します。残りは2セットありますがご希望の方いらっしゃいましたらメールでご連絡ください。先着締め切りで、ハムフェア前日までご連絡なかった場合でも一応持っていきますので当日直接お声をかけてください。

2014年8月9日土曜日

OLED(有機EL)モジュールお試し

関ハムやFDコンテストも終わってひと段落、これまた中断していたDDSVFOの開発を再開しようとブレッドボードに組みなおしました。

今度はMCUを20ピンの18F14K22から28ピンの18F26K22に変更しました。

18F26K22はプログラムメモリが64KB、RAMが4KB、EEPROMも1024Bと各メモリの搭載量が多く、また動作クロックも最大64MHzと高速なのに値段が安い、と18Fシリーズの中ではコストパフォーマンスが高いというところに目をつけて採用しました(秋月で1個220円で購入しましたが、最近240円に値上げされたようです)。

 ソースの移行については、Config文とクロック関連のレジスタの修正、ポート関連の割り当て変更と、とくに入力系統を内部プルアップが有効になるPORTBに移しました。

 同じ18Fシリーズなので大幅な変更なくMCU移行は無事完了しました。

と、ここで以前から試してみたかったOLEDモジュールへ換装してみました。

使用したOLEDはaitendoで購入した128x64ドット単色グラフィックモジュールです。

表示領域が非常に小さい(1インチ未満)ものの、標準GLCD解像度を持っています。(秋月の超小型GLCDは128x48です)

インターフェースは4線SPI専用なので、ハード的にはGLCDとそのまま置き換えが可能です。ただ、最初戸惑ったのはピンの名前でした。4線SPI信号線は、
・CS(チップセレクト)
・D/C(データ・コマンドセレクト)
・SDI/SDO(シリアルデータ入出力)
・SCK(同期クロック)
という名前が通常だと思っていましたが、このモジュール(他のaitendoのモジュールもでした)では、見慣れない"AO(A0?)"と表記されたポートがありました。aitendoのサイトにはポートの説明が何もなかったので、サンプルプログラムをDLしてソースファイルを見てみたら、どうやらD/Cと同じだろうということで落ち着きました。

しかしAO(A0?)って何の略でしょう。わかる方いらっしゃいます?

ポートの謎が解けたところで今度はソースの変更ですが、コントローラーチップのマニュアルを読むと表示制御コマンドは一般的なGLCDと同じため、モジュール初期化部分の追加だけでよく修正はきわめて容易でした。


 OLEDとGLCDのスタートアップ画面比較。OLEDは縦方向が64ドットなので下4分の1が表示されません。通常はOLEDのほうが白黒反転しますが、コマンドでスタートアップのときのみ反転させています。同じもの表示させてもまったく印象が違いますね。


 スタートアップ後の通常画面。表示領域が小さいのにコントラストがくっきりしていて離れたところからでも視認性は格段に上がっています。また表示切替時の残像も皆無で小気味よいです。

 
消費電流はまだ確認していませんが、コントラストを強くすると電流が上がってしまうのでコマンドでほとんど低いほうにあわせていますが、表示的にはぜんぜん問題なさそうです。

というわけでOLEDは表示器として十分以上に使えそうです。ただしひとつだけ問題が…


撮影したiPhoneのカメラの表現力がいまひとつでわかりにくいですが、いわゆる焼きつき現象です。数分のみ放置しただけで、長時間点灯部分のドットの残像がすでにみられます。サイトを巡回してみるとOLEDいわゆる有機ELディスプレイの焼きつき現象があちこちで話題になっていました。そういえばソニーのPSPも一時有機ELを採用したかと思えばまたTFT液晶に戻していたのを思い出しましたが、焼きつき現象が原因のひとつだったのでしょうか。あくまで勝手な予測ですが、バックライトが不要で表現力が高いと評価されていたOLEDもなかなかメジャーになれなかったのは、この現象に対する根本的な有効策が見つからないからなのかもしれませんね。

とりあえずこのモジュールでも従来の秋月ミニGLCDでも使えるように開発を進めていこうと思います。

2014年8月8日金曜日

FDコンテスト移動

8月2日と3日、山梨県のとある山奥までFDコンテストのため移動に行ってきました。

早朝5時過ぎに出発し、1名twitter、G+つながりの局長さんを途中で乗せて首都高速から中央自動車道を名古屋方面に向かいました。

夏休みで土曜日だったせいか下り線はすでに25kmほど渋滞。10時過ぎにようやく現地に到着し、荷解きをした後他のメンバーが来る前に136kHzのアンテナを上げて運用開始しました。アンテナはいつもの12m傘2条つき短縮バーチカルでしたが、高い立ち木が多く地面も掘るとすぐ石に当たったりなど条件がよろしくなく、アンテナ入力抵抗はやはり200Ωと高い値でした。

以前富士市移動のときにも経験しましたが、立ち木が多いとアースマットの下に絶縁シートを挟んでもアンテナ入力抵抗はほとんど下がりません。

時間の余裕もあまりないので突き詰めず変換トランスで50Ωに落として送信機に接続しました。風もなくVSWRもバンド内1.1から1.3と安定していました(アンテナ入力抵抗が高いためバンド幅は広くなっている)

送信出力も38WとまずまずでしたがCWでCQ連呼しても応答ないためQRSS30でID送信しました。後日JN1MSOさんのArgoで捕捉されていたのを確認しました。

もう少し粘りたかったのですが、急に雷雲が出てきてしまいやむなく一時中断してFDコンテストの準備に移りました。

136kHzで使ったアンテナは傘エレメントをはずして垂直部分だけ残し、前日工作した80mバンド用のローディングコイルを取り付け、アースは136kHzのアースマットをそのまま使用しました。


 ローディングコイルはφ1.2mmアルミ線を自在ブッシュの溝にかませてスペース巻きとし、共振周波数調整用のクリップとマッチング用のクリップで調整します。

 136kHzやっていると、ローバンドの短縮バーチカルが容易に思えてしまう不思議hi

 午後になって他のメンバーとも合流し、1200MHzまですべてのアンテナや設備を設営しましたが開始の21時直前までかかってしまいました。


80mと20mを運用しましたが、早出のためか眠ってしまいあまり貢献できませんでした^^;

また、80m運用時どうもPCのタッチパッドに回り込んでたらしく、カーソルがしばしば動かなくなってログ入力修正などに障害が出てしまい戸惑ったりと、課題が残る結果になりました。というかもっとCWの受信能力を高めないと><

136kHzのアンテナ設備を利用したローバンド運用が手軽にできそうなので、160m用のローディングコイルを作って移動運用したいなと思いました。