Raspberry Piでモールス符号解読器を作ってみました。言語は、Pythonです。
入力はGPIO24で、10kΩでプルアップしています。無信号時HIGH、信号時LOWの信号を入れます。
解読された文字は、Python Shell画面に表示されます。
今回は、メモリーキーヤーの信号を入れます。
モールス符号の解読アルゴリズムは、IchigoJam Morse decoderのものをPythonに移植しました。
信号の時間の長さや無信号の時間の長さを測定するのは、sleep(秒)関数を使いました。
sleep(0.001)でループさせ、カウンタをカウントアップすることにしました。カウンタは、信号がHIGHの時間を測定するカウンタをHcounter、LOWの時間を測定するカウンタをLcounterとします。
解読アルゴリズムは、次のとおりです。
プログラム(スクリプト)は、次のとおりです。とりあえず、欧文のみA-Z 0-9の解読です。
速度は、約10WPM~30WPMの解読を確認しています。速度の変化にはある程度追従します。
-------------------------------------------------------
# -*- coding:utf-8 -*-
"""
morse decoder Ver 0.5
2017/04/28
JH7UBC Keiji Hata
"""
morse decoder Ver 0.5
2017/04/28
JH7UBC Keiji Hata
"""
import RPi.GPIO as GPIO
from time import sleep
from time import sleep
GPIO.setmode(GPIO.BCM)
GPIO.setup(24,GPIO.IN)
GPIO.setup(24,GPIO.IN)
#character list
Oubun = ['*','*','E','T','I','A','N','M','S','U','R','W','D','K','G','O','H','V','F','*','L','*','P','J','B','X','C','Y','Z','Q','*','*','5','4','*','3','*','*','*','2','*','*','*','*','*','*','*','1','6','*','/','*','*','*','*','*','7','*','*','*','8','*','9','0','*','*']
Oubun = ['*','*','E','T','I','A','N','M','S','U','R','W','D','K','G','O','H','V','F','*','L','*','P','J','B','X','C','Y','Z','Q','*','*','5','4','*','3','*','*','*','2','*','*','*','*','*','*','*','1','6','*','/','*','*','*','*','*','7','*','*','*','8','*','9','0','*','*']
Mcode = 1
Lcounter = 0
Hcounter = 0
T = 120
W = 400
Flag = 0
Lcounter = 0
Hcounter = 0
T = 120
W = 400
Flag = 0
print "MORSE DECODER Ver.0.5"
print "STOP = ctrl+C"
print "STOP = ctrl+C"
try:
while True:
#GPIO.input=HIGHの時の処理
while GPIO.input(24) == GPIO.HIGH:
if Mcode != 1:
sleep(0.001)
Hcounter += 1
if Hcounter > T:
if Mcode < 66:
print Oubun[Mcode],
else:
print "*",
Flag = 1
Mcode = 1
else:
sleep(0.001)
Hcounter += 1
if Flag == 1 and Hcounter > W:
print (" "),
Flag = 0
Lcounter = 0
#GPIO.inout=LOWの時の処理
while GPIO.input(24) == GPIO.LOW:
sleep(0.001)
Lcounter +=1
if Lcounter < T:
Mcode <<= 1
T = Lcounter * 1.8
W = Lcounter * 4
else:
Mcode <<= 1
Mcode += 1
Hcounter = 0
while True:
#GPIO.input=HIGHの時の処理
while GPIO.input(24) == GPIO.HIGH:
if Mcode != 1:
sleep(0.001)
Hcounter += 1
if Hcounter > T:
if Mcode < 66:
print Oubun[Mcode],
else:
print "*",
Flag = 1
Mcode = 1
else:
sleep(0.001)
Hcounter += 1
if Flag == 1 and Hcounter > W:
print (" "),
Flag = 0
Lcounter = 0
#GPIO.inout=LOWの時の処理
while GPIO.input(24) == GPIO.LOW:
sleep(0.001)
Lcounter +=1
if Lcounter < T:
Mcode <<= 1
T = Lcounter * 1.8
W = Lcounter * 4
else:
Mcode <<= 1
Mcode += 1
Hcounter = 0
except KeyboardInterrupt:
pass
pass
-----------------------------------------------------------------------
メモリーキーヤーとラズパイを接続した様子です。
解読した画面です。
なお、詳細はJH7UBCホームページに掲載します。