Sunday, February 24, 2019

A quiet but friendly Wyong field day

Today I attended the Wyong Field Day. Once again I helped David Rowe on the FreeDV table and in between table duty had a look around.

This year they'd arranged things so that it was pretty much all under cover. Unlike some previous years when it was oppressively hot, it was cool and a tiny bit wet. There was lots of surplus gear not to buy.


I attended an interesting talk on MMDVM (multi mode digital voice modem).


Attendance felt a little down on some past years. Perhaps the threat of showers put some people off.


The ARNSW Home Brew Group had a terrific display, indoors this time.



Peter, VK2EMU, is illustrating below how he can build two amplifiers with the same output power but in vastly different form factors.


Great to see everyone and thanks to the organisers at the Central Coast Amateur Radio Club for a fantastic effort once again.

Friday, February 22, 2019

MacBook battery replacement requires calibration

A few years ago I bought a second hand Mid 2010 MacBook Air 11 as a standby machine. It came with a dead battery. A cheap Chinese replacement was purchased via eBay but while the battery life was usable (for reading the news over breakfast) it would warn that it was going to shut down after about two hours. Shown here in activity monitor.



I did what they advised in that I charged it up and then used it until it warned me on the first cycle.

The battery actually reported that it had more than the design capacity and I figured this was a lie.


Figuring I'd bought a low capacity battery pretending to have more mAh than it really did, I ordered a new one from a reputable dealer, iFixit Australia.

While waiting for the new battery to arrive I read up on battery manager calibration and this time did the following:

  • Fully charged the battery over night
  • Ran the laptop with screen and disk never sleeping, also no screen dimming (Energy saver)
  • Left it like that to run until it shut itself down
  • Left it another 5 hours to really go flat
  • Fully charged it over night
Interestingly as it discharged there was a long flat part of the charge graph before it actually turned off.


After this exercise, the battery had much better life, perhaps five or six hours of heavy use.

The new battery turned up and I figured I might as well put it in to see if it's better. Replacing the battery in an old MacBook Air is pretty easy if you have the pentalobe screwdrivers.



Interestingly, it reports less capacity in CoconutBattery and the Chinese import.


I again followed the calibration process outlined above and this time, just for fun, I ran a bash script to record screen shots for a movie.


For my own future reference, create a folder on the Desktop called "ScreenRecord" and run this command line to capture screen shots periodically:

while [ 1 ];do vardate=$(date +%d\-%m\-%Y\_%H.%M.%S); screencapture -t jpg -x ~/Desktop/ScreenRecord/$vardate.jpg; sleep 1; done


To make the folder full of jpeg images into a movie I used ffmpeg:

ffmpeg -r 24 -pattern_type glob -i '*.jpg' out.mp4

(-r is the frame rate).

Measuring real world battery life is not easy as load varies wildly. I think the new battery is slightly better than the old one after calibration, but I wish I had done this earlier and saved my money.

Saturday, February 16, 2019

Pi-Star hotspot getting started

The hotspot board I ordered via eBay for AU$60 arrived (I note the price has increased recently). It turns out to be labeled a Jumbo Spot rev 1.6. I already had the Raspberry Pi Zero but the other parts came as shown here.


The metal box is very solid, the board is good quality and the OLED display was already soldered in place. There was some soldering in that the pin headers for attaching to the Pi had to be soldered on to the Pi Zero board.

The Pi-Star software was downloaded from here and copied to the microSD card using Etcher on macOS.

Because I hadn't read enough documentation, I fired it up connected to a monitor and keyboard and attempted to get it on to my Wifi via the command line. (Don't do this).


The right way to get started is to let it boot and after a minute or so it creates a Wifi network called "pi-star-setup". On a computer, join that wifi network and go to http://pi-star.local and you log in with username pi-star and password raspberry to do the configuration via a web interface. Here you can tell it about your wifi network and then let it join. After that, go back to your own network and again visit it via http://pi-star.local.

Jumbo Spot isn't in the radio/modem type popup so I used MMDVM_HS_Hat (DB9MAT & DF2ET) for Pi GPIO and that appears to work.

DMR Master is set to DMR+_IPSC2-AUS-2 with options "TS2_1=505;TS2_2=3802;TS2_3=3803;TS2_4=3804;TS1_1=13;TS1_2=113;TS1_3=123". These settings derived from VK7HSE in the Pi-Star forum. I am seeing traffic and can see myself transmit.

There's a good tutorial on setting up Pi-Star configuration on Amateur Radio Notes here.

All boxed up now and it looks like a solid bit of gear.


I set it to the frequency which was already in a code plug I used in my TYT MD-380. I can see a bit of activity on the web interface.


Range seems excellent, it certainly covers the house without any problems. I'm still figuring this thing out but so far it seems good.

I've had a few brief contacts on talk group 505 slot 2 but often can see that a station is there but not hear them.

Updated firmware to 1.4.14

Following the instructions from hvdn.org I've just updated the Jumbo Spot firmware from v1.3.3 to 1.4.14. So far so good and very easy to update.

Here's a VK4 talking to a VK3. I'm in VK2 via this Jumbo Spot.


There is a page for the IPSC2-AUS-2 network which my hot spot is connected to here.

There's a big list of all the BrandMeister talk groups and you can listen live.

Wednesday, February 06, 2019

TYT MD-380 DMR getting started in Sydney

The DMR radio I ordered for AU$127 just days ago arrived today. I thought this would be a place to leave notes for myself that might help others as it's pretty mystifying to get started with.

For the price it's a very solid feeling radio. Heavy in the hand (in a good way), with a good keyboard and knobs. It came with the USB programming cable - I didn't know this and ordered one at the same time. The charging dock is solid and the little power adapter came with an Australian plug adapter. Two antennas, a small stubby one and a slightly larger one that the manual says works better. On UHF the full size one is quite compact anyway.

MD-380 doesn't turn on! Turning on the power and nothing. Charged for an hour, still nothing... it turns out that there was a piece of tape between the battery and the radio so I had to remove the battery and peel it off to turn on the radio. All good.

I registered my callsign for a DMR ID at https://www.radioid.net/ note that you need to upload a copy of your license.

From the recent talk at ARNSW, I learned that I'd need to download a "codeplug" file, edit it to put in my DMR ID number and send it to the radio.

The vk2kvp/md380-codeplug was downloaded as a zip and the file "MD380-90_All_AU_DMR+analog+CB_v15.rdt" was extracted out of that.

A TYT Code Plug Editor was downloaded from Milor.com and it opened the .rdt file extracted from the vk2kvp zip. I put in my callsign, my DMR ID (5050184) and saved the file. It warns about passwords being set but I checked and they were blank.

Finally, I opened the codeplug (.rdt) file with TyMD380tools and sent it to the radio. Update, I've now realised that the code plug editor can directly send to the radio, very nice.



I know from earlier experiments with an RTL-SDR that I can hear the Sydney repeater VK2RCG so I went in to zones and chose that one.

Initial Observations


  • The colour screen is low resolution and even short callsigns have to scroll to be read.
  • The large icons on screen take up space, I wonder if they can be reduced?
  • My screen backlight stayed on until I changed it in Menu, Utilities, Radio Settings, Backlight.
  • When the backlight is off, the screen is completely unreadable.

Useful links


First contact

After hearing nothing all afternoon and calling on Talk Group 9, which I thought was the local TG, I asked for help in the Facebook group. It turns out that the Sydney repeater is off the internet. Les suggested Talk Group 505 Slot 2. I called and got a reply from VK2RF who said I was showing up as unknown ID.

I guess that because my ID is new it hasn't been added by other users yet.

Audio sounded good and I'm now thinking that a hotspot might be the way to go as the only repeater I can hear is off line.

The Facebook group is a great source of info. The reason why I wasn't hearing much is that pretty much all the local repeaters are currently down and the one I can hear is off the internet.


My thanks to Glenn, Les, Pete, Bruce, Bevan and Denis for their help.

Ordered a hot spot

I've ordered an MMDVM Hotspot for AU$60 (I have a spare raspberry Pi already). This seems like the way to go as all the local repeaters are currently down of off the internet. It will take a few weeks to come from China and I'll report the experience here.

The OpenSPOT2 looks tempting but I quite enjoy Linux tinkering and the Pi-Star software for the MMDVM hotspots is being actively updated and looks amazing.

Talked with Les VK4TB

I successfully sent Les a text message via TG505 and then he suggested we have a talk on TG3809 Slot 1. This wasn't in my code plug so I've added it (I got the name wrong saying QLD) but anyhow we were able to talk between Sydney and Brisbane quite well as you'll see here.


I have now flashed the firmware to the "enhanced" version. I was unable to do this under windows as the program just crashed each time I hit flash.

Mine had Firmware version D014.004 and CP Vers V01.37. This seems pretty recent but it looks like updates are available from TYT. Including "MD-380_390 FOR USA" dated 2019-01-07. I have not tried this.

Flashing the firmware worked smoothly on Ubuntu Linux following the excellent instructions from the author Travis Goodspeed here.

The new firmware has a number or worthwhile enhancements including showing the name and info about the person talking:


When no one is talking, you can configure to see lots of useful info including the time slot and talk group (without having to wait for it to scroll into view) and down below is the last call heard.


Nice code plug editor for Linux - editcp

There's a great code plug editor for Linux called editcp by Dale Farnsworth. The binary installed as advertised on Ubuntu and works well.


The UI, built with qt, is superior to the Windows program I've been using as you can drag to re-order items in the lists. One slightly concerning thing is the warnings about fields with illegal values that I get each time I save or go to send to the radio.


Despite this warning all seems well and I've grabbed the code plug (terrible name for settings) from the radio, edited various things, and sent back to the radio where all works nicely.

Wednesday, January 30, 2019

RTL-SDR for spectrum analysis

Since getting back in to RTL-SDR for my recent foray into decoding DMR, I found that these are a very useful (and low cost) bit of gear.

At the last ham radio meeting at Dural, I bought a Shure radio microphone and when I got home I wanted to find out what frequency it was on. Cranking the knob on a receiver was taking forever so I decided to look into scanning broadly with RTL-SDR.

There is a bundled tool called rtl_power which seems perfect for this but it creates a CSV file that's a bit annoying to look at or graph. Now I've stumbled upon RTLSDR-scanner.


RTLSDR-scanner is a python module which you run from the command line. You give it a low and high frequency and it quickly scans and displays a nice graph which can also be exported and looks like this:

(Click images to enlarge by the way). RTL-SDRs don't have much dynamic range so I don't really think this would be good for real spectrum analysis tasks, like finding spurious emissions from transmitters, but for finding the output of a mystery radio mic (622MHz by the way) it was perfect.

Alternatives

There is some great software around for driving RTL-SDR and other SDRs. One that looks terrific is Spektrum but I can't get it working on my Ubuntu or Windows machines here.

Mac Malware - do not update flash

Two good friends have recently had their Apple macOS machines infected with annoying malware and I'm pretty sure the vector was downloading and installing (with authentication) fake updates to Adobe Flash.

I saw this amazing display recently, all on one page.


Use of Flash is almost zero these days and if you really need it I suggest running the Chrome browser which has it built-in.

If you think you have malware on your computer, I can recommend ClamAV which is open source and free. Friend Gerald said that ClamAV didn't find everything though "So it looks like ComboCleaner finds threats that ClamAV does not. Although CC won't delete them, but uses the fear to promote subscription."

He's technical so once he had a name of something found by ComboCleaner he used find / -name XXX to find the path to each suspect file and then deleted them manually.

Having said all that, I don't run a virus checker on my Macs and haven't had trouble, but that's partly because I'm very skeptical of things I install from the internet.

Sunday, January 27, 2019

ARNSW Home Brew Group - DMR here too

Today we had a meeting of the home brew group out at ARNSW in Dural. The first surprise (to me) was the wonderful new tower that has been erected on the site. I'm told that the antenna for the UHF DMR repeater will be right up the top when it's ready.

The other surprise was a large number of valve radios have appeared in the sale items. Apparently this is just the tip of the iceberg and a large collection has become available. I wondered if this was from Jack in near by Castlecrag but apparently that's not the case. I guess the generation who have collected these lovely old mantle receivers has had a touch of KonMarie and aren't seeing enough joy to hang on to them.

Peter, VK2EMU, is building a valve power amplifier and along the way he's taken a diversion and built a beautiful valve tester in a wooden box. The front panel is marked with, I assume, a soldering iron. There's a little door at the back where you pull out the anode lead and inside there is storage for other valve sockets.

A clever part of the design, which I believe is from Drew Diamond, is that the anode is at zero volts and the cathode -600V or so. This means that you don't get killed if you touch the top of the valve.


Peter's diversion reminds me of Donald Knuth's diversion into typesetting while writing the art of computer software. The valve PA is coming along though.


Speaking of valves, here's just some of the valve radios on sale, typically for about $20 each.


Finally we came to the main presentation by Paul VK2GX with an introduction to the DMR radio system. A terrific talk.


When Paul finished I demonstrated decoding DMR off air using an RTL-SDR and the DSD+ software which I wrote about here recently.

Keen to learn more about this I've gone ahead and ordered a TYT MD-380 Transceiver for AU$127 and will report back when it arrives in a few weeks. The low price of DMR gear I think may spell the death of alternative commercial digital radio standards like D-STAR.

Saturday, January 26, 2019

Listening to DMR without a DMR radio

It's not too hard to listen in to DMR digital radio traffic with just a low cost RTL-SDR dongle and some software.

I can pick up the Sydney repeater on 439.5MHz pretty well, even with a non-resonant antenna. There's a good list of frequencies in Australia on VK DMR Info site.


(Click to enlarge the screen shot).

Here, on Windows 10, I'm using SDRSharp piping audio over to DSD+. I followed the instructions found via the RTL-SDR page but in summary, you need VB-Cable to route audio out of SDRSharp over to the DSD+ program.

Demodulation is set to NFM but the bandwidth is wound out to 12kHz. I turned squelch off and also turning off "Filer Audio" made it work much better. Adjusting the audio output level in SDRSharp is also important for good decode.

Here's how it sounds:


At the home brew group meeting on Sunday I understand there's a talk on DMR so I'll be interested to learn more.

Wednesday, January 16, 2019

Nice WSPR Watch review from a fine blog

My thanks to Bas over at the excellent PE4BAS ham radio weblog for his kind review of the recent updates to WSPR watch.

He seems surprised that there are free apps in the iOS app store but the reason, in this case, is that I wrote the app for my own use as I find the WSPRNet.org site isn't really mobile friendly and I like being able to quickly do a search to see how my station is performing.

Bas missed my favourite of the new features which is multi band handling with colour coding. It all looks very pretty.

If you use WSPR watch and haven't already, please leave a review as it helps other people find the app and also makes me feel happy. I'm also open to suggestions for new features but no guarantees on when I'll get to them.

There are a number of sites that scrape WSPRNet.org and add value in different ways:

WSPRNet.org is a great service although it is sometimes very slow or even unresponsive. I'm sure all of us who scrape data from there wish there was an API we could use.


Update

Spurred on by this attention, there have been some updates to WSPR Watch. You can now search the spots for a given callsign (or part) and the traces on the map fade over time.

Sunday, January 06, 2019

Vanlife van interiors - we can learn from the experts - Gypsies

While re-modelling the interior of my tiny camper van I've become fascinated by the interior designs people come up with for these compact living spaces. Recently I struck gold by searching for "Gypsy caravan interior" images.


While clearly designed for cold climate, it's fascinating to look through these.

Check out Low-Tech Magazine

I've just stumbled across a real gem called Low-Tech Magazine. It's a rich collection of stories that provide evidence, if we need it, that sometimes the old ways of doing things are superior to our modern, high technology and high energy use, ways.

They talk about how we used to keep warm at home with a combination of warm clothes and radiant heat - rather than heating the air of the whole house and how ceiling fans are a much better idea than central air-conditioning.

There are interesting pieces about energy storage options including compressed air, as shown above, and insightful comments about how the internet has got faster but web sites have gotten slower.

There's even a solar powered version of the site, which may not be online if the sun isn't shining.

Tuesday, January 01, 2019

Days like this makes me appreciate our solar panels

It's pretty hot here this week. Today it's 32C outside, but inside it's a very pleasant 24C. The wonderful thing is that the house is cooled totally with power from the panels on the roof.

The system generates up to 3.3kW and as the panels are on the north west face of the roof (as you can see the hot water panels are on the north face) we get peak power in the afternoon - which works well on days like this.

I calculate that the system will pay for itself in electricity savings and rebates in about eight years but on days like today we normally wouldn't run the air conditioner except that it's free.


Our quarterly power bill is about $240 and I'm told by the state government's plan comparison site that we can save $100 off that by switching plans - I'm a little sceptical but we'll see.

We did look at adding a battery but at the moment the numbers don't make sense given the lifespan.

Saturday, December 29, 2018

WSPR Watch iOS App now transmits

A bit of feedback from some WSPR Watch users has prompted a bit of work on the app. Recent updates have added and then improved the graphing of the number of spots per block of time - which I think is a fair way to show the rise and fall in propagation, then colours to show bands on not only the graphs but also on the arcs on the map.

Spurred on by recent success transmitting WSPR with a simple Arduino and Si5351 clock generator, I've done the work to generate the needed audio right in the app.

Tests here have shown that simple acoustic coupling from the phone to the mic of an SSB transmitter is enough to be spotted at great distance.

The new transmit feature also has a few goodies:
  • Figures out your maidenhead locator by using the phone's location services.
  • Uses the phone's time sync to start the transmission on time.
There's more to be done but this is a good start. To generate the audio, I used the fabulous AudioKit framework. Symbol generation code was copied from the GPL2 WsprryPi project. (I love how swift can so simply call C functions just by making a bridging header).

WSPR Watch 3.2.6 is now available and I hope you find it useful.

Update 3.2.6 had a bug that led to an intermittent crash. Update to 3.2.7 or later to get over that. I'd like to add that the new band colours in both the graph and map views look great.

The crash was interesting, it wasn't clear what was crashing, somewhere deep in framework c++ code. In the end it turned out that my table of band frequency edges hadn't got 60m correct for all parts of the world and if I got a frequency I didn't expect I'd try to set the colour of an attributed string to an illegal colour. It didn't crash right away though. Thanks to those who reported the issue.

Wednesday, December 19, 2018

Minimal WSPR transmit with Arduino and Si5351

Intrigued by the ZachTek pocket WSPR transmitter Peter, VK3YE, has reviewed, I wondered if I could get a simple beacon going using just an Arduino, an Si5351 clock generator and (you'll be pleased to hear) a low pass filter.

Here's the rig. The low pass filter is from the VK3YE Beach 40 design which I like because it uses off the shelf inductors.


The waveform isn't perfect but it's certainly a long way from the square wave the comes out of the clock generator.


I've taken this sketch, ripped out the lovely GPS time synchronisation, and turned it into a 1 shot beacon. You power on, or press reset, it transmits one message and then turns off RF. Of course you need to push the button at the beginning of a two minute cycle.

Here's how it decodes locally on my receiver with no antenna connected.


You can see that big signal drift earlier where I powered up with the antenna disconnected to let it get up to temperature. In the actual slot it reports a drift of -1 and decodes nicely (well... twice).

Hooked it up to the antenna just now and the little Arduino/sSi5351 transmitter is being heard quite widely.




The software uses some very handy modules:

Both very easy to use. Here's my hack of the code, I'm afraid Blogger doesn't like parts of it like angle brackets so no doubt there will be some things to fix up.


/*
 * Minimal WSPR beacon using Si5351Arduino library
 *
 * Based on code:
 * Copyright (C) 2015 - 2016 Jason Milldrum 
 * 
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see .
 */
 // https://gist.github.com/NT7S/2b5555aa28622c1b3fcbc4d7c74ad926

#include "si5351.h"
#include "Wire.h"
#include <JTEncode.h>
#include <int.h>

#include "Wire.h"

#define TONE_SPACING            146           // ~1.46 Hz
#define WSPR_CTC                10672         // CTC value for WSPR
#define SYMBOL_COUNT            WSPR_SYMBOL_COUNT
#define CORRECTION              0             // Change this for your ref osc

#define TIME_HEADER             "T"           // Header tag for serial time sync message
#define TIME_REQUEST            7             // ASCII bell character requests a time sync message 

#define TX_LED_PIN              13
//#define SYNC_LED_PIN            13

Si5351 si5351;

JTEncode jtencode;
unsigned long freq = 7040500UL;                // Change this
char call[7] = "VK2TPM";                        // Change this
char loc[5] = "QF56";                           // Change this
uint8_t dbm = 10;
uint8_t tx_buffer[SYMBOL_COUNT];

// Global variables used in ISRs
volatile bool proceed = false;

// Timer interrupt vector.  This toggles the variable we use to gate
// each column of output to ensure accurate timing.  Called whenever
// Timer1 hits the count set below in setup().
ISR(TIMER1_COMPA_vect)
{
    proceed = true;
    // Serial.println("timer fired");
}

// Loop through the string, transmitting one character at a time.
void encode()
{
    uint8_t i;
  Serial.println("encode()");
    jtencode.wspr_encode(call, loc, dbm, tx_buffer);

    // Reset the tone to 0 and turn on the output
    si5351.set_clock_pwr(SI5351_CLK0, 1);
    digitalWrite(TX_LED_PIN, HIGH);

    // Now do the rest of the message
    for(i = 0; i < SYMBOL_COUNT; i++)
    {
      uint64_t frequency = (freq * 100) + (tx_buffer[i] * TONE_SPACING);
        si5351.set_freq(frequency, SI5351_CLK0);
        Serial.print("freq = ");
        Serial.println(tx_buffer[i]);
        proceed = false;
        while(!proceed);
    }
    Serial.println("message done");
    // Turn off the output
    si5351.set_clock_pwr(SI5351_CLK0, 0);
    digitalWrite(TX_LED_PIN, LOW);
}

void setup()
{
   Serial.begin(9600);
   Serial.println("setup");
  // Use the Arduino's on-board LED as a keying indicator.
  pinMode(TX_LED_PIN, OUTPUT);

  digitalWrite(TX_LED_PIN, LOW);
  Serial.begin(9600);

  // Set time sync provider
  //setSyncProvider(requestSync);  //set function to call when sync required

  // Initialize the Si5351
  // Change the 2nd parameter in init if using a ref osc other
  // than 25 MHz
  si5351.init(SI5351_CRYSTAL_LOAD_8PF, 0, CORRECTION);

  // Set CLK0 output
  si5351.set_freq(freq * 100, SI5351_CLK0);
  si5351.drive_strength(SI5351_CLK0, SI5351_DRIVE_8MA); // Set for max power
  si5351.set_clock_pwr(SI5351_CLK0, 0); // Disable the clock initially

  // Set up Timer1 for interrupts every symbol period.
  noInterrupts();          // Turn off interrupts.
  TCCR1A = 0;              // Set entire TCCR1A register to 0; disconnects
                           //   interrupt output pins, sets normal waveform
                           //   mode.  We're just using Timer1 as a counter.
  TCNT1  = 0;              // Initialize counter value to 0.
  TCCR1B = (1 << CS12) |   // Set CS12 and CS10 bit to set prescale
    (1 << CS10) |          //   to /1024
    (1 << WGM12);          //   turn on CTC
                           //   which gives, 64 us ticks
  TIMSK1 = (1 << OCIE1A);  // Enable timer compare interrupt.
  OCR1A = WSPR_CTC;       // Set up interrupt trigger count;
  interrupts();            // Re-enable interrupts.

  encode(); // transmit once and stop
}


void loop()
{
   // blink LED when we've finished the transmit
  digitalWrite(TX_LED_PIN, HIGH);
  delay(500);
  digitalWrite(TX_LED_PIN, LOW);
  delay(500);
}

iOS WSPR Watch app with multi-band spot graph

There's a new version of the iOS WSPR Watch app coming out today. Encouraged by some enthusiastic WSPR watchers, I've done some work to add and rapidly improve the graphing of spots.


The graph now shows spot counts aggregated over various blocks of time rather than per two minute slot. The band colours match those used on the WSPRnet.org site.

My thanks to Mark, Phil and Ross for feedback and ideas. Phil, VK7JJ, has an exceptionally low noise level in Tasmania and he also runs an excellent web tool for plotting WSPR spot reception.

I've been picking up Peter, VK3YE, quite reliably and I asked him how he was doing the multi-band transmissions. He's been using a  Zachtek WSPR transmitter which he reviews here:



Most entertainingly, Peter took the transmitter bus mobile and I was one of the stations that received him during a trip!


I like how peter holds the compact loop at the ground point of the feed line and how he notes the SWR change as the metal window frame changes the loop characteristics.

What SNR level shown on WSPR is needed for an actual conversation?

The fact that I can reliably hear some stations got me wondering about what Signal to Noise ratio shown in a WSPR reception would mean the two stations could have a keyboard to keyboard chat. There's a bit of controversy about the equivalence between WSPR and other modes such as this thread, but the consensus seems to be that Olivia 500/8 is the best bet.

Review of Australian Broadcasting Services in the Asia Pacific has published submissions

The Department of Communications and the Arts' Review of Australian Broadcasting in the Asia Pacific has published the 433 formal submissions it received here. I'm only just beginning to look through them but I'm heartened to see that there were so many submissions and from such a diverse range of groups.

"Submissions were received from people and organisations based across Australia and the Asia Pacific region, as well as other countries, including Germany, Indonesia, New Zealand, Palau, Papua New Guinea (PNG), Peru, Philippines, Samoa, Singapore, the United Kingdom (UK), the United States (US) and Vanuatu."

A few that caught my eye include the Prime Minister of Vanuatu. Sean DorneyGeoff Heriot. Murray Green. Peter Parker. Av-Comm / Tecsun Radios AustraliaBruce Dover and Ian Macintosh. The Australian Broadcasting Corporation. SBS. Supporters of Australian Broadcasting in the Asia Pacific (I am a member by the way). ABC Alumni. Lowy Institute. My contribution is here.

It's heartening to see such a great response on this subject. I look forward to the report which is being prepared for government by the end of 2018 and which will be made public "in due course".

Friday, December 14, 2018

A (failed) attempt to recognise the postie with machine learning

I've tinkered with machine learning in the past using TensorFlow but wanted to try Apple's tools which are extremely simple to use by comparison.

We have a low quality webcam pointing out into the street in front of the house that writes a file to a NAS every time it detects motion near the letter box. I often check these images to see if the postie has come. The project's objective is to automate looking at the images and recognise the postie.

Following Apple's documentation, I created an Xcode storyboard and trained it with a folder containing two sub-folders named "Postie" and "No Postie".

The storyboard is just this:

import CreateMLUI

let builder = MLImageClassifierBuilder()

builder.showInLiveView()

And it puts up a nice little UX where you drag your training folder.


I did try all of the augmentations shown above, it took a lot longer but wasn't more accurate in my case.

After saving the model, I created a simple macOS application with an ImageWell in it. You drag in an image and it shows the most likely tag like this:


Here's the main bit of the code to look at the image and display the classification.

    @IBAction func droppedImage(_ sender: NSImageView) {
        if let image = sender.image {
            if let cgImage = image.cgImage(forProposedRect: nil, context: nil, hints: nil) {
                let imageRequestHandler = VNImageRequestHandler(cgImage: cgImage, options: [:])
                do {
                    try imageRequestHandler.perform(self.requests)
                } catch {
                    print(error)
                }
            } else {
                print("Couldn't convert image")
            }
        }
    }
    
    private var requests = [VNRequest]()
    
    func setupVision() -> NSError? {
        // Setup Vision parts
        let error: NSError! = nil
        
        do {
            let visionModel = try VNCoreMLModel(for: PostieClassifier().model)
            let objectRecognition = VNCoreMLRequest(model: visionModel, completionHandler: { (request, error) in
                DispatchQueue.main.async(execute: {
                    // perform all the UI updates on the main queue
                    if let results = request.results {
                        let prediction = results[0] as! VNClassificationObservation
                        let classification = prediction.identifier
                        let confidence = prediction.confidence
                        self.predictionTextField.stringValue = "\(classification) \(confidence)"
                    }
                })
            })
            self.requests = [objectRecognition]
        } catch let error as NSError {
            print("Model loading went wrong: \(error)")
        }
        
        return error

    }

Not much code is there.

While this all works, in my case, recognition of the postie in my low quality webcam image is very unreliable. Testing did show this, to be fair.


I suspect the issue is that the postie is a very small part of the image and, due to weather and the position of the sun, the images do vary quite widely.

As mentioned above, I tried training with all of the augmentations available but accuracy didn't improve. Also I tried cropping training images to just include the postie.

In summary, I'm impressed with how super easy it is to create and use ML models on Apple's platforms but I have a great deal to learn about how to train a model to get good results.

Monday, December 03, 2018

Beautiful Don Dorrigo Gazette

After visiting Dorrigo several times I finally remembered to drop in and purchase (for $1) a copy of the hot-metal typeset "Don Dorrigo and Guy Fawkes Advocate".

The paper has been published since January 8, 1910 and is the last known newspaper in Australia to still be printed this way.

The paper has no photographs and the small type is somewhat wonky but it has a charm of its own.

Mostly local advertising but with a few interesting stories. Click on the images here and view up close to really enjoy it.



There's a Wikipedia page and an ABC story with video showing the production process.