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) | アマチュア無線

2019年04月20日

アマチュア無線(JIDX CWコンテスト2019とLoTW期限切れ失効)

最近アマチュア無線関係の活動が低調で、コンテストの日程などもすっかり頭から抜け落ちていた。

コナンくん映画のブログ記事を書こうと、昨年のブログを読み返していたところ、この時期にJIDX CWコンテストをやっていることを思い出した。確認してみたら、まさに開始後数時間経ったところだった。

どうせCondxも良くないだろうし、ベランダにモービルホイップを仮設して調整するのも面倒だし、今年は不参加にするかなぁ、としばらく悩んだものの、このまま「面倒だ」と何もやらずにいたら、たしかに楽かもしれないけれど、趣味の楽しみもまたなくなってしまう。

と思い直して、14MHzのモービルホイップを仮設し、カウンターポイズを床に這わせ、SWRを見ながらエレメント長を調整。なんとかリグの表示でSWR
2コマくらいに追い込んだ。

IMG_7063_w560.JPG

ワッチすると局数は少ないものの、EUが割と強く聞こえている。縦振れキーを叩いて呼んでみたら、何度か聞き返されたものの、無事に交信成立。

けっこうできるかも、ということで、べガリのパドルをセットして強く聞こえる局を呼んでみる。

すると昨年はまったくできなかったZone16より向こうの15,14あたりともつながった。Condxは良くはないけれど、最悪ではない、という感じかも。

22時過ぎまでやって、9局。14、15、16、17、18エリアと交信できたので1日目は終了。

2日目も早朝からワッチしてみたけれど、この時間帯はまったく聞こえず。用事を済ませて、11時頃に再度聞いたら、東南アジアとロシアが聞こえて、19、27、28を追加。

夕方も少し追加して、21局。10ヶ月ぶりのDX交信ができて、結果として重い腰を上げて良かった。DXCCでMixdのNewが一つでも増えてくれたら嬉しい。

Freq. Point  Multi  QSO
----------------------------------------
14MHz 21 24 21
----------------------------------------
Total 21 24
Score 21 x 24 = 504
DXCC Multi 13: 9M2, BV, BY, DL, EX, K, KH0, OH, T8, UA, UA9, UR, ZL
Zone Multi 11: 3, 14, 15, 16, 17, 18, 19, 24, 27, 28, 32


LoTWを確認したら、証明書の更新期限が三日前に切れていた。そういえば交信手続きをしてね、というメールが何度か来ていたような気がする。まだ先だと思っているうちに忘れてしまっていた。

いったん証明書がExpireされると、ログのアップロードができなくなって、証明書の再取得が必要になるらしい。ちょっと焦ったけれど、冷静にTSQLからRequest new call sign certificate...を選んでリクエストを送ってみた。ら、2日後に新しい.tq6ファイルが届いて、それをTQSLのLoad call sign certificateで読み込ませたところ、無事に再認証が完了。良かった。

【過去のJIDX CWコンテスト】
2018年2016年2015年2014年
posted by ソウヘイ at 06:57| Comment(0) | アマチュア無線

2019年03月24日

アマチュア無線(和文モールス聞き取りゲーム)

以前Scratchで作った和文モールス聞き取り練習ソフト,ゲーム的な要素を追加しようと思っていてすっかり忘れていた。

CWインベーダが大変面白かったこともあって,やはりゲーム要素は大切だなと思ったしだい。

大掛かりな改造をできるだけせずになんとかゲームっぽく仕上げてみた。



元々がScratchを知ってから1週間で作ったコードであり,ボタンの処理とか非常に雑で恥ずかしいけれど,これをもっと洗練したコードで美しく...とか考えだすといつまで経っても完成しなくなってしまう。この手のものは「とにかく完成させる」ことが大切。

いつの間にかScratch3.0になって機能も増えたみたいで,かなり本格的なソフトも作れるのでは。
続きを読む
タグ:CW Scratch
posted by ソウヘイ at 18:58| Comment(0) | アマチュア無線

2019年03月20日

アマチュア無線(旧スプリアス機の再免許申請)

1アマ合格のお祝いにと譲っていただいたFT-100Dで100Wの固定局免許を下ろしてもうすぐ5年になる。そろそろ再免許申請をしなくてはいけない。

しかし,例の旧スプリアス機の規制がクリアできず,FT-100Dは2022年12月以降は使えなくなることがわかっている。(機器単体で新スプリアス規格適合機器として保証が出来ない機器リスト)

どうせまだしばらくは電波コンディションの悪い時期が続くことだし,とりあえずこのまま再免許申請をして,2022年までに代替機を考えることにする。

ただ,旧スプリアス機をそのまま再免許申請できるのかどうかがよくわからなかった。「2022年12月以降も使い続けるためには,スプリアス確認保証が必要」ということはわかるけれど,確認保証を取らなかった(取れなかった)場合,再免許申請をして2022年11月まで使うことができるのか,というのがはっきり書いていない。まあやってみてダメなら100W固定局は廃局かな。まだ50W移動局と200W(実家)の免許は残るので。

そしてまたあの面倒な電子申請Liteを使うのかと思うとなかなか腰が上がらない。なんとかやる気を出して画面を開こうとすると,例によってパスワードの期限切れで変更を促されるが,以前とはポリシーが変更になっているのに気づかず新パスワードが通らなかったりして苦戦。ホント,この面倒くささ,わかりづらさがアマチュア局の減少の大きな要因のひとつだと思う。

何も変更なしで申請して,ペイジーで手数料を納付。2日で申請中になって,免許状送付用のSASEを普通郵便で関東総通に送った。7日目にステータスが審査終了となり,9日目に免許状が到着。意外と早かった。

IMG_6776_w560.JPG

免許の有効期間は平成36年(!)までだけど,備考欄に「新スプリアス基準に合致しない無線設備の使用は平成34年11月30日までに限る」の記載があった。

とりあえずこれで3年の猶予期間は稼げたので,その間に新たな100W機を選定したいと思う。とはいえオールバンド,オールモードの100W機って選択肢はごく限られてしまうんだけど。2019年に新品で買える機種だと下に並べた4台かな。


タグ:FT-100D
posted by ソウヘイ at 20:21| Comment(0) | アマチュア無線