Here's the slides I presented to introduce BARSicle
Tuesday, 12 June 2018
BARSICLE BASICS
This is an outline of the BARSicle project, to build a complete homebrew 40m SSB station. The aim is to build technical know how among club members, from beginenr to advanced levels - LEARN, CODE, BUILD.
It includes a course in coding for the Arduino microcontrollers
Input filter for SA612 mixer
We are planning to build a simple Direct Conversion RX, but with a Si5351 digital sythesiser VFO. The Si5351 has a square wave output with lots of harmonics. In order to limit these and avoid unwanted mixer products a simple filter is to be put infront of the VFO input.
This is simply a 22pF capacitor and a 22uH inductor (commercial resistor-style) loaded by a 51R resistor. The Si5351 happily drives a 51R load with about the right input level for the SA612. The response of this arrangement is,
Which looks good. Now to try it in practice...
Saturday, 9 June 2018
How's your propagation?
So why go digital? Because digital sends data. And that data can be used for other purposes than simply having a QSO. For example the new FT8 mode both allows you to conduct a digital QSO in a minute or so, and build up a pattern of your propagation, but also using additional software gives you an insight into who you are receiving and where they are on the map.
What do you need?
First an SSB receiver (or transceiver), next an interface to get the audio in/out to your PC sound card. All pretty straight forwards and can be implemented with a cheap USB audio interface dongle. Then you need the software...
Software
WSJT-X first. You tune your RX to, for example 7074kHz for 40m, USB. The incoming signals of the new mode FT8 will display on a water fall (audio from 200-2000kHz adjustable). And every 15 seconds as others transmit you will receive their call signs, signal strengths and location.
See how the software is able to decode even the weakest signals (about 20db below the noise!)
WSJT sends out information packets by UDP to a local web address 127.0.0.1: 2337. This can be picked up by other software running on your computer.
GridTracker software picks up the WSJT packets, and plots the received station on a map.
That's a pretty good way of seeing the current propagation conditions.
Monday, 4 June 2018
40m Low Pass Filter for QRP PA
I just built one of QRP LABS 40m LPF. And for fun attached it to my Si5351 signal generator and output it to my AD8307 power meter, with 50R input impedance.
This is the result, it flattens off at -30 as this is the lower limit of my detector.
Friday, 1 June 2018
BPF for Direct Conversion RX
I have breadboarded a AD8307 module (from SV1AFN) with an Arduino Nano to make an RF meter. The AD8307 has a 50R input impedance. I have added on the front a 40dB attenuator tap of 4x680R and 50R. Thus the divide ratio is 4x680/25. I have written the software to allow this to display the actual RF voltage at the input. Code below.
Then I have built a prototype BPF, transformer + 100p --> 8p coupling --> transformer + 100p, output tapped on primary (both type 5u3L from SPECTRUM COMMUNICATIONS). I roughly tuned this to 40m. I applied an input from my SI5351 VFO from 6000 to 8500kHz. This is what I got:
With a bit of tuning I can probably get the top a bit flatter, but I am pleased with the result.
Code
// RF_METER
#include "Oled.h" // include
#define AREF 3250 // actual value of 3V3 ref (mV)
#define AMAX 1023
#define SLOPE 25.0 // 25mV/dB
#define INTERCEPT 87.0 // -85 + 40dB
#define ATTN 40.0 // attenuation
#define IMP 50 // load ohms
float Vrms, dBm, mW; // global variable to display
void setup() {
oled.begin(); // begin OLED
analogReference(EXTERNAL); // set ADC to use external ref, Nano 3V3
}
void loop() {
int ADCin;
double mV;
ADCin = analogRead(A3); // 0-1023
delay(50);
mV = (double)(map(ADCin, 0, AMAX, 0, AREF)); // AREF in mV, calculate & convert to double
dBm = (mV / SLOPE) - INTERCEPT + ATTN; // in doubles
mW = pow(10.0, (dBm / 10.0)); // in double, out double, 0dBm = 1mW
Vrms = sqrt((mW / 1000.0) * IMP); // in double, out double
dispUpdate(); // display
}
void dispUpdate() { // display loop
oled.firstPage();
do {
if( Vrms < 1.0 ) {
dispNumL(35, 5, (Vrms * 1000.0), 0); // display mV
dispMsgL(90, 5, "mV");
}
else {
dispNumL(35, 5, Vrms, 1); // display
dispMsgL(90, 5, "V");
}
dispNumL(35, 25, dBm, 0); // display dBm
dispMsgL(90, 25, "dBm");
if ( mW > 1000.0 ) {
dispNumL(35, 45, (mW / 1000), 1); // display W
dispMsgL(90, 45, "W");
}
else {
dispNumL(35, 45, mW, 1); // display mW
dispMsgL(90, 45, "mW");
}
} while(oled.nextPage());
}
A silly problem that has been nagging for a time
Many products have buttons that create two function, press it for a short time - function one, press it for a longer time - function two. I have a use of this in a new project, to build a VFO for an SSB exciter.
Function one is to push the button on the tuning rotary encoder and change the tuning "step" from 10Hz per click to 1MHz per click.
Function two - the long press - is to switch from LSB to USB.
The code turned out to be simple:
Code
long hold;
if (digitalRead(SW) == LOW) { // sw push
hold = millis(); // start hold count
while (!digitalRead(SW)); // wait release
if (millis() - hold > HOLD) { // sw push hold
usb = !usb;
// update USB/LSB freq
}
else
// update step