速度とトーンがランダムで変化する「ランダムモード」を追加しました。
A と B のボタン同時押しで、
前回までの「ノーマルモード」と、今回追加した「ランダムモード」がトグルで交互にチェンジします。
「ノーマルモード」(電源投入時と同じ)では、
これまで通りに A ボタンで速度アップ、B ボタンで速度ダウンします。
「ランダムモード」では、コールサイン毎で速度と音程が変化するので、より実践的な練習が可能です。
micro:bit :MicroPython で morse Callsign Trainer
# by JH1LHV
# morse Callsign Trainer v.1.5
from microbit import *
from random import randrange
dot_speed = 60
tone_freq = 1500
pin0.set_analog_period_microseconds(tone_freq)
F = False #mode change 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)
while True:
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():
if (F is False):
display.scroll("R") #random
F = not F
elif (F is True):
display.scroll("N") #normal
dot_speed = 60
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)
display.show(m)
sleep(dot_speed * 7)
こんな感じに聞こえます。
実際に長い時間動かして、エラーにならないことを確認しています。
micro:bit に圧電スピーカを取りつけて、このプログラムをコピペして書き込めばちゃんと動いてくれるはずです。
♢ ♢ ♢
PIC や Arduino で同じことやらせようとすると、
ボタンを取り付けるためのプルアップ抵抗が必要になったり・・・ちょっとだけ面倒。
だけど micro:bit なら CW を鳴らすくらいのことは、ホント簡単。
最初からボタンも2つ付いてるし、
文字だって LED のドットマトリクスだけど簡単に表示できるからねぇ~。
さすが、小学生向けの IT 学習用。
プログラム作成だってウェブのエディタでとっつき易いし、
プログラムの書き込みも PC に接続すると現れる micro:bit ドライブに HEX ファイルを保存するだけ。
Arduino のような書き込み設定も必要ありません!
Code With Mu を使えば、プログラムを書いて「書き込み」ボタンを押すだけだよ。
あとは自動で HEX ファイルに変換して micro:bit にプログラムを書き込み、勝手に実行してくれます。
ただ残念なのが、デバッグ機能がないこと。。。これは、将来に期待。。。
ボタンや LED マトリクスのコントロールメソッドもあらかじめ用意されてるのもイイ。
たった1行書くだけで文字が表示できるからね。
Arduino や RasPi ではこう簡単にはいかないよ。
文字を表示するだけでも結構つまずいて・・・「プログラムって難しい」ってなるけど。。。
この micro:bit だと、メソッド1行書くだけで制御できるから。
子供達に「マイコンって簡単なんだ!」って意識付けができるように、ホントよく工夫されてる。
ということで、
micro:bit は「初心者にわかりやすく」を徹底した仕様になっています。
価格も子供のお小遣い程度なので、入門用としては本当に優れたマイコンだと思います。