2019年08月04日

アマチュア無線(フィールドデーコンテスト2019)

フィールドデーコンテストは3年前から地元クラブ局で集まって各自好きなように移動運用するスタイル。

私は昨年(記事なし)と同様に7MHzの釣り竿アンテナと,FT-817を東屋でセッティング。

IMG_7144_w560.JPG

SWRはチューナーなしでリグのメーターで3コマ。チューナーで1まで落とした。

受信はけっこう良くて,1,3,6,8,0エリアが入感。しかしS8から9くらい振っている局を呼んでもぜんぜん取ってもらえない。良くてQRZ?が返ってくる程度。

それでもどうにかローカル2局と,長野,滋賀と交信。弱い信号を取っていただいてありがたい。22時頃まで運用して撤収。2日目の昼間は暑いのでお休み。

Freq. Point  Multi  QSO
----------------------------------------
7MHz 4 4 3
----------------------------------------
Score 4 x 3 x 2 = 24
マルチ: 茨城,滋賀,長野


釣り竿アンテナはカウンターポイズを1本だけにしているけれど,ローカルのOMさんのアドバイスによると,もっと増やした方が飛びが良くなるとのことで,次回までにはカウンターポイズを増設してまたチャレンジしたい。

DSC05964_w560.JPG

過去のフィールドデーコンテストの様子:2018年,2017年,
2016年2015年2014年2013年2012年
posted by ソウヘイ at 14:05| Comment(0) | アマチュア無線

2019年07月07日

アマチュア無線(6m and Downコンテスト2019)

2017年,2018年とローカルのOMさんに便乗して高いところからQRVしたけれど,今年は悪天候だったこともあり,また3年前と同じ場所に戻った。

IMG_7111_w560.JPG

3年前はサンバーで快適な移動運用ができたけれど,今回はまたポロでやや窮屈な体勢となった。ロードスターではそもそも車内で長時間CWは無理だし,移動運用のためにもう一台車が欲しいくらい。レンタカーを借りる手もあるけれど,快適な移動運用のためにはそれなりに準備も必要なので難しいかな。

強風と雨なので,運用は430MHzのモノバンドでシンプルに。ワッチを始めてもさすがに移動局は少ない感じ。バンド内を下から上まで呼んで,CQを出して1,2局呼ばれるというサイクルを繰り返して,2時間で23局。マルチは増えずに6。なんとか静岡が1局だけ。

IMG_7105_w560.JPG

Freq. Point  Multi  QSO
----------------------------------------
430MHz 23 23 6
----------------------------------------
Score 23 x 6 = 138
マルチ: 茨城,東京,埼玉,千葉,群馬,静岡


今回は交信途中で符号が出なくなってしまい慌てた。パドルの接点か,メモリキーヤの電池か,ケーブルか。とりあえず簡易縦振キーの「ピンポンキー」でしのいだ。つなぎなおしたりしたら直ったけれど,結局原因はよくわからず。

IMG_7106_w560.JPG

お昼を食べた後はかんなさんがメモリキーヤでポチポチ。かんなさんは私以上のレア局なので,ゲットできた方は幸運かと思う。コンテストで上位入賞する局というのは,他の局から見れば実は「何度も交信したことのある雑魚キャラ」みたいなもの。自分でCQを出さず,弱小設備で,たまにコンテストに出ても数局呼んで終わり,というかんなさんみたいな局は「はぐれメタル」と言っても過言ではない。

「どうせコンテストに出ても勝てないから」とモチベーションの上がらない局もいらっしゃると思うけれど,上のように考えれば,少ない交信局数でも楽しむことができると思う。そして,1ポイント,1マルチが勝敗を分ける上位局やベテランの局はそんな希少局の価値をよくわかっているので,弱い信号でも頑張って取ろうとしてくれるし,「よく呼んでくれました!ありがとう!」みたいな信号をモールスで返してくれるのである。

IMG_7109_w560.JPGIMG_7107_w560.JPG

【過去の6m and Downコンテストの様子】
2018年2017年2016年2015年2014年2013年2012年
posted by ソウヘイ at 20:28| Comment(0) | アマチュア無線

2019年06月22日

アマチュア無線(ALL ASIAN DXコンテストCWとCWインベーダーコンテスト)

GW明けからの出張もどうにか一段落して,久しぶりに少しだけ無線。

AA TESTは14メガのモービルホイップをベランダに仮設して、無線機のスイッチを入れて、聞こえる局を1局呼んだらまたスイッチを切って他のことをする、という感じでユルく参加。

なのでNEWのエンティティもなかったし、12局で終了。

IMG_7877_w560.JPG

aa20190616.jpg

CWインベーダーコンテストは第2回の開催。とにかく普段完全にサボっているため、そこそこ打てるようにするまでにしばらくリハビリが必要。しかも一回プレイするとかなり疲れるので,連続して何度もチャレンジは無理。

1日目はリハビリに終始して,2日目に本番のつもりでチャレンジ。第1回の記録であり自己ベストの和文ステージ19が近づいてくると緊張してきてミスが多くなる。

IMG_7042_w560.JPG

どうにかこうにかステージ20まで到達。最後は波動砲切れで侵略を許してしまった。ミスが多くてスコアは悪かったけれど,第1回の総合スコアをわずかながら上回ることができたので,ログを提出。

多くの参加局がステージ30をコンプリートしていて,やっぱり日頃の練習が重要だと思い知らされた次第。

IMG_7044_w560.JPG

ということで順位は振るわなかったけれど,ありがたいことに私もかんなさんも参加賞をいただくことができた。次回は何かドネーションを考えたいところ。

IMG_7050_w560.JPG






posted by ソウヘイ at 18:56| Comment(0) | アマチュア無線

2019年05月01日

アマチュア無線(micro:bitでCWトランシーバー)

ゴールデンウィークに遊ぼうと思って,micro:bitをもう一つ購入しておいた。micro:bitは昨年お試しで買ってみて,エレキー練習ソフトを作っただけでお蔵入りになっていた。

最近Scratchでモールス練習ソフトを作ったりして,micro:bitもまた遊んでみようと思った次第。森博嗣さんの連載目当てで買った「子供の科学」誌にmicro:bitの連載があって,無線通信を使った記事が面白かったこともある。



ズバリ作るのはmicro:bit同士で交信するCWトランシーバ。CWってアマチュアでやるには3級以上の取得が必要だし,モールス練習機みたいな音を出すだけのものではやっぱりつまらない。実際に電波を出して離れたところと交信できた方が楽しいのでは。

ただ,たいていのものは世の中で先に作っている人がいるので,まずは検索。するとUKのM0RJVさんのmicro:bit CW transceiverがヒットした。



これはボタン入力した信号をデコードして,文字情報を送るというもので,機能も豊富で大変優れている。あとはJH1LHVさんの「micro:bit で morse を鳴らす」の記事もあったけれど,これはコールサイン受信のトレーニング用。

同じものを作ってもつまらないので,一応構想としては,

(1)micro:bitの無線機能で送信,受信機能を実現
(2)縦振れ電鍵(ストレートキー)を使う。
(3)エレキー機能は不要。
(4)送信パワーの変更機能
(5)受信信号レベルのメータ機能

という感じに決めて作り始めた。

最初はScratch風のMakeCodeエディタで書き始めたところ,(2)の電鍵の入力のところでつまずいた。Scratchの縦振れ練習ゲームでも悩んだけれど,「キーが押されている間は音を鳴らし続け,キーが離されたら音を止める」という動作がどうにもうまくできない。指定周波数の音を鳴らすブロックで,継続時間(x拍)のところを-1とすると,連続音が出るようになるけれど,今度はそれを止めるブロックがない。

Scratchのときも書いたけれど,やっぱりストレートキーを任意の長さで打って止める,という機能は練習には必須だと思うので,早々にMakeCodeエディタは諦めて,MicroPythonに移行。エディタはmu-editorを利用した。これはコードのチェック機能があるし,ボタン一つでmicro:bitにプログラムを転送できるのが便利。

MicroPythonなら,music.stop()関数が使える。これでサイドトーンや受信音のCWを鳴らすのはできるようになった。

ちなみにmicro:bitの無線機能は,本物のCWのようにキーダウンしている間,キャリアを出し続ける,というような使い方はできない。そこで,文字列送信機能を使って,キーダウン検出時に"key_down"を送信し,キーアップ検出時に"key_up"を送信する。受信側では"key_down"を受信したら連続音を鳴らし始めて,"key_up"を受信したら音を止める。というようにした。

次につまずいたのは入力端子。最初,pin1.is_touched()関数を使ってpin1に電鍵をつなぐようにした。するとちょっと速い打鍵ではぜんぜん音がついてこない。処理が悪いのか,速度の問題かと思ってコードをシンプルにしたり,いろいろ試したけどダメで,これは企画倒れに終わるか,と諦めかけた。

試しに電鍵ではなくてbutton_a.is_pressed()関数を使ってAボタンを押すようにしてみたところ,速い入力でも追従する。実はpin1.is_touched()はアナログ入力であり,抵抗値を測っている。仕様は不明ながら,瞬間的な短絡や開放はノイズとして無視されてしまっているのかも。

そこでpin1.read_digital()関数に変えてみたところ,速い打鍵でもまったく遅れなく追従してくれるようになった。キーの接続はpin1と3Vにつなぐ。Hiになったときにkey_down,Loになったときにkey_upとなる。

ここまでくればあとは細かい部分。レベルメータとか,キーダウンだけ受信してキーアップの受信に失敗したときに受信音が鳴りっぱなしになるのをタイマーを仕掛けて回避するとか。

結果としては夢中で作って2日間で完成。もう少し時間をかけて楽しめばよかった...



なお,動画の最初で音がハモっているのは,送信のサイドトーンと受信音が被って聞こえているため。同じ画面に収めるためにどうしても重なって聞こえてしまう。どうせなら不協和音にならないようにと,サイドトーンがファ,受信がラの音と変えてある。

ちなみに最小のパワー0だと,50cmほど離すと受信が途切れ途切れになる。最大のパワー7でどこまで届くかはまだ試せていない。そのうちDX交信の実験をしてみたい。交信実験の様子を追記しました。

# micro:bit CW transceiver
from microbit import *
import radio
import music

radio.on()

pin0.set_analog_period(1)

RxFlag = False
TxFlag = False
Po = 0
msg = ''
rssi = 0
timestamp = ''
mdelay = 0
wdtimer = 0

# music.play(music.POWER_UP)

def QRO():
global Po
Po = Po + 1
if Po > 7:
Po = 0
radio.config(power=Po)
display.show(Po)
sleep(500)
display.clear()

def Meter(RxLevel):
RxLevel = RxLevel - 130
RxLevel = RxLevel // 2
if RxLevel > 45:
RxLevel = 45
elif RxLevel < 0:
RxLevel = 0
for i in [0, 1, 2, 3, 4]:
if RxLevel >= 9:
display.set_pixel(i, 0, 9)
RxLevel = RxLevel - 9
if RxLevel < 0:
RxLevel = 0
else:
display.set_pixel(i, 0, RxLevel)
RxLevel = 0

while True:
Rx = radio.receive_full()
if Rx:
msg, rssi, timestamp = Rx
if str(msg[3:], 'utf8') == 'key_down' and not RxFlag:
wdtimer = running_time()
RxFlag = True
elif str(msg[3:], 'utf8') == 'key_up' and RxFlag:
RxFlag = False

if RxFlag and running_time() > (wdtimer + 3000): # key_down未検出chk
RxFlag = False
# wdtimer = running_time()

if RxFlag:
Meter(255 + rssi) # 受信強度は-255(弱)から0(強)
mdelay = 255 + rssi
else:
mdelay = mdelay - 5
if mdelay < 0:
mdelay = 0
Meter(mdelay)

if pin1.read_digital() and not TxFlag: # 立ち上がり
TxFlag = True
radio.send('key_down')
music.pitch(698, -1, pin0, False)
display.set_pixel(2, 2, 9)

elif not pin1.read_digital() and TxFlag: # 立ち下がり
TxFlag = False
radio.send('key_up')
music.stop()
display.set_pixel(2, 2, 0)

elif not pin1.read_digital() and not TxFlag and not RxFlag: # 離したまま受信なし
music.stop()
elif not pin1.read_digital() and not TxFlag and RxFlag: # 離したまま受信あり
music.pitch(880, -1, pin0, False)

if button_a.is_pressed():
QRO()

sleep(10)


【参考サイト】
m0rvj_microbit_cw_transceiver
BBC micro:bit MicroPython ドキュメンテーション
MicroPythonによるプログラミング教育の可能性



続きを読む
タグ:CW micro:bit
posted by ソウヘイ at 16:02| Comment(0) | アマチュア無線

2019年04月28日

アマチュア無線(ScratchでCW打鍵練習ゲーム)

和文モールス聞き取りゲームは自分なりにそこそこ上手にできたと思う。その流れで今度は本家CWインベーダー同様の打鍵練習ゲームをScratchで組めないかチャレンジしてみた。



聞き取りゲームはロジックとしては単純な四択クイズの応用で,音源の準備(パドルを叩きながら録音した)が地道な作業で時間がかかったのが大変ではあったけれど,本質的に困難な部分はなかった。もちろん慣れないうちは思った通り動かなかったりして苦労したけれど,Scratchの仕様の範囲で十分に書けることがわかっていたという意味で。

その点打鍵練習には「これはScratchで可能かな?」と思うハードルが3つあって,

(1)キーを押している間連続音(サイドトーン)を流し,離したら止める,という実装
(2)打鍵に対する処理速度(レスポンス)の問題
(3)モールス符号のデコードアルゴリズムの移植

(1)については,短点と長点を固定長としてしまえばそれほど難しくない。Scratchで公開されている多くのモールス信号系のプロジェクトもだいたいこの方式。でも縦振れキーの練習としては,やっぱり打鍵の長さを自由に変えられる機能は必須だろう。

いろいろ試して,なんとかそれっぽい実装を考えた。具体的なやり方は,
・長め(5秒とか)のサイドトーンを録音して登録する。
・「キーが押された」までループで待機。
・上記ループを抜けたら長いサイドトーンを再生。
・「「キーが押された」ではない」まで空ループ。
・空ループを抜けたら「すべての音を止める」。

cw_scratch_01_w560.jpg

これで,キーを押している間はサイドトーンを再生して,キーを離すと止める,という動きが実現できる。

ただ問題も残っていて,Scratchに音を登録するときに,自動的にフェードイン・フェードアウトが付加されてしまうこと。時間0で音量100%になるような音を登録しても,音量0からフェードインする音に勝手に編集されてしまう。このせいでキーを押した瞬間は無音で,一瞬遅れてサイドトーンが鳴るようなタイムラグが発生する。連続して打鍵したときの音の歯切れも悪くなる。これは後のレスポンスの問題とも密接に関わってきて,今のところ解決できていない。

cw_scratch_02_w560.jpg

(2)はゲーム性に関わる問題。ストレートキーでそれなりに打てる人ならわかると思うけれど,慣れてくると短点の打鍵などはかなり高速になる。電鍵の代わりにキーボードを打つという違和感は我慢してもらうとしても,慣れているスピードで打とうとすると,処理速度のためだと考えられる入力の取りこぼしが発生する。何度かやっているうちに「うまく反応してくれるタイミング」みたいなものがわかるようになってくるんだけど,初めての人は「なんだこりゃ」と思うかも。

(3)はこのゲームを作る上での「キモ」とも呼べる部分。モールス符号のデコードアルゴリズムをネットで検索すると、「枯れたアルゴリズムがある」とされている一方で、具体的なコードの例はなかなか見つからない。あっても実際の交信の音を入力してFFTをかけて、みたいなものだったり。

可変長のキーダウン信号を短点、長点、符号間の空白、文字間の空白、単語間の空白の5つに分類するわけだけど、それぞれ長さが人間の打ち方によって変化するというのが難しい。人間がいかにこの辺の判定をうまくやっているかがわかる。

で、数少ない情報の中で比較的わかりやすく書かれているのが、JH7UBCさんのサイト。わかりやすいフローチャートとIchigojamとPythonによる実装が紹介されており、大変親切。もっと高度なアルゴリズムもあるのかもしれないけれど、まずはこれをベースとさせていただく。

Scratch用に改造したのは、キーアップ(High)時とキーダウン時(Low)のループのsleep(0.001秒)をなくして,カウンタのインクリメントではなくタイマーを使った経過時間計測に変えた点。Scratchは遅いのでループ回数がsleep無しでも少なく,精度が悪くなってしまったため。

これでそこそこは認識するようになったと思っているけれど,本家CWインベーダーと比べるとまだまだ。パラメータ調整でどうにかなるレベルなのか,アルゴリズムが違うのか,Scratchの処理速度の問題なのか,まだ切り分けられない状況。今後の課題としたい。

プログラムはいじらずに,拡張ブロックを使ってMicro:bitをBluetooth接続でつなぎ、入力端子に電鍵をつないでみた。

これでキーボードで打鍵する違和感をなくせればラッキー、と思ったけれど甘かった。Bluetoothで接続している関係か、打鍵してからScratchが反応するまでの遅延があって、余計に違和感が大きくなってしまった。お手軽な構成で電鍵が繋げると思ったのに残念。



タグ:CW Scratch
posted by ソウヘイ at 18:15| Comment(0) | アマチュア無線