Tuesday 31 May 2016

Voyager 2.0 - Design Principals and Construction Methods

Design and Construction Principals to be applied to Voyager 2

Hull Construction

The vessel should be intrinsically buoyant and unsinkable.
It was decided to build the hull using surfboard construction methods of glass fibre coth with epoxy resin over a closed cell foam.
The hull will be built using sheets of construction foam sandwich glued with plywood stringers. The stringers would be cut to match the appropriate offset lines from the hull design drawings. Then the foam could be carved down to match plywood stringers and sanded and then glassed.

Hull Design

The hull would designed using Freeship. This is powerful, free, hull design software. It has reasonable export capabilities extracting lines and offset information.

Rudders

Standard RC Servos will be used for the rudder (or rudders). These have a limited life, mostly constrained by the wear of the feedback potentiometer. It seems that low cost servos have a single wiper within the potentiometer whereas longer life servos use potentiometers with multiple wipers (typically 3).

One way of doubling the life of a servo is to use it half the time.
Voyager 2 will only have a single rudder, but a later version of voyager will use two rudders, operated by two servos. The steering will be performed by the leeward rudder, while the windward rudder will remain centred. 

Sail

The sail will be self trimming wing sail.
This type of sail is particularly good for low powered autonomous vessels, because it  takes very little power to operate the trim tab to set the sail.
Traditional soft sails or a traditional solid sail typically require a fairly powerful winch or machinery to control.


Keel
One of the hazards to vessels is floating weed.
It is critical that the design of the keel and rudder will shed weed, rather than catch it.
This generally involves using profile with a gentle rake on the leading edge of the keel and rudder skeg to allow the weed slide off.
This also tends to lead to a the use of a unbalanced rudder attached to the sloping rudder skeg.

Equipment Housing and Equipment Bay

The Sistema plastic containers are reasonable for use as equipment housings.
They are reasonably waterproof for short term usage, but can be sealed using a non-corrosive silicone sealer if a completely water tight compartment is required.
It was decided that Voyager 2 would have an equipment bay located aft of the keel assembly, all the way to the back of the vessel with an open transomn.


Sunday 29 May 2016

Servo Endurance - Test Results

Hextronik HXT900

Two model HXT900 servos were tested. Both failed at approximately 40,000 cycles.
The component that failed was the potentiometer, which developed dead spots.
The Servo could continue to be used if the operating region was changed to a different position on the potentiometer.

The image below shows the potentiometer removed from one of the failed servos, showing the worn area. This potentiometer has two wipers.
Hextronik HXT900
HXT900 Potentiometer showing Wear

 

Arduino Servo Endurance Tester

How long do RC servos last ?

The RC servo manufacturers don't seem to publish any information about the operational life span of their servos. The life span of a servo will be influenced by the amount of loading, both static and dynamic. But there'is a fundamental limit which is the number of cycles with no load.
It seems that the quality of feedback potentiometer, rather than the drive train or motor is the limiting factor for the maximum number of cycles an RC servo can perform.

This is a design for a very simple RC Servo exerciser to cycle a servo 20 degrees either side of neutral about once per second. It includes an I2C LCD 2 line by 16 character display to display a count of cycles.
Servo Test Rig showing Arduino Nano, I2C LCD and Test Servo

The code for the Arduino is provided below:


#include "LiquidCrystal_I2C.h"
#include <Wire.h>
#include <Servo.h>

Servo myservo; // create servo object to control a servo
int pos = 0; // variable to store the servo position

// Set the LCD address to 0x27 for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x27, 16, 2);

long CycleCounter = 0;
int BasePosition = 90;

void setup()
{
 
// attach the servo on pin 9 to the servo object
  myservo.attach(9);

  // initialize the LCD
  lcd.begin();

  // Turn on the blacklight
  lcd.backlight();
  lcd.clear();
}

 void loop()
{
 
myservo.write(BasePosition); // tell servo to go to Base Position
  delay(400);
 

  myservo.write(BasePosition+20); // move + 20 degrees
  delay(300);

  myservo.write(BasePosition-20); // move - 20 degrees
  delay(300);

  CycleCounter++;
  lcd.setCursor(0, 0);
  lcd.print(CycleCounter);
}
 



The YouTube clip below shows the test rig in operation with an initial test using a low cost servo. It lasted for about 40,000 cycles before failure. I'll discuss the results of servo tests in another post.

Voyager 1 - Why did it disappear ? Conclusions. or A Study of the Water Take-up Rates with Different Foam Types.

Voyager 1 - Why did it disappear ? Conclusions.

A Study of the Water Take-up Rates with Different Foam Types.

I suspect Voyager 1 sank off Lord Howe Island due to the take-up of water into the spray foam, which was used as primary buoyancy.

The test this hypothesis, I set up a test using samples of foam with a standardised size of 10cm x 10 cm x 10cm (1litre). These were held in water for several weeks. The foam samples were weighed daily and the results were plotted.


Two Foam Samples created from Spray Foam (Open Cell). 
Sample of Construction Foam (Closed Cell).

Test Rig - Two Buckets of Water and Bricks.



Weight Gain of the Foam while held in water over 42 days.


The Construction Foam (closed cell) gained a couple of grams of water in the first day or two, and then its weight did not noticeably change for the next 40 days.

The Spray Foam (open cell) gained weight through out the 40 day test.  The samples of Spray Foam gained between 150g and 190g of water during the test. This represents 15% to 19% by volume of the foam.




I suspect that this take-up of water into the spray foam buoyancy caused the vessel to sink; and this was the most likely reason for the loss of signal.



Saturday 28 May 2016

Voyager 1 - The Last Signal

Voyager 1 - The Last Signal

The Last Signal was received on May 28, 2016 at 1:38am.

http://ww2.acaciacs.com.au/voyager1

The boat was approaching Lord Howe Island at approximately 2 knots at a distance of 110km, when it sent its last transmission.

It had travelled about 1200km from the launch point in Gippsland, Victoria, over 28 days.


http://ww2.acaciacs.com.au/voyager1/
Approaching Lord Howe Island when the last signal was received.

What happened ?
We will probably never know what happened to the boat, because we will probably never see it again.

Possible reasons why it is no longer transmitting:
  • It has sunk
  • The batteries are flat
  • There has been electrical failure
  • The has been a breach of the water tight container holding the SPOT GPS, and it has been damaged by the salt water.
  • The SPOT GPS does not have a clear view of the sky.

Wednesday 25 May 2016

Voyager 1 - The Voyage

Launch May 1st 2016 - Woodside Beach, Victoria

This launch of Voyager 1 was successful. Follow its path here. The prevailing weather conditions were good for taking the boat well offshore. The offshore winds were due to continue for at least a week, with a series of westerly fronts coming through Bass Strait. This should have been good for fulfilling the plan of getting boat well offshore and down into the southern Tasman Sea. 

Setting up on the Beach
Final Preparations

The Launch
 
The boat sailed well for the first 8 hours in a SSW direction.
This was ahead of the first of a series of westerly fronts coming in the next week.
The impending westerly wind should have caused the boat to change course from SSW to about WSW.
But it appears to have headed NW instead; and it appeared to travelling upwind at times.



http://ww2.acaciacs.com.au/voyager1/
The First Two Days
 
This pattern of movement implies that the boat stopped moving with relation to the wind, and instead started moving with the currents instead.
This implies that the mast was broken and the sail is in the water helping to act as a sea anchor, causing the boat to move with the current, and not be influenced by the wind.
It appears that mast was broken when the first front came through on the evening of May 1st 2016.
The weather fronts caused significant damage to properties around Melbourne on the evening of the Launch. News reports of the weather can be seen on The ABC and in The Age.

What was learnt ?
It is an assumption, that the mast is broken, but its hard to imagine another explanation.
The mast was mostly un-stayed, 1m long, 12mm aluminium tubing, with a wall thickness of about 1mm. If it broke, then it was clearly not strong enough for the boat in the conditions experienced.
It will be necessary to consider ways of mitigating this problem in future offshore model boats.

The Flinders Current
The boat is no longer a sailing vessel headed into the southern Tasman Sea as planned. Instead, it is now a drifting buoy, with a Satellite tracking facility.
For the first few days, it travelled fairly distinctly up the Gippsland Coast in a NW direction.
This corresponds to part of the current known as the Flinders Current.
The Flinders Current flows in easterly direction across the south of Australia. It partly flows through Bass Strait, and partly flows up the Gippsland Coast.
This what is moving the boat for the first week.

End of Week 2: May 15, 2016
After 2 weeks at sea, the boat has continued to travel in NW direction up the east Australian coast. At this time it was located over 350km offshore, just south of Sydney.
It movement is under the influence of East Australian Current (EAC). The EAC flows south down the east coast of Australia, close to the mainland down to about the latitude of Sydney. It predominantly flows offshore to the east, at about that point, heading into the Pacific. The edges of the EAC are dominated by eddies that cause significant wandering and circling of the current flow.

May 25 - 25 Days at Sea
After 25 days, the boat is about 1000km from the launch point and about 400km offshore, east of Newcastle. It appears to be on course to drift passed Lord Howe Island and continue into the Pacific. We'll see.
The SPOT GPS Satellite tracking facility is still going well. Without it, We'd have nothing.

Voyager 1 - The Launch Attempts - Learn Something New Every Time

First Launch Attempt 14 January 2016  - Near Pambula, NSW

This launch failed.
Primarily because, the weather conditions did not provide enough of an off-shore breeze for the boat sail away from shore.

The boat was damaged by breaking waves.
This provided guidance on changes in the design and construction of the boat.
The damage incurred was that the Aluminium Fin bent 90 degrees when the boat was caught in a breaking wave. 

What was Learnt ?
The Fin bent so easily, that is fortunate that the launch failed. If the boat had successfully sailed offshore, the fin would have bent in the first storm, leaving the boat lying on its side in the water. In this condition, the SOPT GPS satellite tracking facility would not have worked very well, the boat would have been effectively lost.

The Wind Vane rotated on the shaft when the boat was engulfed by the breaking wave. This is equivalent to changing the course setting of the Vane Steering gear. Hence if a reliable sailing course is to be maintained, steps must be taken to prevent the Wind Vane from rotating on the shaft.  



What changes were made ?
The fin was strong enough to support a static load, but bent easily under the dynamic load of a breaking wave.
The fin was reduced in length to about half the original length.

The Wind Vane mounting arrangements were initially fabricated in 3D printed ABS plastic.

Version 1 - Almost Fully 3D Printed Vane Steering Gear

The 3D printed plastic bosses had threads cut for the 5/32" set screws that were intended to lock the bosses on to the brass shaft.
These worked ok, and could resist quite high static torque loads, but in the conditions experienced with a breaking wave, they easily slipped from the set position.

Version 2 - More Metal Components added




The second version, included threaded metal components. This allowed much torques to be applied to the set screws to resist slipping.



















Second Launch Attempt February 15 2016 - Woodside Beach, VIC
This launch was partly successful.

The boat sailed well in a light offshore breeze, and launch appeared successful.

An Apparently Successful Launch at Woodside Beach
The first satellite signal was received after about 20 minutes when the boat was about 1 kilometre offshore. But 4 hours later the next signal showed the boat was on the beach several miles up the coast.

Satellite Position Signals showing the Launch from Woodside Beach and then running ashore several miles up the Beach.

Washed up on the Beach like a dead Sea Gull


The boat was retrieved for reworking in preparation for the next attempt.


What Went Wrong ?
My assessment of the weather was wrong. I had assumed the offshore breeze would continue for a much longer period and get the boat further offshore into the prevailing breeze.
But instead, it end up back on the beach.

What was Learnt ?
The weather predictions must not be marginal in any way. If there is any uncertainty, then its best not to launch.

There was some damage when boat came ashore. The polycarbonate Wind Vane was broken, the brass Wind Vane shaft was slightly bent, and the Wind Vane bronze bearing was dislodged from its housing.


What changes were made ?
The vertical shaft for Vane was changed from brass to stainless steel. This was done because of concerns about the brass shaft bending. Stainless steel is almost double the hardness of brass. Hence the replacement stainless steel shaft is much more resistant to bending.

The Wind Vane was made using 2mm polycarbonate sheet. This was broken during the beaching. It was replaced with 1mm carbon fibre sheet. This is considerably stronger and also about 60% of the mass of the polycarbonate sheet.
The weight reduction of the Wind Vane required a rebalancing of the vane assembly, and hence their was a corresponding reduction in the lead counterweight.



Saturday 21 May 2016

Voyager 1 - First Sea Trial on Port Philip

The first sea trial of Voyager 1 was performed on Port Philip.
The winds were light and sea was calm, which does not represent typical ocean conditions.
It sailed well and the Vane Steering performed well in the light conditions.

Voyager 1 on Port Philip in light winds

Voyager 1 with Go Pro style Camera on board

 

Voyager 1 - The Build

Voyager 1 was planned as a quick build and launch of a relatively uncontrolled boat to test the out various technologies and design ideas in the lead up to the development of more sophisticated boats.

Voyager 1 is a 1.5 metre sailing vessel that used Vane Steering to control its direction. The Vane Steering was set to steer the boat almost downwind, with the wind about 20 degrees on the starboard quarter.

The aim was to launch the boat from the south-east corner of Australia at a time when the westerly winds would take it out into the Tasman Sea in a south westerly direction. Hopefully it would travel south of New Zealand in the Southern Ocean.

The actual path of Voyager 1 can followed here ww2.acaciacs.com.au/voyager1

The hull for Voyager 1 was not specially built for this task, It is actually a third-hand hull from a catamaran. It was built by Doug Hemm, then given to Jeff Gray, and then given to me (All members of Royal Yacht Club of Victoria).

Third-hand Catamaran Hull
The first task was to strip off the deck and remove centreboard in preparation for fitting out the hull as a monohull.
Balsa bulkheads were fitted, and an aluminium frame was added which incorporated a centerplate casing.
Mounting points were added for mounting the Vane Steering gear and also for securing payload. The payload is the modified SPOT GPS satellite tracking system described in an earlier posting here.
Hull fitted with New Aluminium Centreplate Frame, Bulkheads and Equipment Mounts  
A small hull will always leak.
If it is to remain afloat for months, then it must be intrinsically buoyant, regardless of leaks. This was handled by using expanding foam filler.
Expanding foam is not the best foam to use for buoyancy. It is not a closed cell foam, and if structure surrounding the foam flexes, then the foam will crush and become water-logged.
In this case, there weren't a lot of choices and so expanding foam was used.
Expanding Foam added before trimming back
Most of the detailed components in Voyager 1 were fabricated in ABS plastic using 3D Printer. The images below show the Vane Steering Gear and the equipment mounts mostly fabricated in ABS plastic.
Version 1 of the Vane Steering Gear and Rudder
Version 2 of the Vane Steering Gear


Voyager 1 with the Extra Long Keel, prior to first Sea Trial

 

Part 3 - Arduino Software for Controlling the SPOT GPS Gen 2

Arduino Software for Controlling the SPOT GPS Gen 2

This post provides the actual software used in the Arduino Nano for controlling the SPOT GPS Gen 2.
The whole system has had extensive testing for about 6 months on land before commencing trials at sea.

/*
 SPOT GPS Gen 2 Controller
 This controller is designed to activate the SPT GPS Gen 2 at predetermined intervals.
 It is intended to operate for many months on battery power.

 It uses a state machine to control transitions into different states.

 Alternate between pressing the ok button and the custom message button.
 This is intended to improve overall reliability. on the basis that if one message function fails, may be the other one will work.

 Power is minimized by using a sleep state, and using an 8 second watch dog timer.

Wiring Details
 --------------             ------------------------------
 | Arduino     |           |      SPOT GPS Gen 2          |
 | Nano        |           |                              |
 |  D9  Pin xx |----47kR-->|  Power Switch                |
 |             |           |                              |
 |  D12 Pin xx |<---47kR---| 3Vdc Switched (power sense)  |
 |             |           |  TP(unmarked)                |
 |             |           |                              |
 |  D10 Pin xx |----47kR-->| Ok Message Switch            |
 |             |           |                              |
 |  D11 Pin xx |----47kR-->| Custom Message Switch        |
 |             |           |                              |
 |             |           |                              |
 |             |           |                              |
 |         Gnd |-----------| Gnd                          |
 --------------             ------------------------------

 V1.0 16/8/2015 John Semmens Initial Version
 V1.1 30/8/2015 Near final release.  Adjusting timing constants.
 V1.2 3/9/2015 timing adjustment for 4 hours.

 */

#include <avr/sleep.h>
#include <avr/wdt.h>

const byte LED = 13;
int counter8s; // global variable as counter.

const byte SpotOnOffButton = 9;
const byte SpotOn3VSense = 12;
const byte SpotOkMsgButton = 10;
const byte SpotCustomMsgButton = 11;

const int kSpotOffTime = 1720; // x 8 seconds // 830 = 2 hours
// 1740 = 4 hours + 3 min
// 1720 = 4 hours-3minutes  --- this must be wrong... it must be about 4 hours. 8am 4/9/2015

const int kSpotOnTime = 38;    // x 8 seconds // 38 = about 5 min

enum SpotGPSState_Type
{
    Power_Off,
    Power_On,
    Sending_Ok,
    Power_Off_2,
    Power_On_2,
    Sending_Custom
};

SpotGPSState_Type SpotGPSState;
int q8SecondBlocks;

// watchdog interrupt
ISR(WDT_vect)
{
    wdt_disable();  // disable watchdog

void setup() {
    counter8s = 0;
    SpotGPSState = Power_Off;
    q8SecondBlocks = 1;
}

void loop()
{
    EightSeconds();

    // disable ADC
    ADCSRA = 0;

    // clear various "reset" flags
    MCUSR = 0;
    // allow changes, disable reset
    WDTCSR = bit(WDCE) | bit(WDE);
    // set interrupt mode and an interval
    WDTCSR = bit(WDIE) | bit(WDP3) | bit(WDP0);    // set WDIE, and 8 seconds delay
    wdt_reset();  // pat the dog

    set_sleep_mode(SLEEP_MODE_PWR_DOWN);
    noInterrupts();           // timed sequence follows
    sleep_enable();

    // turn off brown-out enable in software
    MCUCR = bit(BODS) | bit(BODSE);
    MCUCR = bit(BODS);
    interrupts();             // guarantees next instruction executed
    sleep_cpu();

    // cancel sleep as a precaution
    sleep_disable();
}

void EightSeconds()
{
    // We arrive here every 8 seconds approx
    // Perform the "action()" at intervals of aprroximately 8 seconds x k8SecondBlocks
    // Typical values:
    //          7 = 1 minute
    //        106 = 15 minutes
    //        424 = 1 hour
    //        833 = 2 hours
    //        1000 = 2 hours 22 minutes (measured)
    //       1700 = 4 hours

    counter8s++;
    if (counter8s >= q8SecondBlocks)
    {
        counter8s = 0;
        action();
    }
}

void action() {
    // Process the state machine

    switch (SpotGPSState)
    {
    case Power_Off:
        Spot_Turn_On();
        SpotGPSState = Power_On;
        q8SecondBlocks = 1; // "on" time before moving to next state, about 8 sec
        break;

    case Power_On:
        Spot_Message_OK();
        SpotGPSState = Sending_Ok;
        q8SecondBlocks = kSpotOnTime; // "send ok message" time before turning off. 38 = about 5 min
        break;

    case Sending_Ok:
        Spot_Turn_Off();
        SpotGPSState = Power_Off_2;
        q8SecondBlocks = kSpotOffTime; // "off time" before turning on again.
        break;

    case Power_Off_2:
        Spot_Turn_On();
        SpotGPSState = Power_On_2;
        q8SecondBlocks = 1; // "on" time before moving to next state, about 8 sec
        break;

    case Power_On_2:
        Spot_Message_Custom();
        SpotGPSState = Sending_Custom;
        q8SecondBlocks = kSpotOnTime; // "send Custom message" time before turning off. 38 = about 5 min
        break;

    case Sending_Custom:
        Spot_Turn_Off();
        SpotGPSState = Power_Off;
        q8SecondBlocks = kSpotOffTime; // "off time" before turning on again.
        break;

    default: // should not get here.
        Spot_Turn_Off();
        SpotGPSState = Power_Off;
        q8SecondBlocks = kSpotOffTime; // "off time" before turning on again.
    }
}

void Spot_Turn_On()
{
    // Procedure to simulate pressing the power on button on the spot - to turn it on.
    // it waits for the feedback from the Spot device in the form of a switched 3Volt signal.

    // check if its off by looking for 3V sense signal low
    pinMode(SpotOn3VSense, INPUT);
    if (digitalRead(SpotOn3VSense) == LOW)
    {
        // press the on/off button.
        pinMode(SpotOnOffButton, OUTPUT);
        digitalWrite(SpotOnOffButton, LOW);

        // turn the led on
        pinMode(LED, OUTPUT);
        digitalWrite(LED, HIGH);

        // wait for power sense 3V signal
        pinMode(SpotOn3VSense, INPUT);
        while (digitalRead(SpotOn3VSense) == LOW)
        {
            delay(100);
            wdt_reset();
        }

        // release on/off button.
        digitalWrite(SpotOnOffButton, HIGH);
        pinMode(SpotOnOffButton, INPUT);

        // turn led off
        digitalWrite(LED, LOW);
        pinMode(LED, INPUT);
    }
}

void Spot_Turn_Off()
{
    // Procedure to simulate pressing the power on button on the spot - to turn it off
    // it waits for the feedback from the Spot device in the form of a switched 3Volt signal.

    // check if its on by looking for 3V sense signal
    pinMode(SpotOn3VSense, INPUT);
    if (digitalRead(SpotOn3VSense) == HIGH)
    {
        // only turn it off if its on already

        // press the on/off button.
        pinMode(SpotOnOffButton, OUTPUT);
        digitalWrite(SpotOnOffButton, LOW);

        // LED on
        pinMode(LED, OUTPUT);
        digitalWrite(LED, HIGH);

        // wait for power sense 3V to drop to zero
        pinMode(SpotOn3VSense, INPUT);
        while (digitalRead(SpotOn3VSense) == HIGH)
        {
            delay(100);
            wdt_reset();
        }

        // release on/off button.
        digitalWrite(SpotOnOffButton, HIGH);
        pinMode(SpotOnOffButton, INPUT);

        // turn led off
        digitalWrite(LED, LOW);
        pinMode(LED, INPUT);
    }
}

void Spot_Message_OK()
{
    // Procedure to simulate pressing the "I'm OK" button on the Spot Device.
    // It uses a simple 4 second delay before releasing.

    // press the OK Message button.
    pinMode(SpotOkMsgButton, OUTPUT);
    digitalWrite(SpotOkMsgButton, LOW);

    // LED on
    pinMode(LED, OUTPUT);
    digitalWrite(LED, HIGH);

    // hold down OK button for 4 seconds
    delay(4000);

    // release OK Message button.
    digitalWrite(SpotOkMsgButton, HIGH);
    pinMode(SpotOkMsgButton, INPUT);

    // turn led off
    digitalWrite(LED, LOW);
    pinMode(LED, INPUT);
}


void Spot_Message_Custom()
{
    // Procedure to simulate pressing the "Custom Message" button on the Spot Device.
    // It uses a simple 4 second delay before releasing.

    // press the "Custom" Message button.
    pinMode(SpotCustomMsgButton, OUTPUT);
    digitalWrite(SpotCustomMsgButton, LOW);

    // LED on
    pinMode(LED, OUTPUT);
    digitalWrite(LED, HIGH);

    // hold down OK button for 4 seconds
    delay(4000);

    // release "Custom" Message button.
    digitalWrite(SpotCustomMsgButton, HIGH);
    pinMode(SpotCustomMsgButton, INPUT);

    // turn led off
    digitalWrite(LED, LOW);
    pinMode(LED, INPUT);
}