ラズパイ Pythonプログラミングの第2作です。
第1作のCWビーコン送出機の応用で、ラズパイ・モールス符号練習機を作ってみました。
モールス符号を送出するアルゴリズムは、前作のCWビーコン送出機と同じです。
モールス符号をランダムに発生させるために、random関数を使います。
まず、import randomで、ランダム関数モジュールをインポートします。
ランダム関数には
randamo.random() 0.0~1.0までのfloat値を取得
random.uniform(x,y) x~yまでのfloat値を取得
random.randint(x,y) x~yまでのint値を取得
random.choice(param) param名から1つの要素を取得
random.shuffle(array) array内の要素をシャkフル
が、あります。
今回は、random.randint(x,y)を使い、A~Z,0~9のASCIIコードをランダムに発生させます。
モードは、アルファベットだけのモードと数字+アルファベットの2つにしました。
また、速度は、10WPM(語/分)~30WPMまでの間で設定できるようにしました。
Pythonでのプログラミングも少しずつ慣れてきましたが、BASICのようにGOTO命令がないので、プログラムの流れを変える方法に工夫が必要です。
プログラムです。
---------------------------------------------------------
# -*- coding: utf-8 -*-
'''
Morse Trainer
2017.3.14 JH7UBC Keiji Hata
'''
import random
import RPi.GPIO as GPIO
from time import sleep
'''
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)
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
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)
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)
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
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()
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
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()
------------------------------------------------
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上で、対話型で行います。
アルファベットだけのモードの時の画面です。
文字を表示してからモールス符号を送出します。10文字で改行します。
数字とアルファベットのモードです。
モールス符号の信号は、ビーコン送出機と同じくGPIO25に出力します。
GPIO25の信号から音を出すには、電子ブザー(秋月電子で販売しているHDB06LFPN)を使いました。
GPIO25に直接電子ブザーを接続しても良いのですが、3.3Vでは、ちょっと音が小さいので、2SC1815でドライブしました。(今度はうるさいくらいです。Hi)なお、電子ブザーに流れる電流は約10mAです。
回路図です。
ラズパイと電子ブザーを接続した様子です。
ラズベリーパイから直接音を出す方法があるようですので、勉強してやってみます。