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によるプログラミング教育の可能性




【2019.5.6追記】
ゴールデンウィークの最終日に,気になっていたDX交信実験を行なった。



最大出力に設定(power=7)して,符号が途切れ途切れになる位置まで離れていった。だいたい見通し40mくらいが限界みたい。指向性もあるようで,micro:bitの長辺に垂直の方向が,より飛ぶような感じ。

もちろん普通のトランシーバーとは違うので,「カスカスの信号を聞き取る」みたいな面白さはなく,届くか,届かないかのどちらかしかない。

とりあえず「免許不要でCWの交信が体験できるトランシーバーを作る」という目的は達せられたので満足。
タグ:CW micro:bit
posted by ソウヘイ at 16:02| Comment(0) | アマチュア無線
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: