I completed work on my first RF receiver, and for what it is it seems to work decently. It should be self-explanatory from the photos. It’s based around an SA602. As with everything, I don’t plan on posting schematics until the project is complete because I don’t want people re-creating junky circuits! It’s stationed at the University of Florida’s club station W4DFU and its spectrograph can be viewed in real time from the QRSS VD – Web Grabber – W4DFU page. Back to work!IMG_3475IMG_3482IMG_34792dc_qrsscapture

And some music to complete the day!





Additional Resources

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 it’s pictured with its power supply:DSCN0833

Here’s a close-up. Remember, the op-amp is there but NOT used!DSCN0832

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 [pic1] [pic2]recvbig





Additional Resources

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.

full-size output:assembled

10x squished output:assembled-squished

Script to assemble a folder of images into a single, large image:

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()




Additional Resources

These should speak for themselves. Obviously I’m the crazy person who thinks it’s funny to merge molecular biology with amateur radio.

Belgium JO10UX:
belgium JO10UX

England G4CWX:
england G4CWX

France JN39AB:
france JN39AB

Massachusetts W1BW:
mass W1BW_2jpg

Nevada KK7CC:
NE KK7CC

Netherlands JO22DA:
netherlands JO22DA

Alaska KL1X:
alaska

Italia I2NDT:
Italia I2NDT

New Zealand ZL2IK:New Zealand ZL2IK

Germany DL4MGM:
NewZealand





Additional Resources

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. Boom!
DSCN0776
OnOffDNA

… and yeah, that’s a double helix

UPDATE I spotted myself on W4BHK’s Grabber about 300 miles away…
dnareport

#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();
		}
	}

}