モールス符号練習プログラム(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に直接圧電スピーカを接続しています。

inserted by FC2 system