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