PCM Hawk Arduino VFO.

V

VK3ZYZ

Guest
On snooping in a second hand shop, I spotted a lonely looking HF transceiver priced at $60, marked down to $30. Not too bad for a 100W SSB set!
This started my exploration of HF.

This is the first Arduino VFO I did. It ended up looking like this.
Front View.jpg

This set was only fitted with 2 channels so more coils are needed to add more bands. As yet, I do not have them.
After discovering the Si5351 tripple VFO board, and playing with that for a bit, I decided to start the conversion. The crystals have been removed and the PCB I drew up a to hold an Arduino Nano and the Si5351 VFO board is mounted on a 3D printed spacer screwed to the side frame.
CloseUpTopView.jpg


A string of resistors fit nicely between the old crystal switch terminals to produce a resistive divider that feeds a stepped voltage to the Arduino so it knows what band is selected. The PCB has a couple of cuts to suit.

BandSelectConnections.jpg


As I did not want to cut large holes in the front, a 3D printed display box fits over the speaker and is held in by magnets. Just a small hole is needed to feed the 4 wires out to drive the I2C LCD.
3D front1.jpg

The above is a quick introduction to this project.

Here below is a bit more detail, a pdf of the build, some Arduino code and the service manual.
And the info of #1 VFO.
This set is calling out for the Adaptive VFO talked about elsewhere in this forum.
 

Attachments

V

VK3ZYZ

Guest
Just out on interest, I hooked the "VFO Delux" to the Hawk for the club net tonight (20210106) and it worked well :)
VFO_Delux_Hawk.jpg
 
V

VK3ZYZ

Guest
The code now includes a calibration factor. It is nice to have a good frequency counter!
Also, the USB/LSB would work if I replaced the crystal with the CLK1 output.
That will get done later.
Here is the new code, as well as the Si5351 calibration sketch.
This code generated 10Mhz from CLK0 and the Arduino Serial Monitor at 115200 Baud used some keys to adjust the 10Mhz.
A calibration number is produced that is added as below.

This is the Si5351 calibration mods...
.
.
int32_t cal_factor = 19100; // found from Si5351 calibrator sketch.
.
.
.
clockgen.init(SI5351_CRYSTAL_LOAD_8PF, 0, 0);
clockgen.set_correction(cal_factor, SI5351_PLL_INPUT_XO); // <<<<<<<this is found from Si5351 calibrator code.

.
.

This code will work with few mods on a lot of old radios that have a 1.65Mhz IF.
 

Attachments

V

VK3ZYZ

Guest
1.65MhzFilter.png

I have removed the 1.65Mhz crystal, and the 2 x 100nF caps from the oscillator, and added a filter to the BFO signal now produced from the Si5351 board. Now, the Hawk has USB/LSB switching.
These values are not exact according to the calculator, but the signal is now a sine wave.
BFO_filter_Connections.JPG

The output from the filter is connected as above.

This is the "Birds nest" band pass filter.
Birdsnest_BFO_Filter.JPG

I may make up a PCB for this later. There could well be a use for handy filter boards. Diode switching on board could be good.
The main Si5351 output having switched filters springs to mind.
 

Attachments

Last edited by a moderator:

VK3ZYZ

Moderator
Staff member
I've started on VK3KAL's PCM Kestrel.
The synth I'm installing is the Tracker Communications Scout board.
Arduino_VFO_top.jpg


The carrier injection, 1.650Mhz/1.647Mhz is fed into the existing 1.650Mhz osc after the crystal and C16 and C17 have been removed.

Carrier_Osc_Mods.jpg

Removing the caps stops the crystal oscillator, so it is now just a buffer. The coax braid goes to what was one end of C116, and the center to C117.


To prevent the channel oscillator running, one end of R89 is lifted from the board, removing the power.
R89_Lifted.jpg

It is a bit hard to see.

Then, the signal from the synth is fed into TP12, with the coax braid soldered to the ground plane.
Channel_Injection_TP12.jpg


More to follow.......
 

VK3ZYZ

Moderator
Staff member
I have it working (sort off) on a couple of bands.
The channel crystals have been removed and that selector switch bank used as the band switch.
PCM_ChanSwitching1.jpg

The osc feed cap has one end lifted to stop 10V pulse driving into the osc transistor, and the switch wiper connected to 10V.
The clarifier pot is just tied out of th way as it is not used now. Its place has the encoder fitted.


PCM_ChanSwitching2.jpg

All the blue wires are from an exiting mod, and I'm still trying to work it out. There is a "funny" with the second half of the channel switch that uses a relay to select it somehow. I think it is to do with a different channel TX and RX frequency option????


One problem is the RF coils supplied, and there is not a full frequency range. Another is the narrow band width of the could, so I may have to use a couple of "channels" per band. Like 80M_Low and 80M_High.

The display mounting method and placement is still to be figured out.

Don't miss the next exciting episode of "Can a Kestrel Fly Again?".
 
Last edited:

BillC

Active member
I wonder could you stagger tune a couple of the coils to widen the B.W. for 80 m ? Would be a bit lossy compared to a single channel tune up, but the RF amp might provide enough gain in practice.
 

VK3ZYZ

Moderator
Staff member
I think the way to go is to connect my Nano VNA up so the band width can be easily adjusted.
But, as there are 10 channels in the set, and I will only use 5 bands, having more than one channel per band is quite usable.
The big problem will be the lack of coil sets that will tune to 10 and 14Mhz.
I have added a USB/LSB switch and tapped it into the Tune.AM.SSB switch via diodes and resisters to feed an analog input so the Tune and AM always switches to USB even if the USB/LSB switch is in LSB,
ModeSwitchingS.jpg

When it is done, I'll post full circuits of the mods and the updated Arduino code.
 

BillC

Active member
Seems to be a good idea as you have plenty of spare switch contacts, watching with interest, Cheers... Do you need a few neosid coil assemblies for winding the 10 & 14 meg coils ?
 

VK3ZYZ

Moderator
Staff member
This is a parts list. There may be errors!
PART List


caps below 10nF selected to suit filters.
C1 10uF
C2 10uF
C3 100nF
C4 100nF
C5 100nF
C6 100nF
C7 100nF
C8 100nF
C9 10nF
C10 1n6F
C11 1n6F
C12 120pF
C13 10nF
C14 10nF
C15 430pF
C16 430pF
C17 91pF
C18 10nF
C19 100nF
C20 10nF
C21 430pF
C22 430pF
C23 39pF
C24 10nF
C25 10nF
C26 200pF
C27 200pF
C28 36pF
C29 10nF
C30 10nF
C31 130pF
C32 130pF
C33 22pF
C34 10nF
C35 100nF
C36 100nF
C37 100nF
C38 100nF
C39 100nF

0.1" spaced connectors or pins.
CN1 25 Pin header for the TrackerScout socket
CN2 I2C
CN3 I2C
CN4 Encoder
CN5 3 PIN

D1 1N4148
D2 1N4148
D3 1N4148
D4 1N4148
D5 1N4148
D6 1N4148
D7 1N4148
D8 1N4148
D100 LED1


Inductors selected to suit filters.
L1 5u1H
L2 5u1H
L3 4u3H
L4 4u3H
L5 4K7 RESISTOR, R34
L6 4K7 RESISTOR, R35
L7 1u8H
L8 1u8H
L9 4K7 RESISTOR, R36
L10 4K7 RESISTOR, R37
L11 1u6H
L12 1u6H
L13 4K7 RESISTOR, R38
L14 4K7 RESISTOR, R39
L15 1uH
L16 1uH
L17 4K7 RESISTOR, R40
L18 4K7 RESISTOR, R41
L19 75uH
L20 18uH
L21 18uH
L22 9u1H
L23 6u2H



R1 1K
R2 10K
R3 1K
R4 10K
R5 10K
R6 100R
R7 10K
R8 10K
R9 nc
R10 20K
R11 10K
R12 4K7
R13 NOT USED
R14 56K
R15 20K
R16 10K
R17 5K6
R18 3K9
R19 2K7
R20 2K2
R21 200R
R22 200R
R23 200R
R24 200R
"R25" 1N4148
"R26" 1N4148
"R27" 1N4148
"R28" 1N4148
"R29" 1N4148
"R30" 1N4148
"R31" 1N4148
"R32" 1N4148
R33 10K

Replace inductors with resistors.
R34 4K7 Resistor
R35 4K7 Resistor
R36 4K7 Resistor
R37 4K7 Resistor
R38 4K7 Resistor
R39 4K7 Resistor
R40 4K7 Resistor
R41 4K7 Resistor


U1 Arduini Nano
U2 Si5351_2
U3 7805 TO220
U4 PC815 OPTOISO1
U5 PC815 OPTOISO1
U6 PC815 OPTOISO1
U7 PC815 OPTOISO1

I2C_LCD Display I2C_LCD
encoder
 

VK3ZYZ

Moderator
Staff member
Thanks to Jeff, WR2e for the idea, the I2C now runs at 400Khz instead of 100Khz.
Also, to indicate the decade the frequency adjustment operates on, no longer is the lower line of the LCD used to display a * but now the digit has an underline.
UnderlineLCD.jpg

This frees up the second line of the LCD for some other use. maybe a signal strength meter?
The "lcd.cursor();" command is used.....

// display step size
switch (step_size) {

case 1: // added for 1xHz.
lcd.setCursor(10,0);
lcd.cursor();
break;
case 10:
lcd.setCursor(9,0);
lcd.cursor();
break;
case 100:
lcd.setCursor(8,0);
lcd.cursor();
break;
case 1000:
lcd.setCursor(7,0);
lcd.cursor();
break;
case 10000:
lcd.setCursor(6,0);
lcd.cursor();
break;
case 100000:
lcd.setCursor(5,0);
lcd.cursor();
break;
default:
break;
lcd.noCursor();

}
 

Attachments

Top