Transceiver uSDX with Arduino Nano

Personally, I think that a “real” SDR radio is one where the radio signal is received by the antenna and then (possibly after passing through passive filtering circuits) is sampled by an analog-to-digital converter. Further processing of the signal takes place in the digital domain. However, the SDR category also includes other devices which to a greater or lesser extent use digital signal processing. One of the uSDX transceiver variants described below is an example. It was created after reading an interesting article “QRP uSDX Transceivers”, which was published in Polish magazine “Świat Radio” No. 2/2021.

The uSDX project goes back to the products of the “QRP Labs” company. On the basis of the highly successful QCX mini-transceiver, Guido (PE1NNZ) came up with the uSDX design in order to try out what can be achieved with minimal system complexity by transferring it to implementation in the digital domain of the ATmega328P 8-bit microcontroller. The approach followed is to simplify the design where possible while keep a reasonable performance. The result is a cheap, easy to build, versatile QRP SSB/CW/digi transceiver that actually is quite suitable for making QSOs (even in contest situations), however due to the experimental nature some parts are still in progress and hence limited.

The receiver circuit is a direct conversion type. It uses the 74HC4053 IC as a high performance quadrature detector, also known as “Tayloe N7VE detector” or “I-Q mixer”. This detector is characterized by a very high value of the third order intercept point (IP3) and a large dynamic range, as well as low losses. In fact, we have 2 mixers here, which are keyed with signals with the operating frequency, but shifted between each other by 90 degrees. Clock signals CL0/CL1 for the detector are generated in the module containing the Si5351 type PLL frequency synthesizer circuit, which is controlled from the processor via the I2C bus.

There are several types of dual DIL-8 amplifiers on the market; the NE5532 shown in the schematic is readily available, but it works here in off-catalog conditions. Better to use an amplifier from the low-noise category LM4562, or even LT6231. Instead of the 74HC4053, the FST3253 is more often used as a quadrature detector. The resistance of the switch in it is much lower, so you need to limit the IC1A/B gain by adding 100 ohm resistors between C28 and pin 2 and between C11 and pin 6. The symmetry of both analog I and Q paths also affects the performance. It is good to match the components in such a way that their values in the groups are as close as possible to each other: C9/C10/C11 C28; R6/R7; C7/C30; C26 C27; R2/R3/R4/R5.

The output signals from the detector, after amplification and band-limiting by the IC1A/B dual operational amplifier, are fed directly to the inputs of the ATmega328P microcontroller analog-to-digital converter multiplexer, which is used in the Arduino Nano module here. Further processing of the signal takes place only in the digital domain, which is quite an achievement, considering the limited capabilities of the 8-bit microcontroller. The ATmega28P samples the ADC input at a 62kHz sample-rate, and decimates this high-samplerate to a lower samplerate, performs a phase-shift by means of a Hilbert-transform, summing the result to obtain side-band rejection; it subsequently applies a low-pass filtering, AGC and noise-reduction functions. With the 10-bit ADCs and a 4x over-sampling rate, a theoretical dynamic range of 72dB can be obtained in 2.4kHz SSB bandwidth. LSB/USB mode switching is done by changing the 90 degree phase shift on the CLK0/CLK1 signals of the SI5351 PLL. Three embedded attenuators are available for optimally using dynamic range; the first attenuator is the RX FET switch Q2 responsible for 20dB attenuation, the second attenuator is ADC range (1.1V or 5V) selected by the ATMEGA ADC analog reference (AREF) logic and is responsible for 13dB attenation, the third attenuator is a pull-down of an analog input on the ATMEGA with a GPIO port responsible for 53dB attenation. Combining the three attenuators provides the attenation steps 0dB, -13dB, -20dB, -33dB, -53dB, -60dB, -73dB. The receiver circuit does not have an analog headphone amplifier – a digital output with PWM pulse width modulation is used. The audio signal is strong enough, even a small speaker with an impedance of 8 ohms can be used.

The SSB transmit-stage is implemented entirely in digital and software-based manner: at the heart the ATmega328P is sampling the input-audio from the electret microphone and reconstructing a SSB-signal by controlling the SI5351 PLL phase (through tiny frequency changes over 800kbit/s I2C) and controlling the PA Power (through PWM on the key-shaping circuit). In this way a highly power-efficient class-E driven SSB-signal can be realized; a PWM driven class-E design keeps the SSB transceiver simple, tiny, cool, power-efficient and low-cost.

The Arduino module additionally supports a 2×16 character LCD display, buttons and a rotary encoder (pulser with a switch). The entire transceiver is powered by 5V through the 7805 stabilizer, except for the E-class power amplifier, powered directly by the input voltage – typically 13.8V.

The layout is so simple that I decided to assemble it on a universal printed circuit board. I used the mechanical concept of my GNI-r8 rotor controller with a 2×16 OLED display.

Source codes (open source), detailed principles of operation and documentation of the originator of the project, Guido PE1NZZ, are available on GitHub and . In addition to the theory and diagram, there is also a description of the software command menu. In a short time, the project found many enthusiasts gathered in the group on the forum . The project is under constant development, in various variations and versions. My scheme is mainly based on solutions of: Barb WB2CBA ,  Manuel DL2MAN and Miguel PY2OHH . It’s also worth taking a look at Bob’s KD8CGH website .

Instead of the Arduino Nano module in other uSDX variants, the ATmega328P processor in the DIL package is most often used. In this case, a 20MHz crystal is connected to it, and an additional programming interface must be provided (or the microcontroller must be programmed after removing it from the socket). In my case, the Arduino module can be programmed directly via a USB cable. The module, however, requires a modification. The original 16 MHz quartz must be exchanged for 20 MHz and the SMD resistor attached to the LED (marked L) must be removed. After such conversion, it is no longer possible to program from a computer from the Arduino IDE environment, unless the method of direct programming the Arduino Nano 20MHz via the Arduino IDE proposed by PE1DDA is followed:

1.Find the file named boards.txt from arduino IDE, it is located in the fold like “home of arduino\hardware\arduino\avr”.
2.Edit boards.txt.
2.1 Find the line: = Arduino Nano
2.2 Copy the lines from “## Arduino Nano w/ ATmega328P (old bootloader)” down to “”
2.3 Paste these lines below “”
2.4 In each line, replace atmega328old with “atmega328old20MHz”
2.5 Replace this line “ (Old Bootloader)”   with “ (Old Bootloader-modify-20MHz)”
2.6 Edit this line “”, replace with “57600” with “72000”
2.7 Save and close the boards.txt file
3.Run the Arduino IDE: Tools, Arduino Nano Board, Board Manager …, click Update
4.Restart Arduino IDE, you can find a new board as shown below

Now you can upload programs to Arduino Nano with 20MHz from IDE via USB directly.

The Si5351 frequency synthesizer module also requires some rework. It is controlled from the microcontroller via the I2C bus with an above-standard speed of 800 kbit/s, and the voltage translator circuits used there are too slow. You need to remove 2 FET SMD transistors and 4 10k SMD resistors. Then install two 1k SMD resistors and two jumpers between the drain and the source instead of FET transistors. The appearance of both modules after the modifications is shown below.

Three 74ACT00 gates in parallel were used to drive the Q1 power transistor. These may be other gates, but necessarily from the ACT – HC or HCT series do not have enough current capacity to drive the PA amplifier transistor well. On the forum   you can find a number of other proposals for controlling the output transistor, but my experience confirms that 3 parallel 74ACT00 gates seem to be the optimal solution, also due to the relatively good availability of these ICs.

The situation is similar with the Q1 transistor – you can follow various options on the forum mentioned above. I had BS170, 2N7000, IRF510, IRF540N and IRF610 at my disposal. The IRF540N worked best for me on the 80m and 40m bands, and 3 2N7000 connected in parallel on the 20m band. It’s worth checking out other options.

In order to obtain the appropriate output power, the output circuit is very important for a class E amplifier. By design, it is a resonant amplifier. I chose to use one of the WB2CBA solutions, which seems to be a good compromise between quality and simplicity. In order to obtain satisfactory results, I had to adjust the values of the circuit parameters. I must make it clear that the values given below are not necessarily optimal values. First of all – their values strongly depend on the type and even the unit of the transistor, construction and load. I made tests with a 13.8V power supply with an artificial load of 50 ohms until I was satisfied with the results I considered:

3.700 MHz power 5.8 W, efficiency 76% (IRF540N)
3,500 MHz, power 9.4 W, efficiency 78% (IRF540N)
7.100 MHz, power 8.8 W, efficiency 93% (that’s how I came out of the calculations!) (IRF540N)
14.200 MHz, power 2.7 W, efficiency 56% (3x 2N7000)

Below is a screenshot of the output oscilloscope on an artificial load for the 80m band. I have not measured the harmonic content, but the signal looks quite “clean”. Next to it is the RF signal on the Q1 drain. As you can see, the Q1 transistor works in the keying mode. The drain current flows when the voltage across it is close to zero, which ensures high gain efficiency. This is shown very nicely in the article . As you can see, the voltage value reaches 81.6V. Miguel PY2OHH made tested with a supply voltage of up to 32.5V. For the 80m band it gave 20W output power with 75% efficiency. The drain voltages are therefore much higher, hence the Q2 2N7000 transistor must be replaced with a more resistant one, eg IRF510. You cannot forget about the D1 and D2 protective diodes!






The original WB2CBA series resonant filter solution is available at . The component values for the three most popular bands are given below. The values that I have changed from the original are in bold. The L1 choke is 12 turns on the FT37-43 ring core. The L2 and L3 inductances can be wound with a winding wire 0.2-0.4mm or a wire with insulation (e.g. kynar as in the photo above) on T37-2 cores.

Band C1 C2 C3 C4 C5 C6 L2 L3
80 m 680pF 360pF 1,5nF 1,8nF 620pF 1,8nF 15 t. 15 t.
40 m 360pf 180pF 470pf 1nF 180pF 1nF 12 t. 10t.
20 m 100pF 470pF x 470pF 150pF 470pF 8 t. 7 t.

I made filters in the form of plug-in modules. There are a number of examples and ready-made solutions of multi-band output circuits with switches or relays in the network, e.g.: .

The original source code for ATmega328P is available for download on GitHub . I checked several versions of the program in my uSDX system, it is worth looking for the latest one, e.g. HERE. In order for the program to work on Arduino Nano, it was slightly reworked. In version v.1.02p I changed only 2 lines:

line 12: //#define CAT             1   // GNI blocked, CAT-interface (CAT takes a lot of memory space)
(CAT function disabled to free memory resources of the microcontroller)
line 15: #define F_XTAL 25000373   // GNI changed, 25MHz SI5351 crystal  (enable for 25MHz TCXO)
(the value was adjusted experimentally for my Si5351 module)

In my uSDX prototype, I used a more modern 2×16 OLED display. It worked in my rotor controller .  For it to work properly, I had to add D3/R19 parts. In the case of a standard LCD with backlight, they are not needed, but you need to add a potentiometer to adjust the contrast and a resistor for the backlight as shown in the diagram below.

After programming the module in the Arduino IDE (Nano – Atmega328P – Old Bootloader-modify-20MHz)) and placing it in the socket of the assembled transceiver, first set the display contrast using the 10k potentiometer. There are 3 buttons to operate the radio: left L, right R, ENC encoder button and a mechanical rotary encoder (the encoder button can be doubled with a micro-switch, which requires much less pressure and is more convenient to use). The buttons have the following functions (x means press, 2x double press, d long press):

L x – entering the menu and sub-menu
R x – mode change: LSB (lower band), USB (upper band), CW and exit from the Menu
R 2x – change of reception bandwidth: Filter Full, 3000 Hz, 2400 Hz, 1800 Hz (different for CW)
R d – change of VFO A, RIT, VFO B, RIT
ENC x – tuning step: 1M, 100k, 10k, 1k, 500, 100, 10 Hz
ENC d – tuning step: 10 Hz 100, 500, 1k, 10k, 100k, 1M,
ENC 2x – band-switch to pre-defined CW/FT8 frequencies on successive amateur bands
ENC + turn – changes the volume.

So in short – tuning can be done by turning the rotary encoder. Its step size can be decreased or increased by a short or long ENC press. A change of band can be done with a double ENC press. The mode of operation is altered with a short press on the right button; a double press on right button narrows the receiver filter bandwidth, the bandwidth is reset every time mode is changed. The volume is changed by turning the rotary encoder while pressed. The content of the menu slightly depends on the version of the program, descriptions of its functions can be found in the documentation, e.g. : .

For receive, by default an AGC is enabled (item 1.8 in menu). This increases the volume when there are weak signals and decreases for strong signals. This is good for SSB signals but can be annoying for CW operation. The AGC can be turned off in the menu, this makes the receiver less noisy but require more manual volume change. To further reduce the noise, a noise-reduction function can be enabled in the menu with the NR parameter (1.9 in menu). To use the available dynamic range optimally, you can attenuate incoming signal by enabling a front-end attenuator with “ATT” parameter (1.10 in menu). Especially for frequencies 3.5-7 MHz the atmospheric noise levels are much higher, so you can increase the receiver performance by adding attenuation (e.g -13dB) such that the noise-floor is still audible.

A S-meter of choice (dBm, S, S-bar) can be selected with the S-meter parameter. Selecting an S-bar, shows a signal-strength bar where each tick represents a S-point (6dB).

To calibrate the transceiver frequency, you can tune to a calibrated signal source (e.g. WWV on 10 MHz) and zero-beat the signal by changing “Ref freq” parameter (8.1 in menu).

For FT8 (and any other digital) operation, select one of the pre-programmed FT8 bands by double press the rotary encoder, connect the headphone jack to sound card microphone jack, sound card speaker jack to microphone jack, and give a long press on right button to enter VOX mode. Adjust the volume to a minimum and start your favorite FT8 application (WSJT-X for instance). The sensitivity of the VOX can be set in the “VOX threshold” parameter.

The values of the transmitter parameters are best chosen experimentally. The TX Drive value (pos. menu 3.3) is normally used in the range 4-6 (my 6). Having an oscilloscope is helpful to observe the modulation envelope of the signal at the output. Eavesdropping on another receiver does not work. The signals generated by the digital circuits on the uSDX board overlap the useful signal, which makes it seem very distorted and it is impossible to assess the real quality of the SSB signal at the antenna output. PA Bias min (item 8.1) in my opinion does not matter much (I have 10). PA Bias max (item 8.2) can be selected in the following way: in CW mode, we simultaneously observe the signal on the artificial load and the current drawn from the power supply; using the encoder, we increase the value of the PA Bias max parameter until a further increase in current does not result in an increase in output power. For me the value of PA Bias max = 105 came out.

I checked the operation of my transceiver on the air. The farthest connections on the SSB were IZ2LSR at 80m (1,130km), YU1XA at 40m (950km), EC5K at 20m (2,200km).

Have fun installing and using the uSDX transceiver. However, it should be remembered that this is an experimental solution and has a number of limitations resulting not only from the simplicity of construction. It is worth checking new ideas and solutions on the web, e.g. here: . The finished boards have already been developed by several colleagues and should be available, e.g. here: .

Mirek SP5GNI




Number of Comments: 1

Leave a Comment

Your email address will not be published. Required fields are marked *