欧文のランダムモードを追加しました。
B ボタンを押しながら電源投入で、欧文ランダムモードに入り、アルファベットと数字をランダムで LED 表示してモールスが鳴動します。
micro:bit :MicroPython で morse Callsign Trainer v.1.8
# by JH1LHV
# morse Callsign Trainer v.1.8
from microbit import *
from random import randrange, choice
dot_speed = 70
tone_freq = 1500
pin0.set_analog_period_microseconds(tone_freq)
F = False #mode change flag
DISP = True # LED matrix flag
RANDOM_MODE = False # Random-Mode flag
morsetab = {
'A': '.-',
'B': '-...',
'C': '-.-.',
'D': '-..',
'E': '.',
'F': '..-.',
'G': '--.',
'H': '....',
'I': '..',
'J': '.---',
'K': '-.-',
'L': '.-..',
'M': '--',
'N': '-.',
'O': '---',
'P': '.--.',
'Q': '--.-',
'R': '.-.',
'S': '...',
'T': '-',
'U': '..-',
'V': '...-',
'W': '.--',
'X': '-..-',
'Y': '-.--',
'Z': '--..',
'0': '-----',
'1': '.----',
'2': '..---',
'3': '...--',
'4': '....-',
'5': '.....',
'6': '-....',
'7': '--...',
'8': '---..',
'9': '----.',
' ': ' ',
'?': '..--..',
';': '-.-.-.',
':': '---...',
'-': '-....-',
'/': '-..-.',
'(': '-.--.-',
')': '-.--.-',
'_': '..--.-',
}
prefix = ["JA", "JH", "JR", "JE", "JF", "JG", "JI", "JJ", "JK", "JL", "JM", "JN", "JO", "JP", "JQ", "JS", "7J", "7K", "7L", "7M", "7N", "JD", "8J"]
def dot():
pin0.write_analog(500)
sleep(dot_speed)
pin0.write_analog(0)
def dash():
pin0.write_analog(500)
sleep(dot_speed * 3)
pin0.write_analog(0)
if button_a.is_pressed():
DISP = False
if button_b.is_pressed():
RANDOM_MODE = True
dot_speed = 100
while True:
if (RANDOM_MODE is True):
st = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","0","1","2","3","4","5","6","7","8","9"]
call = choice(st)
elif (RANDOM_MODE is False):
r = randrange(len(prefix)-1)
suffix =""
for c in range(3):
suffix = suffix + chr(ord('a') + randrange(26))
call = prefix[r] + str(randrange(10)) + suffix
if (F is True):
dot_speed = randrange(50) + 35
tone_freq = randrange(100) * 10 + 1000
pin0.set_analog_period_microseconds(tone_freq)
for m in call.upper():
if button_a.is_pressed() and button_b.is_pressed() and (RANDOM_MODE is False):
if (F is False):
display.scroll("R") #random
F = not F
elif (F is True):
display.scroll("N") #normal
dot_speed = 70
tone_freq = 1500
pin0.set_analog_period_microseconds(tone_freq)
F = not F
elif button_a.is_pressed() and (F is False):
display.scroll("+")
dot_speed -= 3
elif button_b.is_pressed() and (F is False):
display.scroll("-")
dot_speed += 3
for c in morsetab[m]:
if c == '.':
dot()
elif c == '-':
dash()
sleep(dot_speed)
sleep(dot_speed * 3)
if DISP == True:
display.show(m)
sleep(dot_speed * 7)
ソースコードは ~その1~ をベースにして思い付いた機能をダラダラと追加・修正しています。
気の利いた書き方はしてませんけど。
これはこれで前回と比べてどこをどう修正したかが分っていいんじゃないかと思います。
「コードを綺麗にしてから・・・」なんて言ってたら、いつアップできるかわからないですからね。
■ ■
今回の追加では欧文のランダムモードを追加しましたが、私としては実運用のことを考慮しても絶対にコールサインを聞き続ける方が効果的だと思っています。
このランダムモードは、欧文を覚えたばかりの初心者が、それもホンの短い期間の中だけで使うのがベストだと思っているので、このモードからは速やかに卒業した方がいいでしょう。
ということで、電源投入時のランダムモードのモールスの速度は少し遅くしています。
あと、モールスの鳴動と同時に LED マトリクスに文字も表示するので、音を目で確認しながら練習を進めることができます。
モールス初心者のそれなりの練習教材として活用できるのではないでしょうか。
■ ■
さて、この後はどんな機能を追加したらいいのやら・・・もう、ネタ切れのような。。。
ケースに収めた micro:bit って、やれること決まっちゃうので。
プッシュスイッチ2個と圧電スピーカ、そして LED マトリクスへの文字表示という限られたインターフェースの中でモールス練習機としてやれること・・・何か新たなアイデアを絞り出すしかありません。
あと、デフォルトで使えるのは、3軸加速度センサーと地磁気センサー、それと Buetooth があるけど。
ん~、Buetooth を使って何かできるかも。