RaDAR – APRS

A rather new discussion on our local forum led me to do a little research on APRS again. I posed a few questions. Interesting to see there is a little APRS activity in South Africa.

Is it being put to good use or only an indicator of a very few vehicle movements?
Is any messaging done through the network?
How many active weather stations are there nowadays?
What are the main coverage areas?
Are there still 300 baud HF gateways?

An answer from Andrew ZS5CEY, “DMR radios with GPS can post their positions to APRS via our Brandmeister DMR Master (providing radio set up to do this). This also allows two-way messaging between DMR radios and APRS, and is supposed on all the DMR repeaters”. I need to do a little study on this technology.

Paul ZS1V replied, “Hamnet WC and GS both use 2m APRS during events and WC have used it for multi-day missing persons searches with WSAR also”.

I went to apsr.fi and did a few searches and was pleasantly surprised!

Cape town

Natal

and Gauteng!

Great to see all the active weather stations!

Hennie ZS6EY provided some port info, “You can also connect to http://zs6ey.no-ip.org:14501 on all three ports”. Andy ZS5CEY also mentioned a backup server URL, “You can connect to my backup server at http://www.easytracking.co.za and the port you want to connect to”.

Maybe time to look into APRS again. I have a KAM XL lying around doing nothing!

Just got Xastir running under Zorin OS 12.3 Linux 🙂

Yet Another APRS Client (YAAC)

Advertisements

RaDAR Challenge – Adapting strategies

The first RaDAR Challenge for 2018 took place on Saturday. I chose the four hours between 14:00 and 18:00 CAT (12:00 to 16:00 UTC). Attempting an intercontinental R2R was part of the plan.

I left on foot at 14:00 to travel at least a kilometer and be ready for the AO-91 cubesat pass at 14:36. I hoped to make 5 QSO’s via the satellite but it was quite a low elevation pass to the west which would be even lower for the general HamSat group in South Africa.

I managed good exchanges with Tom ZS1TA and Charles ZS1CF but battled with Tienie ZS6MHH for a grid exchange. Could I count the contact? I don’t think so. The satellite moved north where there is general QRM from central Africa and further QSO’s were impossible.

I had my HF kit with me and hastily set up an HF station to make further QSO’s before I could move. I made QSO’s with Justin ZS6JGP, Thanie ZS4AZ (A big supporter of SOTA and RaDAR) and Sid ZS5AYC. Not counting the QSO with Tienie gave me a total of five QSO’s so I could pack up and move. The strategy was to do the next leg as a mobile station with DX in mind.

I walked to where the car was parked, dumped the kit in the boot and went for a 6km drive returning to my favorite spot in the park and set up the link dipole once again, adjusted for 40m. Here I worked Sid ZS5AYC again, he had already moved to a new grid. I worked Sid’s wife, Adele ZS5APT too then Thanie ZS4AZ again, our supporter. That was three QSO’s and I needed another two. 20m was full of CW contest activity AGAIN! Our CW sked frequency, 14.061 was busy. I went to 15m, it was quiet except for the FT8 frequency. I did a WSPR test at 5W and the results were not too inspiring.

Then I thought, let me try FT8, a mode I’ve never used before. I had my netbook with me running Elementary OS Linux with WSJT-X installed. I connected the Signalink USB to my 897d running off two 7A/Hr SLABS and set it to 40W. I used the 40m section of the link dipole and tuned using the AT897 LDG ATU. I made my first digital FT8 QSO’s. It was just too easy, the computer automatically adjusting for the next information exchange. It had no value other than making a computerized QSO.

I’m in two minds about FT8 for it’s use in RaDAR but at this stage the QSO’s counted, at least the first two so I had an excess of one QSO. It made little sense (At the time) to move any further and thought I’d look out for Greg N4KGL and possible other RaDAR stations and called continuously on 21.061 CW.

These were the only RBN spots I got from the Reverse beacon Network.

I did however manage to work two CW stations from Germany. QSB was very deep though. That was the end of my RaDAR Challenge time period. I managed two locations. Five bonus points for the first satellite contact. Five bonus points for a contact with another RaDAR station, Sid ZS5AYC. Five QSO’s for position 1 and five QSO’s for position two. The excess of three QSO’s could not be counted. Points calculation 40.

If I had moved to a third location I could have made the bonus points for the first QSO with a DX station on CW but chose not to move. I could ignore the FT8 QSO’s but that is a technicality we must discuss. PSK31 is a different story and would most certainly count as a digital modes QSO.

An interesting poll in ZS (Just started)

RaDAR – Arduino controlled robotics

Something I started almost two decades ago but with Arduino’s and modern cheap sensors, my interest has once again been awakened. The knowledge will work it’s way into RaDAR for sure!!!

I’m building a self balancing (Two wheeler) rover robot using scrapped wiper motors I bought around the year 2001. Meet the new Mach 2018 roving robot 🙂

Infrared sensors have been installed at each corner to serve as obstacle avoidance sensors. Specific motor movements have been programmed in the event of an obstacle being detected within a 5cm range. This is the first intelligence the robot will carry on which I will build further. Ultrasonic range sensors will be next, a very effective solution to detect obstacles up to a few meters away which can be accurate up to 5mm!!!

I have installed a tiny screen to display simple diagnostics.

My Arduino code so far for this is as follows:

/*

Mach 2018 – driven by Arduino.

Eddie Leighton – 23rd March 2018

*/

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

// ———————————————————————————-

int RPWM_Output = 5;
int LPWM_Output = 6;

int M2RPWM_Output = 9;
int M2LPWM_Output = 10;

// ———————————————————————————-

int LED = 13; // Use the onboard Uno LED

int RBObstaclePin = 0; // This is our input pin
int RBObstacle = HIGH; // HIGH MEANS NO OBSTACLE

int LBObstaclePin = 1;
int LBObstacle = HIGH;

int LFObstaclePin = 2;
int LFObstacle = HIGH;

int RFObstaclePin = 3;
int RFObstacle = HIGH;

// ———————————————————————————-

void setup()

{

display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3C

display.clearDisplay();
display.display();

display.setTextColor(WHITE);
display.setTextSize(2);

display.setCursor(10,0);
display.print(“Mach 2018”);
display.display();

// ———————————————————————————–

pinMode(RPWM_Output, OUTPUT);
pinMode(LPWM_Output, OUTPUT);

pinMode(M2RPWM_Output, OUTPUT);
pinMode(M2LPWM_Output, OUTPUT);

// ———————————————————————————–

pinMode(RBObstaclePin, INPUT);
pinMode(LBObstaclePin, INPUT);

pinMode(RFObstaclePin, INPUT);
pinMode(LFObstaclePin, INPUT);

pinMode(LED, OUTPUT);

}

void loop()
{

display.clearDisplay();
display.display();

display.setTextColor(WHITE);
display.setTextSize(2);

display.setCursor(10,0);
display.print(“Mach 2018”);

display.setTextSize(1);

// ———————————————————————————–

RBObstacle = digitalRead(RBObstaclePin);

if (RBObstacle == LOW)
{

display.setCursor(10,40);
display.print(“Right back”);
digitalWrite(LED, HIGH);
display.display();

stopBOT(); // STOP
delay (100); // Motors still

slowFWD(); // Move forward slowly
delay(1000); // for one second

stopBOT();
delay (100);

slowSpinCW (); // Spin slowly clockwise
delay(1000); // for one second

stopBOT();
delay (100);

display.clearDisplay();
display.display();

}

// ———————————————————————————–

LBObstacle = digitalRead(LBObstaclePin);

if (LBObstacle == LOW)
{

display.setCursor(10,40);
display.print(“Left back”);
digitalWrite(LED, HIGH);
display.display();

stopBOT();
delay (100);

slowFWD();
delay(1000);

stopBOT();
delay (100);

slowSpinCCW (); // Spin anti-clockwise
delay(1000); // for one second

stopBOT();
delay (100);

display.clearDisplay();
display.display();

}

// ———————————————————————————–

LFObstacle = digitalRead(LFObstaclePin);

if (LFObstacle == LOW)
{

display.setCursor(10,40);
display.print(“Left front”);
digitalWrite(LED, HIGH);
display.display();

stopBOT();
delay (100);

slowREV(); // Move backwards slowly
delay(1000); // for one second

stopBOT();
delay (100);

slowSpinCW ();
delay(1000);

stopBOT();
delay (100);

display.clearDisplay();
display.display();

}

// ———————————————————————————–

RFObstacle = digitalRead(RFObstaclePin);

if (RFObstacle == LOW)
{

display.setCursor(10,40);
display.print(“Right front”);
digitalWrite(LED, HIGH);
display.display();

stopBOT();
delay (100);

slowREV();
delay(1000);

stopBOT();
delay (100);

slowSpinCCW ();
delay(1000);

stopBOT();
delay (100);

display.clearDisplay();
display.display();

}

}

// — Mach motor control for specific movements ————————————-

void slowFWD () {

int reversePWM = -(400 – 511) / 2; // Left motor slow forward
analogWrite(LPWM_Output, 0);
analogWrite(RPWM_Output, reversePWM);

int M2forwardPWM = -(400 – 511) / 2; // Right motor slow forward
analogWrite(M2LPWM_Output, M2forwardPWM);
analogWrite(M2RPWM_Output, 0);

}

// ———————————————————————————–

void slowREV () {

int forwardPWM = (600 – 512) / 2; // Left motor slow reverse
analogWrite(LPWM_Output, forwardPWM);
analogWrite(RPWM_Output, 0);

int M2reversePWM = (600 – 512) / 2; // Right motor slow reverse
analogWrite(M2LPWM_Output, 0);
analogWrite(M2RPWM_Output, M2reversePWM);

}

// ———————————————————————————–

void stopBOT () {

int reversePWM = -(500 – 511) / 2; // Left motor STOP
analogWrite(LPWM_Output, 0);
analogWrite(RPWM_Output, reversePWM);

int M2forwardPWM = -(500 – 511) / 2; // Right motor STOP
analogWrite(M2LPWM_Output, M2forwardPWM);
analogWrite(M2RPWM_Output, 0);

}

// ———————————————————————————–

void fastFWD () {

int reversePWM = -(600 – 511) / 2; // Left motor fast forward
analogWrite(LPWM_Output, 0);
analogWrite(RPWM_Output, reversePWM);

int M2forwardPWM = -(600 – 511) / 2; // Right motor fast forward
analogWrite(M2LPWM_Output, M2forwardPWM);
analogWrite(M2RPWM_Output, 0);

}

// ———————————————————————————–

void fastREV () {

int forwardPWM = (400 – 512) / 2; // Left motor fast reverse
analogWrite(LPWM_Output, forwardPWM);
analogWrite(RPWM_Output, 0);

int M2reversePWM = (400 – 512) / 2; // Right motor fast reverse
analogWrite(M2LPWM_Output, 0);
analogWrite(M2RPWM_Output, M2reversePWM);

}

// ———————————————————————————–

void slowSpinCW () {

int reversePWM = -(400 – 511) / 2; // Left motor slow forward
analogWrite(LPWM_Output, 0);
analogWrite(RPWM_Output, reversePWM);

int M2reversePWM = (600 – 512) / 2; // Right motor slow reverse
analogWrite(M2LPWM_Output, 0);
analogWrite(M2RPWM_Output, M2reversePWM);

}

// ———————————————————————————–

void slowSpinCCW () {

int forwardPWM = (600 – 512) / 2; // Left motor slow reverse
analogWrite(LPWM_Output, forwardPWM);
analogWrite(RPWM_Output, 0);

int M2forwardPWM = -(400 – 511) / 2; // Right motor slow forward
analogWrite(M2LPWM_Output, M2forwardPWM);
analogWrite(M2RPWM_Output, 0);

}

===========================================================================================

Next test, hoping to send variable speeds to the motors, essential when implementing self balancing!!!

/*

Mach 2018 – driven by Arduino.

Eddie Leighton – 23rd March 2018

*/

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

// ———————————————————————————-

int RPWM_Output = 5;
int LPWM_Output = 6;

int M2RPWM_Output = 9;
int M2LPWM_Output = 10;

// ———————————————————————————-

int LED = 13; // Use the onboard Uno LED

int RBObstaclePin = 0; // This is our input pin
int RBObstacle = HIGH; // HIGH MEANS NO OBSTACLE

int LBObstaclePin = 1;
int LBObstacle = HIGH;

int LFObstaclePin = 2;
int LFObstacle = HIGH;

int RFObstaclePin = 3;
int RFObstacle = HIGH;

// ———————————————————————————-

void setup()

{

display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3C

display.clearDisplay();
display.display();

display.setTextColor(WHITE);
display.setTextSize(2);

display.setCursor(10,0);
display.print(“Mach 2018”);
display.display();

// ———————————————————————————–

pinMode(RPWM_Output, OUTPUT);
pinMode(LPWM_Output, OUTPUT);

pinMode(M2RPWM_Output, OUTPUT);
pinMode(M2LPWM_Output, OUTPUT);

// ———————————————————————————–

pinMode(RBObstaclePin, INPUT);
pinMode(LBObstaclePin, INPUT);

pinMode(RFObstaclePin, INPUT);
pinMode(LFObstaclePin, INPUT);

pinMode(LED, OUTPUT);

}

void loop()
{

display.clearDisplay();
display.display();

display.setTextColor(WHITE);
display.setTextSize(2);

display.setCursor(10,0);
display.print(“Mach 2018”);

display.setTextSize(1);

// — Slow to fast, forward ———————————————————

for (int i=50; i >= -50; i–){

FWD(i);

delay(10);

}

stopBOT();
delay (100);

// — Slow to fast, reverse ———————————————————

for (int i=50; i >= -50; i–){

REV(i);

delay(10);

}

stopBOT();
delay (100);

// ———————————————————————————–

RBObstacle = digitalRead(RBObstaclePin);

if (RBObstacle == LOW)
{

display.setCursor(10,40);
display.print(“Right back”);
digitalWrite(LED, HIGH);
display.display();

stopBOT(); // STOP
delay (100); // Motors still

slowFWD(); // Move forward slowly
delay(1000); // for one second

stopBOT();
delay (100);

slowSpinCW (); // Spin slowly clockwise
delay(1000); // for one second

stopBOT();
delay (100);

display.clearDisplay();
display.display();

}

// ———————————————————————————–

LBObstacle = digitalRead(LBObstaclePin);

if (LBObstacle == LOW)
{

display.setCursor(10,40);
display.print(“Left back”);
digitalWrite(LED, HIGH);
display.display();

stopBOT();
delay (100);

slowFWD();
delay(1000);

stopBOT();
delay (100);

slowSpinCCW (); // Spin anti-clockwise
delay(1000); // for one second

stopBOT();
delay (100);

display.clearDisplay();
display.display();

}

// ———————————————————————————–

LFObstacle = digitalRead(LFObstaclePin);

if (LFObstacle == LOW)
{

display.setCursor(10,40);
display.print(“Left front”);
digitalWrite(LED, HIGH);
display.display();

stopBOT();
delay (100);

slowREV(); // Move backwards slowly
delay(1000); // for one second

stopBOT();
delay (100);

slowSpinCW ();
delay(1000);

stopBOT();
delay (100);

display.clearDisplay();
display.display();

}

// ———————————————————————————–

RFObstacle = digitalRead(RFObstaclePin);

if (RFObstacle == LOW)
{

display.setCursor(10,40);
display.print(“Right front”);
digitalWrite(LED, HIGH);
display.display();

stopBOT();
delay (100);

slowREV();
delay(1000);

stopBOT();
delay (100);

slowSpinCCW ();
delay(1000);

stopBOT();
delay (100);

display.clearDisplay();
display.display();

}

}

// — Mach motor control for specific movements ————————————-

void slowFWD () {

int reversePWM = -(400 – 511) / 2; // Left motor slow forward
analogWrite(LPWM_Output, 0);
analogWrite(RPWM_Output, reversePWM);

int M2forwardPWM = -(400 – 511) / 2; // Right motor slow forward
analogWrite(M2LPWM_Output, M2forwardPWM);
analogWrite(M2RPWM_Output, 0);

}

// ———————————————————————————–

void slowREV () {

int forwardPWM = (600 – 512) / 2; // Left motor slow reverse
analogWrite(LPWM_Output, forwardPWM);
analogWrite(RPWM_Output, 0);

int M2reversePWM = (600 – 512) / 2; // Right motor slow reverse
analogWrite(M2LPWM_Output, 0);
analogWrite(M2RPWM_Output, M2reversePWM);

}

// ———————————————————————————–

void stopBOT () {

int reversePWM = -(500 – 511) / 2; // Left motor STOP
analogWrite(LPWM_Output, 0);
analogWrite(RPWM_Output, reversePWM);

int M2forwardPWM = -(500 – 511) / 2; // Right motor STOP
analogWrite(M2LPWM_Output, M2forwardPWM);
analogWrite(M2RPWM_Output, 0);

}

// ———————————————————————————–

void fastFWD () {

int reversePWM = -(600 – 511) / 2; // Left motor fast forward
analogWrite(LPWM_Output, 0);
analogWrite(RPWM_Output, reversePWM);

int M2forwardPWM = -(600 – 511) / 2; // Right motor fast forward
analogWrite(M2LPWM_Output, M2forwardPWM);
analogWrite(M2RPWM_Output, 0);

}

// ———————————————————————————–

void fastREV () {

int forwardPWM = (400 – 512) / 2; // Left motor fast reverse
analogWrite(LPWM_Output, forwardPWM);
analogWrite(RPWM_Output, 0);

int M2reversePWM = (400 – 512) / 2; // Right motor fast reverse
analogWrite(M2LPWM_Output, 0);
analogWrite(M2RPWM_Output, M2reversePWM);

}

// ———————————————————————————–

void slowSpinCW () {

int reversePWM = -(400 – 511) / 2; // Left motor slow forward
analogWrite(LPWM_Output, 0);
analogWrite(RPWM_Output, reversePWM);

int M2reversePWM = (600 – 512) / 2; // Right motor slow reverse
analogWrite(M2LPWM_Output, 0);
analogWrite(M2RPWM_Output, M2reversePWM);

}

// ———————————————————————————–

void slowSpinCCW () {

int forwardPWM = (600 – 512) / 2; // Left motor slow reverse
analogWrite(LPWM_Output, forwardPWM);
analogWrite(RPWM_Output, 0);

int M2forwardPWM = -(400 – 511) / 2; // Right motor slow forward
analogWrite(M2LPWM_Output, M2forwardPWM);
analogWrite(M2RPWM_Output, 0);

}

// ———————————————————————————–

void FWD (int spoed) {

// Slow 50 ….. to …… fast -50

int reversePWM = spoed; // Left motor forward
analogWrite(LPWM_Output, 0);
analogWrite(RPWM_Output, reversePWM);

int M2forwardPWM = spoed; // Right motor forward
analogWrite(M2LPWM_Output, M2forwardPWM);
analogWrite(M2RPWM_Output, 0);

}

// ———————————————————————————–

void REV (int spoed) {

// Slow 50 ….. to …… fast -50

int forwardPWM = spoed; // Left motor reverse
analogWrite(LPWM_Output, forwardPWM);
analogWrite(RPWM_Output, 0);

int M2reversePWM = spoed; // Right motor reverse
analogWrite(M2LPWM_Output, 0);
analogWrite(M2RPWM_Output, M2reversePWM);

}

RaDAR – The new ZS6BKW Maak Toe field measurements

I took part in the local 40m Hamnet contest this weekend using my FT817ND and 9:1 UNUN fed long wire hanging over a high tree branch. My deployment point was close to where I have hung the new ZS6BKW antenna (“Maak toe”), published in the March 2018 Radcom magazine by Brian Austin G0GSF, high up in the trees. I worked two SOTA stations during the exercise.

Propagation wasn’t the best so I spent some “Off time” taking some measurements on the BKW using the 817’s SWR indicator to determine “SWR”. I drew up the following chart as an indication of what the values looked like graphically. Note no tuner was in line.

The green values are for 40m and on the lower part of the band no SWR could be seen but started to lift halfway up the band at 7.1 MHz so the antenna is resonating low on the 40m band. Ideal for CW, Digital modes and SSB.

The brown values are for 10m and a dip in SWR can be clearly seen starting from 28.4 MHz where no SWR could be seen for at least 300 kHz and where the SWR started to slowly climb around 28.8 MHz. At 29.3 MHz the SWR indicator showed 5 bars. The antenna is resonating nicely on the SSB portion of the 10m band. A tuner will be needed for the CW and Digital modes portion of the band.

The yellow values are for 20m and best, but not low, in the CW portion of the band. A SWR indication of 1 bar is really not that critical but the antenna seems to be resonating below the 20m band.

The cyan values are for 17m and the SWR was hovering around 2 to 3 points which would definitely indicate the need for an ATU. The 12m band even more so!

All in all the antenna, in general, is resonating low and may need further trimming of the open wire feeder. I have already removed around a meter but the length is totally reliant on the open wire feed line’s velocity factor (VF).

This antenna was not designed for, and DOES NOT work on 30m and 15m.

The antenna lives in the trees ….. in KG34ac.

73 de Eddie ZS6BNE

RaDAR – Smartphones

Quite a few years ago in the early days of Android I invested in a top of the range Samsung Galaxy Note (It came at the price of a FT817), one of the first “Note” phones. It was my way of getting to know this popular operating system in my job as technology manager. I discovered HamGPS an app capable of using the phones GPS to determine a 10 character maidenhead grid. This immediately became part of RaDAR.

It was in the days where I had no cell phone contract and used the method, “Pay as you go” on the MTN network. I worked this way from way back when I had a Nokia 3310 and even before that, a NEC! Then while on “early retirement” my XYL convinced me to take out a cell phone contract with cell c – it was the biggest mistake of my life! The phone they gave me was a Sony C4 which really had an excellent camera for photos and videos but that was about all. I constantly lost signal and the touch screen became a disaster half way through the contract and could not be replaced. On Friday I terminated the two year contract in it’s final month so by this time next month I will be contract free – and free!

In the meantime I’m using my XYL’s old Sony and have given my old “Note” to Eduan, my grandson. So that leaves me without the capability of determining 10 character maidenhead grids as the Sony I have now doesn’t have a built in GPS!

Maybe this is a good thing that I get back to using my very old Garmin Legend handheld GPS last used with APRS, even via FM satellites!

I can now only determine a 6 character grid square …… but, let’s see how it goes.

RaDAR – Supporting field day the ultralight way

This weekend was the SARL’s Field day and I took part in the ultralight, RaDAR like, category as a casual operation. It was fun setting up the antennas and making a few QSO’s. There were two special QSO’s firstly a QRP / QRP CW QSO with my friend Tom, ZS6OMT/QRP who is usually QRO but this wasn’t an official field day QSO though. Secondly Eben, ZS3EP answered my CQ while he was mobile and I QRP. We had excellent comms between us, also not an official field day QSO.

I took a few pics of Sunday mornings walk in the park. Unfortunately I twisted my ankle on the way not seeing a hole hidden in the grass and it wasn’t very pleasant staying on my feet for too long!!!

Ready to deploy the link dipole and RaDAR mast.

All hooked in and ready to raise the poles.

Deployed …..

Packing up / kit check.

As always, it was fun!!!

73 de Eddie ZS6BNE