[아두이노야 놀자]<14>버저로 모스부호 만들기

모스부호.
<모스부호.>

'어떻게 하면 소식을 빠르게, 멀리까지 전달할 수 있을까'라는 생각에 탄생한 모스 전신기를 통해 모스 부호를 전송했습니다. 버저를 활용해 모스부호를 만들어 봅시다.

모스부호는 점과 선 두 개로만 이뤄진 부호입니다. 사용되는 빈도가 높은 알파벳일수록 부호 길이가 짧습니다. 가령 E는 점 하나로 이뤄져 있습니다. 영화나 드라마에서 도움을 요청하기 위해 보내는 신호 'SOS'를 모스 부호로 변환하면 어떤 모습일까요? 점을 '*', 선을 '-'라고 하면 S는 '***', O는 '---'로 SOS는 '*** --- ***'가 됩니다.

버저로 모스부호를 만들기 위해 아두이노(UNO)와 USB 케이블 각 1개씩, 저항 330옴 1개, 버저를 준비합니다. 영문을 입력하면 모스 부호로 출력할 수 있도록 만드는 게 목표입니다.

[그림 1] 모스 부호 리스트 만들기.
<[그림 1] 모스 부호 리스트 만들기.>

모스 부호 표를 참고해 알파벳 순서대로 리스트에 추가합니다. 알파벳은 모두 26개이고 공백과 쉼표, 마침표를 추가해 [그림 1]과 같이 29개 항목을 만들었습니다. 꼭 순서대로 만들어야 합니다.

프로젝트 순서는 문자열 입력, 문자 해당 리스트 항목 찾기(변환), 출력(읽기) 순입니다. 먼저 사용자에게 영문자를 입력받고, 입력받은 문자열의 글자 수만큼 '변환' 변수를 이용해 해당하는 리스트 항목을 찾아내려고 합니다.

[그림 2] 리스트 항목 찾기.
<[그림 2] 리스트 항목 찾기.>

코드가 매우 깁니다. 순서대로 해석해봅시다. [그림 2]의 'aAbBcC…'처럼 예시로 알파벳 소문자와 대문자를 순서대로 끝까지 입력해줍니다. 모스 부호에서는 소문자와 대문자가 같기 때문에 나란히 써주는 것입니다. 공백, 쉼표, 마침표도 규칙적으로 두 개씩 입력합니다.

다음으로 사용자가 입력한 문자열의 '변환' 번째 글자를 앞서 나열한 예시에서 찾습니다. 그 글자의 시작 위치(~번째)에서 1을 더해줍니다. 예시에서 문자를 두 번씩 입력했으므로 2를 나눈 몫을 계산합니다.

앞서 1을 더한 이유는 a와 A가 한 쌍이 돼야 하는데 a의 시작 위치는 1번, A는 2번이라서 A의 몫은 1이지만 a의 몫이 0이 되기 때문입니다. 인위적으로 1씩 더해주면 a는 2, A는 3이 되며 두 숫자의 몫은 똑같이 1이 되어 한 쌍이 됩니다. 리스트에서 방금 계산한 순서에 있는 항목을 함수로 보내면 준비는 끝납니다.

[그림 3] 모스 출력 함수 생성.
<[그림 3] 모스 출력 함수 생성.>

참, 함수를 먼저 정의했어야 했네요. 함수는 문자·숫자값 매개변수 하나를 추가해 [그림 3]과 같이 생성합니다. 문자에 대응하는 리스트 항목을 잘 찾았는지 말하기 블록을 통해 확인합니다. 이제 '읽기' 변수를 이용해 항목의 모스 부호 요소를 하나하나 읽을 것입니다. 각 문자의 모스 부호 길이만큼 '읽기' 변수에 1씩 더하며 반복합니다.

[그림 4] 짧으면 짧게 길면 길게 생성하기.
<[그림 4] 짧으면 짧게 길면 길게 생성하기.>

[그림 4]와 같이 길이가 길면 길게, 짧으면 짧게 생성하면 됩니다. 이제 부저를 작동시키는 블록이 등장했습니다. 여기서 '-'의 지속시간은 '*'의 3배라는 모스부호 규칙 하나를 알아야 합니다. *의 길이를 0.05로 잡았을 때 -의 길이는 0.15가 돼야 합니다. 모스부호 항목 요소를 순서대로 읽으면서 만일 *라면 0.05초 재생하고 0.15초 쉽니다. 아니면 -일 것이므로 0.15초 재생하고 0.05초 쉽니다.

[그림 5] 공백과 기호 규칙.
<[그림 5] 공백과 기호 규칙.>

마지막으로 모스부호 규칙 하나를 알려드립니다. 문자와 기호 사이엔 3단점(* 3개) 길이 간격을 두고 단어 사이엔 7단점 길이 간격(영어기준)을 둡니다. 공백은 아무 것도 없어 글자 수가 0입니다. 모든 기호의 모스부호 길이는 6입니다. * 하나 길이를 0.05초로 정했으니 기호는 0.15초, 공백은 0.35초 간격을 주도록 합니다.

김지원 커넥트재단 연구원

위방향 화살표