Monday, February 25, 2019

Ham Radio: Home Brew Fox Transmitter

Note:  As presented this project requires a FCC Amateur Radio license.  Amateur Radio is about experimentation.   Even still you must be versed in the band plan, stay away from local repeater stations, stay in accordance to FCC Amateur Radio rules in FCC Section 97, and probably a few other things.  Even after following all those rules, nobody likes to hear a fox 'screaming' out all the time.  Be courteous, aware of your RF footprint, and keep your transmission power suitable for the cause.  That said, let's continue....

In ham radio speak a fox hunt is a search for a hidden transmitter. We wanted a fox transmitter and decided to go with the "roll your own method" to fill the need.
For our rig we went with things that we had available around the shack.  The major components:
     - Baofeng 2m/70cm HT
               - this is the transmitter
     - Arduino Nano
               - used as a simple timer to control a relay module
     - Relay Module
               - when closed the mic keys and the radio transmits
     - MP3 playback device capable of a continuous loop of an audio file
               - this contains the fox message with must include an FCC callsign
     - Some 1/4 inch phono adapters
     - Alligator clip wire
 Since we don't need a permanent fox, we wanted to be able to break down the rig.  Thus, the alligator clip wire.  On low power transmit the rig's battery can easily last all day.  The Arduino and MP3 player are powered by a USB jump battery.
1st:  Get the simple source code we list below and upload it to your Arduino.

2nd: Create a 'fox message' to transmit from the MP3 player.  We typically go to LCWO and create a CW message like the example in the demonstration video at the top of this page.  You must ID with a FCC callsign.

3rd: Connect it all up like this:

Now you're ready to go.    The metal lanyard attachment point provides a handy "GND" point for the transmit relay.  Select the audio file you want to transmit to continuously loop and press PLAY.  Turn the HT on and power up the Arduino.
At power up the Arduino will go through a Self Test.  The relay will cycle five times and then normal operation will start.  The Fox will only transmit when the relay is closed.  In the source code below the rig is set up to transmit for 20 seconds, then rest for 60 seconds, then repeat.
Pretty simple.  Good luck and enjoy hosting a fox hunt.   Here is the Arduino source code:

 *  Ham Radio Fox Transmitter Control
 *  Requires a ham radio license. 
 *  See:
 *  For our Nano: CH340 drivers, Processor->ATmega328P (Old Bootloader), 57600 baud
 *  See: WhiskeyTangoHotel.Com for built details.
 *  FEB 2019

// Set variables and Output pins
const int Tx_seconds = 20;   // seconds that the fox call will be sent
const long Silent_seconds = 60; // seconds between fox call tx.  Resting time.
const long test_chatter = 5; // turn on and off the relay for self test.  This will key the mic and Tx if connected
const int relay = 2;  // Relay control line.  Close relay to transmit

void setup(void){  //run once
  pinMode(relay, OUTPUT);
  digitalWrite(relay, 0);  // off power to relay (not in Tx mode)
  // Self test LED and Relay
  Serial.println("Enter Self Test:");
  for (int i=0; i < test_chatter; i++){
    Serial.println("*** Self Test: " + String(i) + " ***");
    Serial.println("Tx Mode ON. LED ON.  Relay CLOSED.");
    digitalWrite(relay, 1);  // Relay CLOSED
    Serial.println("Tx Mode OFF. LED OFF.  Relay OPEN.");
    digitalWrite(relay, 0);  // Relay CLOSED
    Serial.println(" ");

  Serial.println("Self Test complete. Tx is OFF....");
  Serial.println(" ");
} // end void setup

void loop(void){   // loop until killed by sunspot overdose
  // Turn on the Fox Transmitter
  digitalWrite(relay, 1);  // Relay CLOSED

  Serial.println("Tx is ON for " + String(Tx_seconds) + " seconds...");
  delay(Tx_seconds * 1000); // Keep the Tx mode active

  //Turn off the Fox Transmitter
  digitalWrite(relay, 0);  // Relay OPEN

  Serial.println("Tx is OFF for " + String(Silent_seconds) + " seconds...");
  delay(Silent_seconds * 1000);  //  wait for next Fox Tx
} // end main void loop