무선 방향 탐지용 자동 키어 – 정밀함, 편의성, 신뢰성
부품 및 소모품
| 부품 | 수량 | 비고 |
| Arduino UNO | 1 | |
| 커패시터 100 nF | 5 | |
| 릴레이 (범용) | 1 | |
| LED (범용) | 1 | |
| 커패시터 100 µF | 1 | |
| 점퍼 와이어 (범용) | 1 | |
| 외장 핸드셋/마이크 플러그 (아마추어 무전기용) | 1 | |
| 토글 스위치 | 1 | |
필요한 도구 및 장비
- 납땜 인두 (범용)
- 납 와이어, 무연
- 아마추어 무전기
프로젝트 개요
아마추어 무선 애호가들은 숨겨진 무선 송신기(일명 '여우')를 찾는 연습을 통해 무선 방향 탐지 기술을 연마합니다. 이 기술은 송신기가 있는 장비나 사람을 찾는 데 유용합니다.
이 프로젝트는 아두이노를 사용하여 무전기를 키업(송신 모드 진입)시키고, 모스 부호로 호출부호(아마추어 무선 운용자의 콜사인)를 송신한 뒤 긴 톤을 보내는 장치를 만듭니다. 송신 중인 무선 신호의 위치를 방향 탐지로 정확히 파악할 수 있습니다.
저는 2011년 ARRL 교사 연수에서 첫 '여우 사냥'을 경험하고 매력을 느꼈습니다(우리 팀이 엉뚱한 '여우'를 찾긴 했지만). 중학교 과학 수업 학생들에게 좋은 활동이 되겠다 싶었지만, 직접 만들려면 너무 복잡하거나 비용이 많이 들었습니다.
최근 저렴한 2미터 밴드 무전기와 프로그래머블 마이크로프로세서(아두이노)를 조합하면 매우 저렴하게 나만의 '여우'를 만들 수 있음을 깨달았습니다. 재미있는 여름 학습 프로젝트로도 제격입니다.
이 프로젝트에서는 저렴한 Baofeng UV-3R 무전기(더 이상 사용하지 않는 것)와 Arduino Uno를 사용했습니다. 다른 무전기와 다른 잭을 사용하더라도 잭과 마이크 테스트 과정이 비슷하며, 회로와 아두이노 스케치는 운용자의 콜사인만 변경하면 동일하게 적용할 수 있습니다.
참고: 회로도는 보기보다 단순합니다. 0.01µF 커패시터들은 송신 시 회로가 RFI(무선 주파수 간섭)를 받는 것을 방지하기 위해 추가되었습니다. 이 커패시터가 없으면 무전기가 회로 바로 근처에서 송신할 때 아두이노가 이상 동작(주로 재시작)합니다. 다른 커패시터는 아두이노의 구형파를 정현파에 가깝게 다듬어 음질을 개선합니다.
코드
여우 사냥 무전기 키어 (Arduino)
무전기를 키업하여 송신하고 모스 부호로 식별 신호를 보내는 아두이노 코드입니다.
/* By Nelson Farrier
무전기 키업 및 톤 송신
릴레이 온/오프로 Baofeng UV-3R 키업, 콜사인 송신 후 5초 톤 전송
*/
// 핀 12: 릴레이 연결
// 핀 13: 톤 회로 연결
// 참고: Mike Myers (https://mikemyers.me) @netnutmike
// Let's Make It Episode 6 참고
// 모스 부호 정의 (알파벳, 숫자)
char* letters[] = {
".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..",
".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.",
"...", "-", "..-", "...-", ".--", "-..-", "-.--", "--.."
};
char* numbers[] = {
"-----", ".----", "..---", "...--", "....-",
".....", "-....", "--...", "---..", "----."
};
int relay = 12;
int TonePin = 13;
int frequency = 1000; // 톤 주파수 (Hz)
int dotDelay = 70; // 모스 부호 '점' 길이 (ms)
int charDelay = 500; // 문자 간 간격 (파스워스 방식)
int wordDelay = 1100; // 단어 간 간격
int cycleDelay = 15000; // 사이클 대기 (최대값 16383 제한으로 2회 분할)
void setup() {
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
delay(2000); // 전원 투자 후 초기 대기
}
void loop() {
digitalWrite(relay, HIGH); // 릴레이 온 (키업)
delay(1000);
SendText("NF7Z FOX"); // 콜사인 + FOX 송신
delay(1000);
tone(TonePin, frequency); // 7초간 톤 송신
delay(7000);
noTone(TonePin);
delay(10000); // 톤 없이 10초 송신
digitalWrite(relay, LOW); // 릴레이 오프 (키다운)
delay(cycleDelay);
delay(cycleDelay);
}
// 모스 부호 시퀀스 전송 함수
void morseCodeSequence(char* sequence) {
int i = 0;
while (sequence[i] != NULL) {
dotOrDash(sequence[i]);
i++;
}
delay(charDelay); // 문자 간 간격
}
// 텍스트를 모스 부호로 변환 전송
void SendText(char* MorseCodeLetters) {
int i = 0;
char ch;
while (MorseCodeLetters[i] != NULL) {
ch = MorseCodeLetters[i];
if (ch >= 'a' && ch <= 'z') {
morseCodeSequence(letters[ch - 'a']);
} else if (ch >= 'A' && ch <= 'Z') {
morseCodeSequence(letters[ch - 'A']);
} else if (ch >= '0' && ch <= '9') {
morseCodeSequence(numbers[ch - '0']);
} else if (ch == ' ') {
delay(wordDelay); // 단어 간 간격
}
i++;
}
delay(charDelay);
}
// 점(.) 또는 대시(-) 전송
void dotOrDash(char dotOrDash) {
tone(TonePin, frequency);
if (dotOrDash == '.') {
delay(dotDelay);
} else { // 대시('-')로 간주
delay(dotDelay * 3);
}
noTone(TonePin);
delay(dotDelay); // 점/대시 간 간격
}
회로도
