Building OpenWRT for DSL502T Appliances - Removing Modules

When building OpenWRT Kamikaze 8.09.2 for the DSL502T there are a number of mobiles included by default that are important if you are using the device as a modem but unnecessary if you plan to use the device as an appliance.

After some playing I have found the following modules can be excluded:

Kernel Modules = kmod-sangam-atm-annex-a, kmod-ppp, kmod-pppoa, kmod-pppoe, kmod-ocx

In my configuration the difference in after boot memory usage is as follows:


Mem: 10268K used, 2492K free, 0K shrd, 1300K buff, 4168K cached


Module                  Size  Used by    Not tainted
tiatm                 151008  0
acx                   136704  0
nf_nat_tftp             1088  0
nf_conntrack_tftp       3760  1 nf_nat_tftp
nf_nat_irc              1856  0
nf_conntrack_irc        4768  1 nf_nat_irc
nf_nat_ftp              2432  0
nf_conntrack_ftp        6880  1 nf_nat_ftp
ipt_MASQUERADE          2080  0
iptable_nat             4240  0
nf_nat                 14624  5 nf_nat_tftp,nf_nat_irc,nf_nat_ftp,ipt_MASQUERADE,iptable_nat
xt_state                1600  0
nf_conntrack_ipv4      12064  3 iptable_nat,nf_nat
nf_conntrack           46592  11 pppoatm                 4320  0
ipt_REJECT              2976  0
xt_TCPMSS               3136  0
ipt_LOG                 6720  0
xt_multiport            2528  0
xt_mac                  1312  0
xt_limit                2016  0
iptable_mangle          2080  0
iptable_filter          2080  0
ip_tables              10064  3 iptable_nat,iptable_mangle,iptable_filter
xt_tcpudp               2624  0
x_tables               11504  11 ppp_async              10944  0
ppp_generic            26080  2 pppoatm,ppp_async
slhc                    5952  1 ppp_generic
crc_ccitt               1440  1 ppp_async
br2684                  7920  0
atm                    48912  3 tiatm,pppoatm,br2684


Mem: 7628K used, 5132K free, 0K shrd, 964K buff, 3180K cached


Module                  Size  Used by    Not tainted
acx                   136704  0
gpio_dev                3184  0
br2684                  7920  0
atm                    48912  1 br2684




Ubuntu 8.1 - Network Configuration Change Script

Ubuntu 8.1 works really well as a build environment for OpenWRT and programming environment for the DSL502T. 

I have found that to make OpenWRT a network connection with Internet access is required but to program the DSL502T using minimizing network traffic is important to prevent hangs during programming.

Also all the DSL502T units I have seen use as the IP address for programming... but my internal network using 10.x.x.x network addresses.

So I needed a quick/easy way to switch between DHCP assignment of addresses for the internal network and STATIC assignment when programming.

Directly editing /etc/network/interfaces and restarting the network services works but gets old fairly quickly.... instead I wrote the following setnet script which is called passing DHCP or STATIC as the parameter.  It changes the network configuration and restarts the networking services.


# Check if parameters are provided

if [ $# -ne 1 ]
    echo "Must specify STATIC or DHCP"
    exit 1

ETHMODE=`echo $1 | tr [:lower:] [:upper:]`

# Force both interface types to be off

sudo sed -i "s/#iface eth0 inet dhcp/iface eth0 inet dhcp/" $INTERFACES
sudo sed -i "s/#iface eth0 inet static/iface eth0 inet static/" $INTERFACES
sudo sed -i "s/iface eth0 inet dhcp/#iface eth0 inet dhcp/" $INTERFACES
sudo sed -i "s/iface eth0 inet static/#iface eth0 inet static/" $INTERFACES

# Now select the one that is required

if [ $ETHMODE = "STATIC" ]
    echo "setting STATIC"
    sudo sed -i "s/#iface eth0 inet static/iface eth0 inet static/" $INTERFACES
    sudo /etc/init.d/networking restart
elif [ $ETHMODE = "DHCP" ]
    echo "setting DHCP"
    sudo sed -i "s/#iface eth0 inet dhcp/iface eth0 inet dhcp/" $INTERFACES
    sudo /etc/init.d/networking restart
    echo "Unknown network mode"

Probably no awards for great linux shell scripting but it works for me.


DSL502T + Ruby + Webrick + YAML = DIY Monitoring Appliance

At the top of the hill on my rural property is a bore that provides stock water for my stock and three neighboring properties.

So what does this have to do with DLink DSL502T routers, Ruby, Webrick and YAML?

From time to time faults in the various farm system drain water from the header tank faster than the bore pump can pull water out of the ground.... so the pump runs continually.  Expensive on power but also potentially damaging.  Normal use is about 1 hour per day in summer, much less in winter.

The problem was how to know if the pump was running excessively without climbing the hill.... and even if I did check it was hard to know if the pump was running because it had just reached to refill point or had been running for three days.

A couple of years back I built a bore monitor that used an IR beam to determine of the bore pump was running and could be queried over the wireless network by a ruby application.  By querying every 5 minutes and storing the data in a MYSQL database I could graph daily usage over time and see when things had gone awry.

The network connection in the original design was performed using an AVR AT90S8515 and a Packet Wacker ethernet interface.  For 2 years this worked well and then the Packet Wacker died.

Around this time i had been playing with DSL502T's to provide Amateur Radio IGate services and had a build environment configured for the OpenWRT firmware.   Included in the OpenWRT packages is Ruby and I know I could easily write a ruby program with a web interface (using Webrick) and simple data storage (using YAML) so replace the original monitor board.

It took some playing but I was able to build OpenWRT with Ruby and the required modules for Webrick and YAML to operate with the following configuration:

make menuconfig

With the following options:

Target System = TI AR7 [2.6]
Target Profile = No WiFi
Target Images = squashfs

Base System = base-files, br2648ctl, busybox, dropbear, hotplug2, libgcc, libpthread, libstdcpp, mtd, opkg, uci, uclibc, udevtrigger

Network = atm-tools, wget
Library = (none)
IPv6 = (none)

Kernel Modules = kmod-ipt-core, kmod-ipt-nathelper, kmod-sangam-atm-annex-a, kmod-ppp, kmod-pppoa, kmod-pppoe, kmod-ocx

Utilities = gpioctl

Languages = ruby, ruby-core, ruby-erb, ruby-irb, ruby-openssl, ruby-webrick, ruby-yaml

The ruby-erb and ruby-openssl libraries are required in addition to ruby-webrick if you actually want webrick to work.  Not including these libraries will cause errors when you require 'webrick' in your ruby code.

I have not attempted a minimum size configuration here... it is highly likely when not used as a modem that modules such as kmod-pppoa, kmod-pppoe and kmod-sangam-atm-annex-a can be excluded.

It's not blindingly fast serving pages but as a stand alone monitoring appliance interfaced to data collection sensors via the onboard serial port and providing a simple web interface showing the current status and historical trends it does the job for me.

Another great use for $1 modems.  Time to buy a few more for the stockpile.


Building a DLink DSL-502T Based IGate

This project came about because a group of amateur radio operators in Auckland wanted to improve the APRS receive coverage by using IGates to add receive only coverage around South Auckland.

We found that a really low cost way of doing this (both initial investment and ongoing operational costs) was to use DLink DSL-502T ADSL routers with customized firmware.


The DLink DSL-502T is very common in New Zealand.  It was the router of choice for many first time ADSL users who signed up with the large ISP's.  Over time many users want devices with more capability (wireless or more ports) so the routers are available at very low cost (or free). 

For those who care about the technical details.... the official specification for a DSL-502T is

  • ADSL modem with ADSL2/2+ support to 24Mbit/s+.
  • Single 100MBps LAN port.
  • Single USB-B port (default firmware uses this to provide USB-over-ethernet to a PC host only, it's not clear if this can actually be used as a USB host)
  • Flash chip: 4MBytes - Samsung K8D3216UBC a 32Mbit NOR-type Flash Memory organized as 4M x 8
  • SDRAM: 16Mbytes - Nanya NT5SV8M16DS-6K
  • CPU: TNETD7300GDU Texas Instruments AR7 MIPS based

More complete hardware details are on the OpenWRT DSL-502T hardware page.

In it's IGate implement we don't use the ADSL modem or the USB-B port.  What the specification doesn't say is that there is an onboard serial port (even provided with soldered pin headers) which is perfect (with level conversion from RS-232 to 3.3V TTL) for connect to an TNC.

Using a DSL-502T as an IGate is as much an exercise of configuring software as it is connecting hardware.  The standard operating software makes the device an ADSL router.... we need to replace this so it becomes an IGate.

This article is written for those who are interested in how to build their own operating system image for the device and outlines the steps I followed.  It isn't hard if you have a Linux installation (real or in a VM).... I used Ubuntu 8.1 which work really well as a platform for building the operating software and flashing it into the routers.

If you don't want to get into the details and just want an image to flash visit the guys at WetNet who have prebuilt images available for download - for the DSL-502T you need an image compiled for an AR71xx.

Before going into the detail of how to we built and configured the firmware it is worth explaining what we wanted to achieve.

  • A standard set of firmware that we could flash into many routers.
  • Installation without needing to connect to each router to install extra packages or make configuration settings (unless absolutely necessary).
  • For the router to be able to indicate it's operational status using the front panel LED's (only Status, Ethernet and USB are controllable... it appears that the ADSL indicator is managed directly from the ADSL interface).
  • Central management of the APRSD configuration and have this automatically applied when the power is cycled on the router.

We achieved all these objectives using a custom OpenWRT build. 

It must be said that this project would not have been possible without the efforts of all those involved in the OpenWRT project (for creating the build scripts and environment), those who make it work on AR71xx based routers and those involved with the WebNet project who ported APRSD for the OpenWRT platform.  We are thankful to all these people and hope that the notes here benefit others wanting to package these components to build IGates.

The following outlines the process and scripts we used to configure the DSL-502T as an IGate to meet these objectives.

A suitably configured environment is required to build the OpenWRT firmware.  Assuming you are using Ubuntu 8.1

1.  Install the packages required by the OpenWrt Kamikaze buildsystem

sudo apt-get install build-essential binutils flex bison autoconf gettext texinfo sharutils subversion libncurses5-dev ncurses-term zlib1g-dev 

2.  Checkout and prepare Kamikaze and the packages.  We built out image based on Kamikaze 8.09.2

mkdir ~/openwrt
cd ~/openwrt
svn checkout svn:// .

3.  I installed the minicom and ntpclient packages in the image.  Minicom is useful for checking the serial port works..... and ntpclient to keep the time correct.  Without ntpclient the box doesn't keep very good time.

./scripts/feeds install minicom
./scripts/feeds install ntpclient

4.  By default the serial ports are configured as serial consoles.  This needs to be disabled to use them to connect with a TNC.  Disabling the ports requires a customized /etc/inittab to be included in the flash image.  

Any files in the ./files folder of the build will be added to the flash image when it is built. 

Create the following ./files/etc/inittab to configure the serial ports so they can be used.

::sysinit:/etc/init.d/rcS S boot
::shutdown:/etc/init.d/rcS K stop
#tts/0::askfirst:/bin/ash --login
#ttyS0::askfirst:/bin/ash --login
#tty1::askfirst:/bin/ash --login

5.  The default configuration for OpenWRT (at least for the version I built) is to bring the network up with a static IP address.  I wanted DHCP so a customized /etc/config/network needs to be included in the flash image. 

Create the following ./files/etc/config/network to configure the network for DHCP.

# Copyright (C) 2006

config interface loopback
    option ifname    lo
    option proto    static
    option ipaddr
    option netmask

config interface lan
    option ifname    eth0
    option proto    dhcp   


6.  While we are making changes to /etc/config it is a good idea to configure the system name and timezone.

Create the following ./files/etc/config/system to configure the system name and timezone (in this case New Zealand).

config system
    option hostname    OpenWRT_IGate
    option timezone    NZST-12:00:00NZDT-13:00:00,M10.1.0,M3.3.0


7.  We installed the ntpclient package earlier but this still needs to be configured so it connects to an appropriate time server.

The configuration details are in /etc/init.d.

Create the following ./files/etc/init.d/ntpclient to start the ntpclient with an appropriate time server (or pool in this case).

/usr/sbin/ntpclient -c 1 -s -h &

8.  OpenWRT uses symbolic links between /etc/rc.d and /etc/init.d so we need to create these in ./files to reference the updated ntpclient start script.

Create the following symbolic link in ./files/etc/rc.d

ln -s ../init.d/ntpclient S55ntpclient

9.  Time to build OpenWRT for the AR7 based DSL-502T.  First it is necessary to configure the build:

make menuconfig

With the following options:

Target System = TI AR7 [2.6]
Target Profile = No WiFi
Target Images = squashfs

Base System = base-files, br2648ctl, busybox, dropbear, hotplug2, libgcc, libpthread, libstdcpp, mtd, opkg, uci, uclibc, udevtrigger

Network = atm-tools, wget
Library = (none)
IPv6 = (none)

Kernel Modules = kmod-ipt-core, kmod-ipt-nathelper, kmod-sangam-atm-annex-a, kmod-ppp, kmod-pppoa, kmod-pppoe, kmod-ocx

Utilities = terminal/minicom, gpioctl

10.  We wanted to default the Minicom configuration so it opened port /dev/ttyS0 at 9600 baud, did not send the default initialization string but instead sent the "VER" command to the TNC.

This is done by creating the file minirc.dfl in ./files/etc with the following contents:

pu port             /dev/ttyS0
pu baudrate         9600
pu minit            VER^M
pu mreset          
pu rtscts           No 

11.   The aprsd package (or other amateur radio packages) is not included in the OpenWrt source tree at the time of writing.  The packages can be downloaded from

The OpenWrt-AX25.tgz that you download doesn't match the the folder structure required by the OpenWrt build (at least for version 8.09.2) so it is easiest to uncompress to a different location and then copy the files to the locations as shown in the following table:

OpenWRT-AX25.tgz OpenWRT Source
packages/libs/libax25 package/libs/libax25
packages/net/aprsd package/net/aprsd
packages/net/ax25-apps package/net/ax25-apps
packages/net/ax25-tools package/net/ax25-tools
packages/net/digi-ned package/net/digi-ned


12.  Ensure the aprsd and required libraries are flagged to be built:

make menuconfig

With the following additional options:

Library = libax25
Amateur Radio = aprsd


13.  If you are going to flash a single DSL-502T you can set the aprsd configuration by adding appropriately configured aprsd.conf, aprsd.config, INIT.TNC, RESTORE.TNC and welcome files to the ./files/etc/aprsd folder.  

Because we were going to install multiple DSL-502T IGates and were trying to create a standard image that could be flashed to all units it was important to have a more flexible configuration process for aprsd.

We went with the approach of storing the aprsd.config file for each unit on a central web server.  The files are named with the Ethernet MAC address of the router. 

The startup script downloads the appropriate config file on startup of the router and updates the version in flash if it has changed.  

The script we used is an extension to the standard aprsd startup script and is as follows:

#!/bin/sh /etc/rc.common
# Starts or stops aprsd server.
# Extended to perform additional DSL-502T IGate Configuration Load
# Ethernet and USB Leds are used to indicate status of router configuration
# Ethernet
#    Off =
#    On = IP Address OK from DHCP
#    Flash = No IP Address from DHCP
#    Off =
#    On = APRSD Configuration OK
#    Flash = APRSD Configuration Invalid 


# Initially both off
echo none > /sys/class/leds/ethernet/trigger
echo none > /sys/class/leds/usb/trigger

MYMAC=`ifconfig eth0 | head -1 | grep 'HWaddr ' | cut -c39-55`
MYIP=`ifconfig eth0 | head -2 | tail -1 | grep 'inet addr:' | cut -c21-33`

if [ -z $MYIP ]; then
        echo heartbeat > /sys/class/leds/ethernet/trigger
        exit 1
        echo default-on > /sys/class/leds/ethernet/trigger

cd /etc

if [ -n $MYMAC ]; then
        wget -q -N $SERVER$MYMAC.conf

if [ -f $MYMAC.conf ]; then
        if [ ! -f $APRSD_CONFIG ]; then
                cp $MYMAC.conf $APRSD_CONFIG
                CONFDIFF=`diff $MYMAC.conf $APRSD_CONFIG | wc -l`
                if [ $CONFDIFF -gt 0 ]; then
                        cp $MYMAC.conf $APRSD_CONFIG

# Check if $APRSD_CONFIG has been correctly configured

if [ ! -f $APRSD_CONFIG ]; then
        echo heartbeat > /sys/class/leds/usb/trigger
        exit 1

SERVERCALL=`cat $APRSD_CONFIG | grep 'AX_APRSD_SERVERCALL' | cut -d'=' -f 2`

if [ $SERVERCALL = '"nocall"' ]; then
        echo heartbeat > /sys/class/leds/usb/trigger
        exit 1

chmod 745 $APRSD_CONFIG

start() {
   echo  "Starting aprs server daemon. "
        # Create log directory - uncomment if you want logging
#       mkdir -p /var/log/aprsd       
        # Update aprsd.conf

        # Escape options that may include /
        AX_APRSD_PORT=`echo $AX_APRSD_PORT | sed 's/\//\\\&/g'`
        AX_APRSD_MYLOCATION=`echo $AX_APRSD_MYLOCATION | sed 's/\//\\\&/g'`
        AX_APRSD_NETBEACON=`echo $AX_APRSD_NETBEACON | sed 's/\//\\\&/g'`
        sed -i "s/\(tncport\)\(.*\)/\1 $AX_APRSD_PORT/" $APRSD_CONF
        sed -i "s/\(tncbaud\)\(.*\)/\1 $AX_APRSD_TNCBAUD/" $APRSD_CONF
        sed -i "s/\(servercall\)\(.*\)/\1 $AX_APRSD_SERVERCALL/" $APRSD_CONF
        sed -i "s/\(MyCall\)\(.*\)/\1 $AX_APRSD_MYCALL/" $APRSD_CONF
        sed -i "s/\(MyLocation\)\(.*\)/\1 $AX_APRSD_MYLOCATION/" $APRSD_CONF
        sed -i "s/\(MyEmail\)\(.*\)/\1 $AX_APRSD_MYEMAIL/" $APRSD_CONF
        sed -i "s/\(aprspath\)\(.*\)/\1 $AX_APRSD_PATH/" $APRSD_CONF
        sed -i "s/\(pass\)\(.*\)/\1 $AX_APRSD_PASS/" $APRSD_CONF
        sed -i "s/\(Server\)\(.*\)/\1 $AX_APRSD_SERVER/" $APRSD_CONF
        sed -i "s/\(NetBeacon\)\(.*\)/\1 $AX_APRSD_NETBEACON/" $APRSD_CONF
        #  start aprsd if enabled
        eval aprsd=$AX_APRSD
        if [ "$aprsd" = "TRUE" ]; then
                /usr/bin/aprsd -d
                echo default-on > /sys/class/leds/usb/trigger
                touch /var/lock/aprsd

stop() {
   echo  "Stopping aprs server daemon. "
        rm -f /var/lock/aprsd
        killall -q -INT aprsd

There are a few interesting things in the script.

  • The Ethernet and USB LED's on the DSL-502T are used to indicate status.
  • Ethernet flashing means no IP address was assigned so there is a problem somewhere with DHCP.
  • Ethernet on means an IP address was assigned.
  • USB flashing means that no aprsd.config file could be downloaded (and none already exists in flash).
  • USB on means that the device has a valid aprsd.config file (either newly downloaded or already existing).
  • When both Ethernet and USB LED's are lit the aprsd service will have been started.
  • The aprsd.config file was extended to include additional settings which are not included in the standard file and only exist in aprsd.conf.

14.  With all the modules selected the OpenWRT image is ready to build.


This could take a while.  Everything going well you will see a string of make messages, the last few messages if all went well being:

 make[2] package/rootfs-prepare
 make[3] package/preconfig
 make[2] target/install
 make[3] -C target/linux install
 make[6] -C target/linux/generic-2.6/image/lzma-loader clean compile

Your image is now built and available at ./bin/openwrt-ar7-squashfs.bin

This is the image that you flash to your DSL-502T with the command:

./scripts/ -setmtd1 ./bin/openwrt-ar7-squashfs.bin

Note:  Depending on the version of your DSL-502T the default IP address may be (rather than

Once the firmware is installed the DSL-502T will restart.... the restart process can take up to 60 seconds.  An operational IGate will be flashing the Status LED (like a heartbeat) and have Ethernet and USB LED's on.

Check your IGate appears using APRS.FI but note that your NetBeacon is not sent immediately on startup.... it will only be sent after the specified time.   Setting the NetBeacon interval to 1 minute initially to check the IGate appears and once you are properly communicating with the APRS-IS server update the NetBeacon interval to something more reasonable - we use 60 minutes.



WDXC FT-450 Dial Kit

Following are some photos of the WDXC FT-450 Dial Kit and the steps to fit this to my Yaesu FT-450.

My FT-450 and the kit as received from Japan.

FT-450 and Kit

Closeup of the FT-450 with the standard tuning dial.....

FT-450 with standard dial

The rubber ring around the standard tuning dial removed to allow access to the hex nut....

FT-450 with rubber ring removed

Standard tuning dial removed and comparison between the old and new tuning dials.....

FT_450 with dial removed

 The new tuning dial installed.


FT-450 with new dial



Thoughts on the Puxing PX888

After a recent change in cars I was reluctant to reinstall the FT-7800 because it would involve drilling holes in the interior panels.  I thought it best to let the car get over 100000km before I did that. 

I was also enjoying having the FT-7800 as a base station rig so used the VX-5 for a while for the occasional chat on simplex or the Auckland 6625 repeater but I wanted something I could leave permanently in the vehicle and that would allow me to use a speaker mic.

While commuting I mostly listen to podcasts rather than ragchew so I wasn't looking for a huge investment in new gear... just something that was small so it would fit into the CD storage cabinet on a Honda Accord, could connect to a mag mount antenna on the car, could be programmed with a few of the commonly used frequencies and allowed me to connect a speaker mic (the VX5 should do all that but mine has a problem with the speaker mic not working and it is too old to be worth fixing).

Scanning through e-Bay I noticed the VHF handhelds available from various China/Hong Kong suppliers and was surprised to see fairly positive comments on and   There are many suppliers and models but Puxing was generally well supported and there was good community behind the radios with an active Yahoo Group.  It was certainly positive enough that US$80 including shipping was worth a try.  

 Puxing PX888

I looked at various online vendors and ebay sellers and decided to go with - primarily based on the fact that their website looked fairly professional.  The ordering and payment through Paypal was easy... the web site showed the order as "Processing" and indicated that the payment had been received.... and so it sat for 5 days until I finally sent an email inquiring if the items had been shipped. 

I didn't get a personal reply... just an automated message from the web site software now indicating that my order was "Delivered".  Interesting.... it certainly wasn't here. 

In the message I did receive a registered mail tracking number (actually I received a number with no indication of what it was... it was only through extensive googling that I discovered an RAxxxxxHK number is registered mail reference) so I could see that the parcel was proceeding through the Hong Kong postal system, onto a flight to NZ and arrived in Auckland 3 days later. 

Not bad once things started moving.... I guess there was a glitch in the order process somewhere... so for anyone else ordering keep an eye on your order status and if it doesn't move in a couple of days send a prompting email.... just don't expect a reply from a real person.  I guess you can't expect much for an $80 radio.

As well as the PX888 I also ordered a speaker microphone, programming cable and female SMA to BNC and PL259 adaptors for connection to external antennas.  

If you are considering this style of radio I think this is the minimum list of items to order.... the extras a not expensive and they make the radio a lot more usable.

So what is good about the PX888.....

  • Seems solid, well built and not overly large or heavy (but not like a toy either).
  • Transmit and receive performance is similar to my Yaesu VX5 (to my ear anyway) using the supplied antenna or the whip on the car.
  • The display is clear and easy to read with a choice of 3 colors.
  • The programming software (while typical of software written by hardware engineers so the UI leaves a little to be desired) is easy to use and is the quickest way to get the radio configured and on the air with the frequencies you want.
  • The speaker microphone works.
  • It is more tolerant than the VX5 of the overload from the Auckland Sky Tower.
  • The voice announcements (believe it or not..... really useful when changing channel without looking).
  • It's a basic 2m handheld that works with very few surprises.
  • The price.

 Compared to the VX5.....

  • The operation isn't quite so easy.... most stuff done through menu's.... it's there but with more keypresses.  Many of the options on the VX5 are press and hold which works really well.
  • There seems to be more "hiss" behind the signal on receive.... but it could just be that the received audio seems to have more "treble".

To get started in the shortest amount of time.....

  • You must buy the programming cable
  • While you wait for the radio to arrive
    • Join the Puxing777 (yes they talk about the PX888 as well) group on Yahoo groups and read the messages and files.
    • Read the PX888D Enhanced User Manual by "linkinpark9812".  This is a fabulous document and really helps explain the features and more importantly what some of the options in the programming software mean.
    • Download the PX888 sofware from Puxing (don't expect it to come with your programming cable.... at least not from and load your frequencies and set the radio configuration options based on the Enhanced User Manual.
  • As soon as your radio arrives install the battery and antenna, program it with your configuration and get on the air.  It took me 15 minutes.

Will it survive?

  • The radio... not sure... still early days and I have seen comments on burned out finals but I am very surprised at how well it works for the price.
  • The power supply for the charger is junk.... mine didn't work at all... no big deal for me as I have other 12v supplies but could be a problem for some.

Would I order another.... definitely. integration

My RailTrack web site has been a lot of fun to develop but I really need to find a way to cover at least some of the hosting costs.

Tried adding Amazon links to books relevant to the topic (trains!) and while I did get a few clicks through it wasn't wildly successful. 

I think there are two issues here:

  • The rapidly declining New Zealand dollar makes everything from the US particularly expensive.... and then there are the Amazon freight charges!
  • The Amazon generated links didn't seem to change very often so there wasn't a lot to draw users through.

Not much I can do about the dollar and I am sure I could sort out the second one by managing the section of product myself.... but instead I am going to try out fishpond

To keep the customers happy they seem to have a good product range at reasonable NZ$ prices and shipping is affordable.

To keep me happy they provide a downloadable XML feed for selected product categories so I can load this and use it as the basis for selecting products for the site.

RailTrack is based on Rails (it is a web site on trains.... what else would you expect) so hpricot came to the rescue for the XML parsing.... sure the requirements weren't that challenging but the gem is so nice to use..... 

Fishpond catalog records look like:

    <PRODUCT NUM="3575385">
    <ATTRIBUTE1><![CDATA[Engine Drivers Manual: How to Prepare, Fire and Drive a Steam Lo]]></ATTRIBUTE1>
    <author><![CDATA[ Topping, Brian]]></author>



and the model import method looks like:

    def self.import(sourcefile)
        doc = open(sourcefile) { |f| Hpricot(f) }
        (doc/"products/product").each do |book|
            mi = Merchandise.find_by_vendor_product(book.attributes['num'])
            if mi.nil?
                mi =
            mi.vendor_product = book.attributes["num"]
            mi.isbn ="isbn").inner_text
            mi.title ="attribute1").inner_text
            mi.vendor_url ="product_url").inner_text
            mi.vendor_image ="image").inner_text
            mi.rrp ="rrp").inner_text.to_s.sub!("$","")
            mi.vendor_price ="price").inner_text.to_s.sub!("$","")
            mi.vendor_shipping ="shipment_cost").inner_text
            mi.vendor_currency ="currency").inner_text
            puts mi.isbn




RF Datalink using a PICAXE UART

Living on a farm presents some interesting opportunities for electronic projects. My current work in progress is wireless monitoring of the water levels in the large 5000 Gallons tanks we have on the property.

Many years back I ordered some simple 433.920 mhz transmitter and receiver modules (similar to the RF Link Transmitter and Receiver from SparkFun Electronics) for the parts bin. I didn't have a specific project in mind although at the time did some basic experimentation with limited success..... partly becaue I didn't really have the time to coding a robust manchester encoding scheme to ensure the receiver DC balance was correct for the bit slicer.

The water tank monitoring project got the parts out of the bin and back on the workbench.... but how to build a reliable RF link with the least amount of effort?

Firstly a statement of requirements:

  • Single direction data link
  • Small amount of data to transfer (4 bytes)
  • Multiple transmitters sharing the same frequency
  • The receiver is centrally located on a high location but the transmission paths can be up to 300 meters (clear line of sight).

The solution was to use low cost/easy to program PICAXE 08M parts.

Each tank has a PICAXE 08M which reads the tank level and periodically builds a data packet and transmits it on 433.920 mhz.

There is a central 433.920 mhz receiver which has a PICAXE 18X (only because it was in the junkbox... other parts could equally be used) dedicated to decoding the received packets and for valid packets outputting a serial data message to be recorded in the database.

To make this work

  • Data must be sent from transmitters to the receiver in packets.
  • Each packet must have an ID so the receiver knows which transmitter sent it.
  • The receiver must have some way of validating that the packet received is valid and complete.
  • The packet assembly and disassembly must be performed by a part with 256 bytes of code space and a limited programming language.

The message format I used is as follows:

PreAmble $55,$55,$55,$55,$55,$55
Packet Header $FF,$00,$01,$7F
Finalization $AA,$AA,$AA,$AA

The PreAmble is sent before the data packet to set the receiver DC balance for the packet that follows.

The Packet Header is used by the receiver to identify the start of what might be a valid packet. Having received a header the receiver reads the next 8 bytes which comprise the packet of data. Each byte that is sent is immediately followed by it's inverse. I have found that up to 2400 baud this works fine to maintain the receiver DC balance and ensure reliable decoding (assuming the received signal level is sufficient).

Following the 8 bytes of data is the packet checksum. The packet checksum is the low byte of the sum of STATIONID, TANKLEVELH, TANKLEVELL and PKTCOUNT.

If the packet checksum is valid for the received data packet then the receiver PICAXE accepts this as a valid packet.

This is by no means a scheme that for high performance data transfer but for simple single direction links using low cost parts I have found it to work well.

The great thing is that PICAXE 08M Software UART does all the sending and receiving.

I use the PICAXE SERIN command to receive the data. SERIN handles fixed length packets very well including the search that identifies the packet header but the downside is that it cannot be interrupted while waiting for a new packet. Unfortunately this means the receiving PICAXE is dedicated to decoding incoming packets and cannot do other things. To do that would require coding closer to the hardware (not PICAXE basic), writing your own packet management code and probably a hardware UART that generates interrupts as new bytes are received.

My objective was to get something workable and reliable. That I have achieved. Use fewer parts and you get to write more code.

Here is the code for those who want to try something similar. I can't see why this technique would not work with any microcontroller.


' PICAXE 08M Tank Level Transmitter
' Pin Assignments:
' 0 = (Out) Serial
' 1 = (In) Tank Level ADC
' 2 = (Out) Tramsitter Serial Data
' 3 = (In)
' 4 = (Out) Power Up Control for Transmitter and LM324

#picaxe 08m

' Important - Change this for the device being installed
' Current assignments as follows"
' $00 = Big Shed 25000 litre tank
' $01 = House 25000 litre tank
' $02 = Bore tank

symbol STATIONID = $00

' Constants - Pin Assignments

symbol TANKLEVEL = 1
symbol TXDATA = 2
symbol POWER = 4

' Constants - Other

symbol SENDDELAY_H = $300
symbol SENDDELAY_L = $5
symbol FASTTXLIMIT = 48
symbol POWERSETTLE = 150

' Variable Usage

symbol TANKLEVELW = w0
symbol TANKLEVELL = b0
symbol TANKLEVELH = b1
symbol PKTCOUNT = b4
symbol INVPKTCOUNT = b5
symbol FASTTXCOUNT = b6
symbol INVSTATIONID = b8
symbol CHECKSUM = b9
symbol INVCHECKSUM = b10



' Power Up the Transmitter and LM324


' Read ADC for tank level

sertxd("Tank Level : ",#TANKLEVELW,CR,LF)

' Transmit to base

gosub transmit

' Shutdown the Transmitter and LM324

high POWER

' Short delay is sent on startup until it has been sent STARTUPCOUNT times and then reverts to the long delay

if FASTTXCOUNT > FASTTXLIMIT then maindelay_h
goto main2

' Add extra random delay to keep stations out of sync

goto main


' Transmits lead $55 bytes followed by station id and tank level high/low bytes
' All data transmitted is followed by it's inverse to keen DC level correct for receiver



' Send data


' Make sure transmitter is off at the end



' PICAXE 18 Tank Receiver
' Pin Assignments:
' In0 =
' In1 = Transmitter Serial In
' In2 =
' In6 =
' In7 =
' Out0 =
' Out1 =
' Out2 = Decoded Packet Data Out
' Out3 =
' Out4 = Decode OK LED
' Out5 =
' Out6 =
' Out7 =

#picaxe 18x

' Constants - Other

symbol RAMBASE = $50
symbol TXMAX = $07
symbol TXBUFFER = $03
symbol VALIDRX = $04
symbol DECODEOUT = $02

' Variables

symbol TANKLEVELW = w0
symbol TANKLEVELL = b0
symbol TANKLEVELH = b1
symbol PKTCOUNT = b4
symbol INVPKTCOUNT = b5
symbol CHECKSUM = b8
symbol INVCHECKSUM = b9
symbol STATIONID = b10
symbol INVSTATIONID = b11
symbol TEMP1 = b12
symbol TEMP2 = b13

' Initialize the RAM so there is not data from any station - 2 bytes per station

poke TEMP2,0
TEMP2 = TEMP2 + 1
poke TEMP2,0
TEMP2 = TEMP2 + 1
poke TEMP2,0


' Check if the Packet Received is valid


sertxd("Invalid Packet - Checksum Invalid",13,10)
goto rxloop

' Debugging Information

toggle VALIDRX
sertxd("Valid Packet Received",CR,LF)
sertxd("Station ID : ",#STATIONID,CR,LF)
sertxd("Tank Level : ",#TANKLEVELW,CR,LF)
sertxd("CheckSum : ",#CHECKSUM,CR,LF)

' Save the new data into RAM

TEMP2 =TEMP2 + 1
TEMP2 = TEMP2 + 1

' Write all data in RAM to the serial Port

serout DECODEOUT,T4800,($2B)

' Remote Station 0
serout DECODEOUT,T4800,(CR,LF)

goto rxloop



APRS in an Ammunition Can

The Papakura Amateur Radio Club has been fairly active with technical projects in 2008.  The project for the last quarter has been assembly of OpenTracker kits using PCB's and component kits supplied by Keith ZL1BQE and Ian ZL1VFO.

The plan in early 2009 is to combine the assembled OpenTracker boards with Maxon DM-2550 radios and a GPS/Radio interface board developed by Keith and Ian to form a self contained APRS unit.

There was plenty of enthusiasm for the project.... so much so that we ran out of PCB's.... so I built my OpenTracker using a DSE Prototyping board... a little more time consuming but not difficult and a good way to better understand the circuit.

My plan was to package the OpenTracker, Maxon, GPS, Interface circuits and battery into a rugged and easy to carry unit that I would move from car to car and at least one take flying in the Citabria or Cub.  Surfing the net for packaging ideas I noticed a few articles where projects had been packaged in used ammunition cans.

New Zealand is not a great place for Army Surplus but I tracked down 30 calibre boxes (and larger) at Kiwi Disposals in Karangahape Road for NZ$12.50. Good condition.... a little disappointing that they were labeled as containing blank rounds but you can't have everything.  

I must at this point mention that I am not an experienced metal or woodworker.... do the approach I took was very much influenced by my limited selection of tools and availability of easy to work materials.

I wanted to make a slide in/out module that would fit into the can and hold the following items securely:

    1 x Maxon DM-2550 Data Radio
    1 x Radio / GPS / Power Interface board
    1 x Ashtech G-8 GPS Receiver Module
    1 x OpenTracker Module
    1 x 12v SLA Battery
A 30 calibre looks like quite a big box before you start trying to package everything inside!

I also wanted the top panel to be recessed sufficiently that the box could close without hitting the RF Out, GPS Antenna connectors and other switches.

So my solution was to start with a $4.00 kitchen cutting board from The Warehouse.  

This had some nice features.....

    A handle.
    Easy to cut, file and generally shape as required.

But it wasn't perfectly flat... as you may notice in the photos.
I cut it to size to form a base board and front panel and joined these with some 90 degree aluminium brackets that were sitting on the workbench (no idea why I had these... must have been for another never completed project).  I need some sealant between the base board and front panel to hide the bend in the baseboard.

Played around with spacing of the various components to see where they could fit.  The final placement was really determined by the battery and Maxon as the two largest components.

The interface board was mounted above the Maxon.  This is not the Keith/Ian special but provides

    11.7 volts to the Maxon using an LM317
    5v to the GPS module using an 8221L switching regulator
    RS232 level conversion of the GPS TTL in/out so the OpenTracker understands the data
    3v Memory Backup battery for the GPS
    A mounting place for the OpenTracker board
The Ashtech G-8 GPS module is one I got from Derek Fortune Zl1UF a few years back. 

Not as small and thrifty on power as the newer units but seems to work well enough for this application.  The main issue with the G-8 is in the default configuration the RMC NMEA message is not enabled so the OpenTracker will not get a position lock. 

Enabling this is easy enough with a PC (and the correct documentation) but the configuration change is lost as soon as power is removed... unless a backup battery is fitted.  It will be interesting to see how long the battery lasts.... it if proves to be a problem there is enough space on the board to fit an 8 pin Micro with software to configure the GPS on power up.


What is on next Wednesday......

Sometimes a simple programming exercise can be a lot of fun and really help someone out.

David (ZL1DK.... the guy who manages the Papakura Radio Club website asked me the other week if there was any way to have the banner in the top corner that advertised the meeting for the upcoming Wednesday evening to update automatically.  He had done the banner using animated GIF's and was changing the file manually.

Ideally I would have done this as a server side process but the free hosting doesn't allow such flexibility.... so javascript for the browser provided the solution instead.  Not something I write a lot of but quite satisfying to get a good result.

For anyone who cares here is the script that solved the problem....

// Work out which happening this week message to display

var currentTime = new Date();
var day = currentTime.getDate();
var dow = currentTime.getDay();
var hour = currentTime.getHours();

// Offset to the closest Wednesday

var wed_adj = 3-dow;
var next_meeting = new Date(currentTime);

if (wed_adj < 0)
 // Passed Wednesday this week so next meeting on the following Wednesday

 next_meeting.setDate(next_meeting.getDate() + wed_adj + 7);

else if (wed_adj == 0 && hour < 20)
 // Wednesday and before 2000 hours so next meeting is still today

else if (wed_adj == 0 && hour >= 20)
 // Wednesday and after 2000 hours so next meeting is next week

 next_meeting.setDate(next_meeting.getDate() + 7);

 // Before Wednesday so next meeting is Wednesday this week

 next_meeting.setDate(next_meeting.getDate() + wed_adj);


var weekno = 0;

// If the month of the next meeting is not the same as the current month then week 1

if (currentTime.getMonth() != next_meeting.getMonth())
    weekno = 1;
    // From the next meeting work out how many previous Wednesdays there are in the month

    var test_meeting = new Date;
    while (test_meeting.getMonth() == next_meeting.getMonth())
        test_meeting.setDate(test_meeting.getDate() - 7);
document.write("\"What's" + weekno + ".gif\">");



Take a Message....

Sometimes you are just in the right place at the right time....

On Sunday 21 September the New Zealand Warbirds and various private aircraft did a fly-past of the Auckland Cenotaph to mark the anniversary of the Battle of Britain in 1940. 

Among the aircraft that flew that day was Miles Messenger IIA ZK-CMM. 

Miles Messenger ZK-CMM

The Messenger was owned by the late Dave Cowie and is flown at these events and air shows by my mate Andrew Hope.  (From time to time… and never often enough I fly with Andrew in his Citabria…. Check out if you are interested in tailtragger training in New Zealand). 

I didn’t get to see the fly-past but did head out to Ardmore to watch the aircraft returning and have a closer look at a few particularly the Messenger….

Miles Messenger ZK-CMM

Miles Messenger ZK-CMM

Miles Messenger ZK-CMM

For those unfamiliar with the type here is what Wikipedia has to say about the Miles Messenger….

The Messenger was designed to meet a British Army requirement for a robust, slow speed, low maintenance, air observation post and liaison aircraft. The aircraft designed was a cantilever low-wing monoplane with fixed tailwheel powered by the de Havilland Gipsy Major 1D in-line engine. The prototype was converted from a Miles M.28 Mercury and first flew at Woodley on 12 September 1942. The aircraft had a good short field performance but only a small order for use as a VIP transport was placed for the British Royal Air Force as the Messenger I.

Wartime users of the aircraft included Field Marshal Sir Bernard Montgomery and Marshal of the RAF Lord Tedder.

After the war the Messenger 2A was built for the civilian market. The production aircraft were built at Newtownards in Northern Ireland and flown to Woodley for final fitting out. After 71 aircraft were built production of the aircraft ceased in 1948.

During the war a prototype aircraft was built as the M.48 Messenger 3 with fully retractable flaps. The model was not further developed as it did not provide any advantage over the other variants.

When the RAF retired surviving aircraft in 1948 they were in good condition and were converted for civilian use as the Messenger 4A.

The aircraft was a popular touring and racing aircraft during the late 1940s and early 1950s. In 1954 Harold Wood won the King's Cup Race air race at 133 mph. 

The full Wikipedia article is available here -

ZK-CMM is a Messenger IIA and was built in 1947 so never saw wartime service.  It is however painted in the color scheme of Field Marshal Bernard Mongomery’s private aircraft. 

Some historical information on ZK-CMM thanks to the Museum of Berkshire Aviation -

Miles Messenger M.38 IIA ZK-CMM was built for the UK civil market as G-AJVL (c/n 6372) at Newtownards, Northern Ireland and flown unpainted to Woodley for final painting, upholstering and sale. She was listed on 02-07-1947 with Tyne Taxis of Woolsington. Bryan Price started work with Tyne Taxis in 1947 and his first job was to go to the Miles factory at Woodley, Reading and pick up a new Messenger - none other than G-AJVL (now ZK-CMM).

Bryan flew G-AJVL from Reading to Newcastle on 14-07-1947 and flew it for Tyne Taxis for the next 12 to 18 months. Bryan later emigrated to New Zealand in the early 1950's, along with Peter Proctor (Tyne Taxis Manager), Brian Chadwick (Tyne Taxis Engineer) and today (April 2004) lives in
Christchurch N.Z.. Cancelled in November 1949, the aircraft was exported to Australia to become VH-BJM on 28-12-1950 for use by Sam Hecker of Maryborough, until the registration was cancelled 20-10- 63 due to D.C.A policy re glue failures. Purchased by Ken Orrman of Shepparton (1978) and later by Bill Thompson (December 1988).

Bill Thompson rebuilt the aircraft, pretty much replacing the entire woodwork over a period of four and a half years and involving some 5,500 hours' work.

It returned to the Australian register on 06-08-1993 as VH-BJH and was sold to G Ireland of Capalaba, Queensland, on 10-10-1996, followed by Mike and Elizabeth Apps of Canberra. On 07-10-1997 it was re-registered as VH-ZMM. During the latter part of WWII Messengers were used by some well known high ranking officers as VIP transports, including Field Marshall Montgomery and Marshall of the RAF, Lord Tedder.

VH-BJH had been painted to represent an example of this type, including camouflage and invasion stripes and the British military serial of RG333 was added to represent the first of three such aircraft used by Montgomery. (The RAF number should have been RH368 as this was the only Messenger with Invasion Stripes from logbook of F/L Trevor Martin, Monty's Pilot.)

The aircraft was purchased in Australia in November 2003 by Dave Cowie, dismantled under the supervision of Stan Smith and transported to NZ in December in a 40-ft container (which is no mean feat considering the one piece wing spans 36 ft).

Reassembled at North Shore Airfield, where it is now based, the Messenger was registered as ZK-CMM on 22nd of January 2004 with its Certificate of Airworthiness being issued on 11th February 2004. First New Zealand flight was on the 13th February by Stan Smith. The aircraft performed extremely well and confirmed its STOL reputation. The only modifications are the fitting of Cleveland disc brakes and some "new" instruments.

After the fly-past Andrew was returning the aircraft to it’s hanger at North Shore….. “I’m looking for some company… want a ride?”  How many possible answers are there to that question?

Impressions of the messenger…..

  • No electric starter…. So the pilot (or his/her assistant) gets a strong right arm starting a warm engine (Andrew tells me that the engine starts a lot more predictably when cold). 
  • It’s an English engine…. The prop spins the opposite direction.
  • The high chord wing…. stall speed is around 35 knots.
  • The oleo landing gear… for rough and unprepared strips behind enemy lines.
  • The little propeller on the right wing that drives the generator….
  • The three tails….
  • Gull wing doors…
  • The forward visibility…. or lack of.  I think I have been spoiled by the Citabria which has great visibility from the front seat….. the Messenger is much worse although nothing like a Tiger Month, J3 from the back seat or a real warbird.  A little S turning and looking down the side of the cowling helps.
  • In the cockpit things are quite snug… you wouldn’t want two large guys in the front seats unless they were very good friends…..
  • The smell of warm oil and fuel when you push the throttle forward for takeoff….
  • The ridiculously short ground roll on takeoff….
  • The sedate feel…. nothing happens fast, easy to fly accurately (certainly in departure from Ardmore and crusie which are the bits I flew), the rudder is important to stay in balance but doesn’t have a lot of authority.
  • The wallowing feeling…. As you get out of step trying to correct the yaw with rudder….
  • Flying over the Hauraki gulf at 1000 feet with the side window open and your arm out in the breeze.
  • The amount of rudder work needed to stay straight on the North Shore runway after landing.
  • Wiping the oil off the cowling as the aircraft cools after another successful flight… you can almost see it smiling.

Recreational flying is all about experiences…. And this was a great one. 

As a recreational pilot one reason to learn to fly a taildragger is the range of interesting and different aircraft types you can enjoy.  It’s not that hard… and will make you a better pilot for it.  Since checking out in the Citabria I have had the opportunity to fly a J3 Cub, PA18 Cub and now the Messenger.  And there are so many more out there to try…..

(Check out if you are interested in taildragger training in New Zealand).


Page 9 of 11

Powered by Easytagcloud v2.1

Contact Andrew Quinn