Saturday, July 26, 2008

GutterTool Pro Turbo (with clearvu leaf mirror)!

GuttMaster.jpgThe gutters here at Marxy Manor are full of leaves and when it rains they overflow in all the wrong places.

Being a fan of PVC pipe constructions (see the laptop stand) I had a bright idea that a quick trip to the "$2.50" shop provided the bits for.

To be honest, it doesn't work too well, the mirror goes out of alignment very quickly and the force required to lift the twigs and leaves it too much for the flexible pipe I'm using - perhaps pressure pipe is the answer.

GuttMasterView.jpg


Anyhow, a bit of home invention is great fun. Could this be the next "stump jump plough"?

Friday, July 25, 2008

Low cost embedable frequency counter

Frequency Counter.jpgHeard about this on the wonderful Soldersmoke blog. A flexible digital display for home home brew radios, from Doug N3ZI.

The pre-scaler is configurable to make it useful in ranges up to 50Mhz or so. It uses an Atmel ATtiny24 which comes pre-programmed. The software includes clever things like handling the IF offset.

Normally, low cost frequency counters tend to show annoying jitter in the last digit but the author has overcome this so it seems very stable in operation.

There are three versions of the kit, from $10 to $30 for the full kit. I bought the full kit and it came quickly, went together easily, and worked first time.

I'm thinking of pairing it with a Bitx20.

Thanks Doug!

Update

I've hooked it up to an MMR40 7Mhz rig.

MMR40 counter.jpg


I needed to make a buffer amplifier to boost the local oscillator level enough for the counter. It's based on a snippet from Experimental Methods in RF Design.

rf amplifier.png


The local oscillator output is 0.27V peak to peak, after the transistor buffer it's 1V peak to peak. I used a 2N2222a that I had on hand.

The counter was set to an IF offset of -10Mhz. Doug's software lets you do this with ease using up and down buttons that accelerate if you hold them down.

There's a plastic box HB5970 that fits pretty much perfectly. It's 140 x 110 x 35mm the CPU board slides into slots and I've just used the LCD board as the front panel (a bit ugly but functional).

box content.jpg


Having boxed it all up it looks great:

front working.jpg


I had to increase the input capacitor's value in the counter to get it to be sensitive enough with my buffer to work reliably.

Anyhow, a great kit. Highly recommended.

Thursday, July 24, 2008

iPhoto book in Australia

I've just received the first book printed through iPhoto using Apple's printing service.

iPhotoBook.jpg

The book was assembled in iPhoto from pictures taken with a pocket Sony DSC W300 camera (which I'm very happy with).

It was AU$12.50 for a 20 page (read 20 sides plus front and back cover) 8" x 6" soft cover book.

The books are printed somewhere else in the world and re-posted from Mascot in Sydney (near the airport) so it took 15 days from order to arrival, although it shipped in just two days from somewhere.

I've got to say - it looks great! A very professional looking production that I'm proud to give away and keep on the shelf (I ordered a couple of copies).

Normally, I choose a few digital images to get enlarged at the local printer for gluing in my album, I'm thinking of switching to doing a series of these books for hard copy storage.

The printing is a semi-gloss, sort of waxy look. There's a bit of metamism (that effect where the dark parts of an image reflect light at some angles). It's full edge to edge printing and the preview if super accurate in terms of where things get chopped.

This collection wasn't super quality, many were shot at high ISO (1600), all with available light at a party. I feel that the colours have been a little boosted but overall the effect is great.

Monday, July 21, 2008

Twinkle on iPhone 2 - location based awesome

IMG_0001.PNGI've been hearing about location based services being the next big thing for many years.

Now that I'm playing with Twinkle on the iPhone I'm starting to get it.

You can see, and therefore make contact with, people who are close to you. It can be a little spooky and of course you need to be aware that bad people might be looking for people to stalk close by, but it certainly shows a new way to hook up with interesting folks who you might want to hook up with in "meatspace".

I can see a ton of applications for this already.

Oh, and to take screen shots on iPhone 2, hold down the "home" button and click the top button. The screen flashes and the picture goes in your camera reel as a PNG.

Sunday, July 20, 2008

A chat with Ben & Pete podcast - iPhone 3G

We're back with a podcast where we discuss our experiences with the iPhone 3G. The mp3 is here.

Friday, July 18, 2008

Water rocket launch at Killarney Heights

Peter has improved the launch platform and the spin is much reduced now.


Here's just the flight in slow motion:


Thursday, July 17, 2008

Sleek Geeks in a lift

sleekGeeks.jpgAfter a talk on ABC Radio National about the iPhone this morning, I was riding down in the lift at the ABC's Ultimo centre, the doors opened, and in walked the "Sleek Geeks" - Adam Spencer (with his bicycle) and Dr Karl Kruszelnicki.

I'm a huge fan of both these guys, and they were gracious enough to allow me to snap this picture as we descended. Adam rode off and Karl stayed for a chat about some computer troubles.

Thanks guys for being so polite in the face of a stary-eyed fan in close quarters.

Sunday, July 13, 2008

I miss Starstuff on ABC Newsradio

I tuned in to ABC Newsradio today and mourned the lack of the regular Starstuff program produced and presented by Stuart Gary.

The site simply says "After eight years on the radio StarStaff takes its last journey across the universe this week. Tune in this Sunday at midday EST for the final episode of StarStuff".

As a devoted listener for many years, I'd like to express my thanks to Stuart and the ABC for running this program. I used to really like listening to it late at night on Sunday nights, the schedule change took some adjustment but the podcast made up for it.

Stuart's enthusiastic and informed presentation and interview style were always welcome and his regular guests were terrific.

Apparently ABC Newsradio is trying to focus more on the rolling news role of the station, which I value too, but lets just hope that all things space are not replaced with all things sport.

I'm not the only one to mourn the loss it seems.

Friday, July 11, 2008

Got a 3G iPhone pretty easily in Sydney

iPhoneQ.jpgI've been hanging out for an iPhone for a long time. Rather than going to the city I decided to head for Warringah Mall north of Sydney.

I got to the Vodafone store at about 8 for a 9am opening. There were 8 people in the queue and security guards hanging around. (The store said they were mostly worried about a robbery over night as the phones were hidden out the back).

Doing the paper work and using the Vodafone systems was an incredibly poor and slow experience. Part of the process involved ringing up and we waited 55 minutes in the phone queue. In the end I brought the phone home to "unbrick" (as they call it).

This little Vodafone store had 60 in stock. Everyone I spoke to in the queue wanted the 16Gb black version, while we were waiting a sales person from Crazy Johns was trying to offload some 8Gb models but no one seemed interested.

My home has poor signal from Vodafone and if the bars on the display are anything to go by reception is better than my past phones. In a call (to Ben) it seems like the audio is good but I do still need to find a good spot at home.

Oh the security guard you can see in the shot rushed over to tell me that I'm not allowed to take pictures after the shot above. Strange days..

Updates

So far I've bought the iPhone version of OmniFocus but the syncing update for the mac is due on the 10th (US time) so hasn't turned up yet.

NetNewswire is free so I got that but they want me to sign up on newsgator so I haven't done that yet.

The GPS seems very fast to get a fix, I walked outside and took a picture and the lat long is in the photo's exif.

I wonder why they don't allow a "turn by turn" navigator? I would definitely buy that...

The iTunes remote is kind of cute.

No glitches so far, very smooth user experience.

Update 2

Mobile Me seems to be working now and yes it pushed an email to the phone, it took about 20 seconds. Now, I understand that a single connection exists from the phone to Apple to do the pushing, I wonder if I get charged for that data?

Apps so far

The Apple Remote Control app is really great. I remember they had a patent on this and I'd have to say it blows away any other remote control, at least for talking to iTunes. This feature prompted us to set up some living room speakers connected to a mac and do some music listening.

Truphone does voice over the wifi network. I already have credit on Skype so really that's what I want but until they release I'll use Truphone. Voice quality is fine but the delay seems very long.

Sunday, July 06, 2008

Rather than flying or driving, caught the train

passengers.jpgAs the price of petrol climbs my theoretical enthusiasm for public transport increases.

This weekend the family made the trip to Coffs Harbour. Normally we would either drive or catch a plane but along with my fun-loving sister and brother-in-law, we decided to catch a CountryLink train from Sydney Central.

We decided to pay a little extra and go "first class". The best thing about the trip was meeting other passengers. Along the way we had some great conversations and heard some truly amazing stories that I won't betray here.

The staff were really nice and seemed to be even having some fun.staff.jpg

The seats were rather hard and next time I'd consider taking an inflatable cushion of some sort. The trains themselves are very modern and even had a payphone on board (mobile reception was decidedly patchy along the way).

The wine was pretty good (served after noon) but I'd have to say that the food was hearty but not exciting. Here's the roast pork.

lunch.jpg

Sydney to Coffs Harbour took nine hours whereas the trip by plane is about two all up. I found myself strangely tired from a day of sitting in a chair, but definitely enriched by the experience.

Monday, June 30, 2008

Killarney water rocket with video camera on board



Great innovation this past weekend.

Here it is again, but with the footage shot from the rocket in slow motion.



RocketLauncher.jpgNew technology is on the way.... Rocketeer Holland came up with a brilliant plan, to use water hoses and quick release joiners to launch with.

I've only seen this at night and unfortunately won't be able to try it out until next week due to an exciting train trip this weekend (reports to follow).

Friday, June 20, 2008

iPhone Australia countdown

iPhone.png

Vodafone

The Vodafone store near North Sydney station told me today that all they know is that iPhones will be available on July 11 and that there will be new data plans announced soon.

I pre-registered and just received the following email:

"Here at Vodafone, we’re eagerly counting down the days until the launch of the new iPhone 3G - and we bet you are too! We are keen to make sure that we can give you the very best deals on your new iPhone 3G and we are putting the finishing touches to these offers.

So, what next?

Since you have taken the time to pre-register, you are now at the front of the line. We will be rolling out these exciting offers very soon, so make sure to keep an eye on your inbox to stay ahead of the game.

Stocks will be limited so you will need to be quick.

Regards

The Vodafone Direct Deals Team"

Well, I'm standing by...

Optus


Optus was taking $50 deposits for existing customers and $100 deposits for customers proposing to "churn" from another carrier. Shouldn't that be the other way around?

They have now ceased taking deposits, presumably if you've paid a deposit you'd expect to get your hands on the device on July 11. I guess they don't have enough stock coming in to meet that expectation.

They've now sent out the following email to people who've registered:

"Thanks for your interest in the iPhone 3G with Optus.

Apple has released details of the new iPhone, and it's exciting! With fast 3G wireless technology, maps with GPS and the new App store, you have even more features at your fingertips.

Check out the full features and tech specs today.

We'll be back in touch in the coming weeks to give you more information on Optus' great coverage, great content, great service - and most importantly, the Optus iPhone plans. All reasons why your iPhone 3G will be happy with Optus.

Stay tuned!"

Telstra


They've come to the party, although they'll pay the penalty for being late. When the iPhone launched in the US it's estimated that sales in the first weekend were at least 700,000 units, with 200,000 on the first night. Now, Australia has a much smaller population but we are known as "early adopters" so it's likely that there will be a big pent-up demand.

If the opening of the Sydney Apple store is anything to go by, I can see overnight queueing for iPhones on July 10/11.

Telstra will miss out on this surge and further are likely to suffer the loss of customers who churn over to Optus or Vodafone just to get an iPhone without delay.

Let's not forget that Telstra's operations chief Greg Winn famously predicted that the iPhone would meet stiff competition from the incumbent mobile phone makers and he advised Apple to "stick to it's knitting".

More than a year has passed and while we are starting to see phones with large screens, I don't think anything so far has come close.

Perhaps Mr Winn should stick to his knitting and get Telstra operations working competitively? (Go to a Telstra shop around lunch time and try to get anything done...)

Update

It's December 2012 and Vodafone's Search Engine Optimisation Manager contacted me asking me to fix a link to their iPhone page. Of course this article is now very old so I've removed the link. Thanks for your interest.

Thursday, June 19, 2008

Sydney Apple store opening

SydneyAppleStore.jpgChris, Coops and I wandered into the city to see if anyone had turned up to the opening of the new Sydney Apple store.

It was dark and raining but the queue stretched for several city blocks. Hard to estimate the numbers but it seemed like they would run out of the 2,000 T-Shirts that were up for grabs.

You've certainly got to hand it to Apple for generating a buzz. Passers by were asking what on earth all those people were lining up to buy.

What a pity they don't have any iPhones just yet.

Sunday, June 15, 2008

Building a software defined radio

softrockfront.jpgI'm building the new Softrock "Xtall+Lite" v8.3 from Tony Parks KB9YIG.

He definitely needs to come up with a snappier name!

All seems well on the receiver front although it doesn't seem very sensitive and I suspect my front end isn't resonant in the right place. Shown above is the 40/80m front end.

Construction went well and all seems to check out ok. This board has a few surface mount components that take me a bit of concentration. The little DIP switches set the oscillator frequency.

First I had a go with Linrad on a Linux box but I seem to have sound troubles, so over to the Mac. My frustration is trying to get some SDR software running on the Mac. I spent several hours trying to get UWSDR to build on Leopard, after fixing all the little type casting complaints it wouldn't link with libfftw (missing symbols) so I'm stuck for now.
softrockback.jpg

In other news, I finally heard some PSK31 stations on 80m, VK2BOJ and VK2DD were heard on about 3.660Mhz with excellent signals. We were on our way out the door but I transmitted a few Hz away and they noticed and said hello. I only had time to say I had to go but this is a good sign.

It puzzles me why people give reports such as "599" when using PSK31, surely "S9 and -23db IMD" would be a more useful measure.

Update: I've just been pointed to some SDR software for the Mac by Sebastian DO8SEM here. Looks very promising although still under development. Currently, I'm not hearing too much but it has great promise.

Here it is on 80m. The audio seems rather distorted to me but it certainly works and I'm happily listening to SSB conversations.

SDRTransceiver.png

Tuning shortwave with a "waterfall" display is certainly the best way to operate.

Update 2:I figured out why my softrock was so deaf, the tuned RF front end is supposed to provide anti-phase signals at the input but in my case I had the phase of one side reversed. Works much better now.

Sunday, June 08, 2008

Water rocketry in Killarney Heights

The Killarney Heights space program continues, but this time it's sustainable. These water and air pressure rockets work surprisingly well and can be used multiple times. The air is pressurised with a car tire pump.



Thanks Pete and kids for a fine afternoon out. Shot with a little Canon still camera.

Had a contact with a $5 80m DSB radio

80mDSB.jpgStephen, VK2BLQ, has been selling off his old projects and I picked up an 80m double sideband radio he built for $5.

The only modification I've made is to re-wire the microphone socket to suit the mic I have.

I ran into local ham, Rob, VK2ZNZ in the supermarket today and asked if he would listen out for a weak signal on 80m. We liaised by phone and without trouble he was able to find me and we had a fine chat with the radio. His only complaint was a slow drift in frequency but the audio was good both ways.

This design is one that was published in Silicon Chip in November 1994 and available as a Jaycar kit. A pity they don't offer anything like that now. It's 1.5W PEP out and Rob said I was a little noisy but perfect copy.

Thanks Stephen for the fine radio to play with. Thanks Rob for helping me out.

Friday, June 06, 2008

Looking forward to WWDC 08

This year I'm not attending Apple's WWDC in person. I try to go every few years as it's a very energising experience.

Like many, I'm looking forward to the announcement of a 3G iPhone that I can buy here in Australia, but I'm also wondering what goodies we might see on the MacOS X and developer front. "Snow Leopard" sounds like an incremental update to Leopard, (which seems to be a very stable OS to me), but it would have to have some major changes under the hood. What comes to mind is:

  • Switching to a more modern, faster kernel, such as L4.
  • Make other languages, hopefully python, a first class AppleScripting language
  • Dropping support for PowerPC and no doubt cleaning out the code somewhat
  • Home directory in the cloud, or at least properly on a flash key drive
  • Build in the best of Wine, to make it at least easy to port Windows software to the Mac
  • A framework for making application uninstallers
  • ZFS or something to update HFS+


I'm also looking forward to an updated copy of "Cocoa Programming for MacOS X".

Tuesday, June 03, 2008

Mobile phone operating systems list

I'm preparing a chat about smart phones and trying to get a rundown of the current mobile phone operating systems. Here's what I know, any further tips would be greatly appreciated.


  • Symbian Series 40 - Older Nokia, Foma, Motorolla, Panasonic, Sendo, Siemens, Sony Ericsson and UIQ

  • Symbian Series 60 - in Nokia smart phones and many others including FOMA, LG, Nokia, Samsung, Sony Ericsson and UIQ

  • Windows Mobile - in Samsung, Palm Treo W, HTC, Motorola, Psion, i-Mate, Intermec,

  • RIM Blackberry - What OS is this underneath?

  • Apple iPhone OS - iPhone

  • PalmOS

  • Linux - Motorola, Grundig, HTC, NEC, Panasonic, Samsung, big list here

  • Google Android - Not out yet, coming to HTC at least



It looks like Symbian is currently dominant but clearly it's ageing which is presumably why Nokia bought Troltech. One year after launch, Apple has done well to get to 7% of market share.

Funny how it's hard to figure out the OS on many low end phones. I've used a Linux phone but couldn't tell really.

Had a chat about this on ABC Radio National this morning with Mark Bannerman.

Sunday, June 01, 2008

Sailing weekend in Melbourne

Photo 4.jpgCurrently on "Mark Twain" a lovely S&S 37. We're spending the weekend sailing around Melbourne.

Sailing is something that really brings me back to nature, it's great to be moving fast under just the power of the wind.

For someone like me, who spends so much time sitting in a chair in front of a computer, it's very refreshing to be in an environment like this.

While on board, we ran a wire up the mast which I tuned up as a vertical on 40m. I can personally recommend the little MFJ-16010 antenna tuner for these types of jobs and the in-built SWR meter in the FT-817 works well enough to tune with.ft817.jpg

The club we're moored at, Williamstown, has wifi that gives free access to Google and that's all. As I blog and do email with google everything just works for me.

skipper.jpg
The skipper.

crew.jpg
The crew.

My role was mostly as ballast.

Later..

Stayed over night at Queenscliff, lovely place people leave their houses open and their WiFi open, thanks to Annie and Mr D. Link.

Wednesday, May 28, 2008

Finally robotic beings rule the world

robotSafety.jpgTook some time out today to visit National Manufacturing Week here in Sydney at Darling Harbour.

What a fantastic show!

The best bits for me were the surface mount assembly machines, the printed circuit fabricator that uses a flat drill bit and stepper motors (for under $10k take home), and of course the robots.

There were huge metal benders, cutters - both laser and plasma, lathes and even some fine industrial footware.



Here's one of the robots in action, I like the warning label that is shown above.

I've put a gallery here.

Thursday, May 22, 2008

Social networking and the future of customer care

Had a chat on ABC Radio National with the very hip Steve Cannane this morning about how social networking is starting to be used for pro-active customer care. Check it out here.

iPhone in Australia with dual sims?

My Vodafone contract has expired and naturally I'm waiting for the iPhone to come to Australia before signing up again.

Just had a call from Vodafone asking me to start a new contract. Told the guy I was waiting for the iPhone and he said he was too.

He said a few other interesting things, all just from this outbound sales rep..

  • Vodafone will have about one month of exclusivity in Australia
  • New iPhones will have slots for dual sims, one for data and the other for calls
  • Launch in Australia is mid June


As I said, just claims by an outbound sales rep.

Friday, May 16, 2008

Web controlled Icom radio using python cgi

Modern radios have serial remote control interfaces but they're a little difficult to use. There is a wonderful library called hamlib but for some reason I can't get it to build at the moment on my Mac.

A remote control radio is a wonderful thing, I wish there were more around. You can listen to your own signal from far away to see how it really sounds and if the remote receiver is in a quiet location with a decent antenna it might be much better than listening from your home QTH.

Picture 3.pngI've set up a simple web page controlled remote receiver. The audio is streamed using Nicecast which is a great implementation of a streaming mp3 server that can be received using lots of different software on all platforms. One neat feature is that it automatically configures the port forward on my router.

Initially I used an external USB audio input device but after about 18 hours the sound deteriorated. I think there's a bug in the Mac's USB audio chain somewhere.

For the web interface I chose a very simple cgi using python.

Unfortunately I can't really offer this up to the world as I pay for upload on my internet connection and I'm already on target to run out this month.

I hope others can build on this and set up some more remote receivers around the place.

Here's the little python cgi:


#!/usr/bin/env python
# By VK2TPM Peter Marks http://marxy.org
# You are free to use this for any purpose.
#
# Thanks to df4or.de for notes on CI-V here:
# http://www.plicht.de/ekki/civ/civ-p31.html
#
# The BCD utilities come from
# Rigserve by Martin Ewing
# http://sourceforge.net/projects/rigserve
#


import serial
import time
import cgi
import sys
import time
import string
sys.stderr = sys.stdout

SERIAL_DEV = "/dev/cu.PL2303-000013FD"
SERIAL_BAUD = 4800
INTRO = "\xfe"
TO_ADDR = "\x70"
FROM_ADDR = "\xe0"
SET_OPERATING_FREQ = "\00"
SET_OPERATING_MODE = "\x06"
READ_OPERATING_FREQ = "\x03"
READ_OPERATING_MODE = "\x04"
EOM = "\xfd"

STREAM_URL = "http://XXXXXXXXXXXXX/listen.m3u"
SCRIPT = "/cgi-bin/radio.py"

def main():
log = open("log.txt", "w")
log.write("started %s\n" % time.ctime())
ser = serial.Serial(SERIAL_DEV, SERIAL_BAUD, timeout=1)
form = cgi.FieldStorage()
if form.has_key('frequency'):
freq = form.getvalue("frequency")
log.write("freq = %s\n" % freq)

setFrequency(ser, float(freq) * 1000)
if form.has_key('mode'):
mode = form.getvalue("mode")
log.write("mode = %s\n" % mode)
setMode(ser, mode)
else:
log.write("no form submit\n")
freq = getFrequency(ser)
mode = getMode(ser)
if mode == "LSB":
mode1 = "SELECTED"
mode2 = ""
mode3 = ""
elif mode == "USB":
mode1 = ""
mode2 = "SELECTED"
mode3 = ""
elif mode == "AM":
mode1 = ""
mode2 = ""
mode3 = "SELECTED"

htmlTemplate = """<html><head>
<title>VK2TPM</title>
<style>body,td,a,p{font-family:arial,sans-serif}</style>
</head><body>
<h1>VK2TPM Web controlled radio</h1>
<form action="$script">
<table>
<tr><td>Frequency:</td><td><input name="frequency" value="$freq">Hz
<a href="$script?frequency=$freqDown&Submit=Submit">-5</a>
<a href="$script?frequency=$freqUp&Submit=Submit">+5</a> </td></tr>
<tr><td>Mode:</td><td><SELECT NAME="mode">
<OPTION VALUE="LSB" $lsbSelected>LSB
<OPTION VALUE="USB" $usbSelected>USB
<OPTION VALUE="AM" $amSelected>AM
</SELECT></td></tr>
</table>
<input name="Submit" type=submit value="Submit"> <a href="$script">Refresh</a>
</form>
<a href="$script?frequency=3700&mode=LSB">3700 LSB</a> |
<a href="$script?frequency=3670&mode=AM">3670 AM</a> |
<a href="$script?frequency=3600&mode=LSB">3600 SSB</a> |
<a href="$script?frequency=576&mode=AM">576 AM</a> |
<a href="$script?frequency=11750&mode=AM">11750 AM</a> | <br />
<a href="$script?frequency=5643&mode=AM">5643 AM</a> |
<a href="$script?frequency=8867&mode=AM">8867 AM</a> |
<a href="$script?frequency=4426&mode=USB">4426 USB</a> |
<a href="$script?frequency=8176&mode=USB">8176 USB</a> | <br />
<p>Click to listen to the stream <a href="$streamUrl">here</a>.</p>
This receiver is connected to a 40/80m trap dipole so is best around 3500 and 7000.<br />
The stream is buffered by a few seconds so don't panic after you change something.<br />
After some tidying up, I'll publish the source on the <a href="http://marxy.org">blog</a>
</body></html>
"""
template = string.Template(htmlTemplate)
html = template.substitute({ "freq": str(freq),
"freqDown": str(freq - 5),
"freqUp": str(freq + 5),
"script": SCRIPT,
"streamUrl": STREAM_URL,
"lsbSelected": mode1,
"usbSelected": mode2,
"amSelected": mode3})

print "Content-type: text/html\n\n"
print html
ser.close()
log.close()

def test():
print "started"
ser = serial.Serial(SERIAL_DEV, SERIAL_BAUD, timeout=1)
print getFrequency(ser)
print getMode(ser)
setFrequency(ser, 3670 * 1000) # Hz
ser.close()

def setFrequency(ser, freq):
fs = "%010d" % int(freq)
print fs

out = bcd4(int(fs[8]),int(fs[9]),int(fs[6]),int(fs[7]))
out += bcd4(int(fs[4]),int(fs[5]),int(fs[2]),int(fs[3]))
out += bcd2(int(fs[0]),int(fs[1]))
print out

sendStr = INTRO + TO_ADDR + FROM_ADDR + SET_OPERATING_FREQ
for byte in out:
sendStr += chr(byte)
sendStr += EOM
ser.write(sendStr)

echo = ser.read(len(sendStr))
print "got reply of %d chars" % len(echo)

def getFrequency(ser):
sendStr = INTRO + TO_ADDR + FROM_ADDR + READ_OPERATING_FREQ + EOM
ser.write(sendStr)

echo = ser.read(len(sendStr))
print "got reply of %d chars" % len(echo)

if not expectChar(ser.read(), INTRO): return
if not expectChar(ser.read(), INTRO): return
if not expectChar(ser.read(), FROM_ADDR): return
if not expectChar(ser.read(), TO_ADDR): return

byte = "0"
result = ""
while byte != EOM:
byte = ser.read()
print "%02x" % ord(byte),
result += byte

print "got EOM byte"
frequency = 0.0
if len(result) > 0:
f=0
for k in [10,11,8,9,6,7,4,5,2,3]:
f=10*f + nib(result,k)
frequency = (float(f) / 1000)
return frequency

def getMode(ser):
sendStr = INTRO + TO_ADDR + FROM_ADDR + READ_OPERATING_MODE + EOM
ser.write(sendStr)

echo = ser.read(len(sendStr))
print "got reply of %d chars" % len(echo)

if not expectChar(ser.read(), INTRO): return
if not expectChar(ser.read(), INTRO): return
if not expectChar(ser.read(), FROM_ADDR): return
if not expectChar(ser.read(), TO_ADDR): return

byte = "0"
result = ""
while byte != EOM:
byte = ser.read()
print "%02x" % ord(byte),
result += byte

print "got EOM byte"
mode = "XXX"
if result[1] == "\x00":
mode = "LSB"
elif result[1] == "\x01":
mode = "USB"
elif result[1] == "\x02":
mode = "AM"
elif result[1] == "\x03":
mode = "CW"
elif result[1] == "\x04":
mode = "RTTY"
elif result[1] == "\x05":
mode = "FM"
elif result[1] == "\x06":
mode = "Wide FM"
elif result[1] == "\x07":
mode = "CW-R"
elif result[1] == "\x08":
mode = "RTTY-R"
elif result[1] == "\x11":
mode = "S-AM"
return mode

def setMode(ser, mode):

sendStr = INTRO + TO_ADDR + FROM_ADDR + SET_OPERATING_MODE
if mode == "LSB":
sendStr += "\x00"
elif mode == "USB":
sendStr += "\x01"
elif mode == "AM":
sendStr += "\x02"
sendStr += EOM
ser.write(sendStr)

echo = ser.read(len(sendStr))
print "got reply of %d chars" % len(echo)

# non-reversed
def bcd4(d1,d2,d3,d4): return (16*d1+d2, 16*d3+d4)
# pack 2 BCD digits
def bcd2(d1,d2): return ( (16*d1+d2), )

# get a 4-bit nibble (digit) from a nibble string
def nib(s,i):
k = ord(s[i/2])
if i%2 == 0: k = k >> 4
return k & 0xf

def expectChar(byte, expected):
"""Return true if we got what we expected"""
if byte == expected:
print "good %02x" % (ord(expected)),
return True
else:
print "wanted %02x unexpected %02x" % (ord(expected), ord(byte)),
return False

main()

Measuring small inductors with a bridge

meter2.jpgYou might gather from this blog that I'm most comfortable with digital things - computers, software and even embedded microcontrollers seem very predictable to me. However, I'm very interested in learning the dark arts of radio frequency construction.

There's a long term project on the bench here, a double sideband transmitter for 14Mhz. Everything was going quite well until I got to building a tuned circuit. Of all the components, small inductors are the most mysterious to me.

I mentioned my frustration to John Ha1e, VK2ASU, at a recent meeting of the NSW home brew group and he kindly offered to help me out.

John showed me how he measured small inductors, such as ones wound on drinking straws, using an inductance bridge. There are a number of circuits around the net, I built the excellent simple one by Drew Diamond, VK3XU from his first volume of "Radio projects for the amateur". A design based on his circuit is published here I just discovered.

Yes, it really dips on small inductors like the one shown above. In this picture it's not showing the dip as it would be boring to show a meter on zero! I have yet to calibrate this instrument but I think it can measure from about 1uH up.

meter1.jpg


As with all of my home brew, they look pretty messy when you open the case - but that's where the beauty is for me.

It's amazing how valuable it is to actually watch someone winding and measuring small tuned circuits, but after watching John at work I gained the confidence that these things do actually follow the laws of physics and now feel I'm on my way again.

Thankyou VK2ASU and VK3XU.

Update: It looks like I can measure from about 1uH to 10uH on this device. I went out this morning and purchased a collection of 10% inductors. There's something funny about the colour codes on inductors, the colour seems rather different to those on resistors for some reason.

Monday, May 12, 2008

A Chat podcast 23

Get the podcast in iTunes, or here.

  • Neil Young and the Java?

  • Alternative firmware for Canon point and shoot cameras

  • OLPC in Australia

  • Home broadband upgrade



Thanks Ben for production. Sorry my earlier quick show notes post looked bad.

Sunday, May 11, 2008

Controlling an AD9851 with an Atmel AtTiny85 (or other)

avrdds.jpgFollowing on from my last post, I got something similar working with an ATTiny85. This sample code does a slow sweep from 10Mhz up a bit. It's just a demo, the bit I've been looking for myself and couldn't find was how to just say sendFrequency().

I have lots of ideas for applications of these things, including:


  • General purpose VFO with keypad and knob

  • Sweep test generator, paired with a digital rf signal measurer for computer plotting filters etc

  • Automated antenna analyser with a digital SWR measuring thingy



This code is written in C and uses avrlibc. I'm working on a Mac but it will work the same on Linux or that other OS that was quite popular.


/*
Control an AD9851 DDS with an ATMega85
*/

#include <avr/io.h>
// Sets up the default speed for delay.h
#define F_CPU 800000UL
#include <util/delay.h>
#include <math.h> // for pow()

// Pins used to talk to the DDS chip
#define LOAD 4
#define CLOCK 3
#define DATA 0
#define LED 1

#define DDS_CLOCK 180000000UL

#define OUTPORT PORTB
#define OUTPORTDIRECTION DDRB

void sendFrequency(unsigned long frequency);
void byte_out(unsigned char byte);
void outOne();
void outZero();
void bitSetHi(volatile uint8_t *port, int bit);
void bitSetLo(volatile uint8_t *port, int bit);

int main (void)
{
OUTPORTDIRECTION = _BV(LOAD) | _BV(CLOCK) | _BV(DATA) | _BV(LED);
unsigned long freq;

// flash an led to show we're alive
int i;
for(i = 0; i < 10; i++)
{
bitSetHi(&OUTPORT, LED);
_delay_ms(100);
bitSetLo(&OUTPORT, LED);
_delay_ms(100);
}
while (1)
{
// Do a frequency sweep in Hz
for(freq = 10000000; freq < 10001000; freq++)
{
sendFrequency(freq);
_delay_ms(1);
}
}
return 0;
}

void bitSetHi(volatile uint8_t *port, int bit)
{
*port |= ( 1<<bit );
}

void bitSetLo(volatile uint8_t *port, int bit)
{
*port &= ~( 1<<bit );
}

void sendFrequency(unsigned long frequency)
{
unsigned long tuning_word = (frequency * pow(2, 32)) / DDS_CLOCK;
bitSetLo(&OUTPORT, LOAD); // take load pin low
int i;

for(i = 0; i < 32; i++)
{
if ((tuning_word & 1) == 1)
outOne();
else
outZero();
tuning_word = tuning_word >> 1;
}
byte_out(0x09);

bitSetHi(&OUTPORT, LOAD); // Take load pin high again
}

void byte_out(unsigned char byte)
{
int i;

for (i = 0; i < 8; i++)
{
if ((byte & 1) == 1)
outOne();
else
outZero();
byte = byte >> 1;
}
}

void outOne()
{
bitSetLo(&OUTPORT, CLOCK);
_delay_ms(1);
bitSetHi(&OUTPORT, DATA);
_delay_ms(1);
bitSetHi(&OUTPORT, CLOCK);
_delay_ms(1);
bitSetLo(&OUTPORT, DATA);
_delay_ms(1);
}

void outZero()
{
bitSetLo(&OUTPORT, CLOCK);
_delay_ms(1);
bitSetLo(&OUTPORT, DATA);
_delay_ms(1);
bitSetHi(&OUTPORT, CLOCK);
_delay_ms(1);
}


The AMQRP board has it's own regulator and has a 5V output so I'm powering the ATTiny85 from that power rather than a separate input. Here's a nifty spot reference. Simple enough even for me to build.

spotGen.jpg

Saturday, May 10, 2008

Controlling an AD9851 DDS with an Arduino

ad9851.jpgBeen playing with the AD9851 DDS for a while now using other people's software mostly written in assembly language that I find rather hard to get my head around. Finally tonight, with the help of several others who have published their work on the internet I have got some simple code to drive this chip the way I want.

This can tell it the frequency the generate in Hz and it just works.

This minimal example does a small sweep from 10Mhz so it's easy to listen to on a radio.

While I prefer to use the atmel chips "naked" I do find the Arduino board a very convenient way to muck around and get things going in an interactive environment. This code doesn't rely on any magic Arduino libraries so it should be easy to port, I'll post a straight ATMEGA version soon.

The code presented here shows some things I've struggled to figure out: how to calculate the tuning word from the frequency and how to send the serial commands to the chip. I hope this helps someone else.


// Control a AD9851 DDS based on the good work of others including:
// Mike Bowthorpe, http://www.ladyada.net/rant/2007/02/cotw-ltc6903/ and
// http://www.geocities.com/leon_heller/dds.html
// This code by Peter Marks http://marxy.org

#define DDS_CLOCK 180000000

byte LOAD = 8;
byte CLOCK = 9;
byte DATA = 10;
byte LED = 13;

void setup()
{
pinMode (DATA, OUTPUT); // sets pin 10 as OUPUT
pinMode (CLOCK, OUTPUT); // sets pin 9 as OUTPUT
pinMode (LOAD, OUTPUT); // sets pin 8 as OUTPUT
pinMode (LED, OUTPUT);
}

void loop()
{
// Do a frequency sweep in Hz
for(unsigned long freq = 10000000; freq < 10001000; freq++)
{
sendFrequency(freq);
delay(2);
}
}

void sendFrequency(unsigned long frequency)
{
unsigned long tuning_word = (frequency * pow(2, 32)) / DDS_CLOCK;
digitalWrite (LOAD, LOW); // take load pin low

for(int i = 0; i < 32; i++)
{
if ((tuning_word & 1) == 1)
outOne();
else
outZero();
tuning_word = tuning_word >> 1;
}
byte_out(0x09);

digitalWrite (LOAD, HIGH); // Take load pin high again
}

void byte_out(unsigned char byte)
{
int i;

for (i = 0; i < 8; i++)
{
if ((byte & 1) == 1)
outOne();
else
outZero();
byte = byte >> 1;
}
}

void outOne()
{
digitalWrite(CLOCK, LOW);
digitalWrite(DATA, HIGH);
digitalWrite(CLOCK, HIGH);
digitalWrite(DATA, LOW);
}

void outZero()
{
digitalWrite(CLOCK, LOW);
digitalWrite(DATA, LOW);
digitalWrite(CLOCK, HIGH);
}


The board I'm using is the excellent carrier from AmQRP.

Friday, May 09, 2008

Switched home broadband to Telstra

cableGuy.jpgWe've had Optus cable internet here at the house for many years. It's been a reliable service but over time annoyances build up in a relationship like this so I decided to upgrade and switch to Telstra Bigpond on a service they claim can deliver up to 30Mbps down and 1Mbps up.

Optus gave me 8Mbps down and 256kbps up. The slow upload did cause me some grief sending mail and uploading.

These days Telstra sends out contractors to do any "hard" work and in this case it was Silcar Communications. The guys did a great job and didn't mind me taking a few pictures as the job progressed.

They had to run another cable from the pole as I refused to let them cut over the Optus cable.

I'm pretty happy with the performance so far, of course it will be interested to see how it degrades in busy times. Here's my test results from ozspeedtest.

Broadband Speed Test Results

Test run on 09/05/2008 @ 02:38 PM

Mirror: Telstra Bigpond
Data: 9 MB
Test Time: 3.28 secs

Your line speed is 23.02 Mbps (23024 kbps).
Your download speed is 2.81 MB/s (2878 KB/s).

I'm seeing some pings under 10ms to Australian sites and I really do get 1Mbps upload which is great.

I refused the netgear wireless router they offered and just took a motorola cable modem and I chose to use my Airport Extreme which seems to be working nicely.

It's always amusing to see how these folks respond to a house without windows. They are drilled in the art of telling windows users to reboot to make things work. I said, this is a Mac, you don't need to reboot.

So, why did I switch from Optus:


  • They decided to charge me $2 per month because I wouldn't agree to direct debit. I always pay promptly by bpay and I'd be happy to have electronic invoicing, but no dice.

  • A sales person came to the door trying to sell me a worse deal than I was currently on, much less data, a little more speed and more money.

  • When my modem died in a storm, I purchased a replacement on ebay (from another optus customer), despite this they insisted on sending out a tech to read them the Mac address - something I can certainly do, and charged me the same amount as a replacement modem.



Oh and don't try writing to them about anything, when I did I just got back a form letter FAQ. I don't think they even read letters from customers. Oh well, bye bye Optus. Let me know when you're rolling out fiber.

Update: Cancelling Optus was a good experience. When you ring to cancel you get the 'A' team, the retention people. He said, "you should have rung us first, we could have given you $30 a month for 6 months". I explained that I had rung, and written, and had not been satisfied.

Anyhow he was able to cancel me right away and refund my latest payment. "Speed isn't everything" he said. You're right there, I thought...

Update 2: We are now without a home phone. The plan was also to churn our home phone over to Telstra today as well. The tech was due to come in "the morning", at 2pm they rang to say that they couldn't come and needed to re-shedule. I suggested next week.

Our home phone has been disconnected by Optus, not sure if it's related to the internet switch-over or the churn of the line to Telstra. Very annoying. Currently talking to Optus via Skype.

Ok, Optus has turned it back on. Strange that a churning phone can be disconnected before being connected to the new carrier. I guess I'm being punished for being pesky.

Sunday, May 04, 2008

Rough guide to surface mount soldering

smd.jpgI share an interest in good quality headphone audio with many including Alastair who purchased the board and parts for the Alien DAC. Not being too confident with the soldering iron he made a deal, he bought two sets, one for him and one for me, if I'd help him construct his one.

Surface mount components are either tiny themselves, like the resistors and capacitors, or if large, they have pins that are very close together and hard to avoid having the solder bridge between them. The move to computer manufacturing with surface mount components is unfortunate for us home constructors. Some parts are only available in surface mount packaging and I fear for the future of this fine past time.

I got both boards going and thought I'd share my tips on construction, which you can see from the image are not too good, but serviceable.

For the chips with many pins, hold down the chip with the point of angle ended needle nosed pliers (the weight of the tool will hold it in place - hands shake too much), tack solder one corner pin and one on the opposite corner, then remove the pliers. Just flow solder across all the pins on each side, then go back with fine solder wick and suck back all the excess solder.

For resistors and capacitors again use the point of angle ended needle nosed pliers to hold them in place while soldering one end.

I think I'll put my new audio output device in a nice box along side a powered amplifier as covered in the past. Thanks Alastiar for the bag of bits!

Tuesday, April 29, 2008

Text to speech: making a book on tape on a mac for free

Picture 2.pngI love Bill M0HBR's regular podcast SolderSmoke, the ongoing story of a home brewing ham radio enthusiast who is currently on the air from a flat in Italy using an end fed long wire antenna.

In SolderSmoke82 Bill mentioned a book by Henry David Thoreau called Walden that is about his observations while living as simply for more than two years in a crude cabin in the woods. I wanted to read the book, which is freely available as text at Project Gutenberg here.

As I mostly listen to stuff on an iPod to ease the noisy bus and train trip I endure, I wanted to try turning it in to a book on tape. Turns out it's easy and free on a mac, and it sounds reasonably good.

Download the text file, open a terminal and do this:


$ say <walden.txt -o walden.aiff


It's pretty quick, then drag the .aiff file into iTunes and right click to choose "Convert Selection to AAC".

I don't know what those warnings it spits out, but the file seems fine.

Update: Incidentally, I found a really great use for the "Speech - Start Speaking Text" item in the Services menu. Often when making a payment I have to transcribe a long series of digits from the bill to a payment web form. After entering the digits, select the text and choose "start speaking text" to have the system read back the digits for easy checking.

Sunday, April 27, 2008

Clothesline style antenna hoist for experiments

AntennaHoist.jpgI'm experimenting with antennas again and wanted a way to string up a dipole so that I could easily pull it down and make adjustments.

My best antenna is a dipole tuned for PSK31 on 14.070Mhz that is over the roof of the house but while playing with a simple wire dipole between some trees next to the house I noticed it it appeared to pick up less electrical hash and it got me wondering if I should try suspending the dipole out beside the house where I currently have an end fed long wire (that picks up tons of noise).

This is a very simple idea, I'm positive others have used it too. I bought 30m of 3mm venetian blind cord and two little pulleys. (I already have a pulley up a tree from previous squid pole activities that was used to hold up the far end).

antenna hoist diagram.jpg
It's too early to tell if having the dipole away from the house is better than having it up higher but over the house but it's great to be able to drag it out and back in again for tuning. (I've got this dipole perfectly tuned on my second clipping).

Yes, I will need some weather proofing before leaving the balun out too long.

Friday, April 25, 2008

Chinese torch relay tactics in Canberra

chinese crowd.jpgAs a family, we decided to travel to Canberra to watch the torch relay and join the crowd in support of the Tibetan community. I headed out early for a commitment with the ABC and was surprised to see young Chinese people starting to mass along Northbourne avenue quite a long way from the city centre.

It was about 7:40am and 5 degrees C, so it was pretty chilly to be standing out there. I had a chat with the young Chinese people who seemed nice and had taken on "ozzie" nationalistic behaviours such as being wrapped in flags and with flag temporary tattoos on their cheeks. At that time all seemed pretty well, except for the stream of busses arriving with more while I watched.

Later we walked to the lawn in front of parliament house. Here we had to get past a large crowd of Chinese nationalists who were chanting "One China", so we could join the Tibet crowd. It was a nice group although some people had rather gruesome images of dead Tibetans out for display. There were speeches from Bob Brown and K.D. Lang as well as others.

BobBrown.jpgBob's a real trooper, he gave a great speech and freely mingled with the crowd. He's pictured here talking with a reporter from Deutsche Welle.

The pro-Tibetans and pro-Chinese groups stayed pretty separate until after the torch went by and we started to move over the river to try to catch up with it again.

As we walked the groups started to interact and it was not pretty. The Tibetans were basically saying that they are not anti-china, but just want basic human rights for Tibet and would like China to at least talk with the Dali Lama. The Chinese crowd were quite intimidating, both in their numbers, their organised uniformity and what they were shouting at us. There were people driving by in cars aggressively giving us "the finger" through the window, their faces hidden behind red flags.

The Chinese would shout "One China" and if someone asked about human rights, they'd shout back "you know NOTHING", which really didn't help as it wasn't clear what they know that we are yet to be informed about.

We all walked down from parliament house, past a rather ominous blood bank bus with "don't ignore the need for blood" painted on it, and over the bridge to a park on the other side. Here we were getting stuck and the intermingled crowd was getting agitated. The huge police numbers in Canberra were clearly focussed on the torch and were not much use where we were or even in directing traffic. The mood was turning and I suggested we exit. My wife felt it best to stay as her presence as a witness might prevent violence.

troops.jpg
As I left the scene the riot police turned up and ran in to settle things down.

baloon.jpgAll in all, it was a good day for democracy in Australia, as Bob Brown pointed out, if we'd done this in China we'd all have been arrested and I'd add that there would be no trace of it in the news or on the internet.

We watched the evening TV news versions and the local ABC TV had by far the most accurate version of events.

I like and respect the Chinese people but I'm puzzled about what the government is so fearful of that they must violently put down any opposition and censor the news and internet. Are they so brittle that words will harm them?

Monday, April 21, 2008

Web based software defined radio

Picture 1.pngJust stumbled upon an amazing remote controlled receiver available on the internet called WebSDR.

Unlike other radios available on the internet this one uses software to decode the spectrum coming in from the radio in such a way that multiple people can be listening to different frequencies simultaneously.

This system is hanging out the back of a PC at the Faculty for Electrical Engineering Mathematics and Computer Science at the University of Twente Enschede - The Netherlands. It looks wonderfully home brew.

Click and drag in the black area under the "waterfall" and you can tune. The great thing is that many users can be doing the same and streaming audio at the same time.

Great stuff!receiver.jpg

A Chat podcast - episode 22

Google App Engine and more.

  • Google App Engine experiences

  • YUI

  • Home brew electronics

  • Amazon Web services action

  • Amazon MP3

  • SafariAdBlock

  • Trying Twitter

  • iPhone Australia gossip

  • Open Source Corporations



Subscribe in iTunes here, or for everything else here.

Saturday, April 19, 2008

Sun buys MySQL, what does it mean when open source is bought?

logo_mysql_sun.gifMySQL has been a hugely popular database and is unambiguously the M in LAMP. (Whereas the P could be Perl, Python or PHP). That must annoy the Postgres folks.

Certainly I've had good success with MySQL over the years, for me, it just works, easy to install, easy to use and seems really fast. Sure it used to miss some of the SQL that others had but frankly I rarely ran in to anything I couldn't do or find a way to get around.

So on January 16 it was announced that Sun has purchased "the developer" of MySQL. But MySQL is open source, so anyone can get the source and work on it. What does it mean when a company buys an open source project?

There are some other examples of companies buying open source developers:


  • Apple bought CUPS printing

  • RedHat bought JBoss

  • RedHat was open source but they bought themselves I guess

  • Oracle bought Sleepycat which commercialised Berkeley DB (probably mostly legacy due to sqlite)

  • Citrix bought XenSource

  • Sun bought VitualBox



So what will it mean for MySQL? I had a look at what's happened to VirtualBox since Sun aquired Innotek and the first thing you notice is that they announced on February 12, 2008 they announced it for OpenSolaris. There are only a few posts in the forum so I guess there's not a lot of interest so far.

I'm just speculating here, but I have worked for a major web company that switched many hundreds of servers from Solaris to Linux (a stripped down RedHat distro) and reportedly was happy and saved a significant amount of money. Sun must have been devastated by the success and acceptance of Linux as a server operating system. If I want to run up a web server then Linux/Apache is the way to go today.

What could they do? RedHat split into the free Fedora and the commercially supported RedHat Enterprise with great success and I assume that Sun copied that strategy with Solaris and OpenSolaris.

Presumably the MySQL developers will be tasked with making MySQL run best on Solaris, so in a few years if you want a robust, supported MySQL database you'll choose Solaris/MySQL. That's the theory, but there's a big community of folks who like MySQL on Linux and they'll be looking closely to bring any improvements over to Linux and FreeBSD.

I'm starting to wonder if the days of the SQL databases is coming to an end. With Google's BigTable and Amazon's Simple Storage Service (S3) plus the fact that these days we always talk to the backend via some sort of Object Relational Mapper service, perhaps we won't care so much about the SQL capabilities any more.

Wednesday, April 16, 2008

I miss HyperCard


My thanks go out to Geoff Balemans for pointing me to a wonderful video by Douglas Adams, narrated by Tom Baker, called Hyperland.

This show illustrates all sorts of good stuff that was coming before the Internet was implemented as we know it today.

One of the highlights is all the technology demos done with HyperCard. I loved HyperCard as soon as I saw it. At first it was black and white, in fact 2 bit, they added colour through extensions but it just got worse. In the end, Apple dropped the project, but perhaps it was already perfect.

There are some alternatives but nothing comes close to the seamless environment created by the great Bill Atkinson.



Created in 1990, predicting life in 2005, it's well worth a look.

Sunday, April 13, 2008

Built an over-boxed QRP Power Meter

QRP Power Meter.jpgIn preparation for the next NSW Home Brew group meeting at Dural where we will be having a power meter calibrate-athon, I've built a crazy box for my simple QRP power meter. Haven't tried to calibrate it but the output of a Pixie 2 (at 200-300mW) bashes the needle full over.

The box was constructed with 12mm angle aluminium at the edges and 0.5mm aluminium plate. That aluminium plate is probably a bit too thin but it's very easy to work with using simple tin snips. I was even able to cut the round hole for the meter with the snips.

All boxed up, it feels pretty sturdy and looks rather steam-punk.

The blue is a plastic protective layer that came on the sheet metal from Bunnings, I'll peel it off when it gets a bit scruffy.

I look forward to calibrating it in a few weeks.

Saturday, April 12, 2008

Tiny morse beacon keyer in an ATTiny85

morsebeacon.jpgUsing some code based on the excellent example here I built a morse beacon keyer using an ATMega8 but it seemed like a massive waste of pins so I ordered a bunch of the 8 pin ATTiny85 chips from Digi-key. (Great service by the way)

With just 8 pins, if you use the internal oscillator, you get 6 available pins for input and output which is really quite a lot for many simple tasks like this.

In the code below, pin 5 is the keyer output, pin 6 is an inverted version and pin 7 is an audio side tone output.

My code is a simplification and an extension (to include the full alphabet and make a side tone) of the code that is "© 1997-2006 by AWC, 310 Ivy Glen, League City, TX 77573" so I hope it's ok to present it here:


/*
Morse ident, based on code from:
http://www.awce.com/cbasic.htm
*/

#include
#include
#define F_CPU 800000UL // Sets up the default speed for delay.h
#include
#include

/* dit delay for morse code */
#define DITDELAY 50 /* mS */
#define OUTPORT PORTB
#define OUTPORTDIRECTION DDRB

// the normal output bit
#define OUTBIT 0

// inverted version out bit
#define INVERTED_OUTBIT 1

// tone output bit
#define TONE_OUTBIT 2

void sendchar(int c);
void tone(int length);

int main (void)
{
// Put beacon message in program memory
PGM_P *message=PSTR("cq cq cq cq de vk2tpm ");
OUTPORTDIRECTION = _BV(OUTBIT) | _BV(INVERTED_OUTBIT) | _BV(TONE_OUTBIT);

while (1)
{
int c;
// Send each character in message
PGM_P ptr=message;
for (c=pgm_read_byte(ptr); c; c=pgm_read_byte(++ptr))
{
sendchar(c);
}
_delay_ms(30000); // wait 30 seconds
}
return 0;
}

/* Send a Morse code element (.- or space) */
void send(char c)
{
switch (c)
{
case '-':
OUTPORT = _BV(OUTBIT);
tone(3*DITDELAY);
OUTPORT = _BV(INVERTED_OUTBIT);
break;
case '.':
OUTPORT = _BV(OUTBIT);
tone(DITDELAY);
OUTPORT = _BV(INVERTED_OUTBIT);
break;
case ' ':
_delay_ms(4*DITDELAY);
break;
}
_delay_ms(DITDELAY); /* inter element space */
}

// play a tone for the given length
void tone(int length)
{
int i;
for(i = 0; i < length; i++)
{
// leave the other bits in place
OUTPORT ^= _BV(TONE_OUTBIT);
_delay_ms(2);
}
}
// Send a character (made from dots/dashes) from program memory
void sendc(PGM_P s)
{
int c;
for (c=pgm_read_byte(s);c;c=pgm_read_byte(++s))
{
send(c);
}
}
// Send an ASCII character
void sendchar(int c)
{
switch (toupper(c))
{
case ' ': sendc(PSTR(" ")); break;
case 'A': sendc(PSTR(".-")); break;
case 'B': sendc(PSTR("-...")); break;
case 'C': sendc(PSTR("-.-.")); break;
case 'D': sendc(PSTR("-..")); break;
case 'E': sendc(PSTR(".")); break;
case 'F': sendc(PSTR("..-.")); break;
case 'G': sendc(PSTR("--.")); break;
case 'H': sendc(PSTR("....")); break;
case 'I': sendc(PSTR("..")); break;
case 'J': sendc(PSTR(".---")); break;
case 'K': sendc(PSTR("-.-")); break;
case 'L': sendc(PSTR(".-..")); break;
case 'M': sendc(PSTR("--")); break;
case 'N': sendc(PSTR("-.")); break;
case 'O': sendc(PSTR("---")); break;
case 'P': sendc(PSTR(".--.")); break;
case 'Q': sendc(PSTR("--.-")); break;
case 'R': sendc(PSTR(".-.")); break;
case 'S': sendc(PSTR("...")); break;
case 'T': sendc(PSTR("-")); break;
case 'U': sendc(PSTR("..-")); break;
case 'V': sendc(PSTR("...-")); break;
case 'W': sendc(PSTR(".--")); break;
case 'X': sendc(PSTR("-..-")); break;
case 'Y': sendc(PSTR("-.--")); break;
case 'Z': sendc(PSTR("--..")); break;
case '1': sendc(PSTR(".----")); break;
case '2': sendc(PSTR("..---")); break;
case '3': sendc(PSTR("...--")); break;
case '4': sendc(PSTR("....-")); break;
case '5': sendc(PSTR(".....")); break;
case '6': sendc(PSTR("-....")); break;
case '7': sendc(PSTR("--...")); break;
case '8': sendc(PSTR("---..")); break;
case '9': sendc(PSTR("----.")); break;
case '0': sendc(PSTR("-----")); break;
}
send(' ');
}



When I burn it with the fabulous AVRDUDE I get:


Writing | ################################################## | 100% 34.10s

avrdude: 1026 bytes of flash written

avrdude: safemode: lfuse reads as 62
avrdude: safemode: hfuse reads as DF
avrdude: safemode: efuse reads as FF
avrdude: safemode: Fuses OK

avrdude done. Thank you.


So the code uses just 1026 bytes out of the available 8k which means a lot more can be done on one of these chips.

Thursday, April 10, 2008

Google's App Engine

In a brave move that I'm sure had the producer at least a little sceptical, I attempted to explain Google's new App Engine on ABC Radio National this morning. You can hear it here.

I've started playing with it and so far it's a good experience. Very happy to have python as the language they've chosen to start with, and I love the adoption of parts of django.

Sunday, April 06, 2008

Visualising WSDL with GraphViz and python

sample.jpgI'm working with SOAP and WSDL at the moment and golly that xml can be hard to read.

In the past I've used GraphViz to draw pictures of data structures, once I did an IVR call flow diagram that helped to define what the client wanted and then the source was used to write the dialplan directly.

This is only roughly working, but it's starting to be useful. The python program takes a wsdl file on the command line, and outputs a "dot" file that can be rendered with GraphViz. Note that on the Mac OmniGraffle can also render this format really nicely.

Please let me know if a better tool exists, for the Mac or Unix in general - surely it must, and any improvements would be gratefully accepted. (I am aware of XMLSpy, which looks great but there is no version for the Mac and it looks like it costs "Starting at €399" whatever that means).

#!/usr/bin/env python
"""
A little utility to visualise wsdl using Graphviz.
(http://www.graphviz.org/)
OmniGraffle does an excellent job too.
by Peter B Marks
http://marxy.org

License: You are free to use this for any purpose.

History:
6-April-2008 1 Roughly working for comment.
6-April-2008 2 Skip duplicate arcs.
6-April-2008 3 Add verbose command line switch.
6-April-2008 4 Add levels and outfile options.
"""
import sys
import string
from optparse import OptionParser
import logging
import xml.etree.ElementTree as ET

# global list of nodes we've already outout
# so we don't overwrite them
ALREADY_DONE_NODES = []
ALREADY_DONE_ARCS = []

RECURSE_LEVELS = 50
CURRENT_LEVEL = 0

def main():
global RECURSE_LEVELS
parser = OptionParser()
parser.usage = "%prog [options] infile"
parser.add_option("-v", "--verbose", dest="verbose",
action="store_true", help="print lots of info")
parser.add_option("-o", "--outfile",
dest="outfile", help="Output file to write to")
parser.add_option("-l", "--levels",
dest="levels",
help="Number of levels to recurse or %d" % RECURSE_LEVELS)
(options, args) = parser.parse_args()

if len(args) > 0:
fileName = args[0]
else:
parser.print_help()
return

if options.verbose:
logging.basicConfig(level=logging.DEBUG)
else:
logging.basicConfig(level=logging.ERROR)

if options.levels:
RECURSE_LEVELS = int(options.levels)

if options.outfile:
outfile = options.outfile
else:
outfile = fileName + ".dot"

logging.debug("Reading file %s" % fileName)
infile = open(fileName, "r")
xmldata = infile.read()
infile.close()

logging.debug("Writing to file: %s" % outfile)

of = open(outfile, "w")
of.write('digraph g {graph [rankdir = "LR"];\n')
tree = ET.parse(fileName)
root = tree.getroot()

outputLevel(of, root, root.tag)

of.write('}')
of.close()
logging.debug("Done.")

def removeNamespace(fullString):
where = string.rindex(fullString, "}")
return fullString[where + 1:]

def outputLevel(of, itemList, itemListName):
"""Recursive function for outputting a level"""
global ALREADY_DONE_NODES, ALREADY_DONE_ARCS, RECURSE_LEVELS, CURRENT_LEVEL

itemListLabel = "%s" % (removeNamespace(itemList.tag))
logging.debug("Processing: %s" % itemList.tag)
itemCounter = 0
for item in itemList:
itemName = "%s-%d" % (item.tag, itemCounter)
itemCounter += 1
itemLabel = "%s" % (removeNamespace(item.tag))
for attribute in item.attrib.keys():
itemLabel += "|%s:%s" % (attribute, item.attrib[attribute])

if item.text:
itemText = item.text.strip()
if len(itemText) > 0:
itemLabel += "|%s" % item.text

if itemListName not in ALREADY_DONE_NODES:
ALREADY_DONE_NODES.append(itemListName)
of.write('"%s" [ label = "%s", shape="record" ];\n' % (itemListName, itemListLabel))
else:
logging.debug("Skipping duplicate node:%s" % itemListName)

if itemName not in ALREADY_DONE_NODES:
ALREADY_DONE_NODES.append(itemName)
of.write('"%s" [ label = "%s", shape="record" ];\n' % (itemName, itemLabel))
else:
logging.debug("Skipping duplicate node:%s" % itemName)

arc = '"%s" -> "%s";\n' % (itemListName, itemName)
if arc not in ALREADY_DONE_ARCS:
ALREADY_DONE_ARCS.append(arc)
of.write(arc) # the arc
else:
logging.debug("Skipping duplicate arc:%s" % arc)

CURRENT_LEVEL += 1
logging.debug("Recursed to level %d" % CURRENT_LEVEL)
if CURRENT_LEVEL >= RECURSE_LEVELS:
logging.debug("Hit maximum recursion level %d" % RECURSE_LEVELS)
else:
outputLevel(of, item, itemName) # recurse

if __name__ == "__main__":
main()


The diagram above is a clipping from the output generated from some annotated WSDL.

While I'm here can I mention how useful the techniques shown in this example make python for making little command line utilities. See how OptionParser makes it simple to handle short and long style command line options. Marvel at how you can use the logging module to write output if chosen by the --verbose switch.

It's sometimes a bit hard to find simple examples like this.

Friday, April 04, 2008

A visit to the Sydney Horological Centre

Horological1.jpgActing on a tip from a work colleague, I dropped in to "Smith & Smith" Pty Ltd, also known as The Sydney Horological Centre at Level 5, 193 Clarence Street, Sydney.

A rare pleasure indeed. Not since shopping at The Test Tube Factory in Ultimo have I enjoyed a shop so much.

The shop has a fantastic display of watch and clock parts, tools and servicing do-dads. They also stock an amusing array of cuckoo clocks and some impressive grandfather clocks. There are electronic movements you can put into an existing clock - you can choose between ticking and smooth too.

Horological2.jpgI came away with an "OptiVisor" head magnifier that I need for my recent forays into surface mount soldering, really I wanted the steampunk style that the guy I spoke with was wearing (left) but he told me that regrettably, they are no longer available.

If I ever need a small battery, this is certainly the place to get it - a huge range.

Wednesday, April 02, 2008

Apple's weakness is Microsoft's strength

MiniMouse.jpgMicrosoft makes really great mice. Apple just can't seem to get it right.

I've bought four "mighty" mice since the launch, assuming that the bad one I got was a one-off. They are all bad. The little ball thing that lets me scroll sideways works pretty well for about a week and then it starts to get intermittent.

All the tips about cleaning say to use a wet, lint free, cloth and hold the mouse upside down. It works a bit but doesn't fix the problem.

After much frustration I paid just AU$19 for a basic optical Microsoft "comfort 3000" mouse from Microsoft and it seems excellent. Thinking back, all the Microsoft mice have been very good.

Apple has produced some real lemons in the mouse "space": remember the puck that came with the original iMacs? The subtle second button has always annoyed me and when I see others trying to use it with less care than me they just can't get the second button to work reliably.

The mouse is so important to the use of a graphical computer, it's time to make one that really works.

I wonder if Vista will become popular due to the Microsoft mouse "halo" effect?