threeme3 / usdx Goto Github PK
View Code? Open in Web Editor NEWSimple and experimental (class-E driven) SSB transceiver.
Simple and experimental (class-E driven) SSB transceiver.
Hi,
after building new PCB v1.02 and flashing firmware (1.02w, 1.02x) got problems with 1602 LCD. I think dash is moving properly but digits are not displaying.
After some research got working LCD only on default fuse bits for Atmega328P@8MHz (L: 0x62, H:0xD9, E:0xFF) but of course other/main functions are not working.
https://drive.google.com/file/d/1cpBDkpfa7Jofspr-XiyinPdXa4Yp9wTN/view?usp=drive_link
I saw the code but I cannot figure out how to use it.
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
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
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
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!
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)
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
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 :)
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
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 ?
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.
Hi @threeme3, is there a reason that I2C is bit banged on pins that support hardware I2C? Specifically in class I2C
:
We can probably at least reduce the code size a little by using the hardware I2C (though it probably wouldn't reduce the CPU load since we'd still have to synchronously wait for each byte to transfer).
The title says it all ;-)
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.
0 Hz - 5kHz sweep test while transmitting into a dummy load using different Filter BW settings:
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
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.
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.
Problem solved...
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
Repro steps:
1.1 Volume
and +12
are displayed indicating that menu mode 1 has been entered.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.
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
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.
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
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
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:
Thoughts? I need some help to guide me how to do the transition of WSPR symbols.
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
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?
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.
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
Fantastic project!
Just starting my QCX-SSB build.
Cheers,
Casey
KC1JHV
Whit VOX on, but no transmit "trigger" f.i. when using FT8, the signal meter freezes in all modes, both h and i version of software
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.
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.
Hello,
Thanks for all the hard work. I have found the source code. Thank you
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
?
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 !!!
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
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.
Minor issue:
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.
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+.
Repro steps:
An "x" remains on the top line of the LCD display.
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
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
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.