モールス符号練習プログラム(Python)
2017.3月18日 JH7UBC
CWビーコン送出機のプログラムの応用で、モールス符号の練習プログラムを作りました。
A〜Z,0〜9の文字をランダムに発生させ、文字に対応したモールス符号を100個送出します。
乱数を発生させる関数は、randomモジュールをインポートし、random.randint(x,y)を使います。
この関数は、x〜yの整数を発生させます。
モードは、アルファベットだけ(A〜Z)のZ)モードと数字とアルファベット(0〜9A〜Z)のモードから選べます。
送信速度は、10wpm(語/分)〜30wpmの間で設定できます。20wpmが実用的な速度です。
モードと速度は、Python Shell上で対話型で入力します。
音は、GPIO25に電子ブザーを接続して出します。
プログラムです。
# -*- coding: utf-8 -*-
''' Morse Trainer 2017.3.14 JH7UBC Keiji Hata ''' import random import RPi.GPIO as GPIO from time import sleep GPIO.setmode(GPIO.BCM)
GPIO.setup(25,GPIO.OUT) Morse_Code =[63,62,60,56,48,32,33,35,39,47,1,1,1,1,1,1,1,6,17,21,9,2,20,11,16,4,30,13,18,7,5,15,22,27,10,8,3,12,24,14,25,29,19]
counter = 0 y = 90 def dot():
GPIO.output(25,GPIO.HIGH) sleep(dot_time) GPIO.output(25,GPIO.LOW) def dash(): GPIO.output(25,GPIO.HIGH) sleep(dash_time) GPIO.output(25,GPIO.LOW) def space():
sleep(space_time) def morse_send():
char_code = ord(moji) if char_code == 0x20: space() else: Mcode = Morse_Code[char_code - 48] while Mcode != 1: mark = Mcode & 1 if mark == 0: dot() else: dash() sleep(dot_time) Mcode >>=1 def mode_input():
global mode print("1: ABC.....XYZ") print("2: 012..9AB..Z") mode = input('Select 1 or 2 ') if mode == 1 or mode == 2: return else: mode_input() def speed_input():
global speed speed = input("Speed(10-30 wpm)= ") if speed <10 or speed >30 : speed_input() else: return def random_char():
global mode global moji_ascii if mode ==1: x=65 else: x=48 moji_ascii =random.randint(x,y) if moji_ascii > 57 and moji_ascii < 65: random_char() else: return try: while True: print('=== MORSE CODE TRAINER ===') print('STOP = ctrl + C') print('') mode_input() print('') speed_input() print('') dot_time = 1.2 / speed dash_time = dot_time * 3 space_time = dot_time * 6 while counter < 100: random_char() moji = chr(moji_ascii) print moji, morse_send() sleep(space_time) counter +=1 if counter % 10 == 0 : print"" counter = 0 print('') except KeyboardInterrupt: pass GPIO.cleanup() |
Python Shellの画面です。
アルファベットだけのモードで、速度20wpmの設定です。
数字とアルファベットのモードです。速度は30wpmです。
音を出すためには、GPIO25に電子ブザーを接続します。
私は、2SC1815でドライブして、秋月電子で販売している電子ブザーHDB06LFPNを鳴らしました。(けっこう大きな音が出ます)
ラズベリーパイに接続した様子です。
ラズパイには、疑似アナログ出力として、PWM(Pulse Width Modulation)出力があります。
これを利用すれば、圧電スピーカから音を出すことができます。
方法は、GPIOのsetupの次に、p = GPIO.PWM(25,700) #GPIO25 700Hzを加えます。
def dot()とdef dash()は、次のように書き換えます。
def dot(): p.start(50) sleep(dpot_time) p.stop() def dash(): p.start(50) sleep(dash_time) p.stop() |
p.start(50)は、デューティ比50%で、PWMを出力する関数です。
GPIO25に直接圧電スピーカを接続しています。