第三級アマチュア無線技士試験のために、モールス信号を練習するiPhoneアプリ、Morse Maniaをダウンロードしました。これで送信練習をしているうちに、本格的な電鍵で練習してみたくなりました。そこで、縦振り電鍵やパドル電鍵をiPhoneに接続するアダプタを、Arduino互換ボードを使って自作しました。Arduino Leonardoで使われているATmega32U4を搭載したボードならば、USBキーボードとして機能するので、電鍵のスイッチをキーボード信号としてiPhoneアプリに伝えることができます。
第三級アマチュア無線技士試験
第三級アマチュア無線技士試験を受験しようと思い立ちました。アマチュア無線技士の一番下の級は電話のみの四級です。これに対して、電信も使える三級の試験には、モールス信号に関する問題が出題されます。モールス信号以外の問題は、三級と四級で、内容にほとんど違いはありません。モールス信号の問題も、アルファベットの符号を怪しいレベルで覚えていれば、解けるものばかりです。四級が扱える送信電力は10~20Wなのに対して、三級は50Wですし、最初から三級を目指すのも良いかと思います。ちなみに、受験勉強には、たくさんの方が推薦していたCQ出版社の「第3級ハム国試 要点マスター 2025」という本が良かったです。コンパクトでどこにでも持っていって勉強できました。毎年、最新の過去問に対応するようなので、年号が古いようでしたら最新版を探してください。
モールス符号練習アプリで受験勉強
過去問に関してはこの本で対応できるので、残りの課題はモールス符号を覚えることです。スマホで繰り返し練習できるアプリがきっとあるはずと思って、検索して、最初に出てきたのがMorse Maniaという名前のソフトでした。無料で使い始められるので、早速使ってみました。使用したアプリはiPhone版でしたが、Android版もあり、そちらが先に開発されたようです。
このアプリは、モールス符号を聞き取ったり、発信する練習ソフトです。聞き取り練習モードでは、以下のスクリーンショットのように、信号音を聞いて、ソフトキーボードから回答していきます。簡単な符号から、少しずつレベルが上がっていくので、1日くらい遊んでいれば、アルファベットの符号を楽しく覚えられます。
課金するとできること
このソフトの配布形式は「アプリ内課金」です。つまり、一部機能は無料で使えて、課金することで使える機能が増える方式です。課金額には、"Beginner's Bundle"と"Pro Bundle"があり、それぞれ800円と1,500円です(税込)。無課金でも、アルファベットすべての聞き取り練習が可能ですので、アマチュア無線試験勉強にはほぼ必要十分です。英字以外に出題される数字の練習には、課金が必要です。でも、数字の符号パターンは機械的ですぐに覚えられるので、無課金で問題ありません。
一方で、送信練習に関しては、無課金の場合は機能がかなり制限されていて、アルファベットの一部しか練習できません。
送信練習の画面は、上のようになってます。下部の丸い部分をタップすると、信号音が出ます。出題された文字に対して、モールス符号を正しく打てればクリアです。短点、長点、間隔を正しいタイミングで打つ必要があります。これが結構楽しかったので、もっと練習できるように、課金することにしました。課金額は少し悩みましたが、BeginnerにしてあとからProにする場合は割高になるかもしれないと思い、最初からProにしました。先に紹介した過去問解説書も同じくらいの価格ですし、これも同様に満足のいくアプリなので、1,500円の価値はあるかと考えました。
Pro Bundleにすることで、機能は充実しました。アルファベットすべての送信練習だけでなく、単語やコールサインの練習、聞き取りが苦手な符号を選択するカスタマイズ機能などが使えます。送信練習には、先の図のような縦振り電鍵(英語ではstraight key) のほかに、横振り電鍵 (paddle key) も使えます。単点と長点のエリアが表示されるので、それをタップすると信号音が流れます。
ちゃんとした電鍵で練習したい
Morse Maniaのアプリは良くできています。上の図の横振り電鍵モードでは、長短両方の領域を同時にタッチすると、長短が繰り返します。なので、パドル2個の電鍵でのスクイーズ操作が可能です。スクイーズ操作というのは、2個のパドルを親指と人差し指でつまむ操作です。長短信号が交互に現れる符号を優雅に鳴らせる、2パドル電鍵ならではのテクニックです。そうなると、実際の2パドル電鍵を使っての練習がしたくなりました。
そこで、ヤフーオークションでパドル電鍵を落札しました。電信なんて古い廃れた技術なので、不用品処分市な状態と考えていたのですが、趣味の世界では思いのほか盛り上がっているようです。オークションに、少しお値打ちな出品があると、入札が殺到して、そこそこの価格になっていました。
落札した商品は、すでに廃業してしまったカツミ電機という会社のKM-22です。パドルが2個ある横振り電鍵で、製品名はマニピュレーターです。カツミ電機は、長短の信号を電子的に作るエレクトリックキーという装置(商標 エレキー)で有名だった会社です。そのエレキーの操作部分ということで、マニピューレーターと呼んでいるのではないかと思います。後継機種にKM-23があるようですが、パドルの色が少し違う程度の違いのようです。到着した商品は、古い割に錆も汚れもほぼ無いとても良い状態でした。本体は、鉄製の鋳物で、重量が1,230gもあります。がっしり安定してます。以下では、この電鍵を使って、Morse Maniaを操作することを目指します。
電鍵をiPhoneに接続する
電鍵でiPhoneアプリを操作するためには、電鍵の機械的なスイッチ動作を、iPhoneに伝達しなければなりません。その方法を考えました。
タッチ画面に接続する
最初に考えた接続方法は、画面に表示されたタッチ領域から電鍵に配線して、電鍵操作で接地して、タッチ面から接地までの静電容量を変化させる方法です。人がタッチする代わりに、電鍵でタッチする方式です。画面から配線する方法がポイントになるかと思います。Amazonではスマホタッチ面に吸盤で貼り付ける電極が売られています。実際にこれを購入して電鍵へ配線したところ、なんとか動作することを確認できました。ただ不安定ですし、画面への電極取り付け・取り外しが面倒なので、この方式はお蔵入りとしました。
USB接続する
そんな時、ふとMorse Maniaの取説画面を見ていたら、キーボードからも操作可能とありました。パドル電鍵に設定した場合、キーボードの'a'で画面内の左パドルを、's'で右パドルを押せるようです。他にも'[',']','1','3','0','9','←','→',左右コントロールキーが使えます。縦振り電鍵に設定した場合は、これらに加えて、スペースキーまたはエンターキーで押せるようです。
実際に有線USBキーボードをiPhoneに接続してみたら、動作しました。iPhoneに有線USBキーボードを接続できること自体を知らなかったので、驚きでした。今のiPhoneならば、USB Type-Cのコネクタがついているので、ケーブル選択も楽です。ということで、電鍵のスイッチ押下を、USBキーボードのキーとしてiPhoneに伝える変換器を作れば良いようです。
また、パドル電鍵の2つのスイッチがそれぞれキーボードキーを送出する変換器を作れば、どちらかのスイッチ配線を省略することで、縦振り電鍵にも使えるはずです。ということで、縦振り電鍵にも使えるパドル電鍵用の変換器を作ることにしました。
USB HIDに対応するArduino
USB接続のキーボードやマウスなどは、USB Human Interface Device (HID) という標準プロトコルで情報伝達しています。USB HIDのデバイスは、ほとんどのOSで使用できて、iPhoneもその一つだったようです。多分Androidでも使えるはずです。
一部のArduinoは、USB HIDに対応しているので、スイッチやセンサなどの状態を、キーボードやマウスの信号としてコンピュータに伝達する工作を簡単に作ることができます。USB HIDに対応したArduinoは、Arduino Leonardoという機種です。これに搭載されているATmega32U4が、USB HIDの機能を持っています。Arduinoブランドの純正品Leonardoは高い(秋月電子で税込3,500円)ですが、互換性品が多数販売されています。中でもSparkFun社が作ったLeonardo互換機のPro Microは、Leonardoよりも小型なので使いやすいです。ただこれもSparkFunブランドのPro Microは高い(スイッチサイエンスで税込4,158円)です。なのでPro Microのさらに互換機を使って工作するのがおすすめです。
Pro Microの互換機をAmazonで探すと、2個で送料込み2,640円くらいのようです。翌日配送なので早いです。Aliexpressならさらにお安いです。例えば、こちらのPro Micro互換製品は、送料別830円です(以下の写真)。送料は300円ですが、1,500円以上買うと送料無料になります。なので1,660円で2個買えます。最安ですが、納期は最大1週間なので、1,000円高いけど翌日届くAmazonとのトレードオフになるかと思います。
AliExpressは、以前はAmazonと同じくなんでも送料無料という値付けが多かったですが、最近は送料別で、1,500円以上買うと送料無料になる方式が多いです。配送に携わる人たちをリスペクトしている気がするので、良い傾向だと思います。
ということで、このType-Cモデルを(送料無料になるし予備にもなるので)2個購入しました。販売ページにはmicro USBモデルもありますが、micro USBを今更選ぶ理由はないと思います。このページから購入したPro Micro互換機は、この後の記事でわかるように、全く問題なく動作しました。
電子工作してプログラム環境を整える
最初の電子工作はブレッドボードで簡単に済ませました。Pro Microの7番,8番入力ピンを電鍵の左右パドルの端子に、GNDを電鍵の共通端子に接続しました。回路図にするほどでも無いですが、以下のような構成になります。縦振り電鍵の場合は、7番または8番入力ピンのどちらか一つを使用します。
後述のように、プログラム書き込み時にリセットする必要があるので、リセットピンにジャンパー線を刺して、GNDにショートできるようしておきました。
Pro Microとパソコン (Mac mini) をUSB接続して、Arduino IDEでプログラムしました。Arduino IDEは、macOS Apple Sillicon用をダウンロードしました。
Arduino IDEでは、プログラム対象のボードを設定する必要があります。順当に考えると、SparkFun社が用意したPro Micro用ボードライブラリを入手して使うところですが、試したところUSB HID機能がうまく使えませんでした。手順が間違っていた可能性があります。でも、Arduino IDEに最初から入っているArduino Leonardoのボードライブラリで問題なくプログラムできたので、そちらを使うことにしました。
Arduino IDEで簡単なLチカプログラムを書いて、Pro Microに一回ダウンロードしたら、次回からシリアルポートが見えなくなって、プログラム書き込みできなくなりました。Pro MicroのUSBがUSB HIDモードに切り替わり、シリアル通信不可能になったようです。Pro Microをリセットすると、一時的にシリアルモードに戻せます。Pro MicroのRSTピンにジャンパ線を刺して、USBコネクタの金属部分に触れるとリセットされます。その後、8秒間、USB HIDモードが解除されて、シリアル接続可能になります。Arduino IDEが使用するシリアルポートも復活します。ということで、プログラムをダウンロードする際に、毎回リセットする必要があります。でも慣れれば大した手間ではありませんでした。
Arduino プログラム
Pro Microに書き込んだプログラムを説明します。このプログラムでは、メインループの中で以下の手順を繰り返し実施します。
- 入力ポートが前回変化した時刻から20ms以内なら何もせず終了(チャッタリング防止)
- チャッタリングの心配がないので入力ポートを読む
- その値に変化が無ければ何もせず終了
- 入力ポートが変化したので、入力ポートの値と、時刻を記録しておく
- 電鍵が押された変化ならば、対応キーボードキーがpressされた信号を送出する
- 電鍵が離された変化ならば、対応キーボードキーがreleaseされた信号を送出する
20ms何もしない項目は、電鍵のチャッタリングを避けるための処理です。簡単なプログラムを作り、KM-22を試したところ、5msくらいならチャッタリングは観測されませんでした。安全を見て、その4倍の20msにしました。delay()で単純に20ms待機しても良いのですが、他の処理(例えばもう片方のパドル読み込み)に影響する可能性があります。そこで、ms単位でのタイムスタンプを得るmillis()関数を使って、変化時刻を記録して、それからの経過時間が20ms以下の場合は、何もせずにすぐに終了することにしました。
パドル電鍵にはスイッチが2個搭載されていて、それぞれをPro Microの入力ピンに接続します。そこで、それぞれのパドルスイッチに対して、以下の情報を保持しておく必要があります。
- 接続したPro Microのポート番号
- 送出すべきキーボードキー
- 前回読み込んだポートの値(変化を調べるため)
- 前回変化があった時の時刻(チャッタリングを避けるため)
そしてこの情報に基づいて、それぞれのパドルスイッチに対して、前述の処理を行うことになります。なので、パドルスイッチをクラスとして定義するば、スッキリと実装できそうです。ということで、パドルスイッチのクラスを以下のように定義しました。縦振り電験でも使うので、名前はMorseSwitchにしました。
//class for a Morse key switch
class MorseSwitch {
static const int chatlength=20; //key-chattering duration in msec
private:
int pin; //connected Arduino I/O pin
char key; //assigned keyboard-key ('a', 's', space...)
int prevLevel=HIGH; //previous Arduino-pin level (HIGH or LOW)
unsigned long chatstart=0; //time when key-chattering may have started
public:
MorseSwitch(int arduino_pin, char keyboard_key);//内容は後述
void handle(); //内容は後述
};
4個のインスタンス変数は、前述した保持すべき情報です。コンストラクターMorseSwitch(int,char)では、接続ピン番号と、送出キーボードキーを指定して、インスタンスを作ります。唯一のインスタンスメソッドのhandle()が呼ばれると、前述した繰り返し処理の手順を1回だけ実施します。
実際に作成し、Pro Microに書き込んだプログラムを以下に示します。
//Morse key to USB keyboard converter for Morse Mania app.
//2 paddle key: pin7<-->left paddle, pin8<-->right GND<-->common
//straight key: pin7 or pin8<-->key, GND<-->common
#include "Keyboard.h"
//class for a Morse key switch
class MorseSwitch {
static const int chatlength=20; //key-chattering duration in msec
int pin; //connected Arduino I/O pin
char key; //assigned keyboard-key ('a', 's', space...)
int prevLevel=HIGH; //previous Arduino-pin level (HIGH or LOW)
unsigned long chatstart=0; //time when key-chattering may have started
public:
MorseSwitch(int arduino_pin, char keyboard_key) {
pin=arduino_pin;
key=keyboard_key;
pinMode(pin, INPUT_PULLUP); //pull-up mode
}
//read the Arduino pin and send a keyboard-key if pin changed
void handle() { //called from loop().
unsigned long timenow=millis(); //time now in ms
if((timenow - chatstart) < chatlength) return; //chattering, do nothing
int newLevel = digitalRead(pin); //now stable, read this pin
if(prevLevel==newLevel) return; //no change, do nothing
prevLevel=newLevel;//update this previous pin-level
chatstart=timenow;//update chattering-start-time
if(newLevel == LOW) { //switch is pressed
Keyboard.press(key);
}
else { //newLevel == HIGH, then switch is released
Keyboard.release(key);
}
}
};
MorseSwitch *leftPaddle, *rightPaddle;
void setup() {
Keyboard.begin();
leftPaddle = new MorseSwitch(7,'a');
rightPaddle = new MorseSwitch(8,'s');
}
void loop() {
leftPaddle->handle(); //read left and send USB key
rightPaddle->handle();//read right and send USB key
}
setup()では、左右それぞれのパドルに対応したインスタンスを作成します。コンストラクターの中でpinMode()を呼んで、電鍵に接続したピンをプルアップしてます。これでプルアップ抵抗が不要で、配線が簡素になります。loop()では、左右パドルスのインスタンスメソッドhandle()を実行しています。
前述のように、7番、8番のいずれかとGNDを縦振り電鍵に接続すれば、このプログラムでもMorse Maniaが動作します。パドル電鍵KM-22を接続したまま、Morse Maniaを縦振り電鍵に設定すると、KM-22が縦振り電鍵として動作することを確認しました。手作業だけで頑張る感じが心地良いので、そのうちに縦振り電鍵も探して入手したいと思います。
仕上げと動作確認
ブレッドボードで配線していた部分を、ハンダづけして、熱縮チューブで保護しました。
ちなみに、熱縮チューブに空いている小さな穴は、リセット用です。この場所に、RSTピンの穴があるので、ここにブレッドボード用ジャンパー線を差し込んで、USBコネクタの金属部分にショートすれば、リセットします。プログラム更新の際に使います。
これで完成です。iPhoneとUSB接続すれば、すぐに使えます。
Morse Maniaで使っている様子を動画にしました。
関連先行事例
スマホでモールス信号を練習するMorse Maniaというニッチなアプリに、重い電鍵を取り付けようなんて考える人はいないだろうから、世界初の試みかなと最初は思っていました。でも検索してみたところ、一年前に、今回と同様にPro Microを使って電鍵を接続していた方がいました。
世界は広いです。プログラムを見てみると、シンプルな内容なので、同じなのは当然かもしれないですが、私が作った内容とほぼ同じです。チャッタリングを除去するために、私と同じくmillis()を使ってました。複数のパドルを記述するために構造体を使っていて、そこはかっこいいと思ったので、クラスを使うバージョンを作る際の参考にさせていただきました。
まとめ
iPhoneに電鍵をUSB接続して、モールス練習アプリで使えるようにしました。USB接続のために、Arduino Leonardo互換のボードを使い、プログラムしました。重量感のある電鍵を使うことで、安定して練習できています。横振りや、スクイーズなどの動作は、iPhoneのタッチ画面では出来ないですが、この構成ではそれも練習できます。とても満足な仕上がりになりました。
今回はiPhoneで動作確認しましたが、Android版のMorse Maniaでも、このままのプログラムで、全く同様に動作すると思います。機会があれば確認したいです。
追記:この記事のつづきは以下です。このアダプタに縦振り電鍵を取り付けました。


