Flashing QCX Firmware using a Teensy 3.2

Today, I wanted to flash my QCX qrp transceiver with the latest available firmware. But I didn’t have an AVR programmer at hand.

In a tutorial Simon VK3ELH describes how to use an Arduino UNO to program the QCX. Unfortunately I don’t have an Arduino UNO neither. What I do have are Teensy 3.2, and seems to be, you could use those too.

I’m asuming you already had the Teensy 3.2, so you most likely also already installed Arduino and Teensyduino. Open a new sketch and go to File -> Examples and look for ArduinoISP. Connect the Teensy 3.2 with a usb cable to you computer, select the appropriate board (Teensy 3.2 / 3.1), press verify and upload the sketch. You should not get any errors, no codechanges are needed.

Next you wire up the Teensy 3.2 to the QCX according to the following schematic:

Use your Teensy 3.2 to flash new firmware in your QCX

Check the QRPLabs@groups.io forum to find out where you can download the latess firmware. In this example it’s version 1.04.

To flash the new firmware to the QCX, you need a program called AVRDUDESS. You can find it here.

Start the program and change the following fields (those traced in red)

  • Select β€œArduino” as the programmer (There is no Teensy 3.2 in the list)
  • Select the COM port the Teensy 3.2 is connected to
  • Enter BAUD rate 19200
  • Select ATmega328 as the MCU
  • Select the path where the new firmware is located
  • Press the Program button.
Use AVRDUDESS to flash new firmware in your QCX

30 seconds later your QCX is flashed with the latest firmware. Have fun!

Automatic Magnetic Loop Tuner – Arduino 1.8.11 & Teensyduino 1.50

I just installed the latest version of Arduino: 1.8.11 and Teensyduino 1.50.

When compiling the latest version ML_v409 I got the the following error:

ML_v409:1287: error: 'class ADC' has no member named 'setSamplingSpeed'

Apparently something changed in the ADC.h library so we need to change the following code:

// Set up the two separate ADCs for synchronous read at 12 bit resolution and lowest possible measurement speed (minimal noise)

adc->setSamplingSpeed(ADC_SAMPLING_SPEED::LOW_SPEED, ADC_1);
adc->setConversionSpeed(ADC_CONVERSION_SPEED::LOW_SPEED, ADC_1);
adc->setResolution(12, ADC_1);
adc->setAveraging(16, ADC_1);

  to this:

 // Set up the two separate ADCs for synchronous read at 12 bit resolution and lowest possible measurement speed (minimal noise)

Then recompile again and you are good to go!
This info was also already shared in the LoopController group on Groups.io

73 de ON5IA

Magnetic Loop – Capacitor Box

After building several tuners it was time to build a magnetic loop that I could set up outside in my garden.
I built a magnetic loop for the 80m band to the 30m band.
The magnetic loop has a circumference of 6 meters and a diameter of 1.9 meters. The material I used is 2.2cm copper tubes used in sanitary installations.
Visit the 66pacific.com website to calculate your magnetic loop.

To get the loop into resonance on the frequency we want to use it, we need to add a capacitor. For this antenna, I chose an air variable capacitor. The capacitor was made by HA8DU and bought via a Dutch reseller.

Magnetic Loop Air Variable Capacitor

The capacitor is controlled by a Nema 17 stepper motor., which on his turn is connected to the automatic magnetic loop tuner.

Magnetic Loop Air Variable Capacitor

On the capacitor, I’m using a 60 teeth GT2 pulley, and on the stepper motor a 16 teeth GT2 pulley. The belt is a GT2 280mm rubber band, reinforced with fibreglass. Do not use a belt with steel wires.

Magnetic Loop Air Variable Capacitor

To connect the capacitor to the loop I used soft copper bands and fastened them with hose clamps.

Magnetic Loop Air Variable Capacitor Magnetic Loop Air Variable Capacitor

If I would have to make this loop antenna again, I would switch the positions of the tube clamps and the hose clamps. Also, would I turn the capacitor 90Β°. But now, for the moment, this is fine πŸ˜‰

Magnetic Loop Air Variable Capacitor

All closed up. Next step is to tape the box with Duct Tape and make sure all other holes are sealed with silicone. Then I’ll paint the loop black and search for a better way to attach the coupling loop.

AliExpress parts list:

Nema 17 stepper motor bracket:

Nema 17 stepper motor 45 Nm, 1.5A:

GT2 Pulley 16 teeth:

GT2 Pulley 60 teeth:

GT2 Rubber Belt:

Automatic Magnetic Loop Tuner – New Firmware Available

Loftur TF3LJ/VE2LJX released a new firmware version for the Automatic Magnetic Loop Tuner. You can find it at the bottom of his web page: https://sites.google.com/site/lofturj/to-automatically-tune-a-magnetic-loop-antenna

Firmware version 4.09 fixes stepper motor hiccups that might occur when you move the stepper motor a lot at high speed forward or backwards.

The PCB’s I designed earlier for the DRV8825 or A4988 stepper motor drivers are compatible with this new firmware. I recommend upgrading to this new version if you are using one of mine PCB designs. In the rare case where you would encounter issues, you can always revert back to firmware version 4.08.

Automatic Magnetic Loop Tuner – Smaller Enclosure Finished

When our first batch of automatic magnetic loop tuners was finished, I started looking for another enclosure. One that was sturdier, better looking and cheaper. I ended up looking on AliExpress and found this aluminium box. After some measuring, drilling and filing I test fitted the components.

I quickly understood this enclosure would be a very tight fit. Using the bulkier rotary encoder together with the larger tin box for the SWR bridge was not possible. In parallel, we started working on our second batch of automatic magnetic loop tuners, and I needed the buttons and screen bezel to finish another tuner. Having no spare screen bezel any more and in need of extra internal space, I ditched the screen bezel idea and let the LCD come out of the enclosure. It wasn’t even looking that bad.

Automatic Magnetic Loop Controller

Yet, the little extra space I gained on the inside of the enclosure was still not enough to fit the SWR bridge in it’s RF shielded tin box. I had to go and find a smaller box, which I did on a local ham fair.

SWR Bridge
SWR Bridge in small enclosure

The SO-239 connectors were also replaced by SMA connectors. These are also a lot easier to mount as you only need to drill one round hole.

SWR Bridge

When I made the A4988/DRV8825 version of the automatic magnetic loop tuner PCB, I made it exactly 100mm wide. This way it fits nicely in the PCB slot in the aluminium box. When the PCB is positioned completely to the left against the tin box of the SWR bridge, there is plenty of room for the rotary encoder on the right. The rotary encoder is positioned between the power button and the fuse and serial connector.

Automatic Magnetic Loop Tuner

When the box is closed and the power is switched on it looks very nice πŸ˜‰

Automatic Magnetic Loop Tuner

The knob on the rotary encoder is a full aluminium knob which you can find here on AliExpress.

Icom IC-7300 External Keyboard


Endlessly calling CQ during a contest or special call activation can give you a sore throat. Voice keyers were invented for this particular matter. A voice keyer is even built-in in the IC-7300, so at first, there is no need for an external device.

This voice keyer has 8 presets and can be used as a keyer for voice, CW or RTTY. The only drawback is that this keyer is only accessible when the voice keyer option is visible on the display. And at that time you can’t see any other screen that might be more of an interest to you than the voice keyer buttons such as a larger scope, the audio input and output and your meters (SWR, ALC, COMP and I). An external keyboard would be of great help.

Strange enough this external keyboard is not provided by Icom, you are forced to buy an aftermarket device, or… build it yourself. The schematics for this are made available by Icom in their manual on page 12-2.

A prerequisite for me was that I could still use the original mic when the keyboard was attached and that when I don’t use the original mic, I still have the same capabilities as if I’m using the original mic. So both schematics need to be combined.

Gather the needed components


Except for the resistors all I needed was bought on AliExpress. For the enclosure, I choose for an aluminium box measuring 122(W) x 66.5(H) x 39.5(L)mm. Guitar enthusiasts use these enclosures to make so-called stomp boxes or effects units. Manufacturer Hammond brought an enclosure with these dimension to the market as model 125B/1590N1. On Aliexpress you can find one here.



You can choose whatever momentary switch you like for this project. I went for black plastic 12 mm momentary push-buttons.

Microphone connectors

Icom uses an 8-pin microphone connector. These GX16 connectors, sometimes also referred to as circular aviation socket plug, can be found in abundance on AliExpress. Search for GX16 8 male female because we want two male sockets and 2 female sockets. The male sockets are to be placed on the enclosure, the female sockets are needed to build the cable to connect the external keyboard to the radio.


Finding a suitable cable that has sufficient inner strands, is not to thick and looks good was not so easy. Mini Din 8 pin extension cables can be found easily, but they do often come in an ugly beige colour. As we only need 6 inner strands, I figured out a Mini Din 6 pin cable would do the trick as well. I still had 1 meter of this cable in my stock as I once used it to build a data interface for my trusty Yaesu FT857-D.


We need one 470 Ohm, one 4,7k Ohm, one 2,2k Ohm and two 1,5k Ohm resistors. All 5% and 1/4 Watt.

Audio Jack Sockets

When looking for audio jack sockets, look for those with a screw on the inside of the enclosure. Not only do they look better, but I also have the impression the quality is a bit better.

Preparing the enclosure


On the top of the box 7 holes needed to be drilled. 4 on the top row, 3 on the bottom row. Each hole has to be 12mm.


On the left two 20mm holes are drilled for the GX16 connectors and on the front 2 7mm holes were made for the 3.5mm stereo jacks.


On the back, another 7mm hole was drilled for the 3.5mm jack that will be used to connect a foot-pedal for handsfree PTT operation.

Once all holes are drilled and all components are test fitted, you can start sanding the box and give it some layers of spray paint.

Put everything together

First, make sure you solder long ends of wire to the GX16 connectors. It would be a real challenge to solder them when they are already mounted in the enclosure.


I opened the original Icom MH-219 to know what colour code they use and tried to use the same as much as possible.

Pin 1: Mic input = white
Pin 2: 8V = not used for this project
Pin 3: Frequency up and down = red
Pin 4: Squelch = not used for this project
Pin 5: PTT = brown
Pin 6: PTT Ground = green
Pin 7: Mic Ground = Black
Pin 8: AF output = Blue

Everything wired up. I used to much green wire, I could have connected them in a much more economic way, they are all PTT Ground / GND.

Now fix a connection cable with two female GX16-8 connectors, using an SP/2 extension cable and some clear tubing as stress relief. The colour scheme of this cable is different from that of Icom, but as long as you connect each wire to the same pin on the opposite side of the cable, you’re good to go.


The finished product


In this picture, the original mic and the foot pedal are not connected. I’m using an in-ear Sennheiser and a 1€ condenser boom mic from AliExpress. Maybe not the “best” solution, but for the moment good enough.

Everything works as it should and the magic smoke remained in the components where it belongs πŸ˜‰

I will put this keyer to the test during the March 2019 CQ WPX contest. Hope to meet you on the band!

73 de ON5IA

Automatic Magnetic Loop Tuner – IC-7300 setup

The Automatic Magnetic Loop Tuner can be used with a variety of transceivers, from the most common brands like Yaesu, Elecraft, Kenwood and of course Icom.

I recently acquired an IC-7300 and since many ham’s love and own this radio, I’ll quickly show you what settings you need to enter to make it “talk” with the Automatic Magnetic Loop Tuner.

First, we do the setup on the IC-7300. On the transceiver, push the menu button. Next press the “SET” button on the touchscreen.

Select “Connectors” and “CI-V” in the two following screens.

In the CI-V menu, following options must be set accordingly:

  • CI-V Baude Rate: 19200
  • CI-V Address: 94h 
  • CI-V Transceive: OFF
  • CI-V USB->REMOTE Transceive Address: 94h
  • CI-V Output (for ANT): OFF
  • CI-V USB Port: Unlink from [REMOTE]
  • CI-V USB Baud Rate: 19200
  • CI-V USB Echo Back: ON

Now we switch to the Automatic Magnetic Loop Tuner and press the Menu / Enact button for more than 1 second. Select the “Radio Type” menu item.

Choose for ICOM CI-V Poll in the Transceiver Type menu.

The value will be saved in the memory and you’ll return back to the Config Menu. Now select “ICOM CI-V Addr” and set the value to 94.

Next, we set the Serial Port Signals to TTL and the Serial Data Rate to 19200 b/s.

Exit, the menu, and if everything went well, now your Automatic Magnetic loop tuner follows the VFO of your IC-7300, and you can use the auto-tune function to set the radio in transmit mode and let the tuner hunt for an acceptable SWR.

Power And SWR Meter – Multi Band Calibration

You might have noticed it: I’m a big fan of Loftur’s projects. I’ve already described his Automatic Magnetic Loop Tuner in detail and now I will show you what functionality I added to his Power and SWR Meter.

For most OM’s his version of the code is more than good enough. But sometimes you have OM’s with particular needs πŸ˜‰

If you know the exact forward coupling attenuation and the exactly reversed coupling attenuation of the directional coupler you are using and if you have access to a signal generator and want one power and SWR meter calibrated for multiple bands… this little change of code is made for you!

The easiest part of changing this code was to implement an extra menu so you could select the desired band for which you want to use the meter. All values are stored in memory and will overwrite the initial values as defined in Loftur’s code. This way I had little to change in the calculation formulas coded by Loftur.

20181031_131232 20181031_131244

No changes were done to the “One Level Calibration” so it’s still usable for (most) OM’s without a signal generator.
New here is that you can enter both the higher and lower level for both Forward and Reverse power.



And save the adjusted calibration values.


This picture was taken without proper signal input. I’m one of those OM’s without a signal generator. However, I know an OM with a signal generator (for whom I made these code changes) who can do this calibration for me. Just like he did for one of his friends in South Africa who is using this power meter and code while bouncing signals to the moon and back (EME) πŸ˜‰

Now, most important: the code.

This coding was done already a year ago, only today I retrofitted it to the latest version you can find on Loftur’s website (version 1.02). I’ve sent a copy to Loftur, but I have my doubts it will be merged in his version. It might be too specific and not many OM’s have the equipment to make use of this exact calibration method. Yet it was a nice project to work on and someone might find it useful…

USB Morse Key Keyboard Input

Funny little project to train your morse code sending capabilities. Let’s connect a morse key to a pc and turn it into a keyboard.
To do this, you’ll need: a Teensy 3.2, a morse key, two jumper cables and 15 minutes of your time.

USB Morse Keyer

First you have to program the Teensy 3.2. To do this you need to download the source code from https://github.com/nomblr/morse/. It’s a project of Nomblr, who posted it on imgur in 2017. It has been in my favorites for more than a year before I finally took the time to play with it.

if you can’t download the code, just copy it from the browser and past it in Arduino.

Connect the Teensy to your PC via USB.
USB Morse Keyer

In Arduino you’ll need the following “board settings”. You can find these in the menu Tools (or “Hulpmiddelen” in Dutch).
Board: “Teensy 3.2 / 3.1”
USB Type: “Keyboard”
Keyboard Layout: “US English”
and select the correct com-port for your Teensy 3.2.

Verify and upload the code to the Teensy.

Connect the black jumper wire to the ground pin of the teensy, and the red to “pin 7”
USB Morse Keyer
For info: “pin 7” is not the seventh pin of the Teensy. First pin is ground, second pin is “pin 0”, third pin is “pin 1”, etc…

Then connect crocodile clip of the black jumper wire to the ring of the morse key, and the red one to the tip.
USB Morse Keyer

When done, you can start keying and watch the letters appear on your screen.

People using a AZERTY keyboard have to switch their PC input settings to QWERTY. If you are using Windows you can do this by pressing “Shift + Alt” (do it again to switch back to AZERTY). This is probably because we choose for the “US English” keyboard layout, but all other keyboard layouts of the Teensy gave the same result.

Although a Teensy is perfectly capable of doing this job, it’s a rather expensive device for this simple task. I’ve ordered myself some “Beetle USB ATMEGA32U4” devices on AliExpress and some Mini buzzers and will provide you with an update when they arrive. The ATMEGA32U4 are much cheaper and the buzzer will give you audible feedback. I’ll reprogram the Teensy and put it back in my Automatic Magnetic Loop Controller πŸ˜‰

*This blogpost may or may not have been written using this USB Morse Key Keyboard input method.

Because sometimes things get removed from gitHub, I made a copy of the code which you can find below.

// Turns Morse key into USB keyboard

#include // include de-bounce library

const int led = 13; // led is connected to pin 13
const int keyPin = 7; // morse key is connected to pin 7
Bounce morseKey = Bounce(keyPin, 10); // 10 ms debounce

const unsigned long dashThresh = 150; // time threshold in ms to differentiate dots from dashes
const unsigned long letterThresh = 500; // time threshold in ms to differentiate letter gaps
const unsigned long wordThresh = 3000; // time threshold in ms to differentiate word gaps

String inputString = ""; // initialise input string

unsigned long downTime = 0; // records the start time of state change
unsigned long upTime = 0; // records the end time of state change
unsigned long timeNow = 0; // records the current time
unsigned long changeDuration = 0; // records the duration of state change
unsigned long pauseDuration = 0; // records the duration of the last pause

int pauseFlag = 0; // initilise the flag to indicate whether a pause has already been evaluated

void setup()
pinMode(led, OUTPUT); // configure the pin connected to the led as an output
pinMode(keyPin, INPUT_PULLUP); // configure the pin connected to the morse key as a pullup
} // end of setup

void loop()
// start of IF loop
if (morseKey.update()){

if (morseKey.risingEdge()) { // if input from key has gone to 1 and model is still 0, update model


} else if (morseKey.fallingEdge()) { // if input from key has gone to 0 and model is still 1, update model


} // end of if update loop

} // end of loop

void keyDown()
downTime = millis();
digitalWrite(led, HIGH); // switch LED on

void keyUp()
upTime = millis();
changeDuration = upTime-downTime;
digitalWrite(led, LOW); // switch LED off

if (changeDuration>0 and changeDuration=dashThresh) {
inputString = inputString + "-";


pauseFlag = 1;


void checkPause()
timeNow = millis();
pauseDuration = timeNow-upTime;

if (pauseDuration>=letterThresh and pauseDuration= wordThresh and pauseFlag) {

pauseFlag = 0;


void newWord()

void evaluateLetter()

if (inputString==".-") {
} else if (inputString=="-..."){
} else if (inputString == "-.-."){
} else if (inputString=="-.."){
} else if (inputString=="."){
} else if (inputString=="..-."){
} else if (inputString=="--."){
} else if (inputString=="...."){
} else if (inputString==".."){
} else if (inputString==".---"){
} else if (inputString=="-.-"){
} else if (inputString==".-.."){
} else if (inputString=="--"){
} else if (inputString=="-."){
} else if (inputString=="---"){
} else if (inputString==".--."){
} else if (inputString=="--.-"){
} else if (inputString==".-."){
} else if (inputString=="..."){
} else if (inputString=="-"){
} else if (inputString=="..-"){
} else if (inputString=="...-"){
} else if (inputString==".--"){
} else if (inputString=="-..-"){
} else if (inputString=="-.--"){
} else if (inputString=="--.."){
} else if (inputString==".----"){
} else if (inputString=="..---"){
} else if (inputString=="...--"){
} else if (inputString=="....-"){
} else if (inputString=="....."){
} else if (inputString=="-...."){
} else if (inputString=="--..."){
} else if (inputString=="---.."){
} else if (inputString=="----."){
} else if (inputString=="-----"){
} else {

inputString = ""; // re-initialise inputString ready for new letter


Automatic Magnetic Loop Tuner – Smaller Enclosure Green Display

I was trying to fit the automatic magnetic loop tuner into a smaller enclosure. It was only a partial success.

Automatic Magnetic Loop Controller

There is plenty of space for the display and buttons on the front, but I have to choose between the SWR bridge or the rotary encoder. This, however, is not an option. They both need to be present in the automatic magnetic loop tuner. So the only possibility I see for the moment is to look for a smaller box to accommodate the SWR bridge. If I can’t find a smaller box for the SWR bridge, I’ll probably have to stick with the larger Hammond enclosures.

I also used a green display instead of the blue ones I usually use. What’s your favourite colour?