二進数情報伝送の走りともいうべき、モールス符号の発信機を作ってみようと思います。
今回は、特に何も難しいことはありません。文字と符号の対応表を調べて、文字列から符号へ変換したら、アクティブブザーで音を鳴らすだけです。
モールス符号について検索する(別ウインドウが開きます)
ご存知の通り、モールス符号は、2つの符号、短点と長点の組み合わせで成り立っています。短点と長点、トンとツー、「・」と「−」など、表記は様々ですが、以下、短点/長点と呼びます。
モールス符号を音として発信する場合、その音の長さと、間隔には規定があります。
まず、基本的なところから決めておくと、スイッチなどを使って、人間が手動でモールス符号を発信する機能は、今回持ちません。……さすがに、モールス符号を手動でカッコ良く送信できる方は少ないでしょうし、そもそも、筆者が使えないので、機能の検証ができないからです。
今回は、シリアルモニタから文字列を打ち込むと、それをモールス符号に変換して送信する、と言う機能を提供します。送信するモールス符号のスピードを、基準となるTsdotの時間で指定することによって、制御することができるようにします。
以下、調べた範囲で、各文字と対応するモールス符号の対応表です。
| コード | 文字 | 符号 | 備考 |
| 送信要求 | −・− | (Kと同じ) | |
| 送信開始「BT」 | −・・・− | (=と同じ) | |
| 送信終了「AR」 | ・−・−・ | (+と同じ) | |
| 通信の終了「VA」 | ・・・−・− | ||
| 了解 | ・・・−・ | (*と同じ) | |
| 訂正「HH」 | ・・・・・・・・ | ||
| 09 | タブ | ※SP扱い | |
| 訂正・終了「ラタ」 | ・・・−・ | ※ | |
| 本文「ホレ」 | −・・−−− | ※ | |
| 待機要求「AS」 | ・−・・・ | (&と同じ) | |
| 20 | 空白" " | SP(単語の区切り) | |
| 21 | 感嘆符"!" | −・−・−− | |
| 22 | 二重引用符" | ・−・・−・ | |
| 23 | # | ||
| 24 | $ | ||
| 25 | % | ||
| 26 | & | ・−・・・ | |
| 27 | ' | ・−−−−・ | |
| 28 | 左括弧"(" | −・−−・ | |
| 29 | 右括弧")" | −・−−・− | |
| 2A | * | ・・・−・ | |
| 2B | + | ・−・−・ | |
| 2C | カンマ"," | −−・・−− | |
| 2D | ハイフン"-" | −・・・・− | |
| 2E | ピリオド"." | ・−・−・− | |
| 2F | 斜線"/" | −・・−・ | |
| 30 | 0 | −−−−− | |
| 31 | 1 | ・−−−− | |
| 32 | 2 | ・・−−− | |
| 33 | 3 | ・・・−− | |
| 34 | 4 | ・・・・− | |
| 35 | 5 | ・・・・・ | |
| 36 | 6 | −・・・・ | |
| 37 | 7 | −−・・・ | |
| 38 | 8 | −−−・・ | |
| 39 | 9 | −−−−・ | |
| 3A | : | −−−・・・ | |
| 3B | ; | ||
| 3C | < | ||
| 3D | = | −・・・− | |
| 3E | > | ||
| 3F | 疑問符"?" | ・・−−・・ | |
| 40 | アットマーク"@" | ・−−・−・ | |
| 41 | A | ・− | |
| 42 | B | −・・・ | |
| 43 | C | −・−・ | |
| 44 | D | −・・ | |
| 45 | E | ・ | |
| 46 | F | ・・−・ | |
| 47 | G | −−・ | |
| 48 | H | ・・・・ | |
| 49 | I | ・・ | |
| 4A | J | ・−−− | |
| 4B | K | −・− | |
| 4C | L | ・−・・ | |
| 4D | M | −− | |
| 4E | N | −・ | |
| 4F | O | −−− | |
| 50 | P | ・−−・ | |
| 51 | Q | −−・− | |
| 52 | R | ・−・ | |
| 53 | S | ・・・ | |
| 54 | T | − | |
| 55 | U | ・・− | |
| 56 | V | ・・・− | |
| 57 | W | ・−− | |
| 58 | X | −・・− | |
| 59 | Y | −・−− | |
| 5A | Z | −−・・ | |
| ここより、S-JISコード | |||
| コード | 文字 | 符号 | 備考 |
| A1 | 。段落"」" | ・−・−・・ | ※ |
| A2 | 「下向き括弧"(" | −・−−・− | ※ |
| A3 | 」上向き括弧")" | ・−・・−・ | ※ |
| A4 | 、区切点"、" | ・−・−・− | |
| A5 | ・ | ※SP扱い | |
| A6 | ヲ | ・−−− | |
| A7 | ァ | −−・−− | (アと同じ) |
| A8 | ィ | ・− | (イと同じ) |
| A9 | ゥ | ・・− | (ウと同じ) |
| AA | ェ | −・−−− | (エと同じ) |
| AB | ォ | ・−・・・ | (オと同じ) |
| AC | ャ | ・−− | (ヤと同じ) |
| AD | ュ | −・・−− | (ユと同じ) |
| AE | ョ | −− | (ヨと同じ) |
| AF | ッ | ・−−・ | (ツと同じ) |
| B0 | ー長音"ー" | ・−−・− | |
| B1 | ア | −−・−− | |
| B2 | イ | ・− | |
| B3 | ウ | ・・− | |
| B4 | エ | −・−−− | |
| B5 | オ | ・−・・・ | |
| B6 | カ | ・−・・ | |
| B7 | キ | −・−・・ | |
| B8 | ク | ・・・− | |
| B9 | ケ | −・−− | |
| BA | コ | −−−− | |
| BB | サ | −・−・− | |
| BC | シ | −−・−・ | |
| BD | ス | −−−・− | |
| BE | セ | ・−−−・ | |
| BF | ソ | −−−・ | |
| C0 | タ | −・ | |
| C1 | チ | ・・−・ | |
| C2 | ツ | ・−−・ | |
| C3 | テ | ・−・−− | |
| C4 | ト | ・・−・・ | |
| C5 | ナ | ・−・ | |
| C6 | ニ | −・−・ | |
| C7 | ヌ | ・・・・ | |
| C8 | ネ | −−・− | |
| C9 | ノ | ・・−− | |
| CA | ハ | −・・・ | |
| CB | ヒ | −−・・− | |
| CC | フ | −−・・ | |
| CD | ヘ | ・ | |
| CE | ホ | −・・ | |
| CF | マ | −・・− | |
| D0 | ミ | ・・−・− | |
| D1 | ム | − | |
| D2 | メ | −・・・− | |
| D3 | モ | −・・−・ | |
| D4 | ヤ | ・−− | |
| D5 | ユ | −・・−− | |
| D6 | ヨ | −− | |
| D7 | ラ | ・・・ | |
| D8 | リ | −−・ | |
| D9 | ル | −・−−・ | |
| DA | レ | −−− | |
| DB | ロ | ・−・− | |
| DC | ワ | −・− | |
| DD | ン | ・−・−・ | |
| DE | ゙濁点 | ・・ | |
| DF | ゚半濁点 | ・・−−・ | |
| ヰ | ・−・・− | 対応する文字なし | |
| ヱ | ・−−・・ | 対応する文字なし | |
冒頭にも書きましたけど、モールス符号って、二進数情報伝送の走りですよね。さらに進んでいることに、アルファベットの方は、単語の中での出現確率が高いアルファベットに短いコードが割り当てられているのだそう。これって、ハフマン符号化の考え方ですから、まさに、現代におけるデジタル伝送の礎と言って過言ではないでしょう。
ただ、残念ながら、日本語のモールス符号の方は、日本語での出現確率順にはなっていなくて、「ABCD……」の符号を、「イロハニホヘト」の順に、割り当てたものをベースとして、少しいじっただけみたいです。
シリアルモニタで受け付けるコマンドの仕様は以下の通りです。
Arduinoとアクティブブザーを以下の通り、接続してください。
| Arduino | 接続 | アクティブブザー |
| D11 | → | + |
| GND | ⇔ | −(表示なし) |
手元のアクティブブザーのサイズだと、「+」端子をUNOのD11端子ソケットに挿入すると、「−」端子位置がちょうどGNDのピンソケット位置に来るので、デュポンワイヤ無しでUNOに直挿しできます。

プログラムをリンクしておきます。
完成版プログラム:morse_code.ino
コンパイルしてArduinoへ書き込んだら、シリアルモニタを開いてください。と、言いたいところですが、今回は、S-JISコードの送受信に対応した通信ソフトウェア(Tera Termを推奨)を起動してください。Arduino IDEのシリアルモニタでは、文字コードがunicodeになってしまうので、半角カタカナの送信ができません。
Tera TermでArduinoと接続したら、「KanjiCodeメニュー ⇒ Recv/Send: Shift_JIS」を選択してください。
実験サンプル:【 】内はTera Termからの送信データ
【send,I MISS YOU.】 …… こんな電信をもらったら飛んで行きます。イヤ、相手によるな。
**(I) ( )
--(M)**(I)***(S)***(S) ( )
-*--(Y)---(O)**-(U)*-*-*-(.)
OK: sent I MISS YOU.
【sdot,75】 …… 送信速度が少しゆっくりになります。
OK: sdot=75[ms]
【send,ニイタカヤマノボレ】 …… 現在の日本では、これを伝送しても戦争は始まらないはず。
-*-*(ニ)*-(イ)-*(タ)*-**(カ)*--(ヤ)-**-(マ)**--(ノ)-**(ホ)**(゙)---(レ)
OK: sent ニイタカヤマノボレ
録音データを聞いてみる:
「I MISS YOU.」(Tsdot=50ms)
「ニイタカヤマノボレ」(Tsdot=75ms)
音を鳴らすと共に、変換したモールス符号をシリアルに出力するようになっています。
また、英数字と日本語カタカナのモールス符号は、一部重複しており、同時使用できません。そこで、本プログラム(morse_code.ino)のローカルルールとして、日本語のモールス符号は、日本語の制御コードとして規定されていた「本文(ホレ、[SI]に割り当て)」〜「訂正・終了(ラタ、[SO]に割り当て)」の間に挟むようにしました。……本来の電信ルールではないので、ご注意ください。
あと、対応しているのは、「半角」カタカナなので、全角カタカナを送らないようにしてください。
普通に生活していると、さすがにモールス符号なんて使いませんけど、Arduinoで目覚まし時計をDIYして、アラーム音をモールス符号「アサダ、オキロ」にしてみるとか、ちょっとした遊びには使えそうではないですか?


