二進数情報伝送の走りともいうべき、モールス符号の発信機を作ってみようと思います。
今回は、特に何も難しいことはありません。文字と符号の対応表を調べて、文字列から符号へ変換したら、アクティブブザーで音を鳴らすだけです。
モールス符号について検索する(別ウインドウが開きます)
ご存知の通り、モールス符号は、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して、アラーム音をモールス符号「アサダ、オキロ」にしてみるとか、ちょっとした遊びには使えそうではないですか?