The personal website of Scott W Harden

Improved MEPT Enclosure

I've been pretty busy lately, but I drip to the hardware store with the XYL produced a PVC enclosure that looked perfect for my ongoing MEPT (manned experimental propagation transmitter) projects. I didn't want to buy it (it was a little pricey by my standards, at $6 USD, which is about the total cost of the transmitter!) but the wife convinced me and I'm glad she did! I intended it to replace the styrofoam enclosure I had been using, but I wasn't thinking clearly and drilled holes in the box and mounted screws through them. While electrically this is a wonderful way to add antenna connections, thermally it was a bad idea. The main point of the enclosure was to be temperature stable! Oh well. I put the whole thing in the Styrofoam and as a test, I'm leaving it outside tonight. I can't wait to see how it goes! Here are some photos of the project.

Update: Even when being housed outdoors when temperature fluctuations vary greatly between day and night, this MEPT is surprisingly stable! When I open the box, it's very warm inside, so I am thinking that the voltage regulators and the MOSTFETs of the PA are heating the device nicely. Here's a capture spanning about 2 hours. The vertical height of each "V" is about 10Hz, so I estimate that for this span of time, drift is <1Hz. However, I do believe that long term (day to day) frequency stability is still not optimal, but only time will tell.

Signal report: briefly, this is my signal in Alaska courtesy of KL7UK. My signal is the V-shaped one near the bottom:

Markdown source code last modified on January 18th, 2021
---
title: Improved MEPT Enclosure
date: 2010-11-14 20:22:38
tags: qrss, amateur radio, circuit
---

# Improved MEPT Enclosure

__I've been pretty busy lately__, but I drip to the hardware store with the XYL produced a PVC enclosure that looked perfect for my ongoing MEPT (manned experimental propagation transmitter) projects. I didn't want to buy it (it was a little pricey by my standards, at $6 USD, which is about the total cost of the transmitter!) but the wife convinced me and I'm glad she did!  I intended it to replace the styrofoam enclosure I had been using, but I wasn't thinking clearly and drilled holes in the box and mounted screws through them.  While electrically this is a wonderful way to add antenna connections, thermally it was a bad idea.  The main point of the enclosure was to be temperature stable! Oh well. I put the whole thing in the Styrofoam and as a test, I'm leaving it outside tonight. I can't wait to see how it goes!  Here are some photos of the project.

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

[![](IMG_4526_thumb.jpg)](IMG_4526.jpg)
[![](IMG_4534_thumb.jpg)](IMG_4534.jpg)
[![](IMG_4547_thumb.jpg)](IMG_4547.jpg)
[![](IMG_4548_thumb.jpg)](IMG_4548.jpg)

</div>

__Update:__ Even when being housed outdoors when temperature fluctuations vary greatly between day and night, this MEPT is surprisingly stable! When I open the box, it's very warm inside, so I am thinking that the voltage regulators and the MOSTFETs of the PA are heating the device nicely.  Here's a capture spanning about 2 hours. The vertical height of each "V" is about 10Hz, so I estimate that for this span of time, drift is <1Hz.  However, I do believe that long term (day to day) frequency stability is still not optimal, but only time will tell.

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

[![](qrss_stable_thumb.jpg)](qrss_stable.jpg)

</div>

__Signal report__: briefly, this is my signal in Alaska courtesy of KL7UK. My signal is the V-shaped one near the bottom: 

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

[![](KL7UK_alaska_thumb.jpg)](KL7UK_alaska.jpg)

</div>

Deciphering QR Code from Radio Spectrogram

Although I've been ridiculously busy the last few weeks, I've been eying some posts circulating around the Knights QRSS mailing list regarding mysterious signals in the 40m band. They recognized it as a QR Code and tried decoding it with phones and such, but the signal wasn't strong enough above the noise to be automatically deciphered.

That's the original spectrograph as captured by ON5EX in Belgium. It's a pretty good capture, it's just not great enough to be automatically decoded. The first thing I did was pop it open in ImageJ, separate the channels, and use the most useful one (red, I believe). When adjusted for brightness and contrast, I was already at a pretty good starting point.

I tried using an automated decoder at this point (http://zxing.org/w/decode.jspx) but it wasn't able to recognize the QR code. I don't blame it! It was pretty rough. I decided to manually recreate one, so I slapped the image into InkScape, add a grid, and align the image with the grid. From there, it was as easy as drawing a single grid-square-sized rectangle and copy/pasting it in all the right places.

However problems came when working on those last few rows. The static was pretty serious, so I tried a lot of different filters / adjustments. One of the greatest benefits was when I stretched the image super-wide and performed a "rolling ball" background subtraction, then revered it to its original size. That greatly helped reduce the effect of the vertical striping, and let me visually determine where to place the last few squares by squinting a bit.

Once it was all done, I saved the output as orange, then later converted it to black and white for web-detection via the ZXing Decoder.

The final result:

which when decoded reads:

WELL DONE / F4GKA QSL PSE 73

Yay! I did it. Although my call sign is AJ4VD, I'm spending the afternoon at the University of Florida Gator Amateur Radio Club station and am using their computers, so I might QSL as W4DFU. Also, there's a lot to be said for ON5EX for capturing/reporting the QR code in the first place. After a bit of research, it turns out that F4GKA is one of the Knights! I should have known it =o)

Thanks for the fun challenge!

Markdown source code last modified on January 18th, 2021
---
title: Deciphering QR Code from Radio Spectrogram
date: 2010-11-11 15:13:29
tags: qrss, amateur radio
---

# Deciphering QR Code from Radio Spectrogram

__Although I've been ridiculously busy the last few weeks,__ I've been eying some posts circulating around the [Knights QRSS mailing list](http://cnts.be/mailman/listinfo/knightsqrss_cnts.be) regarding mysterious signals in the 40m band.  They recognized it as a [QR Code](http://en.wikipedia.org/wiki/QR_Code) and tried decoding it with phones and such, but the signal wasn't strong enough above the noise to be automatically deciphered.

<dev class="center border medium">

[![](on5ex-odd_thumb.jpg)](on5ex-odd.jpg)

</dev>

__That's the original spectrograph__ as captured by ON5EX in Belgium. It's a pretty good capture, it's just not great enough to be automatically decoded.  The first thing I did was pop it open in ImageJ, separate the channels, and use the most useful one (red, I believe).  When adjusted for brightness and contrast, I was already at a pretty good starting point.

<dev class="center border medium">

![](better.jpg)

</dev>

__I tried using an automated decoder__ at this point (<http://zxing.org/w/decode.jspx>) but it wasn't able to recognize the QR code. I don't blame it! It was pretty rough.  I decided to manually recreate one, so I slapped the image into [InkScape](http://inkscape.org/), add a grid, and align the image with the grid.  From there, it was as easy as drawing a single grid-square-sized rectangle and copy/pasting it in all the right places.

<dev class="center border medium">

[![](building_thumb.jpg)](building.jpg)

</dev>

__However problems came__ when working on those last few rows.  The static was pretty serious, so I tried a lot of different filters / adjustments.  One of the greatest benefits was when I stretched the image super-wide and performed a "rolling ball" background subtraction, then revered it to its original size. That greatly helped reduce the effect of the vertical striping, and let me visually determine where to place the last few squares by squinting a bit.

<dev class="center border medium">

[![](building3_thumb.jpg)](building3.jpg)

</dev>

__Once it was all done,__ I saved the output as orange, then later converted it to black and white for web-detection via [the ZXing Decoder](http://zxing.org/w/decode.jspx).

<dev class="center border medium">

[![](building2_thumb.jpg)](building2.jpg)

</dev>

__The final result:__

<dev class="center">

![](finished.jpg)

</dev>

__which when decoded reads:__

`WELL DONE / F4GKA QSL PSE 73`

__Yay!__ I did it.  Although my call sign is AJ4VD, I'm spending the afternoon at the University of Florida Gator Amateur Radio Club station and am using their computers, so I might QSL as W4DFU.  Also, there's a lot to be said for ON5EX for capturing/reporting the QR code in the first place. After a bit of research, it turns out that F4GKA is one of the Knights! I should have known it =o)

Thanks for the fun challenge!
September 17th, 2010

Climbing A 1786 Foot Tall Tower

When I saw this, I had to share it.

... and no, that's not me!

Markdown source code last modified on January 18th, 2021
---
title: Climbing A 1786 Foot Tall Tower
date: 2010-09-17 08:40:38
---

# Climbing A 1786 Foot Tall Tower

__When I saw this,__ I had to share it.

![](https://www.youtube.com/embed/RDNGZVmhkTo)

... and no, that's not me!

Cutting-Edge 1960s Oscilloscope (for the 70s)

I'm extremely excited about my new purchase! I found this on Craigslist of all places! It's a Tektronix 453 oscilloscope from the late 60s in pretty good condition. I'm not going into a bunch of technical details about what I'm using it for, but let's just say I'm satisfied. The 1khz square wave generator doesn't function and one of the lights is not working, but other than that it seems to be fine. Here are a couple pics:

I've got to thank my wife Angelina for this scope! It was my birthday gift this year. I made it too easy for her by telling her exactly what I wanted and finding it on the internet! Now I have to spend the next month trying to think of a gift for her without any hints [ponders]...

Okay, back to work! Now that I'm up and running after a few months without a scope, I can't wait to see what I come up with.

Markdown source code last modified on January 18th, 2021
---
title: Cutting-Edge 1960s Oscilloscope (for the 70s)
date: 2010-09-10 22:33:26
---

# Cutting-Edge 1960s Oscilloscope (for the 70s)

__I'm extremely excited about my new purchase!__  I found this on Craigslist of all places!  It's a [Tektronix 453](http://www.diyguitarist.com/TestEquipment/Tektronix453.htm) oscilloscope from the late 60s in pretty good condition.  I'm not going into a bunch of technical details about what I'm using it for, but let's just say I'm satisfied.  The 1khz square wave generator doesn't function and one of the lights is not working, but other than that it seems to be fine. Here are a couple pics:

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

[![](probe_thumb.jpg)](probe.jpg)
[![](canned-3.5mhz_thumb.jpg)](canned-3.5mhz.jpg)
[![](tektronix_cutting_edge_thumb.jpg)](tektronix_cutting_edge.jpg)

</div>

__I've got to thank my wife Angelina__ for this scope!  It was my birthday gift this year.  I made it too easy for her by telling her exactly what I wanted and finding it on the internet!  Now I have to spend the next month trying to think of a gift for her without any hints [ponders]...

__Okay, back to work!__ Now that I'm up and running after a few months without a scope, I can't wait to see what I come up with.

Quantifying University Network Frustrations

I'm sitting in class frustrated as could be. The Internet in this room is unbelievably annoying. For some reason, everything runs fine, then functionality drops to unusable levels. Downloading files (i.e., PDFs of lectures) occurs at about 0.5kb/s (wow), and Internet browsing is hopeless. At most, I can connect to IRC and enjoy myself in #electronics, #python, and #linux. I decided to channel my frustration into productivity, and wrote a quick Python script to let me visualize the problem.

Notice the massive lag spikes around the time class begins. I think it's caused by the retarded behavior of windows update and anti-virus software updates being downloaded on a gazillion computers all at the same time which are required to connect to the network on Windows machines. Class start times were 8:30am, 9:35am, and 10:40am. Let's view it on a logarithmic scale:

Finally, the code. It's two scripts:

This script pings a website (kernel.org) every few seconds and records the ping time to "pings.txt":

import socket
import time
import os
import sys
import re


def getping():
    pingaling = os.popen("ping -q -c2 kernel.org")
    sys.stdout.flush()
    while 1:
        line = pingaling.readline()
        if not line:
            break
        line = line.split("n")
        for part in line:
            if "rtt" in part:
                part = part.split(" = ")[1]
                part = part.split('/')[1]
                print part+"ms"
                return part


def add2log(stuff):
    f = open("pings.txt", 'a')
    f.write(stuff+",")
    f.close()


while 1:
    print "pinging...",
    stuff = "[%s,%s]" % (time.time(), getping())
    print stuff
    add2log(stuff)
    time.sleep(1)

This script graphs the results:

import pylab
import time
import datetime
import numpy


def smoothTriangle(data, degree, dropVals=False):
    triangle = numpy.array(range(degree)+[degree]+range(degree)[::-1])+1
    smoothed = []
    for i in range(degree, len(data)-degree*2):
        point = data[i:i+len(triangle)]*triangle
        smoothed.append(sum(point)/sum(triangle))
    if dropVals:
        print "smoothlen:", len(smoothed)
        return smoothed
    while len(smoothed) < len(data):
        smoothed = [None]+smoothed+[None]
    if len(smoothed) > len(data):
        smoothed.pop(-1)
    return smoothed


print "reading"
f = open("pings.txt")
raw = eval("[%s]" % f.read())
f.close()

xs, ys, big = [], [], []
for item in raw:
    t = datetime.datetime.fromtimestamp(item[0])
    maxping = 20000
    if item[1] > maxping or item[1] == None:
        item[1] = maxping
        big.append(t)
    ys.append(float(item[1]))
    xs.append(t)

print "plotting"
fig = pylab.figure(figsize=(10, 7))
pylab.plot(xs, ys, 'k.', alpha=.1)
pylab.plot(xs, ys, 'k-', alpha=.1)
pylab.plot(xs, smoothTriangle(ys, 15), 'b-')
pylab.grid(alpha=.3)
pylab.axis([None, None, None, 2000])
pylab.ylabel("latency (ping kernel.org, ms)")
pylab.title("D3-3 Network Responsiveness")
fig.autofmt_xdate()
pylab.savefig('out.png')
pylab.semilogy()
pylab.savefig('out2.png')
fig.autofmt_xdate()
print "done"
Markdown source code last modified on January 18th, 2021
---
title: Quantifying University Network Frustrations
date: 2010-09-09 08:06:39
tags: python, old
---

# Quantifying University Network Frustrations

__I'm sitting in class frustrated as could be.__ The Internet in this room is unbelievably annoying.  For some reason, everything runs fine, then functionality drops to unusable levels.  Downloading files (i.e., PDFs of lectures) occurs at about 0.5kb/s (wow), and Internet browsing is hopeless.  At most, I can connect to IRC and enjoy myself in #electronics, #python, and #linux. I decided to channel my frustration into productivity, and wrote a quick Python script to let me visualize the problem.

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

[![](out_thumb.jpg)](out.png)

</div>

__Notice the massive lag spikes__ around the time class begins. I think it's caused by the retarded behavior of windows update and anti-virus software updates being downloaded on a gazillion computers all at the same time which are required to connect to the network on Windows machines. Class start times were 8:30am, 9:35am, and 10:40am.  Let's view it on a logarithmic scale:

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

[![](out2_thumb.jpg)](out2.png)

</div>

__Finally, the code.__ It's two scripts:

This script pings a website (kernel.org) every few seconds and records the ping time to "pings.txt":

```python
import socket
import time
import os
import sys
import re


def getping():
    pingaling = os.popen("ping -q -c2 kernel.org")
    sys.stdout.flush()
    while 1:
        line = pingaling.readline()
        if not line:
            break
        line = line.split("n")
        for part in line:
            if "rtt" in part:
                part = part.split(" = ")[1]
                part = part.split('/')[1]
                print part+"ms"
                return part


def add2log(stuff):
    f = open("pings.txt", 'a')
    f.write(stuff+",")
    f.close()


while 1:
    print "pinging...",
    stuff = "[%s,%s]" % (time.time(), getping())
    print stuff
    add2log(stuff)
    time.sleep(1)
```

This script graphs the results:

```python
import pylab
import time
import datetime
import numpy


def smoothTriangle(data, degree, dropVals=False):
    triangle = numpy.array(range(degree)+[degree]+range(degree)[::-1])+1
    smoothed = []
    for i in range(degree, len(data)-degree*2):
        point = data[i:i+len(triangle)]*triangle
        smoothed.append(sum(point)/sum(triangle))
    if dropVals:
        print "smoothlen:", len(smoothed)
        return smoothed
    while len(smoothed) < len(data):
        smoothed = [None]+smoothed+[None]
    if len(smoothed) > len(data):
        smoothed.pop(-1)
    return smoothed


print "reading"
f = open("pings.txt")
raw = eval("[%s]" % f.read())
f.close()

xs, ys, big = [], [], []
for item in raw:
    t = datetime.datetime.fromtimestamp(item[0])
    maxping = 20000
    if item[1] > maxping or item[1] == None:
        item[1] = maxping
        big.append(t)
    ys.append(float(item[1]))
    xs.append(t)

print "plotting"
fig = pylab.figure(figsize=(10, 7))
pylab.plot(xs, ys, 'k.', alpha=.1)
pylab.plot(xs, ys, 'k-', alpha=.1)
pylab.plot(xs, smoothTriangle(ys, 15), 'b-')
pylab.grid(alpha=.3)
pylab.axis([None, None, None, 2000])
pylab.ylabel("latency (ping kernel.org, ms)")
pylab.title("D3-3 Network Responsiveness")
fig.autofmt_xdate()
pylab.savefig('out.png')
pylab.semilogy()
pylab.savefig('out2.png')
fig.autofmt_xdate()
print "done"
```
Pages