Tuesday, 12 June 2018

BARSICLE INTRO

Here's the slides I presented to introduce BARSicle

BARSicle intro 001 BARSicle intro 002 BARSicle intro 003 BARSicle intro 004 BARSicle intro 005 BARSicle intro 006

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

BARSICLE BASICS 001 BARSICLE BASICS 002 BARSICLE BASICS 003 BARSICLE BASICS 004

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.

IMG 0233
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,

Screen Shot 2018 06 12 at 12 50 35

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.

Screen Shot 2018 06 12 at 08 41 08

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.

Screen Shot 2018 06 12 at 08 43 53

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.

IMG 0168

Screen Shot 2018 06 04 at 14 35 42

Screen Shot 2018 06 04 at 14 35 52

This is the result, it flattens off at -30 as this is the lower limit of my detector.

Screen Shot 2018 06 04 at 14 34 19

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:

IMG 0101

Screen Shot 2018 06 01 at 16 25 10

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