Quantcast
Channel: JH7UBCブログ
Viewing all articles
Browse latest Browse all 440

ラズパイ Python モールス符号練習機

$
0
0
 ラズパイ 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
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上で、対話型で行います。

アルファベットだけのモードの時の画面です。

文字を表示してからモールス符号を送出します。10文字で改行します。

イメージ 1

数字とアルファベットのモードです。

イメージ 2 

 モールス符号の信号は、ビーコン送出機と同じくGPIO25に出力します。

 GPIO25の信号から音を出すには、電子ブザー(秋月電子で販売しているHDB06LFPN)を使いました。

 GPIO25に直接電子ブザーを接続しても良いのですが、3.3Vでは、ちょっと音が小さいので、2SC1815でドライブしました。(今度はうるさいくらいです。Hi)なお、電子ブザーに流れる電流は約10mAです。

 回路図です。

イメージ 3

 ラズパイと電子ブザーを接続した様子です。

イメージ 4

 ラズベリーパイから直接音を出す方法があるようですので、勉強してやってみます。


 

Viewing all articles
Browse latest Browse all 440

Trending Articles