(和文)モールス→キーボード入力コンバーターの製作

7M4MON
2021/9/1



はじめに

コンテストはCWで参戦することが多く、欧文は(コンテストに出るくらいは)送受信できる
のですが、和文モールスはさっぱりです。
K3NG Keyerの和文対応をしたとき、そろそろ和文も練習したいと考えるようになりました。

送信の練習は、モールス信号をデコードして、PCにキーボード入力として送る形が良いだろうと。
K3NG Keyerには FEATURE_USB_KEYBOARD があるので、これを使おうか…とも考えましたが、
デコーダーの方式を風呂に入りながら検討してみたところ、それほど難しくなさそうだったので、
頭の体操も兼ねて、自分で実装することにしました。

マイコンは、USB HIDに対応する、Arduino Micro (ATMega32u4) を使用することにします。
このボードは、Keyboard.h をインクルードすることでUSBキーボードとして動作し、
キーボードから入力されたように文字をPCに送ることができます。


モールス符号を2進数で表現する

モールス符号は長点と短点の組み合わせで構成されています。
例えば 'A' なら、 ・− 、'9' なら −−−−・ といった具合です。
これを2進数で表すことを考えると、一短長点あたりは
(例えば、1bitで短点を 0, 長点を 1 としたときは、0b01 と 0b0001 の区別がつかないので、)
2bitが最小です。
短点を 0b01 (=1), 長点を 0b11 (=3) とすれば、偶然にも 1:3 の比となります。
よって、'A' は 0b0111, '9'は 0b1111111101 となります。
一短長点あたり2bit使うので、16bit整数型では、最大で8短長点を表すことができます。
欧文の訂正符号 HH がそれにあたり、HH以外は和文も含めて8短長点未満です。

短長点を検出する

接点が接となった時、断になるまでの時間を1ms間隔でカウントします。
カウントが閾値以下ならば短点、閾値より大きければ長点とします。
短点の時間は 20WPM の場合、 1 WPM = 50 dots で 1分あたりは 20*50 = 1000 dotsなので
一短点は 1000/(1000/60) =  60ms となります。閾値は1:3のちょうど間の2短点としました。


短長点・文字・単語の切れ目

接点が断になっている時間も重要です。
接点が断になったあとすぐに接になった場合、それは符号の入力中なのでまだ文字は確定しません。
ある程度(無線局運用規則 第十二条では3短点)の時間が空いた場合は、文字が確定するので
符号のビット列を判定処理に送って、文字を決定&キーボード入力をします。
キーボードに文字を入力したあと、さらに断になっている時間が規定時間(7短点)空いた場合、
それは単語と単語の間なので、直前が訂正符号でなければ、スペースを1回だけ入力します。
実際使ってみると規定時間では間延びしている印象なので、プリプロセッサ命令で変えられるようにしてあります。


和文入力について

欧文入力中に DOホレ)で和文モード、SNラタ)で欧文モードに戻ります。
ラタは訂正符号にも使用しますが、マイコンは訂正符号か和文終了か区別がつかないので、
訂正(BackSpace入力)は HH を使用することにします。
和文モールス中に 括弧 で一時的に欧文モードになります。
K3NG Keyerではキーボードの刻印のキーコードを送信していましたが、
今回はPC側の入力モードがトグル動作かつ、どちらか不明で、カナ入力にすると数値の切り替えが面倒なので
普段使用している、ローマ字入力 で日本語文字の入力を行うことにしました。
和文モード使用時は IMEをONにしてローマ字入力にしていることが前提となります。
この方式の良いところは、アルファベット入力も入力モードを切り替えることなく Shift+ で可能なことです。
和文モードの場合は 小文字アルファベットで子音と母音を送信して ENTERで確定、
欧文モードの場合は 大文字アルファベットを入力して即 ENTER 確定です。
日本語106/109キーボードとして動作させる場合は、Keyboard.h の替わりに、Keyboard_jp.h を使用します。


スピードとトーン周波数の確認

スピードとトーン周波数は半固定抵抗で調整できるようにしました。
確認用のボタンを押している間は V の連続がブザーから鳴りますので、
聞きながら半固定抵抗を回して、お好みの速度・周波数に調整します。
調整範囲はスピードが 8〜60 WPM、 トーン周波数が 500〜1011Hzです。


オープンソースです

コードは github に GPLv3 で公開しています
バグ報告のIssueや、機能追加の Pull Request は歓迎しますのでお気軽にどうぞ。