개인 블로그에 작성한 글을 바탕으로 작성된 글이며, 내용이 길어서 일부 정리하여 올렸습니다. 원문은 하단 출처에서 확인 가능합니다.
어느날 새벽 모공에서 아래의 짤을 보았습니다.

아앗!
작고 아름다운 그것은 그렇게 제 마음에 들어왔습니다.
마침 잠도 오질 않았기에 모스 키보드를 만들기 위해 필요한 정보와 부품들을 탐색하게 되었습니다.
모스 부호의 기본
모스 코드는 크게 dot(또는 dit), dash(또는 dah)로 신호 접점을 누르는 시간에 따라 신호 구분을 하고
이 신호의 조합에 따라 정해진 글자(character)를 전달하도록 되어있습니다.
참고로 신호 길이의 비율은 dot이 1이라고 하면 dash는 3이고, 신호 간격 1, 글자(word) 간격은 3이라고 합니다.
만약 ㆍㅡ 와 같이 두 신호를 입력하게 되면 알파벳으로는 ‘A’자가 되며, 이러한 부호 조합은 아래의 표와 같습니다.1
| 한글 | 알파벳 | 모스부호 | 숫자,특수문자 | 모스부호 |
|---|---|---|---|---|
| ㄱ | L | ㆍㅡㆍㆍ | 1 | ㆍㅡㅡㅡㅡ |
| ㄴ | F | ㆍㆍㅡㆍ | 2 | ㆍㆍㅡㅡㅡ |
| ㄷ | B | ㅡㆍㆍㆍ | 3 | ㆍㆍㆍㅡㅡ |
| ㄹ | V | ㆍㆍㆍㅡ | 4 | ㆍㆍㆍㆍㅡ |
| ㅁ | M | ㅡㅡ | 5 | ㆍㆍㆍㆍㆍ |
| ㅂ | W | ㆍㅡㅡ | 6 | ㅡㆍㆍㆍㆍ |
| ㅅ | G | ㅡㅡㆍ | 7 | ㅡㅡㆍㆍㆍ |
| ㅇ | K | ㅡㆍㅡ | 8 | ㅡㅡㅡㆍㆍ |
| ㅈ | P | ㆍㅡㅡㆍ | 9 | ㅡㅡㅡㅡㆍ |
| ㅊ | C | ㅡㆍㅡㆍ | 0 | ㅡㅡㅡㅡㅡ |
| ㅋ | X | ㅡㆍㆍㅡ | . | ㆍㅡㆍㅡㆍㅡ |
| ㅌ | Z | ㅡㅡㆍㆍ | , | ㅡㅡㆍㆍㅡㅡ |
| ㅍ | O | ㅡㅡㅡ | ? | ㆍㆍㅡㅡㆍㆍ |
| ㅎ | J | ㆍㅡㅡㅡ | / | ㆍㅡㅡㆍㅡ |
| ㅏ | E | ㆍ | : | ㅡㅡㅡㆍㆍㆍ |
| ㅑ | I | ㆍㆍ | ; | ㅡㆍㅡㆍㅡㆍ |
| ㅓ | T | ㅡ | ' | ㆍㅡㅡㅡㅡㅡㆍ |
| ㅕ | S | ㆍㆍㆍ | " | ㆍㅡㆍㆍㅡㆍ |
| ㅗ | A | ㆍㅡ | ( | ㅡㆍㅡㅡㆍ |
| ㅛ | N | ㅡㆍ | ) | ㅡㆍㅡㅡㆍㅡ |
| ㅜ | H | ㆍㆍㆍㆍㆍ | - | ㅡㆍㆍㆍㅡ |
| ㅠ | R | ㆍㅡㆍ | $ | ㆍㆍㆍㅡㆍㆍㅡ |
| ㅡ | D | ㅡㆍㆍ | _ | ㆍㆍㅡㅡㆍㅡ |
| ㅣ | U | ㆍㆍㅡ | 정정부호 | |
| ㅔ | Y | ㅡㆍㅡㅡ | 한글 | ㆍㆍㆍㅡㆍ |
| ㅐ | Q | ㅡㅡㆍㅡ | 영문 | ㆍㆍㆍㆍㆍㆍㆍㆍ |
기존 제품 분석 및 설계
(1) 제품 분석
짧은 영상이라 분석이라고 할 것 까지는 없지만 영상을 보면 몇가지 특징을 확인 할 수 있었습니다.
- 모스 신호 입력을 위해서 단 하나의 키 입력만 사용
- 신호 입력 과정을 눈으로 확인하기 위해서 Dot과 Dash 정보도 전송(타이핑)
- 변환된 문자가 입력되기 전에는 입력된 Dot과 Dash는 지움
- 모스 코드로는 입력 불가한 코드 입력을 위해 별도의 커스텀 코드를 사용하는 것으로 추정
- 대문자 입력을 위해서 Shift가 눌린 것처럼 하기 위해서 커스텀 코드를 사용하는 것으로 추정
- H 입력 후에 소문자 e 입력 하기전에 신호 입력 과정이 ‘.‘이 ‘>'로 ‘-', ‘_‘로 변한 것을 볼때 유추
위에 나열된 특징을 요약하자면 모스코드 신호 입력 과정이 표시되며, 커스텀 코드를 사용하여 기존 모스코드에 없는 문자 입력이나 대/소문자 입력을 하는 것으로 보였습니다.
(2) 기능 설계
단순히 그대로 구현하는 것보다는 독자적인 기능이나 편의사항 등을 고려하여 몇가지 개선점과 추가 기능을 고려해보았습니다.
- 한글 입력을 고려
- 자/모 분리가 되는 현상을 회피하기 위해서 신호 입력과정 표시 유무 선택 가능
- 신호 입력 과정(dot, dash)을 디바이스 자체에서 LED 또는 LCD로 시각적 표시 고려
- 대소문자 입력은 Shift 키가 아닌 Caps Lock 키 입력을 통한 대소문자 변환 고려
- 신호 입력 과정이 점과 대시가 아닌 괄호와 언더바로 표시되는 현상을 개선
- 띄어쓰기나 들여쓰기 등 지원하지 않는 입력이 가능하도록 부가적인 커스텀 코드 적용
- 키 입력 시 부저(buzzer)를 이용하여 모스 신호 소리와 유사한 효과 선택 가능
- Dot, Dash 입력 타이밍을 사용자가 임의로 설정 또는 입력 타미잉을 보정 하는 기능 고려
모스 코드 신호를 분석해서 키보드 입력으로 전송하는 기본적인 기능 이외에 시각적, 편의적 기능을 추가적으로 고려하였습니다.
하드웨어(Hardware) 설계 및 작성
(1) MCU 선정
영상처럼 컴팩트한 느낌으로 만들려면 PCB를 설계부터 적정한 케이스를 찾거나 또는 만들어야겠지만 시간, 비용을 고려할 때 일회성 프로젝트데 많은 것을 투자할 수는 없어서 작업 용이성과 완성도를 적절히 조율할 수 있는 요구사항을 정리하였고 가장 부합하는 마이크로칩 사의 PIC32MX230F256B 28핀 디바이스로 결정하였습니다.
(2) 기타 하드웨어
프로세서 외의 부품 중에서는 키보드 부품이 중요했는데 요즘은 기계식 키보드 축을 따로 팔고 있으므로 게이트론 저소음 갈축이 8개 세트로 판매가 되고 있길래 해당 축을 선택하였고, 그 외 회로 구성을 위한 기판, 스위치, RLC, LED 와 같은 부품을 선정하여 리스트 업 했습니다.
(3) 회로 구성 및 작성
회로도는 현재 Autodesk에 인수된 Eagle CAD를 사용하였습니다. 인수되어 구독형 제품으로 제공되고 있는데 무료버젼도 제공하고 있고, 해당 버젼만으로도 충분하기 때문에 수월하게 회로도 작성이 가능했습니다.

펌웨어(Firmware) 설계 및 작성
(1) 개발환경
Microchip사는 MPLAB X라는 NetBeans IDE 기반 개발환경을 제공합니다. 32bit 프로세서가 출시된 이후부터는 이전에 Pheriperal, 통신 프로토콜(USB, Ethernet) 또는 특정 애플리케이션(LCD, Codec 등) 개별 전용 라이브러리로만 제공하던 것 대신 Harmony라는 이름으로 통합 소프트웨어 스택과 GUI 유틸리티를 제공합니다.
그럼 디테일한 설명은 생략하고 디버깅을 위한 UART와 USB 스택, 기타 필요한 것들을 배치하여 베이스 코드가 생성되도록 합니다.
(2) 모스 부호 인식
모스 부호는 짧은 신호와 긴 신호 두가지로 구분이 됩니다. 스위치를 누르는 시간을 측정하면 되므로 인풋캡쳐(Input Capture) 장치(peripheral)를 사용하여 신호 변화에 따른 시간 길이를 측정하거나 포트 인터럽트(Port Interrupt)와 타이머(Timer)를 사용해서 시간을 측정하는 방법이 있습니다.
여기서는 후자의 방법을 사용하였고 간단하게 1ms로 타이머 인터럽트 시 시간 카운트를 하도록하고 포트 신호가 변경 될 때 카운터를 리셋하거나 카운트를 세서 시간을 측정하는 단순한 방식을 사용했습니다.
이렇게 측정된 시간에 따라서 dot, dash를 구분하고 신호를 누적하여 임시 저장합니다. 대략 이 시간은 dot은 150 ms, dash는 dot의 3배수를 두고 약간의 tolerance 시간을 두고 기준 시간 입력을 초과하였는지 여부로 간단하게 dot과 dash를 구분하게 하였습니다.
그리고 일정 시간이상 입력이 없거나(timeout)가 지정한 시간에 미치지 못하게 되면 입력이 완료된 것으로 간주하고 누적된 신호를 문자로 변환하는 과정으로 넘어가게 됩니다.
(3) 모스 부호 변환
모스 신호는 두가지 상태만 존재하며, 모스 코드 테이블을 보면 신호의 길이는 최대 8을 넘지 않는 것을 확인 할 수 있습니다.
이러한 특징으로 신호는 두가지 밖에 없으므로 이진수(binary)로 표현 할 수 있고(dot: 0, dash: 1),
길이는 최대 8을 넘지 않으니 char 타입(1바이트)이면 입력된 신호를 임시로 저장하고 변환하는데 충분할 것으로 예상 할 수 있습니다.
그래서 신호를 이진화하여 좌측으로 쉬프트 하면서 채워 나가면 입력된 신호를 1바이트 값에 저장할 수 있습니다.
다만 이경우 ㆍ 이나 ㆍㆍ 처럼 char 기준 모두 0으로 동일한 값이 되는 문제가 있습니다.
하지만 신호 길이가 다르므로 신호를 누적하여 저장함과 동시에 입력된 신호 길이를 재서 변환 시 참고를 하면 각자 다른 부호로 인식할 수 있습니다.
그리고 모스 부호 테이블에 있는 코드 값을 미리 변환하여 테이블로 만들어 두고 입력이 완료되면 테이블을 참조하여 모스 신호가 문자로 변환될 수 있도록 합니다.
아래의 순서대로 신호 입력을 키보드 입력 값으로 변환하는 절차를 거치도록 했습니다.
1. 키 입력 및 2진화
2. 바이트 변환 및 길이 저장
3. ASCII 코드 변환
4. HID 키보드 값 변환
(4) 기타 기능
짤 영상처럼 키입력을 이진화 하는 과정을 타이핑으로 보여주기 위해서 스위치를 누를 때마다 dot과 dash가 입력되도록 하였고, 디바이스에도 두가지 색 표시가 가능한 LED를 달아서 dot이 입력되면 빨간색, dash가 입력되면 green 표시가 되도록 했습니다.
그리고 키가 눌릴때마다 부저에서 신호 소리가 나올 수 있도록 하였습니다.
그리고 위의 각각 기능은 모두 DIP 스위치로 켜고 끌 수 있도록 합니다.
마지막으로 모스부호 특성상 입력할 수 없는 키 입력을 위해서 커스텀 코드를 만들어 적용했습니다. 아래 신호를 넣어서 띄어쓰기나 CapsLock 이나 Enter 입력이 가능하도록 하였습니다.
| Key | Custom Code |
|---|---|
| Space | ㅡㅡㅡㆍ |
| CapsLock | ㆍㆍㅡㅡ |
| Right Alt(for EN/KR switching) | ㆍㅡㆍㆍㆍ |
| Enter(Return) | ㅡㅡㅡㅡ |
(5) 미완 기능
dot, dash 인식을 위한 시간 값을 사용자 임의로 지정하기 위해서 각각 신호의 길이를 5개씩 측정해서 평균값을 사용하는 기능을 기획했으나 일단 초기 릴리즈에서 제외하였습니다.
테스트 및 제작
실제 회로를 제작하기에 앞서 기능 테스트를 위해서 오래전에 구입하고 방치해두었던 디바이스를 브레드보드에 장착시켜서 펌웨어 테스트만 진행하였습니다.

펌웨어가 제대로 동작하는지 확인 했으면 부품을 준비해서 땜질을 시작합니다.

완성 및 마무리
![]() |
![]() |
![]() |
모스부호에 익숙치 않아서 천천히 눌러서 영상을 2배 빠르게 돌렸습니다.

완성된 디바이스 회로도와 펌웨어는 Github에 공개 되어있습니다.
https://github.com/micro-artwork/simple_morse_keyboard
다음 목표는 단계를 높여서 미디어 조절 (윈도우 볼륨, 미디어 조절) 기기를 직접 만들어 보는 것이 목표입니다.
관심있으신 분들이 많으시면 작업이 완료 될 때 공유드리겠습니다.



역으로 번역도요 ㅋㅋㅋ
그럼 전쟁나도 키보드 두드리면 ㅋ
다 같은 마음이군요 ㅋㅋㅋㅋ
말씀 감사합니다 👍@억군님
이걸 하고 있거든요.
군 시절 지식으로 자작 부호 만들고, 전문 내용 부호화 해서 코드 쳐서 날리는데 걸리는 시간 제는 취미가 있는 놈이라서요. ㅋㅋㅋㅋ
그넘아가 이야기 해줬습니다.
그때 사용한 코드랑 수식의 숫자를 그대로 쓰면 큰일나니까 기억에 있는 숫자열은 배재하고 의도적으로 숫자 크기를 그때그때 늘리던가, 줄이던가 해서 논다 이야기를 했네요.
왜 그걸 함? 하고 물어보면 재밌다 해요. ㅋㅋㅋ
영어를 못하는 놈인데, 전문 날릴때는 알파벳도 쓴다 하던……. ㅋㅋㅋㅋㅋㅋㅋ
전문 내용을 분해하고 부호화해서 그걸 쳐 내고, 다시 듣고 복호화해서 전문내용 복원하는거 까지가 한 사이클이라 하더라구요.
그 부분 하나하나가 종목이 되어서 대회가 열리는거네요. 오………..
군사영역은 접어두고, 근현대 시절 전신의 흔적이 스포츠로 남은거네요.
볼륨조절기, 저도 하고 싶습니다.
/Vollago
대단하십니다 ㅎ
납땜만 하거나 펌웨어까지 개발하겠다면 비전공자도 가능할수도 있는데 그 외에 회로 그리고 하는 건 (심지어 빵판) 이미 전공의 영역이지요. ㅎ