Git Product home page Git Product logo

usdx's Introduction

uSDX: micro Software Defined Transceiver

uSDX is a simple and experimental (Class-E driven) SSB and CW SDR transceiver. It can be used to make QRP SSB contacts, or (in combination with a PC) used for the digital modes such as FT8, JS8, FT4. It can be fully-continuous tuned through bands 80m-10m in the LSB/USB-modes with a 2400Hz bandwidth has up to 5W PEP SSB output and features a software-based full Break-In VOX for fast RX/TX switching in voice and digital operations.

The SSB transmit-stage is implemented entirely in digital and software-based manner: at the heart the ATMEGA328P is sampling the input-audio 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 (ie. no need for power-inefficient and complex linear amplifier with bulky heat-sink as often is seen in SSB transceivers).

For the receiver, most parts are implemented in digital manner (software): the ATMEGA328P is implementing a 90 degree phase shift circuit, the (CW/SSB) filter circuit and the audio amplifier circuit (now a class-D amplifier). This has simplifies the uSDX circuit a lot, and there are a number of advantages and features (compared to an analog approach): there is no longer a need for an I/Q alignment procedure due to the very accurate 90 degree Hilbert phase shifter; and there are now adjustable IF DSP filters for CW and SSB; and there is an AGC and there is a noise-reducing DSP signal conditioning function and there are three indepent built-in attenuators in the analog front-end which helps utilizing the full dynamic range. The speaker is directly connected and driven by the ATMEGA. A digital mixer with narrow low-pass window (2 kHz), steep roll-off (-45dB/decade) combined with an oversampling and decimating ADC are responsible for a processing gain, dynamic range and alias rejection sufficient to handle weak and strong signal conditions (e.g. contests or listening on 40m just next to broadcasting band).

This experiment is created to try out what is can be achieved with minimal hardware while moving complexity towards software; here 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 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. Feel free to try it out or to experiment with this sketch, let me know your thoughts or contribute here: https://github.com/threeme3/usdx

Note: there is an active online forum discussing the uSDX here: uSDX Forum.

73, Guido [email protected]

List of features:

  • Simple, fun and versatile QRP SSB HF transceiver with embedded DSP and SDR functions;
  • EER Class-E driven SSB transmit-stage
  • Approximately 5W PEP SSB output from 13.8V supply
  • All-Mode support: USB, LSB, CW, AM, FM
  • DSP filters: 4000, 2500, 1700, 500, 200, 100, 50 Hz passband
  • DSP features: Automatic Gain Control (AGC), Noise-reduction (NR), Voice-triggered Xmit (VOX), RX Attentuators (ATT), TX noise gate, TX drive control, Volume control, dBm/S-meter.
  • SSB opposite side-band/carrier supression Transmit: better than -45dBc, IMD3 (two-tone) -33dBc, Receive: better than -50dBc
  • Multiband support, continuously tunable through bands 160m-10m (and from 20kHz..99MHz with loss in performance)
  • Open source firmware, built with Arduino IDE; allows experimentation, new features can be added, contributions can be shared via Github, software-complexity: 2000 lines of code
  • Software-based VOX that can be used as fast Full Break-In (QSK and semi-QSK operation) or assist in RX/TX switching for operating digital modes (no CAT or PTT interface required), external PTT output/PA control with TX-delay
  • Simple hardware design with only 4 ICs, a micro-controller and few transistors/passives
  • Lightweight and low-cost transceiver design: because of the EER-transmitter class-E stage it is highly power-efficient (no bulky heatsinks required), and has a simple design (no complex balanced linear power amplifier required)
  • Fully digital and software-based SSB transmit-stage: samples microphone-input and reconstruct a SSB-signal by controlling the phase of the SI5351 PLL (through tiny frequency changes over 800kbits/s I2C) and the amplitude of the PA (through PWM of the PA key-shaping circuit)
  • Fully digital and software-based SDR receiver-stages (optionally): samples I/Q (complex) signal from Quadrature Sampling Detector digital mixer, and performs a 90-degree phase-shift mathematically in software (Hilbert-transform) and cancels out one side-band by adding them
  • Three independent switchable analog front-end receiver attenuators (0dB, -13dB, -20dB, -33dB, -53dB, -60dB, -73dB)
  • Receiver Noise floor MDS: –135 dBm at 28MHz (in 200Hz BW)
  • Receiver Front-end selectivity: steep -45dB/decade roll-off +/-2kHz from tuned-frequency
  • Blocking dynamic range: 20kHz offset 123dB, 2kHz offset 78dB
  • CW decoder, Straight/Iambic-A/B keyer
  • VFO A/B + RIT and Split, and corresponding relay band-filter switching via I2C
  • CAT support (TS480 subset), possibility to stream audio, keys, display-text over CAT
  • Optional SWR/Power measurement and PA efficiency/overload control
  • Battery voltage indicator
  • Probably the most cost effective and easy to build standalone SDR/SSB transceiver that you can find. Very much simplified circuit and versatile in use.

Revision History:

Rev. Date Features
latest 2021-10-23 Features for final version.
R1.02w 2021-08-23 TX quality improvements, better robustness against RFI feedback, fix VOX issue, single encoder/button-only control option, 16MHz Arduino Uno/Nano support, CW Messages. Key click reduction, TX bandwidth control, OLED fixes, CAT remote control features including RX audio streaming. CW support, TS480 CAT support, RX quality improvments, semi-QSK, PA PTT out with TX-delay, VFO-A/B/RIT, LPF switching, backlight saving, 160m.
R1.02j 2020-10-10 Integrated SDR receiver, CW decoder, DSP filters, AGC, NR, ATT, experimental modes CW, AM, FM, quick menu, persistent settings, improved SSB TX quality. LCD fix, selectable CW pitch.
R1.01d 2019-05-05 Q6 now digitally switched (remove C31) - improving stability and IMD. Improved signal processing, audio quality, increased bandwidth, cosmetic changes and reduced RF feedback, reduced s-meter RFI, S-meter readings, self-test on startup. Receiver I/Q calibration, (experimental) amplitude pre-distortion and calibration.
R1.00 2019-01-29 Initial release of SSB transceiver prototype.

Schematic:

Below the schematic: schematic

Hardware:

There are many uSDX constructions possible, here are a few common implementations:

Partially assembled PCB kits can be obtained from various sources:

This project originally started as a QCX modification:

Firmware: download hex file and do the firmware upload (see also note 1). Use default Arduino Uno fuses (by selecting burn bootloader) and use default CPU clock (16MHz) in case you burn from source code in Arduino IDE.

Operation:

Currently, the following functions have been assigned to shortcut buttons (L=left, E=encoder, R=right) and menu-items:

Menu Item Function Button
1.1 Volume Audio level (0..16) & power-off/on (turn left) E +turn
1.2 Mode Modulation (LSB, USB, CW, AM, FM) R
1.3 Filter BW Audio passband (Full, 300..3000, 300..2400, 300..1800, 500, 200, 100, 50 Hz), this also controls the SSB TX BW. R double
1.4 Band Band-switch to pre-defined CW/FT8 freqs (80,60,40,30,20,17,15,12,10,6m) E double
1.5 Tuning Rate Tuning step size 10M, 1M, 0.5M, 100k, 10k, 1k, 0.5k, 100, 10, 1 E or E long
1.6 VFO Mode Selects different VFO, or RX/TX split-VFO (A, B, Split) 2x R long
1.7 RIT RX in transit (ON, OFF) R long
1.8 AGC Automatic Gain Control (ON, OFF)
1.9 NR Noise-reduction level (0-8), load-pass & smooth
1.10 ATT Analog Attenuator (0, -13, -20, -33, -40, -53, -60, -73 dB)
1.11 ATT2 Digital Attenuator in CIC-stage (0-16) in steps of 6dB
1.12 S-meter Type of S-Meter (OFF, dBm, S, S-bar)
2.1 CW Decoder Enable/disable CW Decoder (ON, OFF)
2.2 CW Tone CW Filter+Side-tone (600, 700)
2.4 Semi QSK On TX silents RX on CW sign and word spaces
2.5 Keyer speed CW Keyer speed in Paris-WPM (1..35)
2.6 Keyer mode Type of keyer (Iambic-A, -B, Straight)
2.7 Keyer swap to swap keyer DIH, DAH inputs (ON, OFF)
2.8 Practice to disable TX for practice purposes (ON, OFF)
3.1 VOX Voice Operated Xmit (ON, OFF)
3.2 Noise Gate Audio threshold for SSB TX and VOX (0-255)
3.3 TX Drive Transmit audio gain (0-8) in steps of 6dB, 8=constant amplitude for SSB
3.4 TX Delay Delays TX to allow PA relay to be fully switched on before TX (0-255 ms)
3.5 MOX Monitor on Xmit (audio unmuted during transmit)
4.1 CQ Interval Idle time in seconds before new CQ Message is given (0-60)
4.2 CQ Message CQ Message text, pressing left-button in menu will start sending L
8.1 PA Bias min PA amplitude PWM level (0-255) for representing 0% RF output
8.2 PA Bias max PA amplitude PWM level (0-255) for representing 100% RF output
8.3 Ref freq Actual si5351 crystal frequency, used for frequency-calibration
8.4 IQ Phase RX I/Q phase offset in degrees (0..180 degrees)
10.1 Backlight Display backlight (ON, OFF)
power-up Reset to factory settings E long
main Tune frequency (20kHz..99MHz) turn
main Quick menu L +turn
main Menu enter L
RIT RIT back R
menu Menu back R

Operating Instructions:

Tuning can be done by turning the rotary encoder. Its step size can be decreased or increased by a short or long press. A change of band can be done with a double 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.

There is a menu available that can be accessed by a short left press. With the encoder it is possible to navigate through this menu. When you want to change a menu parameter, a press with left button allows you to change the parameter with the encoder. With the right button it is possible to exit the menu any time. A fast access to the menu and parameter can be achieved by pressing the left button while turning the encoder, once you lift the left button you can immediately change the parameter by turning the encoder.

For receive, by default an AGC is enabled. 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. To use the available dynamic range optimally, you can attenuate incoming signal by enabling a front-end attenuator with "ATT" parameter. Especially on 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. 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; alternatively you can measure the XTal frequency with a counter and set the parameter. 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).

For SSB voice operation, connect a microphone to the paddle jack, a PTT or onboard "key" press will bring the trasnceiver into transmit. With the "TX Drive" parameter, it is possible to set the mdulation depth or PA drive, it is default set to 4 increasing it gives a bit more punch (compression for SSB). Setting it to a value 8 in SSB means that the SSB modulation is transmitted with a constant amplitude (possibly reducing RFI but at the cost of audio quality). To monitor your own modulation, you can temporarily increase MOX parameter. Setting menu item "VOX" to ON, enters the transceiver in Voice-On-Xmit operation (in TX mode as soon audio is detected), the VOX sensitivity can be configured in the menu with "VOX threshold" parameter. The PA Bias min and max parameters sets the working range of the PWM envelope signal, a range of 0-255 is the full range which is fine if you use a key-shaping circuit for envelope control, but when you directly bias the PA MOSFETs (note 3) with the PWM signal then you specifiy the optimal working range from just above the MOSFET threshold level to the maximum peak power you would like to use (0-180 are good values on my uSDX).

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 (JTDX for instance). The sensitivity of the VOX can be set in the "VOX threshold" parameter.

On startup, the transceiver is performing a self-test (when DIAG option is enabled). It is checking the supply and bias voltages, I2C communications and algorithmic performance. In case of deviations, the display will report an error during startup. It also discovers the capabilties of the transceiver depending on the mods made.

Technical Description:

Below the block diagram of the uSDX transceiver: block diagram

For SSB reception, the a digital SDR phasing stage is used; this means that a Tayloe Quadrature Samplimg detector supplies individual I and Q outputs, directly fed into the ATMEGA328P ADC inputs for signal processing. The ATMEGA328P (over-)samples the ADC input at a 62kHz sample-rate, an 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. The ADC inputs are low-pass filtered (-40dB/decade roll-off at 1.5kHz cut-off) to prevent aliasing and input are biased with a 1.1V analog reference voltage to obtain additional sensitivity and dynamic range. 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 MOSFET switch Q5 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.

For SSB transmission the uSDX is using a dedicated ADC input as audio-input. An electret-microphone (with PTT switch) is combined with the Paddle jack input, whereby the DOT input acts as the PTT and the DASH input acts as the audio-input. The electret microphone is biased with 5V through a 10K resistor. A 10nF blocking capacitor prevents RF leakage into the circuit. The audio is fed into ADC2 input of the ATMEGA328P microprocessor through a 220nF decoupling capacitor. The ADC2 input is biased at 0.55V via a divider network of 10K to a 1.1V analog reference voltage, with 10-bits ADC resolution this means the microphone-input sensitivity is about 1mV (1.1V/1024) which is just sufficient to process unamplified speech.

uSDX firmware is uploaded to the ATMEGA328P, and facilitates a digital SSB generation technique in a completely software-based manner. A DSP algorithm samples the ADC2 audio-input at a rate of 4x4800 samples/s, performs a Hilbert transformation and determines the phase and amplitude of the complex-signal; the phase-changes are restrictednote 2 and transformed into either positive (for USB) or negative (for LSB) phase changes which in turn transformed into temporary frequency changes which are sent 4800 times per second over 800kbit/s I2C towards the SI5351 PLL. This result in phase changes on the SSB carrier signal and delivers a SSB-signal with a bandwidth of 2400 Hz whereby spurious in the opposite side-band components is attenuated.

The amplitude of the complex-signal controls the supply-voltage of the PA, and thus the envelope of the SSB-signal. The key-shaping circuit is controlled with a 32kHz PWM signal, which can control the PA voltage from 0 to about 12V in 256 steps, providing a dynamic range of (log2(256) * 6 =) 48dB in the SSB signal. C31 is removed to ensure that Q6 is operating as a digital switch, this improves the efficiency, thermal stability, linearity, dynamic range and response-time. Though the amplitude information is not mandatory to make a SSB signal intelligable, adding amplitude information improves quality. The complex-amplitude is also used in VOX-mode to determine when RX and TX transitions are supposed to be made. Instead of using a key-shaping circuit for evelope control, it is possible to directly bias the PA MOSFETs with the (filtered) PWM signal. This has the advantage of less losses and simplifies at the cost of linearity which result in more compression for an SSB signal (which is actually a good thing).

The IMD performance is related dependent on the quality of the system: the linearity (accuracy) of the amplitude and phase response and the precision (dynamic range) of these quantities. Especially the DSP bit-width, the precision used in the DSP algorithms, the PWM and key-shaping circuit that supplies the PA and the PA phase response are critical. Decreasing (or removing) C32 improves the IMD characteristics but at the cost of an increase of PWM products around the carrier.

Results

Here is a sample me calling CQ on 40m with my uSDX at 5W and received back by the Hack Green websdr about 400km away, note that the audio quality has further improved since then.

Several OMs reported a successful QRP DX contacts.

Measurements: The following performance measurements were made, a modified RTL-SDR, Spektrum-SVmod-v0.19, Sweex 5.0 USB Audio device and Audicity player. It is recognized that this measurement setup has its own limitations, hence the dynamic range of the measurements is somewhat limited by the RTL-SDR as this device goes easily into overload. Measurements were made with the following setttings: USB modulation, no pre-distortion, two-tone input 1000Hz/1200Hz where audio level is set just before the point where compression starts. Results:

  • Intermodulation distortion products (two-tone; SSB with varying envelope) IMD3, IMD5, IMD7: respectively -33dBc; -36dBc; -39dBc
  • Intermodulation distortion products (two-tone; SSB with constant envelope) IMD3, IMD5, IMD7: respectively -16dBc; -16dBc; -19dBc
  • Opposite side-band rejection (two-tone): better than -45dBc
  • Carrier rejection (two-tone): better than -45dBc
  • Wide-band spurious (two-tone): better than -45dBc
  • 3dB bandwidth (sweep): 0..2400Hz twotone

Notes:

  1. Firmware upload variations:
  • AVRDudess tool or avrdude CLI (avrdude -c avrisp -b 19200 -P /dev/ttyACM0 (or: /dev/ttyUSB0) -p m328p -e -U efuse:w:0xFD:m -U hfuse:w:0xD6:m -U lfuse:w:0xFF:m -U flash:w:R1.0x.hex) can be used for uploading the firmware via the ISP connector on the uSDX. Follow Arduino as ISP instructions if you have a Arduino UNO board available (tip: use female-to-male breadboard cables to connect Arduino to uSDX ISP jumper); or USBasp instructions if you have a USBasp programmer, alternatively use USPasp ExtremeBurner; but many other ISP programmers can be used in similar manner such as USBtiny or AVRisp mkII. During ISP, mic should be disconnected, power supply should be connected; in tool do not erase, program EEPROM or set fuse settings (they are by default ok: E=FD H=D6 L=FF).
  • Alternatively, in case you have an ATMEGA328P chip with Arduino bootloader, you can place the chip in an Arduino UNO board and upload directly (without the need for a ISP cable and uSDX) by specifying 'arduino' programmer and baudrate 115200.
  • Alternatively, in case you have an Arduino 1.8.10 (or newer) environment installed, you can upload the uSDX Sketch directly from the Arduino environment (without using AVRDudess and firmware file); make sure "Tools > Board > Arduino/Genuino Uno", "Tools > Port > /dev/ttyUSB0 or ttyACM0", and then "Sketch > Upload" is selected, while the ATMEGA328P chip is placed in the Arduino UNO socket. It is also possible to use Arduino as ISP method: upload this variation of ArduinoISP to the Arduino board and select "Tools > Programmer > Arduino as ISP", and "Sketch > Upload Using Programmer".
  1. The occupied SSB bandwidth can be further reduced by restricting the maximum phase change (set MAX_DP to half a unit-circle _UA/2 (equivalent to 180 degrees)). Audio-input can be attenuated by increasing parameter MIC_ATTEN (6dB per step).
  2. Alternatively, the PA MOSFETs can be directly biased by the PWM envelope signal, basically making the key-shaping circuit redundant. To do so, Q6,Q4,R41,R42,C32,C31 can be removed entirely, whereby C-E pads of Q6 are wired, and where a 10nF capacitor is inserted at IC3A-pin3 and G of Q1-3, and where a 10k resistor is placed at G-D pads of Q4, a 10nF capacitor between S-D pads of Q4, and where a 10k resistor is placed between D of Q4 and G of Q1-3.

Credits:

The uSDX was originally announced in the QRPLabs Forum as a SSB modification for a QCX: QCX is a QRP Labs CW Xcvr kit designed by Hans Summers (G0UPL), originally built for RSGB's YOTA summer camp 2017, a high performance, image rejecting DC transceiver; it is basically a simplified implementation of the NorCal 2030 by Dan Tayloe (N7VE) designed in 2004 combined with a Hi-Per-Mite Active Audio CW Filter by David Cripe (NMØS), Low Pass Filters from Ed (W3NQN) 1983 Articles, a key-shaping circuit by Donald Huff (W6JL), a BS170 switched CMOS driven MOSFET PA architecture as used in the ATS designs by Steven Weber (KD1JV) (originating from the Power MOSFET revolution in the mid 70s), a Ghetto-class-E filter-network published by Paul Harden (NA5N) and an Atmel ATMEGA328P microprocessor, a Hitachi HD44780 LCD display and a Silicon Labs SI5351 Clock Generator (and using a phase shift in the SI5351 clocks).

The uSDX transmitter and receiver stage both running on a ATMEGA328P, including its multiband front-end and direct PA biasing/envelope-generation technique; its concept, circuit, code are a design by Guido (PE1NNZ); the software-based SSB transmit stage is a derivate of earlier experiments with a digital SSB generation technique on a Raspberry Pi. The uSDX sandwitch PCB and class-E LPF design, is the work of Manuel (DL2MAN). Many thanks to all of you who got interested in this project and took the challege and effort to try out and further develop the uSDX; without your valuable feedback and contributions the project could not have kept moving on, improving and challenging new ideas!

usdx's People

Contributors

abbrev avatar adecarolis avatar howard0su avatar threeme3 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

usdx's Issues

Manufacturer defect and replacement of IRF510 in usdr qrp transceiver.

Hello,
20231118_232318
20231118_232216
20231111_113032
20231116_172214

I purchased the USDR QRP Tranceivers radio. Unfortunately, the radio never worked on broadcast. When I opened the device, I noticed that the IRF 510 component was not correctly soldered to the circuit. 1 pin was not soldered. See in PJ. I am looking for the diagram of the electronic circuit of this uSDR QRP Transciever device ? (10 watt model with external power supply). Do you have ?
What do you think about this problem ?

Thank you for your help.

  • Best Regards,

Add menu item

thanks  I have a question: I would like to add an item to the menu using your comment: # define N_ PARAMS 44+4//number of (visible) parameters//visible menu items and enum params_ t also modified switch (id) {//Visible parameters
After the case ADD is completed, the newly added menu item in USDX displays garbled code. I don't know where the problem is

Switching Mode with Right Button causes two rewrites of second row of LCD.

Hi!

Here's a trace of the traffic that goes to the LCD when somebody pushes the right button to switch mode (USB to CW in this case). The first column is RS, the second column is the 8 bits of command/data, and the rest of the line shows the contents of the ddRam. The ddRam data also shows the cursor position which, unfortunately, obstructs that one byte.

Anyway, the issue is that there are two rewrites of the second line of the display when only one is required. It looks like the first rewrite is showing what would appear if menu mode was 1 but is immediately overwritten with the info that's supposed to appear.

This is not a big deal but I thought I'd mention it anyway!

Adrian / kr0dak

0 11000000 uSDX.                                                           _14,074,00 USB R                                                
1 01001101 uSDX.                                                           M_4,074,00 USB R                                                
1 01101111 uSDX.                                                           Mo_,074,00 USB R                                                
1 01100100 uSDX.                                                           Mod_074,00 USB R                                                
1 01100101 uSDX.                                                           Mode_74,00 USB R                                                
1 00111010 uSDX.                                                           Mode:_4,00 USB R                                                
1 00100000 uSDX.                                                           Mode: _,00 USB R                                                
1 01000011 uSDX.                                                           Mode: C_00 USB R                                                
1 01010111 uSDX.                                                           Mode: CW_0 USB R                                                
1 00100000 uSDX.                                                           Mode: CW _ USB R                                                
1 00100000 uSDX.                                                           Mode: CW  _USB R                                                
1 00100000 uSDX.                                                           Mode: CW   _SB R                                                
1 00100000 uSDX.                                                           Mode: CW    _B R                                                
1 00100000 uSDX.                                                           Mode: CW     _ R                                                
1 00100000 uSDX.                                                           Mode: CW      _R                                                
1 00100000 uSDX.                                                           Mode: CW       _                                                
1 00100000 uSDX.                                                           Mode: CW        _                                               
1 00100000 uSDX.                                                           Mode: CW         _                                              
1 00100000 uSDX.                                                           Mode: CW          _                                             
1 00100000 uSDX.                                                           Mode: CW           _                                            
1 00100000 uSDX.                                                           Mode: CW            _                                           
1 00100000 uSDX.                                                           Mode: CW             _                                          
1 00100000 uSDX.                                                           Mode: CW              _                                         
1 00100000 uSDX.                                                           Mode: CW               _                                        
1 00100000 uSDX.                                                           Mode: CW                _                                       
1 00100000 uSDX.                                                           Mode: CW                 _                                      
1 00100000 uSDX.                                                           Mode: CW                  _                                     
1 00100000 uSDX.                                                           Mode: CW                   _                                    
0 11000000 uSDX.                                                           _ode: CW                                                        
1 00000110 uSDX.                                                           ._de: CW                                                        
1 00110001 uSDX.                                                           .1_e: CW                                                        
1 00110100 uSDX.                                                           .14_: CW                                                        
1 00101100 uSDX.                                                           .14,_ CW                                                        
1 00110000 uSDX.                                                           .14,0_CW                                                        
1 00110111 uSDX.                                                           .14,07_W                                                        
1 00110100 uSDX.                                                           .14,074_                                                        
1 00101100 uSDX.                                                           .14,074,_                                                       
1 00110000 uSDX.                                                           .14,074,0_                                                      
1 00110000 uSDX.                                                           .14,074,00_                                                     
1 00100000 uSDX.                                                           .14,074,00 _                                                    
1 01000011 uSDX.                                                           .14,074,00 C_                                                   
1 01010111 uSDX.                                                           .14,074,00 CW_                                                  
1 00100000 uSDX.                                                           .14,074,00 CW _                                                 
1 00100000 uSDX.                                                           .14,074,00 CW  _                                                
1 00100000 uSDX.                                                           .14,074,00 CW   _                                               
1 00100000 uSDX.                                                           .14,074,00 CW    _                                              
1 00100000 uSDX.                                                           .14,074,00 CW     _                                             
1 00100000 uSDX.                                                           .14,074,00 CW      _                                            
1 00100000 uSDX.                                                           .14,074,00 CW       _                                           
1 00100000 uSDX.                                                           .14,074,00 CW        _                                          
1 00100000 uSDX.                                                           .14,074,00 CW         _                                         
1 00100000 uSDX.                                                           .14,074,00 CW          _                                        
0 11001111 uSDX.                                                           .14,074,00 CW  _                                                
1 01010010 uSDX.                                                           .14,074,00 CW  R_                                               
0 11000111 uSDX.                                                           .14,074_00 CW  R                                                
0 00001110 uSDX.                                                           .14,074_00 CW  R                                                

Internal Pull-Up issue with minicore

Hi!

First, thank you for this project, it's really cool!

I am playing with your code and I have an issue with the INPUT_PULLUP.

When I use MiniCore (version 2.1.3 in the arduino IDE 1.8.16), the PD7 and PD7 lines are not pulled up. This causes the rotary encoder not working. If I add two 10k resistors the rotary encoder works well.
If I use the regular arduino Uno board (in the IDE), the pull-up function works fine. But I encounter another issue : the pull-up is applied on all of the input, especially on the PC3 input. I get about 1,2V when no button is pressed. This causes an issue with the voltages thresholds.

Did you already have this behavior ?

Exiting the 'Menu' when using CAT_EXT

Hello!

The following CAT commands work pretty well.

;ID;

;FD;

;FA00014074000;

;UK84;

;UK44;

By using the ;UK84; CAT_EXT command, I can enter the 'Menu' and change various settings.

However, I have been unable to find a CAT command which will allow me to exit this 'Menu' on the uSDX. Is there a CAT command which allows exiting the 'Menu' on the uSDX?

Thanks for the help, and for this superb, and fun project.

Cheers and 73,
Dhiru (VU3CER)

2m band

Hi, in source code is in band variable 2m frequency. Will the transmitter works in 2m band ? and how about receiving ? My idea is down converter to 28 MHz.

73 Ondra OK1CDJ

Split out ino file into multi files

It is inconvenient to maintain such big file. Also this limit us to build the different firmware for the different board by default. I would suggest to do the following folder structure to organize the code instead:

src/*.h -> the main source code. We can split the code into multi .h files like cat.h, radio.h, menu.h, globals.h, lcd1602.h, si5351.h, led.h, debug.h
QCX-SSB/QCX-SSB.ino -> the build folder to build QCX-SSB firmware. This ino contains the definition and a serial of includes to include the files in src/
uSDX/uSDX.ino -> the build folder to build uSDX firmware.
uSDX_ABC/uSDX_ABC.ino -> another build for another board.

Thoughts?

Filter BW for TX is capped at a max of 2.4kHz

0 Hz - 5kHz sweep test while transmitting into a dummy load using different Filter BW settings:
5khz sweep full bw
5khz sweep 3khz bw
5khz sweep 2 4khz bw
5khz sweep 1 8khz bw

As you can see, Full, 3kHz, 2.4kHz don't do anything - the radio still transmits with a bandwidth of 2.4kHz. Setting it to 1.8kHz finally does work.

Also, frequencies higher than 2.4/1.8 kHz fold over (is aliasing the right term here?) and therefore the spectrum does not look clean.

Is the TX filter BW cap of 2.4kHz intentional or is this a bug?

Settings used:
TX Drive: 2
Noise gate: 4
PA min bias: 0
PA max bias: 128

Software and hardware:
v1.02w firmware
DL2MAN sandwich

Main screen banner is overwritten by decoded CW after switching off CW decoder

Minor issue:

  1. Power on uSDX
  2. Go to CW Decoder setting and switch ON
  3. Return to main screen
  4. Allow decoded characters to accumulate
  5. Go to CW Decoder setting and switch OFF
  6. Return to main screen

What's wrong: When returning to the main screen in the final step, the "uSDX▶" banner briefly appears but is immediately overwritten by the previously decoded CW data.

OLED SSD1306 128 x 64 (cheap, common (China) 0,91" I2C )

Hi Guido,

Amongst fellow uSDX'rs I found troubles with my OLED's 1306 if I do not adapt the latest (since november 22) "m" firmware:
line 687: #define BRIGHT 1 ( must be un-comment)
and/or
line 699: 0x81, /32/ 0x7F, // Set contrast control register
to: 0x81, /128/ 0x7F, or: 0x81, /64/ 0x7F,
However with (much) lower brightness if # define BRIGHT 1 is commented
Furthermore some characters, like the ones used in the uSDX banner and VFO a / b indicators show up unreadable / unrecognizable.
Personally: I do not like the "line printer, interlaced characters" that show up on the OLED, knowing that it can be beautiful sharp (and even display 5 very good readable lines)
I found a SSD1306 library (maybe you know it already) with fast I2C :

https://github.com/greiman/SSD1306Ascii

and used it to very simply replace code for an LCD 2004 in an Arduino SWR / PWR meter project and even succeeded in
putting more information on the display.
Please check if this library could make things easier for the OLED driver impact (and nicer for the looks :-)

73' s
Cees, PE1DDA

Freezes in TX with v 1.02e?

Hi Guido,

I recently updated from the 5/17 v 1.02d QCX-SSB.ino to the 6/3 v 1.02e.

After reboot, everything seemed good until I clicked the right button and then radio went in to TX and froze. After another reboot it was still frozen in TX, and the frequency was missing from the display.

The hardware is the Rev 5 QCX board built per Manuel's v 1.02 instructions. I have not done the 'magic witchery mod'. I also have a 10m LPF installed on the board.

I tried a few older commits between 6/3 and 5/17, but it did the same thing.

I am now back to the 5/17 commit and everything is back to normal.

Any ideas?

Cheers,
Casey

PS - Below are my first ever reports on 10m and FT8 thanks to your project!

first qcx-ssb ft8 rx reports 2020 06 03

Delay lines

Hi Guido,
the delay lines may include a bug or an extra element which can be removed.
For example: https://github.com/threeme3/QCX-SSB/blob/1e97ccae49598a3068d1127e87b88c947348909b/QCX-SSB.ino#L1810-L1813

The current value gets written into v[7] but in the end, v[7] is also copied into v[6] causing the delay line to be shortened to 7 elements instead of 8. If the lines 1811 and 1813 would be swapped, we would get a delay line with 8 elements. Or cut the array to 7 elements and go with i = v[0]; v[0] = v[1]; v[1] = v[2]; v[2] = v[3]; v[3] = v[4]; v[4] = v[5]; v[5] = v[6]; v[6] = ac2 >> att2; - dunno what is intended here :).

Same applies to:
https://github.com/threeme3/QCX-SSB/blob/1e97ccae49598a3068d1127e87b88c947348909b/QCX-SSB.ino#L1870-L1873
https://github.com/threeme3/QCX-SSB/blob/1e97ccae49598a3068d1127e87b88c947348909b/QCX-SSB.ino#L1963-L1966
https://github.com/threeme3/QCX-SSB/blob/1e97ccae49598a3068d1127e87b88c947348909b/QCX-SSB.ino#L1984-L1987

73, DC1MP

Lcd flickers messed up, displaying random letters

Hello Mr. Guido PE1NNZ
Thank you very much for sharing this great program, I want to try to follow what you have done but after VERSION "1.02a" upload was successful, I got a messed up letter on the LCD, it doesn't work as it should, can you give advice and help to solve it? correctly.
Forgive my English is not good, thank you.

Recent versions don't compile if "#define KEYER" is commented out.

Hi! Minor problem... ditTime is defined when KEYER is defined. However, it used in code that compiles when KEYER is not defined. Looks like it's related to semi QSK change. The following shows the compile error when #define KEYER is commented out.

/home/adrian/Downloads/QCX-SSB/QCX-SSB.ino: In function 'void switch_rxtx(uint8_t)':
QCX-SSB:3119:37: error: 'ditTime' was not declared in this scope
       semi_qsk_timeout = millis() + ditTime * 8;
                                     ^~~~~~~
/home/adrian/Downloads/QCX-SSB/QCX-SSB.ino:3119:37: note: suggested alternative: 'nbtime'
       semi_qsk_timeout = millis() + ditTime * 8;
                                     ^~~~~~~
                                     nbtime
exit status 1
'ditTime' was not declared in this scope

QCX resets after transmit and VOX not working

Hello,
I've flashed my QCX with the 1.01s firmware and performed the hardware modifications detailed on the master branch (not the experimental one).

However, I'm having trouble using VOX and transmitting. When enabling VOX, it shows up as enabled, however the radio doesn't respond to sound being injected on the microphone. This might be some issue with my cabling, which I have yet to check, but I wanted to report anyway, in case it relates to the next problem:

Immediately after transmitting, my QCX resets even if VOX is not enabled. At first I suspected a power issue, but measuring the voltage and keeping the PTT pressed showed power was actually okay. Also, I can transmit indefinitely, the radio only resets when I release the PTT.

How do you thing I can troubleshoot my problems? How can I help solving these issues?

Thanks for the great work!
PY3PK

AGC low volume bug

Seems like sometimes the AGC does not recover. The easiest way I found to reproduce this bug is to quickly switch between all ham bands by double clicking the rotary encoder. The volume will become very low. Power cycling the radio brings the volume back to normal levels.

Tested on latest feature-rx-improved firmware.

S- meter zero/calibrating

The S meter shows a value of 4 when the input is closed. I would like to ask how to set it to 0 or calibrate it.
Is it possible at all?
Thank you!
Ferenc.

27Mhz

Hello
Would this device be possible to use it to transmit and receive in 27Mhz (Citizen Band with 40 channels) possibly with SSB (USB and LSB)?

I think it would be great coupled with JS8Call on a RaspberryPi4

1.3" SSH1106 OLED not working in v1.02w (and a weird fix)

In v1.02w using #define OLED_SH1106 the OLED does not work.
Using #define OLED_SSD1306 display turns on, but it is very glitchy.

To fix this, I simply moved 0x8D, 0x14, // Set charge pump, internal VCC out of, and above #ifndef OLED_SH1106. This made the display turn on without any glitches.

The display was also shifted by a few pixels to the right, so to fix this I removed:

#ifdef OLED_SH1106
    _oledX += 2; // SH1106 is a 132x64 controller.  Use middle 128 columns.
#endif

73 de LY5NF

Blank screen on my USDX+ hf transceiver, all functions work

I can receive and transmit, change bands, but screen is blank. Can’t see frequency or menu. Backlight on screen works, just no alpha/numeric text.
IMG_5105
IMG_5104
How can I get it to work. Is there a reset or a way to update to get it to work again.

ATS link in the README.md is bad

Hi Guido,
For some reason the link for ATS in the Readme is going to the main yahoo page or something, not anything relevant.
Thanks for your great work here, and for the references!
73,
Rob
KL7NA

In the receive description of the README, I think Q6 is a typo, and it should be Q5.

The sentence where I believe Q6 should be Q5 is:

Three embedded attenuators are available for optimally using dynamic range; the first attenuator is the RX MOSFET switch Q6 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.

Rob

CW message auto tx broken in 1.02w

I'm trying out the CW auto tx function in 1.02w. It doesn't work, just shows a 0 in the display and exits. I don't know if this is not yet implemented in this version (a note in the definition header would have saved me and other people some time) or if it was working but it was seriously broken in this version.

Dead audio when using VOX with SSB mods

Hello,
I've finally made this project work on my QCX and performed only the SSB modifications. What I noticed is that, when VOX is enabled, the RX audio disappears (just noise), even when VOX isn't triggered (V showing on LCD, not transmitting). I'm running v1.02a and my RX audio works normally when VOX is disabled.

Extreme redundancy of LCD updates when menumode > 0

Hi! When menu mode is > 0, the following code in loop() updates the LCD on every iteration. Could you make the update happen only when it's actually required? I'm experimenting with a display option that would greatly benefit from not being overwhelmed by redundant LCD updates.

  bool param_change = (encoder_val != 0);
  if(menumode != 0){  // Show parameter and value
    if(menu != 0){
      paramAction(UPDATE_MENU, menu);  // update param with encoder change and display

I tried a version that defined some new change conditions and added an if (param_change || menumode_change || menu_change) before the paramAction call, but I'm not confident that I understand the loop logic well enough to submit it as a reasonable pull request.

Slow AGC issue on strong signals

Hi Guido,

There is an issue with the slow AGC algorithm. When receiving a very strong signal, the AGC stays blocked and never increases the gain. I modified the code to display the centiGain value on the S-meter, and when this happens I can see that the centiGain value is 15. This causes the gain to never increases when the strong signals disappears because 15 >> 4 = 0. We needs to stay > to 16.

To solve this issue, I modified the strong signal condition, from :

if(HI(abs(out)) > HI(1536)){
to
if(HI(abs(out)) > HI(1536) && centiGain > 16){

Maybe there is a more elegant way to solve this issue but it works on my side.

Regards,

Sebastien.

Switching off automatic decoder CW

In the latest version, the CW automatic decoder cannot be switched off. This is very annoying for us, what we can do CW better than that decoder. Please return the shutdown. Thank you. Milan OK1IF

Entry into menumode 1 only displays correctly on first entry.

Repro steps:

  1. Start uSDX
  2. Press left button
  3. Note that 1.1 Volume and +12 are displayed indicating that menu mode 1 has been entered.
  4. Press right button
  5. Note that we're now in menu mode 0, according to display.
  6. Press left button (and resist urge to press it again if you don't get what you expect)
  7. Note that display does not change.
  8. Press left button
  9. Note that 1.1 Volume and >+12 is displayed indicating that menu mode 2 has been entered.

I believe this is happening because prev_menumode is initialized to 0 but never ever returns to 0 because it's only ever changed inside an if (menumode != 0). As a result, going into menu mode 1 results in a correct display update only the first time the left button is pressed.

Uncommenting "#define MOX 1" results in compile errors.

In order to re-enable MOX, I uncommented the #define MOX 1 line. Unfortunately, this leads to compile errors, presumably because the symbol MOX is used in the definition of enum params_t. Perhaps change #define MOX 1 to define MOX_ENABLED 1 and change the corresponding #ifdef MOX directives to #ifdef MOX_ENABLED?

Support WSPR

It now has some ROM space to add the support to transit WSPR beacons.

We can create a simple webpage to encode the data of the callsign, position, 5w for WSPR. This will creates a symbol list with 162 4FSK symbols. It can combined into 81 uint8_t if concerning the space. Then it can be compiled into the firmware.

Introduce a new mode called WSPR to transmit. The precise timestamp can be feed by human by click the button to give a precise start time. Then the machine can measure the time. Later on, we can add the support reading from GPS.

WSPR mode can have the following parameters:

  1. idle time -- how much slot to become idle.
  2. bands -- transit on how many bands
  3. bands random - random select bands or one-by-one order.

Thoughts? I need some help to guide me how to do the transition of WSPR symbols.

QCX+

Will you be making a guide/new version for the new QCX+ transceiver. It seems like QRP labs are fully stopping the production of them and switching to the QCX+.

Changing version number causes continual reset every power-up - bug

Seems to be that a variable is the wrong size:-
Line 4092: uint8_t eeprom_version;
Needs to be:-
uint16_t eeprom_version;
As VERSION requires a 16-bit variable to hold the fixed format serial.
This can cause continual resetting if the version is changed during reprogramming, because the reset code compares the 16-bit VERSION value with the stored 8-bit version, dependant on the serial number set and truncation effect.

11 meter band request

Hello folks !!! cogartulations for the wonderfull code !!!!!
Is it possible to include the 11 meter band in the trasnmiter bands ???
I am ham operator, as well, CB operator...
enabling 11 meter would be a very usefull feature !!!

Suggestion: better volume control when using the M0PUB AGC

The new slow AGC algorithm already uses a multiply, so how about, if it's active, make the AGC threshold a function of volume and skip the right-shift volume control (which sounds like crud at any setting below 8). There should be no CPU penalty — the thresholds can be in a PROGMEM lookup table (just 52 bytes or so) and eliminating the right-shift should about make up for the cost of fetching them to register.

I'd try it myself and send a PR, but I'm more of a software guy than a hardware guy; I bought an eBay unit and I haven't gotten it disassembled far enough to get at the ISP connector yet :)

Speed CW BUG

Hi Guido. There is a small bug in version 1.02r. The set CW speed does not correspond to reality. E.g. set to 16WPM is actually 19WPM. Milan OK1IF

VOX not enabled using menu

Using 1.02h code

For a long time I was not able to get the VOX to work. After troubleshooting and finding no problem, I finally tried enabled VOX using the Right Button Long and then it worked. So setting the VOX on using the menu does not seem to enable VOX, but the Right Button Long does. I have low RF output but I know that is caused by the LPF and I can fix that. Except for this issue, everything is working great, working FT8 on 30 M. Started with a new QCX+ and followed the modification instructions. Thanks for all your work

73, Greg
KD4VV

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.