아두이노로 모스 부호 송신기 만들기 – 쉬운 DIY 가이드
부품 및 소모품
| 부품 | 수량 | 비고 |
| 아두이노 우노 | 1 | |
| SparkFun 푸시버튼 스위치 12mm | 2 | 2핀 푸시 버튼 사용 |
| LED (일반) | 1 | |
| 부저 | 1 | |
| 저항 330Ω | 4 | |
| 브레드보드 (일반) | 1 | |
| 점퍼 와이어 (일반) | 10 | 아두이노 보드에서 브레드보드로 연결용 |
앱 및 온라인 서비스
프로젝트 소개
아이디어 설명
우리는 자연스러운 센서(혀, 제스처 등)를 통해 서로 소통합니다. 흥미로운 부분은 비밀 정보를 누군가와 공유하고 싶을 때 시작됩니다. 어떻게 하면 제3자가 메시지를 보아도 열쇠를 찾기 전까지는 이해할 수 없게 할 수 있을까요?
이를 위해 모스 부호 통신을 사용했습니다. 다른 방식도 가능하지만 모스 부호를 선택했습니다.
모스 부호란?
모스 부호는 원래 문자를 점(.)과 대시(-)의 조합으로 표현하여 정보를 전달하는 통신 방식입니다. 예: A → .- , B → -...
모스 부호에 대한 더 많은 정보는 여기를 클릭하세요.
왜 모스 부호를 선택했나?
이유는 간단합니다. 최근에 요원이 버튼을 클릭하여 정보를 전달하고, 수신 측에서 이를 해독하는 영화를 보았습니다. 그래서 아두이노와 간단한 기본 부품으로 이것을 만들어보기로 했습니다.
이 프로젝트의 작동 원리
브레드보드에 회로를 만들고 스케치를 업로드하면 매우 간단합니다. 시리얼 모니터를 클릭하면 아래 이미지처럼 표시됩니다.
지시를 따라하면 바로 사용할 수 있습니다.
혼란스러운 점이 있다면 시연 영상을 시청하세요.
코드
모스 부호 소스 코드
이제 스케치를 업로드할 준비가 되었습니다.
아두이노 IDE를 열고 툴바 File → Open → MorseCode.ino를 클릭하고 업로드 버튼을 누르세요.
/* This Program is for demonstration of MORSE CODE Communication which was use to send information secretly using codes of combinations dots . and dashes - Thanks to open source community By Jalal Mansoori */
#define SIZE 26
const int ledPin = 8;
const int speakerPin = 12;
const int dotButton = 2;
const int dashButton = 7;
String morseCode = "";
String text = "";
int characterAscii = 0;
int startPos = 0, endPos = 0;
int startPos1 = 0, endPos1 = 0;
String characterCode = "";
int dashButtonState = 0;
int dotButtonState = 0;
// 영어 알파벳 A-Z 모스 부호 배열
String letters[SIZE] = {
// A to I
".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..",
// J to R
".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.",
// S to Z
"...", "-", "..-", "...-", ".--", "-..-", "-.--", "--.."
};
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(dotButton, INPUT);
pinMode(dashButton, INPUT);
Serial.begin(9600);
Serial.println("*************************************************************");
Serial.println(" Demonstration of Morse Code ");
Serial.println("************************************************************* ");
Serial.println("\nInstructions");
Serial.println("1. First Write Your Morse code");
Serial.println("2. When you are done Write 1 on above input box and Press Enter or click Send Button ");
Serial.println("3. For Space between letters write 2 and Press Enter ");
Serial.println("4. For Space between words write 3 and Press Enter ");
Serial.println("5. Thats all Translation of Morse Code will then be Shown ");
Serial.println("\n\nEnter Your Morse Code Here ");
}
void loop() {
while (Serial.available() > 0) {
int ascii = Serial.read();
switch (ascii) {
case 49: // 49는 '1'의 ASCII 값
Serial.print("\n");
morseCode.concat('#'); // 모스 부호 끝에 # 배치로 후처리 단순화
Serial.print("\nYour Morse code Translation : ");
endPos1 = morseCode.indexOf('#');
while (endPos1 < morseCode.length()) {
extractLetters(morseCode.substring(startPos1, endPos1));
startPos1 = endPos1 + 1;
if (startPos1 == morseCode.length()) {
break;
}
endPos1 = morseCode.indexOf('#', startPos1);
}
startPos1 = 0;
endPos1 = 0;
text = ""; // 새 번역을 위해 초기화
morseCode = "";
Serial.println("\n\nEnter Your Morse Code Here ");
break;
case 50: // 50은 '2'의 ASCII 값
morseCode.concat("@");
Serial.print("@");
delay(200);
break;
case 51: // 51은 '3'의 ASCII 값
morseCode.concat("#");
Serial.print("#");
delay(200);
break;
}
}
process();
}
void turnONLedSpeaker() {
// LED 켜기
digitalWrite(ledPin, HIGH);
tone(speakerPin, 4699, 300); // tone(핀, 주파수, 지속시간 ms)
}
void process() {
dotButtonState = digitalRead(dotButton);
dashButtonState = digitalRead(dashButton);
if (dashButtonState == HIGH) {
turnONLedSpeaker();
morseCode.concat("-");
Serial.print("-");
delay(200);
} else if (dotButtonState == HIGH) {
turnONLedSpeaker();
morseCode.concat(".");
Serial.print(".");
delay(200);
} else {
// LED 끄기
digitalWrite(ledPin, LOW);
}
}
char convertIntoText(String characterCode) {
characterAscii = 65; // 'A'
for (int index = 0; index < SIZE; index++) {
if (characterCode == letters[index]) {
return characterAscii;
}
characterAscii++;
}
return '?'; // 매칭되지 않는 경우
}
void extractLetters(String words) {
words.concat('@'); // 단어 끝에 @ 배치로 후처리 단순화
endPos = words.indexOf('@');
// 문자열에서 단일 문자 모스 부호 추출 루프
while (endPos < words.length()) {
characterCode = words.substring(startPos, endPos);
text.concat(convertIntoText(characterCode));
startPos = endPos + 1;
characterCode = "";
if (startPos == words.length()) {
break;
}
endPos = words.indexOf('@', startPos);
}
Serial.print(text);
Serial.print(" ");
startPos = 0;
endPos = 0;
text = "";
}
회로도
아두이노 디지털 핀에서 브레드보드로의 연결 지침:
- 핀 D2 → 푸시버튼1의 한 다리
- 핀 D7 → 푸시버튼2의 한 다리
- 핀 D8 → 저항을 통해 LED의 +극 다리
- 핀 D12 → 저항을 통해 부저의 +극 다리
나머지 연결은 회로도 그림을 참조하세요. 완료!