JH1LHVの雑記帳

和文電信好きなアマチュア無線家の雑記帳

スポンサーリンク

micro:bit で morse を鳴らす ~その6~

欧文のランダムモードを追加しました。

B ボタンを押しながら電源投入で、欧文ランダムモードに入り、アルファベットと数字をランダムで LED 表示してモールスが鳴動します。

f:id:JH1LHV:20180609102637j:plain 


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 を使って何かできるかも。