Category Archives: Amateur Radio

DC40B, Day 4, and stupidity on my part…

Well, over the weekend I completed the trial assembly of my DC40B. The voltages all measured out correct, but the oscillator seemed to not start reliably. It appears that the twin 47pf caps that provide crystal feedback may not be quite sufficient to reliably start the oscillator on power up. If I prod the base of Q5 with my oscilloscope probe, the oscillator starts right up. In discussions on the dc40kits yahoo! group, it appears that at least one other ham found that he had to add some capacitance to his dc40b kit, so I’ll give that a try.

In a fit of stupidity though, I went blindly forward, and promptly installed all the ICs. Like an idiot though, I wasn’t watching what I was doing. No, I didn’t install anything backwards, I installed the 8 pin op amp in place of the 8 pin AVR and vice versa. Guess what? The Atmel AVR gets pretty hot when you install it in the wrong place! IDIOT. Oh well. While no magic smoke was released, it appears that I have zorched the chip, so I’ve got an email into KI6DS to order some replacements (maybe I should get more than one…)

Anyway, that’s my update.

dc40b

No DC40B work tonight…

Too tired, so instead I took the wife out for some Mexican food and a movie, and when I got back I relaxed a bit. I have the feeling in my tired state I would have just made mistakes. I did dust off my old Manhattan style constructed oscillator since AK6L was going down the path of building them, and I decided to hook it up to my $20 oscilloscope and see what it looked like. It’s currently got a 7.040 crystal in it, and I must admit: the waveform looks pretty nice (excuse the iPhone picture, I haven’t been able to find the SD card reader for my Canon, and I didn’t spend any time improving the lighting).

photo

Not bad at all.

DC40B Construction: Day 3

Toroids. Today it was winding toroids. I really don’t mind winding ’em, it is stripping and tinning the leads that seems to be annoying. Nevertheless, I got the four toroids done (two simple, one bifilar transformer and one regular) and installed on the board. A simple continuity check between the pads indicates that all is well.

Should be really easy to finish the radio this weekend, just need to install the transistors, ics, a couple of electrolytic caps, and then power/speaker leads.

Midway DXpedition, courtesy of my HW-8

Well, as I was heading off to bed, I was reminded that there is currently a DXpedition operating from Midway island using the callsign K4M. A quick google revealed that they were operating on 7.078 SSB, so before heading off to bed, I decided to power on my HW-8 (ever since I got it, the FT-817 has been side lined) and see if I could hear anything. And, voila, here is K4M responding to G0HNW (in England). I just grabbed a small snippet of audio, but it gives you some ideas as to what you can hear with a radio like the HW-8.

K4M answering G0HNW on 7.078 SSB, October 15, 2009 07:05 UTC

Addendum:

Same recording, but with noise reduction courtesy of Audacity

Addendum2: I was wondering what algorithm Audacity actually implemented for noise gating. It’s spectral noise gating. I had previously blogged that papers by James Moorer provided some details of similar algorithms, but it appears that my previous links to him had decayed, so there is a fresher one.

DC40B construction: Day 2

Well, I found a replacement for the one resistor I screwed up, and started work on all the caps. They are all in and double checked (I only screwed up one capacitor, which I quickly desoldered, moved, and resoldered). I then got the trimmers in, and soldered in the 16 pin socket. I was gonna start on the toroids, but Mythbusters was on, so I thought I’d take a break. I’m guessing it will take a couple more sessions to get all the semiconductors in, do some minimal testing, and then apply power for real.

Stay tuned….

DC40B construction underway…

DXxxB3Well, after playing around with my Heathkit HW-8, I was struck by a feeling of productivity and started working on my latest kit, a DC40B from Hendricks’ QRP Kits. It’s a very cute little rig, consisting of a 1 watt (ish) transmitter with a built in Atmel AVR keyer, and a direct conversion receiver. It’s crystal controlled, and this one will be built on the crystal frequency of 7.040 Mhz.

Tonight, I started soldering in all the resistors, the diodes, the one molded inductor, and the two eight pin sockets. I noted a couple of issues with the instructions. First, it says that R5 is a 2.2K ohm resistor, but that it’s code should be BROWN-BLACK-RED (which is actually the code for a 1K ohm resistor). I worked around the instructions, and figured that it probably should be a 2.2K resistor and that the listed color code was wrong. I’ll double check with the schematic when I have a chance. In the process though, I managed to goof and install one resistor in the wrong place. Hence, I need another 2.2k ohm, and I couldn’t find one in my junk box. Oh well, a trip to Radio Shack or Fry’s should make that happen if I can’t scrounge the right one together. It also says there should be a 16 pin socket (which reading the Yahoo! help group, nobody seems to get). I could solder it in place, or get a socket.

I did make two mistakes (I mixed a RED-RED-RED with a RED-RED-ORANGE, and mixed a resistor with a similarly marked molded inductor which was truly stupid), but some snips, soldering braid and the like, and I’m back on track.

I might try my hand at winding some of the toroids tonight, and tomorrow: all the caps will go in. Then, it should be a short walk to a working radio!

I’ll keep ya posted.

My new toy, a Heathkit HW-8

Yesterday I managed to be the winning bidder for this little radio at the QRP Pacificon. Mike Schettler, WA6MER was kind enough to put it up, and I thank him profusely, it’s a very nice little rig. Now, I am one step closer to emulating Bill, M0HBR, as I have BOTH a Drake 2B and a Heathkit HW-8. Heh.

Addendum: My apologies for saying the word “actually” three times in once sentence. Chalk it up to me being fairly excited.


httpv://www.youtube.com/watch?v=A4fCK9VPC0U

BROADCAST YOUR PODCAST

Well, this isn’t quite amateur radio in the sense of ham radio, but it’s a cute and potentially useful project: a simple fm transmitter that uses only a single transistor, and is built “Manhattan style” on a scrap of PC board. If you’ve been looking for an excuse to try Manhattan construction, this might be a fun, low risk project that requires only the most minimal of investments.

BROADCAST YOUR PODCAST.

More on the Softrock Experience…

I am not really that much closer to figuring out why opposite sideband rejection is so poor, but I downloaded a couple of different SDR programs in the hopes that they might provide some diagnostic which might point more at the exact cause. Rocky still seems to be the best. PowerSDR seemed to work and has many cool features, but also seemed to pop and glitch occasionally. I also tried KGKSDR, which is a nifty program too, but which gave a glitch or two as well. I think the take away from all this is that sound cards suck.

But, a couple of interesting milestones with this: I decoded my first SSB signal with it yesterday (nifty!) and also my first PSK31 signal (Rocky has a built in decoder).

Oh, and I spent some time looking for a new scope. No luck yet.

My Softrock 40…

So, I’ve had my Softrock 40 on the shelf for a while. When I’ve hooked it up, I don’t get very good opposite sideband cancellation. I think I see why, although I’m not sure how to proceed to fix it.

First of all, check out awesome WB5RVZ page on the Softrock Lite. The basic idea is that the Softrock runs an oscillator at 4x the center of the receive frequency (at least for the 40m version, the 30m is a bit different). The oscillator in the 40m I’ve got runs at 28.224 Mhz. It then runs two separate divider chains that create two (essentially) square waves run at 7.056 Mhz (which becomes the center frequency of the band received). Each of these is mixed with the incoming signal, and the result summed back together, which should result in an image of the entire band (subject to Nyquist sampling restrictions, naturally).

But what I’m seeing in my reciever is that I’m seeing each frequency at the opposite side of the carrier frequency (if I am trying to see a signal at 7.070 Mhz (say, a BPSK frequency), I also see the same signal on the opposite sideband at 7.042 Mhz.

It’s not hard to see why. I recorded a bunch of audio from it on my laptop, and plotted each sample as an X-Y pair. Have a peek:

Screen shot 2009-10-03 at 9.40.07 PM

If the radio were working properly, I’d expect to see a very symmetric pattern here, but instead we see an ellipse at 45 degrees. Not good. The thing is, I’m not sure what could be going on here. I’ve hooked an oscilloscope to the divider outputs, and seem to get what I would expect (although my scope is only a 20Mhz one, and the waveforms seem a bit distorted, which could be the scope or the radio). It seems unlikely that the two divider outputs could be that far out of whack: it’s just a set of cmos dividers. My best guess is the sloppy job I may have done on the trifilar inductor that I wound as a mixer. What do you all think?

I’ll try to get some oscilloscope screenshots up here later. i am still a rookie at using the oscilloscope, and haven’t been able to get the X-Y pattern that I expect yet.

Addendum: Here’s an example showing the lack of opposite sideband cancellation. I recorded some audio and ran it through my own spectrum rendering code, each horizontal pixel is about 20ms. You can see that the power in each sideband isn’t exactly even, but that we can clearly see the same signals on both sides of the middle frequency.

opposite

Addendum2: Here’s a photo of the X-Y of the two quadrature channels. I’m somewhat confused actually about the scaling: I am getting significantly more vertical deflection than horizontal, but that result seems to hold even when I reverse the channels. That obviously can’t be right. I probably have my scope configured in some stupid way. Oh well, this is how we learn, right?

IMG_0066

Addendum3: Yep, something is definitely wacky. Here we are in dual trace mode. You can see the amplitudes are very close to the same, although the shapes aren’t very pretty.
IMG_0067

Addendum4: AK6L sent me this link, which shows what I think the waveforms should look like…



How to use Python to predict satellite locations…

Occasionally I get to talk to hams who are just getting into using amateur satellites, and many of them ask the quite reasonable question “How do I figure out when the next pass occurs?”. For most of them, I suggest that they simply use a program like predict, which is probably what most people expect from a satellite prediction program.

I used just such a program for quite a while, until I first worked NH7WN in Hawaii, myself standing in my front yard, he standing on a beach in Hawaii, and I asked myself the quite normal question: “How often can I work Hawaii from here in California?” The (frankly excellent, don’t get me wrong) predict program didn’t provide a convenient way to answer that question.

Faced with this, I decided to write my own code for satellite prediction, so I could easily adapt it to answering questions like these. Because I like Python, and find it convenient for scripting applications, I chose Python as the implementation language. The algorithm I used was James Miller, G3RUH’s Plan 13 which was originally written in BASIC, and was relatively easy to port. I ended up creating a simple Python library implementation of Plan 13, which I’ve used for all my own satellite prediction needs. The nice thing about Python is that it has a bunch of useful libraries you can use (I used the sqlite3 library to build a database of orbital elements, and urllib to download them automatically from celestrak), and it’s been quite adaptable.

Still there were a few warts with it, and I haven’t had the chance to tidy it up. But recently I discovered that the PyEphem library includes a lot of the same functionality, and with a better version of the orbital model that I implemented. And, it’s pretty easy to use. As an example, here is a small chunk of code that figures out the next three passes of the ISS, using the current (for today) orbital elements. Even if you aren’t an amazing programmer, you can probably figure out how it works.

#!/usr/bin/python

import sys
import math
import ephem

iss = ephem.readtle("ISS (ZARYA)",
	"1 25544U 98067A   09270.78646569  .00012443  00000-0  87997-4 0  6860",
	"2 25544  51.6377 140.0905 0009007 135.9273 312.2213 15.74420558622113")

obs = ephem.Observer()
obs.lat = '38.0'
obs.long = '-122.0'

for p in range(3):
	tr, azr, tt, altt, ts, azs = obs.next_pass(iss)
	while tr < ts :
		obs.date = tr
		iss.compute(obs)
		print "%s %4.1f %5.1f" % (tr, math.degrees(iss.alt), math.degrees(iss.az))
		tr = ephem.Date(tr + 60.0 * ephem.second)
	print
	obs.date = tr + ephem.minute

Running it produces a dump of times, altitude and azimuths for three passes. Here’s a resulting run.

2009/9/28 04:12:18 -0.0 268.5
2009/9/28 04:13:18  1.4 257.6
2009/9/28 04:14:18  2.4 244.9
2009/9/28 04:15:18  2.5 231.3
2009/9/28 04:16:18  1.8 218.3
2009/9/28 04:17:18  0.4 206.7

2009/9/28 17:27:22 -0.1 169.1
2009/9/28 17:28:22  2.1 159.4
2009/9/28 17:29:22  4.0 147.1
2009/9/28 17:30:22  5.2 132.6
2009/9/28 17:31:22  5.1 117.1
2009/9/28 17:32:22  3.9 102.7
2009/9/28 17:33:22  1.9  90.7

2009/9/28 19:00:26  0.0 227.2
2009/9/28 19:01:26  3.8 226.9
2009/9/28 19:02:26  9.2 226.4
2009/9/28 19:03:26 17.8 225.3
2009/9/28 19:04:26 35.8 222.0
2009/9/28 19:05:26 80.4 152.7
2009/9/28 19:06:26 37.7  57.0
2009/9/28 19:07:26 18.5  53.3
2009/9/28 19:08:26  9.6  52.2
2009/9/28 19:09:26  4.1  51.8
2009/9/28 19:10:26  0.2  51.5

I did notice that this simple program may not work properly if the ISS is currently visible from your location, but I am sure that with just a little more work we could figure that out. I’ll probably port my existing software to this framework, because it also includes a bunch of useful functions (like figuring out when the sun rises and sets, and other fun things) which would be a pain for me to add. So here’s my radical suggestion: if you need to compute the location of satellites, write some scripts of your own using pyephem! It’s the homebrewer way. 🙂

Addendum: A few more minutes of work added some more interesting outputs…

#!/usr/bin/python

import sys
import math
import ephem

iss = ephem.readtle("ISS (ZARYA)",
	"1 25544U 98067A   09270.78646569  .00012443  00000-0  87997-4 0  6860",
	"2 25544  51.6377 140.0905 0009007 135.9273 312.2213 15.74420558622113")

obs = ephem.Observer()
obs.lat = '38.0'
obs.long = '-122.0'

for p in range(3):
	tr, azr, tt, altt, ts, azs = obs.next_pass(iss)
	print """Date/Time (UTC)       Alt/Azim	  Lat/Long	Elev"""
	print """====================================================="""
	while tr < ts:
		obs.date = tr
		iss.compute(obs)
		print "%s | %4.1f %5.1f | %4.1f %+6.1f | %5.1f" % \
			(tr, 
			 math.degrees(iss.alt), 
			 math.degrees(iss.az), 
			 math.degrees(iss.sublat), 
			 math.degrees(iss.sublong), 
			 iss.elevation/1000.)
		tr = ephem.Date(tr + 20.0 * ephem.second)
	print
	obs.date = tr + ephem.minute

And some output:

Date/Time (UTC)       Alt/Azim	  Lat/Long	Elev
=====================================================
2009/9/28 04:12:18 | -0.0 268.4 | 34.9 -145.6 | 335.6
2009/9/28 04:12:38 |  0.5 265.0 | 34.0 -144.5 | 335.7
2009/9/28 04:12:58 |  1.0 261.3 | 33.2 -143.4 | 335.9
2009/9/28 04:13:18 |  1.5 257.4 | 32.3 -142.3 | 336.0
2009/9/28 04:13:38 |  1.9 253.4 | 31.4 -141.3 | 336.2
2009/9/28 04:13:58 |  2.2 249.1 | 30.5 -140.2 | 336.3
2009/9/28 04:14:18 |  2.4 244.7 | 29.5 -139.2 | 336.5
2009/9/28 04:14:38 |  2.6 240.2 | 28.6 -138.3 | 336.6
2009/9/28 04:14:58 |  2.6 235.7 | 27.7 -137.3 | 336.8
2009/9/28 04:15:18 |  2.5 231.1 | 26.7 -136.3 | 337.0
2009/9/28 04:15:38 |  2.4 226.7 | 25.8 -135.4 | 337.1
2009/9/28 04:15:58 |  2.1 222.3 | 24.8 -134.5 | 337.3
2009/9/28 04:16:18 |  1.7 218.1 | 23.9 -133.6 | 337.5
2009/9/28 04:16:38 |  1.3 214.0 | 22.9 -132.7 | 337.7
2009/9/28 04:16:58 |  0.9 210.2 | 21.9 -131.8 | 337.9
2009/9/28 04:17:18 |  0.3 206.6 | 20.9 -131.0 | 338.1

Date/Time (UTC)       Alt/Azim	  Lat/Long	Elev
=====================================================
2009/9/28 17:27:24 |  0.0 168.7 | 19.0 -118.4 | 346.7
2009/9/28 17:27:44 |  0.7 165.7 | 20.0 -117.5 | 346.4
2009/9/28 17:28:04 |  1.4 162.5 | 21.0 -116.7 | 346.2
2009/9/28 17:28:24 |  2.1 158.9 | 22.0 -115.8 | 345.9
2009/9/28 17:28:44 |  2.8 155.1 | 22.9 -115.0 | 345.6
2009/9/28 17:29:04 |  3.5 151.0 | 23.9 -114.1 | 345.3
2009/9/28 17:29:24 |  4.1 146.6 | 24.9 -113.2 | 345.0
2009/9/28 17:29:44 |  4.6 141.9 | 25.8 -112.3 | 344.7
2009/9/28 17:30:04 |  4.9 137.0 | 26.8 -111.3 | 344.4
2009/9/28 17:30:24 |  5.2 131.9 | 27.7 -110.4 | 344.1
2009/9/28 17:30:44 |  5.3 126.8 | 28.6 -109.4 | 343.9
2009/9/28 17:31:04 |  5.3 121.6 | 29.6 -108.4 | 343.6
2009/9/28 17:31:24 |  5.1 116.4 | 30.5 -107.4 | 343.3
2009/9/28 17:31:44 |  4.8 111.5 | 31.4 -106.4 | 343.0
2009/9/28 17:32:04 |  4.3 106.7 | 32.3 -105.4 | 342.7
2009/9/28 17:32:24 |  3.8 102.1 | 33.2 -104.3 | 342.4
2009/9/28 17:32:44 |  3.2  97.9 | 34.0 -103.2 | 342.2
2009/9/28 17:33:04 |  2.5  93.9 | 34.9 -102.1 | 341.9
2009/9/28 17:33:24 |  1.8  90.2 | 35.8 -101.0 | 341.6
2009/9/28 17:33:44 |  1.1  86.9 | 36.6  -99.8 | 341.3
2009/9/28 17:34:04 |  0.4  83.8 | 37.4  -98.6 | 341.1

Date/Time (UTC)       Alt/Azim	  Lat/Long	Elev
=====================================================
2009/9/28 19:00:26 |  0.1 227.2 | 23.8 -137.4 | 345.3
2009/9/28 19:00:46 |  1.2 227.1 | 24.8 -136.5 | 345.1
2009/9/28 19:01:06 |  2.4 227.0 | 25.7 -135.6 | 344.8
2009/9/28 19:01:26 |  3.8 226.9 | 26.7 -134.7 | 344.5
2009/9/28 19:01:46 |  5.4 226.8 | 27.6 -133.7 | 344.2
2009/9/28 19:02:06 |  7.2 226.6 | 28.6 -132.8 | 343.9
2009/9/28 19:02:26 |  9.2 226.4 | 29.5 -131.8 | 343.6
2009/9/28 19:02:46 | 11.6 226.2 | 30.4 -130.8 | 343.3
2009/9/28 19:03:06 | 14.4 225.8 | 31.3 -129.7 | 343.0
2009/9/28 19:03:26 | 17.9 225.3 | 32.2 -128.7 | 342.8
2009/9/28 19:03:46 | 22.2 224.7 | 33.1 -127.6 | 342.5
2009/9/28 19:04:06 | 28.1 223.6 | 34.0 -126.5 | 342.2
2009/9/28 19:04:26 | 36.1 221.9 | 34.8 -125.4 | 341.9
2009/9/28 19:04:46 | 47.7 218.5 | 35.7 -124.3 | 341.6
2009/9/28 19:05:06 | 64.1 209.2 | 36.5 -123.1 | 341.4
2009/9/28 19:05:26 | 80.5 149.1 | 37.4 -121.9 | 341.1
2009/9/28 19:05:46 | 66.7  71.9 | 38.2 -120.7 | 340.8
2009/9/28 19:06:06 | 49.6  60.7 | 39.0 -119.5 | 340.6
2009/9/28 19:06:26 | 37.4  57.0 | 39.8 -118.2 | 340.3
2009/9/28 19:06:46 | 29.0  55.1 | 40.5 -116.9 | 340.1
2009/9/28 19:07:06 | 23.0  54.0 | 41.3 -115.5 | 339.8
2009/9/28 19:07:26 | 18.4  53.3 | 42.0 -114.1 | 339.6
2009/9/28 19:07:46 | 14.9  52.8 | 42.7 -112.7 | 339.3
2009/9/28 19:08:06 | 12.0  52.5 | 43.4 -111.3 | 339.1
2009/9/28 19:08:26 |  9.5  52.2 | 44.1 -109.8 | 338.8
2009/9/28 19:08:46 |  7.5  52.0 | 44.7 -108.3 | 338.6
2009/9/28 19:09:06 |  5.7  51.9 | 45.4 -106.7 | 338.4
2009/9/28 19:09:26 |  4.1  51.7 | 46.0 -105.1 | 338.1
2009/9/28 19:09:46 |  2.6  51.7 | 46.5 -103.5 | 337.9
2009/9/28 19:10:06 |  1.3  51.6 | 47.1 -101.9 | 337.7
2009/9/28 19:10:26 |  0.2  51.5 | 47.6 -100.2 | 337.5

Addendum2: As another example of what can be done, consider the command line voice synthesizer that is included in Mac OS. Using the os.system command, you can have your computer speak voice updates almost as easy as printing them. For example:

#!/usr/bin/python

# Mac OS includes a voice synthesis command called "say".   It's pretty
# easy to make a simple program like this that will use voice to announce
# the current position of the satellite.   With a little work, you could
# easily make it announce the altitude and azimuth repeatedly during a pass.

import sys
import os
import math
import ephem

iss = ephem.readtle("ISS (ZARYA)",
	"1 25544U 98067A   09270.78646569  .00012443  00000-0  87997-4 0  6860",
	"2 25544  51.6377 140.0905 0009007 135.9273 312.2213 15.74420558622113")

obs = ephem.Observer()
obs.lat = '38.0'
obs.long = '-122.0'

iss.compute(obs)
if iss.alt < 0:
	os.system('say The ISS is not currently visible.')
else:
	os.system('say "The ISS is at altitude %d, azimuth %d."' % \
		(int(math.degrees(iss.alt)+0.5), int(math.degrees(iss.az)+0.5)))

Here’s an example of the voice it outputs:
Voice synthesis example

Bouncing APRS packets off the ISS…

My wife mentioned to me that there was a visual pass of the ISS this evening. Wow, is she awesome or what? She found out about it by subscribing to the twitter feed “twisst”, which is apparently automated, and will send you messages when a ISS pass is about to occur. This pass had a maximum altitude of about 35 degrees, so I decided to get out my TH-D7A radio and my Arrow antenna and see if I could not only see it visually, but could bounce some packets off it. While waving my antenna around, I heard the telltale sound of a digital packet, and then, suddenly rising above the hill behind my house, there it was, looking nice and bright. I got my wife to look at it, and while I was looking down at my radio, it apparently went into eclipse, because when I looked back up, not a trace of it could be seen. Nevertheless, I bounced three packets off it, which were logged onto the Internet by gateways. Check it!

Picture 1

2009-09-23 03:47:51 UTC: K6HX-1>37UXPW,RS0ISS-3*,qAS,W6MSU-4:'2+9l <0x1c>-/>THD7A,5w,arrow
2009-09-23 03:48:52 UTC: K6HX-1>37UXPW,RS0ISS-3*,qAo,N6VIG:'2+9l <0x1c>-/>THD7A,5w,arrow
2009-09-23 03:50:51 UTC: K6HX-1>37UXPW,RS0ISS-3*,qAR,N0AN:'2+9l <0x1c>-/>THD7A,5w,arrow

via Raw packets of K6HX-1