What does a fox have to do with electronics? In Amateur Radio circles, a "fox" is a hidden transmitter and it is used in the sport of radio direction finding (RDF). This can range from Amateur Radio Direction Finding (ARDF), often called Radio Orienteering, to a cleverly hidden and camouflaged beacon transmitter for the radio version of Hide-and-Seek. RDF activities can generate a lot of enthusiasm. However... Amateur Radio clubs across the globe will attest that this interest can also be VERY short-lived. This makes the "cost to implement" a real consideration.
I own a commercially manufactured "fox". It has an output power level of 700mW. While that doesn't seem like a lot of power, this is sufficient for a multi-city hunt. The fox can literally be heard for miles. This power level complicates demonstrating RDF techniques because everywhere close to the fox is awash in signal. I could use attenuators - or I could use a lower powered transmitter.
Affordable. Lower powered. Something I can build... Project14 says sub Gigahertz. This screamed "Use one of the many RF modules available online!" With 433MHz falling in both the license-free spectrum at certain power levels AND being within the Amateur Radio 70cm band, it was certainly "the sweet spot" for my project. And, if I could create something that another person could replicate... build that thing that I had hoped to find when I first started in the hobby... well... I win - at least in my own mind.
Ideally, I want the transmitter to be low power enough not to require licensing but I could not find clear enough guidance to know what that is. I'm going to accept that the modules do not exceed US limits as I didn't find any chatter during my research even mentioning this. There was some language about "limited" and/or "infrequent" transmissions, but that could be just as much about the application as any regulatory requirement. In that a fox is a beacon, I will probably exceed these limits for unlicensed transmissions - if they exist. There seemed to be no bottom to this rabbit hole. In the end, I had to abandon this search and move forward with the project. I can legally exceed the license-free power levels and/or durations if I transmit my Amateur Radio call sign periodically. While I believe that one can use this device as a beacon and not break any laws, I will share "a beacon with my call sign" to avoid any issues.
Like most of my projects, I take something that is easy in concept and... well... complicate it. The development process resembles a squirrel trying to cross the road. I purchased some 433 MHz modules. Argh! Wrong kind. These do Amplitude Shift Keying (ASK). All of the "hacks" I can find on the internet use the original Surface Acoustic Wave (SAW) resonator. Buy another pack of modules.
I give credit to MadElectro_1 (YouTube) for the modification plans to the transmitters. I found three mods and tried them all. They all perform essentially the same that I can tell. If I had to pick only one, I would recommend Circuit 2 as that behaved the most consistently with the better handheld radio. They all function similarly with the cheaper radio. From reviewing the schematic, I believe that all three mods attenuate the input signal by bypassing a portion of the module - especially Circuit 1.
The next portion of the project was to create the tones and Morse Code that the transmitter would repeat. For this, I turned to my old standby, the Arduino Nano (old Bootloader). The physical connections are quite simple. Ground, power and a PWM output signal from Pin 3. To try to decrease the power output, I fed the transmitter module from the 3.3v output of the Arduino.
Argh! Forgot the antenna. 6.5 inches of wire later, I was transmitting. Initially, I just used tone() and I could receive the output on a handheld radio. I do admit to having to bust out the tinySA spectrum analyzer to find the correct transmitting frequency. The "good" radio, Yaesu FT-70D, had some issues in that the frequency of the modules drifts with the changing tones and the receiving circuit on the Yaesu does not. The Baofeng UV-82, on the other hand, had no problems receiving on a variety of frequencies. Take your pick. Almost anything in the ballpark will do.
* We have found an application where the cheap radio performs the task better than the good radio! Hams of the World, rejoice! We all own at least one. Some of us actually admit it.
The sound was terrible. To say that the square wave output sounds harsh is kind. I wasted days on filter circuits trying to improve the output but to no avail. Remember that the project objective is for an affordable - and therefore uncomplicated - fox. I never did find a filter circuit that I was happy with so I thought I might try a different route - speech. I spent way too much time playing with the Talkie Library. It did not have all the words I wanted. I was successful in creating some words but not others. In the end, the gaps in speech that makes it intelligible caused gaps in transmission that were just as annoying as the harshness of the tones. So... I went back to the tones. I also hit a point of disillusionment when I read that I could not use the Talkie Library with the ATtiny85. Cue the sound of breaking glass. I was starting to have visions of using my Digisparks in this project.
Excellent! The concept works. Now to package it into something usable. It's all about the application.
ARGH!! Antennas! Floppy wire just won't do. Back to the bench. (Remember the squirrel crossing the road?)
I could buy some antennas. SELF: "You mean like BOTH sets of RF modules? And the replacement for the Digispark you broke?"
Okay. We'll make one. Or three. I didn't want dipoles so I opted to follow the convention of using helically loaded antennas (the same design as your rubber duck antenna).
Of course, I tried a number of different antenna tuning methods. The antennas that came with the ASK modules were about 3mm in diameter so I found a screwdriver with that diameter shaft and used that as my form. I used copper wire recovered from some old transformers. I tried thin welding wire and while it made beautiful helical antennas, they were impractical to attach to the RF module and had to be abandoned.
Each antenna was tightly wound on the form and then gapped. All were wound much longer than they needed to be. I used the lid of an Arduino Minima box, folded over - two thicknesses of cardboard - to gap the coils. Wonderfully consistent - even if unconventional.
Tuning method one used the tinySA. I waited for transmissions and cut the antenna until the broadcast frequency was 433.92MHz. Okay, we know that I could never get that precise - but close. The problem with this method is restraint. In trying to get the antenna just a little bit better, I cut off too much - a couple of times.
The short antenna led to method two - stretching the antenna. This method wasn't effective as it created a fragile antenna - and as such was abandoned.
Antenna tuning method three was to solder the antenna to a SMA connector and put it on the NanoVNA. Words of warning: To get my NanoVNA to interface with the computer, I upgraded the firmware. Now that the firmware is upgraded, it is only stable when it is connected to the computer. It freezes in stand alone mode - regularly. AND... I don't have one of the clones. Make sure you have a copy of your current firmware before upgrading. This way you have something to fall back on.
As you get close, make adjustments in 1/4 coil increments. Be happy with "close". I then added heat shrink tubing to strengthen the antenna. Know that heat shrink will decrease your resonant frequency by approximately 30MHz. I tuned the uninsulated antenna to around 465MHz and achieved approximately 434MHZ after heat shrink. If you zoom into the picture, you can see the resonant frequency is just under 433MHz. I'll take it.
With antennas in place, the last things to do are package the transmitter and show that it works. Originally, I had planned to use three AA batteries and mount the Nano and RF transmitter to the back. BUT... while playing with the Digisparks, I decided to go for other battery solutions.
While this isn't an original Digispark, we're close enough. Two 3v CR2032 batteries in a holder feed Vin on the Digispark. The 5v output of the Digispark powers the transmitter module - making this more powerful than the original Arduino Nano. Both devices share a common ground. PWM0 / pin 0 on the Digispark provides the tone input to the transmitter. Both modules are hot glued to the back of the battery case and the slide switch controls if it's ON or OFF. I'm rather happy with this as a small piece of double sided sticky tape will allow it to be placed in all sorts of locations.
While I love the stealthiness of the coin cell battery pack, I also love the simplicity of the original Digispark and a power bank. This setup uses two output pins of the Digispark (D1=B+ & D2=Gnd) to power the transmitter. The transmitter draw is supposed to be between 10mA and 12mA and the Digispark (ATTiny85) is supposed to be able to handle 40mA. Even if the module power estimates are wrong, I have a reasonable safety factor. I haven't burned one out (yet). The Circuit 1 variant has the full female headers - for continued experimentation. The more shallow assembly has the Circuit 2 modification and will live out its life as you see it today. There are two layers of spacers on the male headers connecting the two boards.
Yes, but do they work?
Conclusion: While these aren't the best, the cost to play is between $10 and $15 for a transmitter. That is literally 1/10th the cost of my commercial one. From my experimentation, the range is about the length of a football field (line of sight) - which makes it perfect for a school playground. My new ultimate goal is to figure out how to mount it in a small ball and launch it with a slingshot. I haven't performed a length of run test yet, but it is in the hours range - if not days for the power bank.
This was a fun project. I spent a great deal of time on tangents, but it was good to get back into Arduino programming and letting the project meander from the original plan a bit. Since I have a huge number of coin cell battery holders and a few 433MHz receiver modules, I should really take a look at doing something with those. That will be more complicated as I want to create a field strength meter of some type and mount it on a directional antenna. One project begets another sometimes.
/* Training Fox using Digispark * A beacon for practicing hidden transmitter hunting techniques. * Uses pin 0 in pwm0 output to DATA input on modified 433MHz transmitter module. * Uses pin 1 in output mode, set high, to supply power to transmitter module. * Uses pin 2 in output mode, set low, to supply ground to transmitter module. */ #define pin 0 // set output to pin 0 unsigned int freq = 262; // set tone of initial output unsigned long duration = 500; // set tone length int t = 150; // time interval of dit void setup() // setup code. runs once. { // turn on power and ground for transmitter module. comment these out if not using them for power/ground. pinMode(1, OUTPUT); digitalWrite(1, HIGH); pinMode(2, OUTPUT); digitalWrite(2, LOW); } void loop() // main program. runs repeatedly. { for (int i = 0; i <= 26; i++) // play tone. step tone up { tone(pin, freq); delay(duration); freq = (freq * 1.06); // required to allow tone time to play. fraction is for gap. } for (int i = 26; i >= 0; i--) // play tone. step tone down { tone(pin, freq); delay(duration); freq = (freq / 1.06); } noTone(pin); delay(1000); // CW ID. fake call sign for file. only the letters needed. // A dit(); dah(); delay(t * 2); // B dah(); dit(); dit(); dit(); delay(t * 2); // C dah(); dit(); dah(); dit(); delay(t * 2); // 0 dah(); dah(); dah(); dah(); dah(); delay(t * 2); // X dah(); dit(); dit(); dah(); delay(t * 2); // Y dah(); dit(); dah(); dah(); delay(t * 2); // Z dah(); dah(); dit(); dit(); delay(t * 2); noTone(pin); // This delay sets rest time between transmissions. delay(10000); } void dit() { tone(pin, 600); delay(t); tone(pin, 5); // very low tone to keep transmit active delay(t); } void dah() { tone(pin, 600); delay(t * 3); tone(pin, 5); // very low tone to keep transmit active delay(t); }