EDIT12/7/13: I have changed the code quite a bit. The new code includes a lookup table of morse code so that you can insert the text straight into the program and have it converted to morse for you. My motivation for this was the Hackaday Fubarino contest at http://hackaday.com/2013/12/03/new-contest-win-one-of-20-microchip-fubarino-boards/. This easter egg should not be transmitted over ham radio due to it sounding like an advertisement.

A hidden transmitter, or fox as it is sometimes called, is used by amateur radio operators for sport. Somebody hides a fox, and participants use different methods to find it. This is for practice for when there is an illegal transmitter nearby. Then the "hams" know what they are doing when tracking it down.

The transmitter usually transmits a long tone followed by a fcc granted call sign in morse code. The club I am a member of needed one of these, so I sat down and started designing it. I based it around an arduino, though this could be ported to many different microcontrollers.

Step 1: How the Code Works

Writing this code was the first time I used custom functions, as well as an array. First I define values at the top for easy customization. Then i set up the morse code array. After declaring a few more things, I go on to the loop. First it calls my first fuction called playtone(). In the parenthathese you input how long you want it to transmit in milliseconds (1 second == 1000 milliseconds; this adds precision). This is for the hams to track the signal. After this it waits 1 second then calls my second function. called playcode(), which plays a call sign in morse code. This function uses a for loop to read through the array one character at a time. It uses a series of if statements to set the duration. After that playtone(Duration) is called. This plays the sound at the length of the character then the for loop reads the next character of the array. After it has gone through all characters the program delays for a set time, determined by preference. I have it set for 1 minute. Read the comments in the code for more detailed information.

EDIT 12/7/13: In the original code, you must insert the morse for the call sign to be transmitted manually. In the updated (albeit messy, apologies) code, you just need to input the call and any other text in the string Text. For the program to transmit the easterEgg string instead, you must hold pin 10 high at reset. This is what qualifies the project for Hackaday's contest.
<p>This is the line that it will not accept</p><p>if (i=0;if (morsetab[i].c == c) { </p><p>unsigned char p = morsetab[i].pat ; </p><p>Serial.print(morsetab[i].c) ; </p>
<p>Hi</p><p>seems a desirable program</p><p>However when I try to load from sketch errors are shown and it will not load??</p>
<p>I would like to build one of these for a local Fox Hunt. Are there detailed plans or a schematic I can use somewhere? I only need a simple code generator and a PTT signal. Thanks!</p>
Also not a good idea to put SOS out as a message and the long tone is a definate no no . So any newbies that take this up please don't foul up the airways. Governments love an excuse to take these things away and then charge a lot more to get them back.
Just looking to see what hoops I have to jump through here . Thankfully you can post without the crap. <br>I wonder if you would benefit from adoption of the array method used earlier and placed on hackaday a few weeks back. he had a unique way of using a bit array to return the morse . You simply altered the message needed by putting in the text , which I suppose would not be hard here either . <br>Thanks for the post
// <br>// Simple Arduino Morse Beacon <br>// Written by Mark VandeWettering K6HX <br>// Email: k6hx@arrl.net <br>struct t_mtab { char c, pat; } ; <br> <br>struct t_mtab morsetab[] = { <br> {'.', 106}, <br> {',', 115}, <br> {'?', 76}, <br> {'/', 41}, <br> {'A', 6}, <br> {'B', 17}, <br> {'C', 21}, <br> {'D', 9}, <br> {'E', 2}, <br> {'F', 20}, <br> {'G', 11}, <br> {'H', 16}, <br> {'I', 4}, <br> {'J', 30}, <br> {'K', 13}, <br> {'L', 18}, <br> {'M', 7}, <br> {'N', 5}, <br> {'O', 15}, <br> {'P', 22}, <br> {'Q', 27}, <br> {'R', 10}, <br> {'S', 8}, <br> {'T', 3}, <br> {'U', 12}, <br> {'V', 24}, <br> {'W', 14}, <br> {'X', 25}, <br> {'Y', 29}, <br> {'Z', 19}, <br> {'1', 62}, <br> {'2', 60}, <br> {'3', 56}, <br> {'4', 48}, <br> {'5', 32}, <br> {'6', 33}, <br> {'7', 35}, <br> {'8', 39}, <br> {'9', 47}, <br> {'0', 63} <br>} ; <br> <br>#define N_MORSE (sizeof(morsetab)/sizeof(morsetab[0])) <br> <br>#define SPEED (10) <br>#define DOTLEN (1200/SPEED) <br>#define DASHLEN (3*(1200/SPEED)) <br> <br>int LEDpin = 13 ; <br>int Soundpin=9 ; <br> <br>void <br>dash() <br>{ <br> digitalWrite(LEDpin, HIGH) ; <br> analogWrite(9, 128); <br> delay(DASHLEN); <br> digitalWrite(LEDpin, LOW) ; <br> analogWrite(9, 0); <br> delay(DOTLEN) ; <br>} <br> <br>void <br>dit() <br>{ <br> digitalWrite(LEDpin, HIGH) ; <br> analogWrite(9, 128); <br> delay(DOTLEN); <br> digitalWrite(LEDpin, LOW) ; <br> analogWrite(9, 0); <br> delay(DOTLEN); <br>} <br> <br>void <br>send(char c) <br>{ <br> int i ; <br> if (c == ' ') { <br> Serial.print(c) ; <br> delay(7*DOTLEN) ; <br> return ; <br> } <br> for (i=0; i if (morsetab[i].c == c) { <br> unsigned char p = morsetab[i].pat ; <br> Serial.print(morsetab[i].c) ; <br> <br> while (p != 1) { <br> if (p &amp; 1) <br> dash() ; <br> else <br> dit() ; <br> p = p / 2 ; <br> } <br> delay(3*DOTLEN) ; <br> return ; <br> } <br> } <br> /* if we drop off the end, then we send a space */ <br> Serial.print(&quot;?&quot;) ; <br>} <br> <br>void <br>sendmsg(char *str) <br>{ <br> while (*str) <br> send(*str++) ; <br> Serial.println(&quot;&quot;); <br>} <br> <br>void setup() { <br> pinMode(LEDpin, OUTPUT) ; <br> pinMode(Soundpin,OUTPUT); <br> Serial.begin(9600) ; <br> <br>} <br> <br>void loop() { <br> sendmsg(&quot;CQ CQ DE VK4AAZ VK4AAZ K&quot;) ; <br> delay(6000) ; <br>} <br>
Cool project, looks like it is going to be used on a local foxhunt sometime soon. <br> <br>A friend of mine suggested I feed back some changes I made. Took a few minutes to find you, but the power of the interwebz comes through! <br> <br>When you do the sizeof you get double what you expect because the variable is declared int, which is a doublebyte construct. Change it to byte and you won't have to do the division. <br>... <br>byte code[] = { }; // 1 id dih, 2 is dah, 0 is pause <br>int codelength = sizeof(code); <br>... <br>I also changed the &quot;rest&quot; parameter by adding in a random element. My thought is you don't want the fox to be too predictable. <br>... <br>delay(rest+random(7000)); // keeps it from repeating on a regular schedule <br>... <br>It would be cool if the changes were attributed to me, but not necessary. These things are just too much fun. <br> <br>Cheers, <br> <br>Jim
Thanks for posting this. I run the fox hunts for the local ham radio club (W9ZL) and currently use a really old stand alone fox, which I do not like because it was modified by someone in the past and I haven't been able to fully figure everything out. It's also fairly large so it isn't the easiest to hide. <br> <br>I have a Arduino Uno laying around along with a IC-T90A that I don't use very often. This would be nice to use since it's smaller than the current transmitter and will allow us to also try doing a hunt on 70cm. <br>73, <br>KC9FSH <br>
Excellent FOX build! This gives me idea to expand into APRS use. Thanks! 73's

About This Instructable




More by The Nate Dawg:Arduino Controlled Hidden Transmitter 3D Anaglyph Text 
Add instructable to: