'어떻게 하면 소식을 빠르게, 멀리까지 전달할 수 있을까'라는 생각에 탄생한 모스 전신기를 통해 모스 부호를 전송했습니다. 버저를 활용해 모스부호를 만들어 봅시다.
모스부호는 점과 선 두 개로만 이뤄진 부호입니다. 사용되는 빈도가 높은 알파벳일수록 부호 길이가 짧습니다. 가령 E는 점 하나로 이뤄져 있습니다. 영화나 드라마에서 도움을 요청하기 위해 보내는 신호 'SOS'를 모스 부호로 변환하면 어떤 모습일까요? 점을 '*', 선을 '-'라고 하면 S는 '***', O는 '---'로 SOS는 '*** --- ***'가 됩니다.
버저로 모스부호를 만들기 위해 아두이노(UNO)와 USB 케이블 각 1개씩, 저항 330옴 1개, 버저를 준비합니다. 영문을 입력하면 모스 부호로 출력할 수 있도록 만드는 게 목표입니다.
모스 부호 표를 참고해 알파벳 순서대로 리스트에 추가합니다. 알파벳은 모두 26개이고 공백과 쉼표, 마침표를 추가해 [그림 1]과 같이 29개 항목을 만들었습니다. 꼭 순서대로 만들어야 합니다.
프로젝트 순서는 문자열 입력, 문자 해당 리스트 항목 찾기(변환), 출력(읽기) 순입니다. 먼저 사용자에게 영문자를 입력받고, 입력받은 문자열의 글자 수만큼 '변환' 변수를 이용해 해당하는 리스트 항목을 찾아내려고 합니다.
코드가 매우 깁니다. 순서대로 해석해봅시다. [그림 2]의 'aAbBcC…'처럼 예시로 알파벳 소문자와 대문자를 순서대로 끝까지 입력해줍니다. 모스 부호에서는 소문자와 대문자가 같기 때문에 나란히 써주는 것입니다. 공백, 쉼표, 마침표도 규칙적으로 두 개씩 입력합니다.
다음으로 사용자가 입력한 문자열의 '변환' 번째 글자를 앞서 나열한 예시에서 찾습니다. 그 글자의 시작 위치(~번째)에서 1을 더해줍니다. 예시에서 문자를 두 번씩 입력했으므로 2를 나눈 몫을 계산합니다.
앞서 1을 더한 이유는 a와 A가 한 쌍이 돼야 하는데 a의 시작 위치는 1번, A는 2번이라서 A의 몫은 1이지만 a의 몫이 0이 되기 때문입니다. 인위적으로 1씩 더해주면 a는 2, A는 3이 되며 두 숫자의 몫은 똑같이 1이 되어 한 쌍이 됩니다. 리스트에서 방금 계산한 순서에 있는 항목을 함수로 보내면 준비는 끝납니다.
참, 함수를 먼저 정의했어야 했네요. 함수는 문자·숫자값 매개변수 하나를 추가해 [그림 3]과 같이 생성합니다. 문자에 대응하는 리스트 항목을 잘 찾았는지 말하기 블록을 통해 확인합니다. 이제 '읽기' 변수를 이용해 항목의 모스 부호 요소를 하나하나 읽을 것입니다. 각 문자의 모스 부호 길이만큼 '읽기' 변수에 1씩 더하며 반복합니다.
[그림 4]와 같이 길이가 길면 길게, 짧으면 짧게 생성하면 됩니다. 이제 부저를 작동시키는 블록이 등장했습니다. 여기서 '-'의 지속시간은 '*'의 3배라는 모스부호 규칙 하나를 알아야 합니다. *의 길이를 0.05로 잡았을 때 -의 길이는 0.15가 돼야 합니다. 모스부호 항목 요소를 순서대로 읽으면서 만일 *라면 0.05초 재생하고 0.15초 쉽니다. 아니면 -일 것이므로 0.15초 재생하고 0.05초 쉽니다.
마지막으로 모스부호 규칙 하나를 알려드립니다. 문자와 기호 사이엔 3단점(* 3개) 길이 간격을 두고 단어 사이엔 7단점 길이 간격(영어기준)을 둡니다. 공백은 아무 것도 없어 글자 수가 0입니다. 모든 기호의 모스부호 길이는 6입니다. * 하나 길이를 0.05초로 정했으니 기호는 0.15초, 공백은 0.35초 간격을 주도록 합니다.