The personal website of Scott W Harden

Minimalist Radio Receiver

Now that my minimalist QRSS transmitter is mostly functional, I'm shifting gears toward building a minimalist receiver. These are some early tests, but I'm amazed I managed to hack something together that actually works! Once it's finished I'll post schematics. For now, here are some photos. This receiver is based upon an SA602 and although there *IS* an op-amp on the board, I actually bypassed it completely! The SA602 seems to put out enough juice to make my PC microphone jack happy, and those cheap op-amps are noisy anyway, so awesome! Go minimalism!

Here's the output from 7.040 MHz. Conditions are pretty bad right now, and I'm at my apartment using my crazy indoor antenna

Markdown source code last modified on January 18th, 2021
---
title: Minimalist Radio Receiver
date: 2010-06-09 23:42:00
tags: qrss, amateur radio, old
---

# Minimalist Radio Receiver

__Now that my minimalist QRSS transmitter is mostly functional, I'm shifting gears toward building a minimalist receiver.__ These are some early tests, but I'm amazed I managed to hack something together that actually works! Once it's finished I'll post schematics. For now, here are some photos. This receiver is based upon an SA602 and although there \*IS\* an op-amp on the board, I actually bypassed it completely! The SA602 seems to put out enough juice to make my PC microphone jack happy, and those cheap op-amps are noisy anyway, so awesome! Go minimalism!

<div class="text-center img-border img-medium">

[![](DSCN0832_thumb.jpg)](DSCN0832.jpg)

[![](DSCN0833_thumb.jpg)](DSCN0833.jpg)

</div>

__Here's the output from 7.040 MHz.__ Conditions are pretty bad right now, and I'm at my apartment using my crazy indoor antenna

<div class="text-center img-border img-medium">

[![](recvbig_thumb.jpg)](recvbig.jpg)

</div>

QRSS VD Image Assembler

This minimal Python script will convert a directory filled with tiny image captures such as this into gorgeous montages as seen below! I whipped-up this script tonight because I wanted to assess the regularity of my transmitter's embarrassing drift. I hope you find it useful.

import os
from PIL import Image

x1,y1,x2,y2=[0,0,800,534] #crop from (x,y) 0,0 to 800x534
squish=10 #how much to squish it horizontally

### LOAD LIST OF FILES ###
workwith=[]
for fname in os.listdir('./'):
    if ".jpg" in fname and not "assembled" in fname:
        workwith.append(fname)
workwith.sort()

### MAKE NEW IMAGE ###
im=Image.new("RGB",(x2*len(workwith),y2))
for i in range(len(workwith)):
    print "Loading",workwith[i]
    im2=Image.open(workwith[i])
    im2=im2.crop((x1,y1,x2,y2))
    im.paste(im2,(i*x2,0))
print "saving BIG image"
im.save("assembled.jpg")
print "saving SQUISHED image"
im=im.resize((im.size[0]/10,im.size[1]),Image.ANTIALIAS)
im.save("assembled-squished.jpg")
print "DONE"

Script to download every image linked to from a webpage:

import urllib2
import os

suckFrom="http://w1bw.org/grabber/archive/2010-06-08/"

f=urllib2.urlopen(suckFrom)
s=f.read().split("'")
f.close()
download=[]

for line in s:
    if ".jpg" in line and not line in download and not "thumb" in line:
        download.append(line)

for url in download:
    fname = url.split("/")[-1].replace(":","-")
    if fname in os.listdir('./'):
        print "I already downloaded",fname
    else:
        print "downloading",fname
        output=open(fname,'wb')
        output.write(urllib2.urlopen(url).read())
        output.close()
Markdown source code last modified on January 18th, 2021
---
title: QRSS VD Image Assembler
date: 2010-06-07 23:20:18
tags: qrss, old, python
---

# QRSS VD Image Assembler

This minimal Python script will convert a directory filled with tiny image captures such as [this](http://www.swharden.com/blog/images/mass-W1BW_2jpg.jpg) into gorgeous montages as seen below! I whipped-up this script tonight because I wanted to assess the regularity of my transmitter's embarrassing drift. I hope you find it useful.

<div class="text-center img-border">

[![](assembled-squished_thumb.jpg)](assembled-squished.jpg)

</div>

```python
import os
from PIL import Image

x1,y1,x2,y2=[0,0,800,534] #crop from (x,y) 0,0 to 800x534
squish=10 #how much to squish it horizontally

### LOAD LIST OF FILES ###
workwith=[]
for fname in os.listdir('./'):
    if ".jpg" in fname and not "assembled" in fname:
        workwith.append(fname)
workwith.sort()

### MAKE NEW IMAGE ###
im=Image.new("RGB",(x2*len(workwith),y2))
for i in range(len(workwith)):
    print "Loading",workwith[i]
    im2=Image.open(workwith[i])
    im2=im2.crop((x1,y1,x2,y2))
    im.paste(im2,(i*x2,0))
print "saving BIG image"
im.save("assembled.jpg")
print "saving SQUISHED image"
im=im.resize((im.size[0]/10,im.size[1]),Image.ANTIALIAS)
im.save("assembled-squished.jpg")
print "DONE"
```

__Script to download every image linked to from a webpage__:

```python
import urllib2
import os

suckFrom="http://w1bw.org/grabber/archive/2010-06-08/"

f=urllib2.urlopen(suckFrom)
s=f.read().split("'")
f.close()
download=[]

for line in s:
    if ".jpg" in line and not line in download and not "thumb" in line:
        download.append(line)

for url in download:
    fname = url.split("/")[-1].replace(":","-")
    if fname in os.listdir('./'):
        print "I already downloaded",fname
    else:
        print "downloading",fname
        output=open(fname,'wb')
        output.write(urllib2.urlopen(url).read())
        output.close()
```

New Transmitter, New Spots!

These should speak for themselves. Which signal is mine? Obviously I'm the crazy person who thinks it's funny to merge molecular biology with amateur radio.

Belgium JO10UX

England G4CWX

France JN39AB

Massachusetts W1BW

Nevada KK7CC

Netherlands JO22DA

Alaska KL1X

Italia I2NDT

New Zealand ZL2IK

Germany DL4MGM

Markdown source code last modified on January 18th, 2021
---
title: New Transmitter, New Spots!
date: 2010-06-07 20:47:04
tags: qrss, amateur radio
---

# New Transmitter, New Spots!

These should speak for themselves. Which signal is mine? Obviously I'm the crazy person who thinks it's funny to merge molecular biology with amateur radio.

### Belgium JO10UX

<div class="text-center img-border">

[![](belgium-JO10UX_thumb.jpg)](belgium-JO10UX.jpg)

</div>

### England G4CWX

<div class="text-center img-border">

[![](england-G4CWX_thumb.jpg)](england-G4CWX.jpg)

</div>

### France JN39AB

<div class="text-center img-border">

[![](france-JN39AB_thumb.jpg)](france-JN39AB.jpg)

</div>

### Massachusetts W1BW

<div class="text-center img-border">

[![](mass-W1BW_2jpg_thumb.jpg)](mass-W1BW_2jpg.jpg)

</div>

### Nevada KK7CC

<div class="text-center img-border">

[![](NE-KK7CC_thumb.jpg)](NE-KK7CC.jpg)

</div>

### Netherlands JO22DA

<div class="text-center img-border">

[![](netherlands-JO22DA_thumb.jpg)](netherlands-JO22DA.jpg)

</div>

### Alaska KL1X

<div class="text-center img-border">

[![](alaska_thumb.jpg)](alaska.jpg)

</div>

### Italia I2NDT

<div class="text-center img-border">

[![](Italia-I2NDT_thumb.jpg)](Italia-I2NDT.jpg)

</div>

### New Zealand ZL2IK

<div class="text-center img-border">

[![](New-Zealand-ZL2IK_thumb.jpg)](New-Zealand-ZL2IK.jpg)

</div>

### Germany DL4MGM

<div class="text-center img-border">

[![](dunno_thumb.jpg)](dunno.jpg)

</div>

QRSS DNA

I'm still working on this project, and although progress is slow I'm learning a lot and the circuit is getting better with time. I'm still not yet ready to post the schematics, but you can get an idea of what's going on from the picture. It can handle 255 levels of frequency shift and has the ability to turn the tone on and off. 6 capacitors, 3 resistors, 4 transistors, a single inductor, and a micro-controller.

UPDATE I spotted myself on W4BHK's Grabber about 300 miles away...

#include <avr /io.h>
#include <util /delay.h>

char dotlen = 5;                              // ultimately the speeed of transmission
char call[] = {0, 1, 1, 1, 2, 0, 2, 1, 1, 0}; // 0 for space, 1 for dit, 2 for dah

void setfor(char freq, char ticks)
{
    OCR1A = freq;
    while (ticks > 0)
    {
        sleep();
        ticks--;
    }
}

void sleep()
{
    for (char i = 0; i < dotlen; i++)
    {
        _delay_loop_2(65000);
    }
}

void slideto(char freq, char ticks)
{
    freq = freq + 30;
    char step = 1;
    if (OCR1A > freq)
    {
        step = -1;
    }
    while (OCR1A != freq)
    {
        OCR1A += step;
        setfor(OCR1A, 1);
    }
    setfor(freq, ticks);
}

void DNA()
{
    char a[] = {4, 5, 5, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 7, 7, 7, 7, 6, 6, 6, 5, 5, 4, 3, 3, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 3, 3};
    char b[] = {1, 1, 1, 1, 2, 2, 2, 3, 3, 4, 5, 5, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 7, 7, 7, 7, 6, 6, 6, 5, 5, 4, 3, 3, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0};
    for (char i = 0; i < sizeof(a); i++)
    {
        //slideto(a[i]*4,2);
        //slideto(b[i]*4,2);
        setfor(a[i] * 2 + 5, 10);
        setfor(b[i] * 2 + 5, 10);
    }
}

void ID()
{
    for (char i = 0; i < sizeof(call); i++)
    {
        setfor(10, 50);
        if (call[i] == 0)
        {
            setfor(10, 100);
        }
        if (call[i] == 1)
        {
            setfor(15, 100);
        }
        if (call[i] == 2)
        {
            setfor(15, 250);
        }
        setfor(10, 50);
    }
}

void ID2()
{
    for (char i = 0; i < sizeof(call); i++)
    {
        if (call[i] == 0)
        {
            ampOFF();
            setfor(10, 50);
        }
        if (call[i] == 1)
        {
            ampON();
            setfor(10, 100);
        }
        if (call[i] == 2)
        {
            ampON();
            setfor(13, 100);
        }
        ampOFF();
        setfor(OCR1A, 30);
    }
    ampON();
}

void ampON()
{
    PORTA |= (1 << PA7);
    PORTA |= (1 << PA0);
    PORTA &= ~(1 << PA1);
    _delay_loop_2(10000);
}
void ampOFF()
{
    PORTA &= ~(1 << PA7);
    PORTA |= (1 << PA1);
    PORTA &= ~(1 << PA0);
    _delay_loop_2(10000);
}

int main(void)
{
    DDRA = 255;
    OCR1A = 75;
    TCCR1A = 0x81;
    TCCR1B = 1;
    while (1)
    {
        ID2();
        ID();
        for (char i = 0; i < 3; i++)
        {
            DNA();
        }
    }
}
Markdown source code last modified on January 18th, 2021
---
title: QRSS DNA
date: 2010-06-06 19:15:58
tags: microcontroller, circuit, qrss, old
---

# QRSS DNA

__I'm still working on this project,__ and although progress is slow I'm learning a lot and the circuit is getting better with time. I'm still not yet ready to post the schematics, but you can get an idea of what's going on from the picture. It can handle 255 levels of frequency shift and has the ability to turn the tone on and off. 6 capacitors, 3 resistors, 4 transistors, a single inductor, and a micro-controller.

<div class="text-center img-border">

[![](DSCN0776_thumb.jpg)](DSCN0776.jpg)
[![](OnOffDNA_thumb.jpg)](OnOffDNA.png)
[![](dnareport_thumb.jpg)](dnareport.jpg)

</div>

__UPDATE__ I spotted myself on [W4BHK's Grabber](http://www.qsl.net/w4hbk/W4HBKgrabber.html) about 300 miles away...

```c
#include <avr /io.h>
#include <util /delay.h>

char dotlen = 5;                              // ultimately the speeed of transmission
char call[] = {0, 1, 1, 1, 2, 0, 2, 1, 1, 0}; // 0 for space, 1 for dit, 2 for dah

void setfor(char freq, char ticks)
{
    OCR1A = freq;
    while (ticks > 0)
    {
        sleep();
        ticks--;
    }
}

void sleep()
{
    for (char i = 0; i < dotlen; i++)
    {
        _delay_loop_2(65000);
    }
}

void slideto(char freq, char ticks)
{
    freq = freq + 30;
    char step = 1;
    if (OCR1A > freq)
    {
        step = -1;
    }
    while (OCR1A != freq)
    {
        OCR1A += step;
        setfor(OCR1A, 1);
    }
    setfor(freq, ticks);
}

void DNA()
{
    char a[] = {4, 5, 5, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 7, 7, 7, 7, 6, 6, 6, 5, 5, 4, 3, 3, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 3, 3};
    char b[] = {1, 1, 1, 1, 2, 2, 2, 3, 3, 4, 5, 5, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 7, 7, 7, 7, 6, 6, 6, 5, 5, 4, 3, 3, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0};
    for (char i = 0; i < sizeof(a); i++)
    {
        //slideto(a[i]*4,2);
        //slideto(b[i]*4,2);
        setfor(a[i] * 2 + 5, 10);
        setfor(b[i] * 2 + 5, 10);
    }
}

void ID()
{
    for (char i = 0; i < sizeof(call); i++)
    {
        setfor(10, 50);
        if (call[i] == 0)
        {
            setfor(10, 100);
        }
        if (call[i] == 1)
        {
            setfor(15, 100);
        }
        if (call[i] == 2)
        {
            setfor(15, 250);
        }
        setfor(10, 50);
    }
}

void ID2()
{
    for (char i = 0; i < sizeof(call); i++)
    {
        if (call[i] == 0)
        {
            ampOFF();
            setfor(10, 50);
        }
        if (call[i] == 1)
        {
            ampON();
            setfor(10, 100);
        }
        if (call[i] == 2)
        {
            ampON();
            setfor(13, 100);
        }
        ampOFF();
        setfor(OCR1A, 30);
    }
    ampON();
}

void ampON()
{
    PORTA |= (1 << PA7);
    PORTA |= (1 << PA0);
    PORTA &= ~(1 << PA1);
    _delay_loop_2(10000);
}
void ampOFF()
{
    PORTA &= ~(1 << PA7);
    PORTA |= (1 << PA1);
    PORTA &= ~(1 << PA0);
    _delay_loop_2(10000);
}

int main(void)
{
    DDRA = 255;
    OCR1A = 75;
    TCCR1A = 0x81;
    TCCR1B = 1;
    while (1)
    {
        ID2();
        ID();
        for (char i = 0; i < 3; i++)
        {
            DNA();
        }
    }
}
```

Soup Can MEPT

This page documents the progress of my MEPT (manned experimental propagation transmitter) endeavors. If you have questions, feel free to E-mail me! My contact information can be found by clicking the link on the right navigation menu.

The Soup-Can Transmitter

The Signal

The Spots

Florida

288.3 miles away (W4HBK) May 22, 2010

Massachusetts

1,075.5 miles away (W1BW) May 27, 2010

Belgium

4,496.3 miles away (ON5EX) May 27, 2010

Germany

4,869.2 miles away (DL4MGM) May 28, 2010

Essex

4,356.4 miles away (G6AVK) May 28, 2010

New Zealand

8,077.6 miles away (ZL2IK) May 29, 2010

Markdown source code last modified on January 18th, 2021
---
title: Soup Can MEPT
date: 2010-06-03 13:51:34
tags: qrss, amateur radio, circuit, old
---

# Soup Can MEPT

__This page documents the progress__ of my MEPT (manned experimental propagation transmitter) endeavors. If you have questions, feel free to E-mail me! My contact information can be found by clicking the link on the right navigation menu.

## The Soup-Can Transmitter

<div class="text-center img-border">

[![](IMG_3459_thumb.jpg)](IMG_3459.jpg)
[![](IMG_3466_thumb.jpg)](IMG_3466.jpg)
[![](IMG_3467_thumb.jpg)](IMG_3467.jpg)

</div>

## The Signal

<div class="text-center img-border">

[![](aj4vd_gator_thumb.jpg)](aj4vd_gator.png)
[![](antenna_thumb.jpg)](antenna.jpg)

</div>

## The Spots

### Florida
288.3 miles away (W4HBK) May 22, 2010

<div class="text-center img-border">

[![](spotNice_thumb.jpg)](spotNice.jpg)

</div>

### Massachusetts
1,075.5 miles away (W1BW) May 27, 2010

<div class="text-center img-border">

[![](gatorSeen_thumb.jpg)](gatorSeen.jpg)

</div>

### Belgium
4,496.3 miles away (ON5EX) May 27, 2010

<div class="text-center img-border">

[![](aj4vd_gator_belgium_thumb.jpg)](aj4vd_gator_belgium.jpg)

</div>

### Germany
4,869.2 miles away (DL4MGM) May 28, 2010

<div class="text-center img-border">

[![](2010_05_28_DL4MGM_Germany_thumb.jpg)](2010_05_28_DL4MGM_Germany.png)

</div>

### Essex
4,356.4 miles away (G6AVK) May 28, 2010

<div class="text-center img-border">

[![](aj4vd_gator_essex_thumb.jpg)](aj4vd_gator_essex.jpg)

</div>

### New Zealand
8,077.6 miles away (ZL2IK) May 29, 2010

<div class="text-center img-border">

[![](2010_05_29_ZL2IK_NewZealand_thumb.jpg)](2010_05_29_ZL2IK_NewZealand.png)

[![](NewZealand_thumb.jpg)](NewZealand.png)

</div>

Pages