用于无线电狐狸狩猎的自动键控
组件和用品
| | × | 1 | |
| | × | 5 | |
| | × | 1 | |
| | × | 1 | |
| | × | 1 | |
| | × | 1 | |
| | × | 1 | |
| | × | 1 | |
关于这个项目
业余无线电爱好者经常通过练习寻找隐藏在远处的无线电(称为“狐狸”)来保持他们的无线电测向技能敏锐。这些技能对于寻找设备和带有无线电发射器的人员很有用,需要找到。
该项目采用 Arduino 并使用它来启动无线电进行传输,然后使用摩尔斯电码发送电台 ID(业余无线电操作员的呼号)。然后发出长音。发射时,可精确定位无线电信号的位置。
我在 2011 年 ARRL 教师学院使用无线电测向进行了第一次“猎狐”,并且很喜欢它(尽管我们的团队不小心发现了错误的“狐狸”)。对于我在科学课上教的中学生来说,这似乎是一项很棒的活动。不幸的是,建造一个似乎太复杂或花费超过我愿意花的钱。
然而,最近,我意识到使用便宜的 2 米收音机和可编程微处理器(如 Arduino),我可以以很少的成本制作自己的“狐狸”,并有一个有趣的暑期学习项目。
对于这个项目,我使用了宝丰 UV-3R 无线电,因为它很便宜(我不再使用它了)和一个 Arduino Uno。我假设使用具有不同插孔的不同无线电需要类似的步骤来测试插孔和麦克风,但电路和 Arduino 草图将相同,除了操作员的无线电呼号。
注意: 原理图没有看起来那么复杂。添加了 01 微法拉电容器以防止电路在传输时拾取 RFI(射频干扰)。没有它们,当无线电传输距离电路如此近时,Arduino 会做出不寻常且不一致的事情(通常会重新启动)。另一个电容是为了平滑Arduino的方波,使其成为正弦波,这样听起来更好听。
代码
Fox Hunting Radio KeyerArduino
Arduino 启动无线电发射并发送莫尔斯电码来识别自己。并发送 5 秒的提示音。 */ // 引脚 12 连接到继电器。// 引脚 13 连接到音频电路。// 修改自:Mike Myers (http://mikemyers.me) @netnutmike // Let's Make It Episode 6 (http ://tech-zen.tv/index.php/shows/let-s-make-it/episodes/59-sensor-fun-with-arduino-1-massive-failure-but-4-successes-let-s -make-it-episode-6)// 定义字母和数字的摩尔斯电码char* letters[] ={ ".-", // A "-...", // B "-.-." , // C "-..", // D ".", // E "..-.", // F "--.", // G "..", // H " ..", // I ".---", // J "-.-", // K ".-..", // L "--", // M "-.", / / N "---", // O ".--.", // P "--.-", // Q ".-.", // R "...", // S " -", // T "..-", // U "...-", // V ".--", // W "-..-", // X "-.--" , // Y "--.." // Z};char* numbers[] ={ "-----", // 0 ".----", // 1 "..--- ", // 2 "...--", // 3 "....-", // 4 ".....", // 5 "-....", // 6 " --...", // 7 "---..", // 8 "----." // 9 --- 从 Mike Myers 借来的代码的第一段结束};int relay =12;int TonePin =13;整数频率 =1000; //toneint dotDelay =70 的频率; //莫尔斯电码中点的持续时间,这也是点和dashesint之间的时间charDelay =500; // Farsnworth 方法的字母之间的等待时间int wordDelay =1100; // Farsnworth 方法的单词之间的等待持续时间int cycleDelay =15000; // 将持续时间减半,因为最大值是 16383 // 当您按下 reset:void setup() { // 将数字引脚初始化为输出时,设置例程运行一次。 pinMode(12,输出); pinMode(13,输出);延迟(2000); // 上电后的初始延迟}// 循环例程永远反复运行:void loop() { digitalWrite(relay, HIGH); // 打开继电器(HIGH 是电压电平) delay(1000); // 等待第二个 SendText("NF7Z FOX");延迟(1000); // 等待第二个音调(TonePin,频率); // 发送 7 秒音调延迟 (7000); noTone(TonePin);延迟(10000); // 10 秒传输无音调 digitalWrite(relay, LOW); //通过使电压低延迟(cycleDelay)来关闭继电器; // 等待循环时间(因为最大值是 16383) delay(cycleDelay); // 等待循环时间}//==============================================================//// 修改自:Mike Myers (http://mikemyers.me) @netnutmike// 功能:morseCodeSequence/ /// 输入:要发送的点和破折号字符数组//// 说明:// 此函数将数组或“.”作为输入。和“-”和//为数组中的每个项目调用dotOrDash。////在序列的末尾,有3倍//点持续时间的延迟。//=================================================================void morseCodeSequence(char* sequence){ int i =0; // 循环数组中的每个元素 while (sequence[i] !=NULL) { dotOrDash(sequence[i]); // 发送点或破折号 i++; // 递增到数组中的下一个元素 } delay(charDelay); // 字母间距}//================================================================//// 功能:SendText//// 输入:英文文本字符数组//// 说明://此函数将文本作为输入并为每个字母发送莫尔斯电码。// 然后在每个字母后停顿。////================================================================void SendText(char* MorseCodeLetters ){ int i =0;字符 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') // Number { morseCodeSequence(numbers[ch - '0']); } else if (ch ==' ') // 空格(等待 4 次 dotDelay { delay(wordDelay); // 单词之间的间隔 } else { } i++; // 递增到数组中的下一个元素 } delay(charDelay) ); // 字母间距}//==============================================================//// 函数:dorOrDash//// 修改自:Mike Myers (http://mikemyers.me) @netnutmike// 输入:应该是点或破折号的字符//// 说明:// 此函数首先打开输出,然后查看// 字符是否为“.”,如果是,则延迟dotDelay.// // 如果字符不是“.”,则例程假定它// 是“-”并保持输出高电平 // dotDelay 的长度的 3 倍。这可以通过确保// 字符是“-”,但在大多数情况下这无关紧要。//// 在延迟时间后,引脚变为低电平,关闭 // 音调。//// 然后它延迟一个 dotDelay 时间,因此点和破折号// 不能一起运行。//==================================================================void dotOrDash(char dotOrDash){tone(TonePin, frequency);如果(dotOrDash =='.'){ 延迟(dotDelay); } else // 必须是 - { delay(dotDelay * 3); } noTone(TonePin);延迟(点延迟); // 闪光间隔} 示意图