Monday, May 25, 2020

RV Solar Tech: Using the data from a Bogart Trimetric TM-2030 to use excess solar power to power a refrigerator


I have a 2015 Winnebago 26A Brave, which is a 26-foot Class A Recreational Vehicle (RV). The RV has been fitted with 300 Watts of solar panels connected to a Bogart Engineering SC-2030 PWM solar charge controller to charge the house battery, and a Bogart TM-2030 system monitor which reports net current, state of charge, and voltage among other things. The house battery comprises a pair of Trojan T-105 6 V batteries wired in series.

When we camp, the batteries are usually fully charged by about noon, and we don't use much electricity during the day. Therefore, the solar energy the panels generate in the afternoon used to be wasted. The RV is equipped with a small refrigerator that can run off either electricity or propane. Normally, when not connected to "shore" power (i.e. 120 Volt main power), the fridge runs on propane. This Arduino project utilizes the formerly wasted solar power after the batteries are charged to run the fridge, thus saving propane. It does this by turning on a relay when there is excess power, and the relay energizes a 120 VAC outlet where the fridge is plugged in. When the outlet is energized, the fridge automatically switches from propane to AC.

I have a cheap 700 W non-sine inverter from Radio Shack (R.I.P.) that powers this outlet, and the inverter is on continually when using the RV, and with no load, it draws about 0.5 A at 12 VDC, (6 W) which is acceptable. I could put the relay in the DC supply to the inverter, but to match the capacity of the inverter, it would need to be a 700/12 = 60 Amp relay, while cheap relays such as I use here only drive up to 10 amps.

When the fridge is running on AC, it draws about 270 Watts, so only in ideal conditions will the 300 Watt solar panels "keep up" with the added load continuously, so the relay cycles on and off when in use.

Solar is only one way the house batteries are charged: the batteries also charge when the engine is running or when plugged in, or if the built-in generator is running. A side benefit to this project is that the fridge runs off electricity when the coach engine is running (at least, once the house batteries are charged), so turning off the propane to increase safety on the road, as many RV operators do, won't disable the fridge.


The TM-2030 has a TTL-level serial port that continually sends out charging data at 2400 baud. Based on what I've seen on the internet from EorEquis and others, it appears that the data is not completely consistent from one unit to another, but the main data needed for my purposes are Voltage and State of Charge (SOC).

The format of the data is par1=val1,par2=val2,par3=val3 where parN is "parameter" N, and valN is value N. For example V=12.4,%=98,A=1.0 which means that voltage is 12.4, SOC is 98, and we have a net charge (charge current – load current) of 1 Amp. There is no white space, and every field is delimited by a comma.

Voltage while charging is typically over 13 volts, so, even if the batteries are full, I don't want to run the system when the batteries are not being charged, or when the SOC is less than 98%. The relay turns on until the SOC drops below 95%, then shuts off and lets the batteries recover to 98%. These limits may change as I get more experience with the system.

I am worried that there could be a condition where the relay is turning on and off repeatedly, and wanted to avoid that. Therefore, I put in some timing logic so that after the relay turns off, it won't turn on again for at least 10 minutes. This shouldn't be needed. As a side effect of this logic, the relay won't activate until the controller has been powered up at least 10 minutes.

I saw Gordon Boulton's (aka EorEquis, https://TristarObservatory.Space) blog post and code to do a similar task on Github, which used a basic Arduino (Uno?) and grabbed the serial data using the SoftwareSerial library. However, based on a comment in his code, it appears his code doesn't actually work. I started out using a Pololu A-Star Micro which has a 32U4 chip, and was unable to read the serial data using the SoftwareSerial library. I wanted to try a hardware serial port, and I don't know how to use the one port on the 32U4 for user needs, (I think it's possible, but didn't want to deal with it) so I switched to a Teensy 3.2, which has 4 serial ports, 3 of which are available for the user. I suspect an Arduino Mega would work too. Using a hardware port, collecting the data was easy-peasy.

The moral of that story is, if you have to collect serial data, use a serial port, imho. I think SoftwareSerial might be ok for sending data, but for collecting a continuous stream of data even at 2400 baud, forget it.

The main "loop" checks if there is anything waiting at the serial port, and, if so, puts the character into a buffer to be parsed later. When a comma is detected, the program attempts to parse the contents of the buffer, determining the parameter and the value. If it's something I want to process, I store it in a structure, and check the criteria as described in the preceding paragraph, and see if I need to change the status of the relay, which is driven by a single digital output. I wrote the logic in such a way that the program discards things that are erroneous, that it doesn't recognize, or that it doesn't care about, which should make it reliable – I hope.

If you dig into my code, you should know that I've done quite a bit of C programming, so the code uses some cool features of C that, for me, increase clarity of code function. This is only my second Arduino project though, so some of the Arduino stuff might not be the best way to do things.


I did take some care in building the relay box, as I don't want anyone to get shocked, and I also don't want any fires. I used two steel electric utility boxes from Home Depot bolted together back-to-back. Side-to-side would work fine too. One box has the outlet, and the other has a metal cover which I drilled to accommodate standoffs. I attached the relay to the cover because I wanted to be able to remove the cover and get to the terminals easily. A standard 3-prong plug is plugged into the inverter, and leads into the boxes. The ground and neutral are led directly to the plug, while the "hot" lead goes to the common terminal of the relay. The "normally open" side of the relay then goes to the hot side of the socket.

Be super careful messing with 120 VAC. Make super sure that everything is wired correctly before plugging into the wall, and I recommend making the connections inside a relatively fireproof container, which is the reason I used the steel utility boxes. Mistakes with AC power hurt and can cause fires.

The serial port on the back of the TM-2030 uses an RJ-11 socket with a phone extension cable that runs down to the SC-2030. I put an RJ-11 two-line splitter from Ace Hardware into that socket. Note that not all such splitters are created equal -- I got one that didn't give me all the connections in the same place. I use an RJ-11 wall socket with easy-to-access terminals to get to the individual wires. I don't have the patience or skill to strip and solder phone wires, and I didn't have to. The wall socket has 4 connections, which are 5v, ground, data, and something else, I don't know what. Based on wire tracing, the wires I thought would carry the data were wrong, so I used an oscilliscope to find which pair was the correct pair. Am not sure whether Bogart's documentation is wrong, or, more likely, it's hard to trace RJ-ll wires. Again, my patience and skill for dealing with tiny wires is lacking.

The relay is powered from the same 5 Volt USB power supply which powers the Teensy. The USB power supply is plugged into a second outlet powered by the same 700 W inverter. The grounds of the signal line from the SC-2030, the Teensy, and the relay are all wired together. The relay is active when the signal line is pulled LOW, because if the wire breaks or the Teensy dies or whatever, I want the relay to turn OFF. An open circuit should give a HIGH signal.

The Teensy's digital lines are only 3.3 Volt, while the relay I used is 5 volt. The 3.3 volt signal is sufficient to operate the relay.


The program parses more data than it needs, and it prints it out to the Serial port occasionally. A future project may be to put these values on a display, and maybe even a time history graph.

I'm not sure how much propane will be saved by this project, but I really like the idea of wasting less of my excess solar energy. The project was fun and educational and maybe helps save a few bucks in the long run.

Here's the Arduino code:

//  *************************************************************************************************************
//  *  Excess Solar Power Utilization Project
//  *  Feb  2019
//  *  Works on Teensy 3.2
//  *  Chris Hill
//  *  Collects, uses and displays data continuously from TM-2030
//  *  Turns on a relay to add load to a solar system that is fully charged, e.g. a propane/electric refrigerator
//  *************************************************************************************************************

  // **********************************************************************************************************
  // The comments documenting the data stream are from Gordon Boulton, but the code below that is all my mess.
  // **********************************************************************************************************
  //  V = Volts (Batt 1)  *Both
  //  FV = Filtered Volts (Batt 1)  *Both
  //  V2 = Volts (Batt 2) *Both
  //  A = Amps  * Both
  //  FA = Filtered Amps (Batt 1) *Both
  //  PW = Charge controller pulse width (First number is charge state, then is hex number defineing pulse width from 0-FF hex.)  *2030
          // Charge State Values
          // 0 - Discharging, < 98% Full : See section 4.5.3 of
          // 1 - Bulk Charge
          // 2 - Absorb
          // 3 - Float
          // 4 - Finish
          // 5 - Max Voltage Finish
          // 6 - Was in float, now discharging, still > 98% Full 
  //  AH = Amp Hours From Full  * Both
  //  T% = State of charge  * Both << CJH  FOR ME, I only see a % symbol for State of Charge, not T%
  //  W = Watts * Both
  //  DSC = Days Since Charged  * Both
  //  DSE = Days Since Equalized  * Both
  //  PW = (Why is PW here twice??  No effing clue) *2030
  //  r% = Replaced Percentage Data - Replaced percentage of used AH since last full charge   *2030 
  //  pD = Lowest previous discharge Amp Hours.  Total used, remaining capacity?  I dunno yet.    *2030
  //  X = Shows up occasionally ??  CJH

// Here's a list of the data I'm actually collecting, some of it just for the heck of it
#define VOLTS       1
#define FILTVOLTS   2
#define AMPS        3
#define FILTAMPS    4
#define SOC         5
#define WATTS       6
#define PREVDIS     7
#define INVALID     0  // bad value

#define BUFSIZE  32

int   RELAY = 22 ; //  Pin for the relay
int   LED   = 21 ; //  Pin for the LED

boolean processBuffer(char *, int) ;
boolean relayOn ;

struct {
    float          parameterValue ;
    unsigned long  collectionTime ;
} measurement[20] ;  // leave a little room for expansion

void setup(){
  Serial.println("In setup ... ") ;
  Serial.begin(38400);     // UART Serial for comm w/ PC over USB
  Serial3.begin(2400) ;
  delay(1000) ;
  Serial.println(" Setup Finished ") ;
  printHeader() ;
  initRelay() ;
  pinMode(LED, OUTPUT) ;    // Set up LED

}   // End Setup

void loop()
    // continuously collects data from serial port = TM-2030
    static char buffer[BUFSIZE];
    static unsigned long lastEvalTime=0, lastBannerTime=0, lastOffTime = 0 ;
    static unsigned long lastLEDTime = 0 ;
    static int ii = 0 ;
    unsigned long currentTime = 0 ;   // in mSec since board powered up
    static boolean LED_On = 0 ; 

    // get the time
    currentTime = millis() ;

    // Go to the serial port and get the data from the TM-2030
    if (Serial3.available()) {
      char c =;
      if(c == ',') {      // commas delimit the data fields, so when we get one, we discard it and process what we have

        processBuffer(buffer) ;
        for(ii = 0 ; ii < BUFSIZE ; ii++) buffer[ii] = (char)0 ;           // clean out the buffer.  (I'm sure there's a better way)
        ii = 0 ;
        //  check criteria for changing state
        //  consider whether to turn the relay OFF
        if(relayOn) {        
          if(measurement[SOC].parameterValue < 95.0 ||
             measurement[SOC].collectionTime + 10000 < currentTime)  {
                lastOffTime = currentTime ;
                turnRelayOff() ;
        // now consider whether we want to turn the relay ON
        else if(measurement[VOLTS].parameterValue > 13.0 &&       // relay is OFF, do we want to turn it on?
              measurement[SOC].parameterValue > 98.0 &&
              measurement[VOLTS].collectionTime + 10000 > currentTime &&
              measurement[SOC].collectionTime + 10000 > currentTime &&
              currentTime > lastOffTime + 600000)  {   // wait at least 10 minutes before turning on. unfortunately, this means won't turn on immediately on power up.
                // consider putting in anti-chatter logic, e.g., don't turn on if you've been on more than 4 (?) times in last hour
                turnRelayOn() ;
      else {
        if(ii      } 

    //  LED is on for 1 second, then off for 1 second
    if(currentTime > lastLEDTime + 1000) {
      lastLEDTime = currentTime ;
      if(LED_On) {
        LED_On = 0 ;
        digitalWrite(LED, LOW) ;
      else {
        LED_On = 1 ;
        digitalWrite(LED, HIGH) ;
    //  Print out the data and headers in the Serial monitor
    if(currentTime > lastEvalTime + 10000) {  // 10 seconds since last evaluation
      lastEvalTime = currentTime ;
      Serial.print("  ") ;      Serial.print(currentTime / 60000) ; // minutes of run time
      Serial.print("  ") ;      Serial.print(measurement[VOLTS].parameterValue) ;
      if(currentTime > measurement[VOLTS].collectionTime+2000) Serial.print("*") ;
      Serial.print("  ") ;      Serial.print(measurement[FILTVOLTS].parameterValue) ;
      if(currentTime > measurement[FILTVOLTS].collectionTime+2000) Serial.print("*") ;
      Serial.print("  ") ;      Serial.print(measurement[AMPS].parameterValue) ;
      if(currentTime > measurement[AMPS].collectionTime+2000) Serial.print("*") ;
      Serial.print("  ") ;      Serial.print(measurement[FILTAMPS].parameterValue) ;
      if(currentTime > measurement[FILTAMPS].collectionTime+2000) Serial.print("*") ;
      Serial.print("  ") ;      Serial.print(measurement[WATTS].parameterValue) ;
      if(currentTime > measurement[WATTS].collectionTime+2000) Serial.print("*") ;
      Serial.print("  ") ;      Serial.print(measurement[SOC].parameterValue) ;
      if(currentTime > measurement[SOC].collectionTime+2000) Serial.print("*") ;
      Serial.print("    ") ;    Serial.print(measurement[PREVDIS].parameterValue) ;
      if(currentTime > measurement[PREVDIS].collectionTime+2000) Serial.print("*") ;
      Serial.print("       ") ;
      Serial.print(relayOn ? "ON" : "OFF") ;
      Serial.println() ;
      if(currentTime > lastBannerTime + 100000) { // 100 seconds have elapsed since last banner
        lastBannerTime = currentTime ;
        printHeader() ;

void printHeader() {
      Serial.println("Mins   >Volts FiltVolts Amps  FiltAmps  Watts   >SOC  PrevDischarge  Relay On?") ;

//  processBuffer takes the buffer, hopefully containing a parameter e.g. Volts, Watts, SOC (state of charge)
//  and a value, e.g. V=12.5, in which the "parameter" is Volts, and finds the parameter and the value
//  I would like to see the Solar Amps in this data, but that is not available.

boolean processBuffer(char buffer[])
  int eqLoc ;
  String s=buffer ;
  int parameter ; // was global, but didn't need to be, i hope.

  eqLoc = s.indexOf('=') ;  // is there an = sign
  if(eqLoc == 0) {          // no good -- set values and bail
    parameter = INVALID ;
    return 0 ;
  String sParmID = s.substring(0, eqLoc) ; // just the parm ID
  String sParmVal = s.substring(eqLoc+1) ; // just the value as a string
  if(sParmID == "V") {       parameter = VOLTS ;   }
  else if(sParmID == "FV")  {    parameter = FILTVOLTS ;   }
  else if(sParmID == "A")   {    parameter = AMPS ;   }
  else if(sParmID == "FA")  {    parameter = FILTAMPS ;   }
  else if(sParmID == "W")   {    parameter = WATTS ;  }
  else if(sParmID == "pD")  {    parameter = PREVDIS ;   }
  else if(sParmID == "%" || sParmID == "T%") {    parameter = SOC ;   } // my TM-2030 just says %, but Gordon Boulton's says T%
  else {   
    parameter = INVALID ; 
    return 0 ; 
  measurement[parameter].parameterValue = sParmVal.toFloat() ;  // place data in structure so can use it
  measurement[parameter].collectionTime = millis() ; 

  return 1 ; // valid result

void initRelay() {
  relayOn = 0 ;
  pinMode(RELAY, OUTPUT) ;
//  delay(200) ;
  digitalWrite(RELAY, HIGH) ;   // Note: Relay is set up to be HIGH=OFF

void turnRelayOn() {
  relayOn = 1 ;
  digitalWrite(RELAY, LOW) ;

void turnRelayOff() {
  relayOn = 0 ;
  digitalWrite(RELAY, HIGH) ;

Tuesday, July 17, 2012

New Series

First race of the second half of the summer, and I had a Plan for my start.  I wanted to start 1/3 of the way up the (short, beam reach) line and be upwind of the competition.  That part worked, but my plan for a fast approach didn't as Steve and Bruce were early, and turned head-to-wind on the start line in front of me.  We started about even, but Steve managed to pull out ahead, inch by inch.  He told me later he'd sheeted his jib for the reach, and heeled the boat to weather.  It was a close reach, and so I wouldn't have thought that to be the best approach, but it worked...

We changed the course before the start: Down to X, up to 11, X, 11, finish, which gave two windward legs.  11 is in the lee of Bay Island.  Therefore, the center of the windward leg had a big wind shadow, and we had to decide which site to approach on.

We went around the corner toward the leeward mark, and we were overlapped with two boats.  We had already decided on a starboard rounding, and I was on the right side of the other boats, except Steve who was, as usual, in the process of disappearing in the lead.  So I rounded the lee mark in 2nd place and stayed on starboard across the channel.  I figured the better wind was on the right side of the island, so I tacked on to port and stayed there until I was almost at the layline.  This turned out ok, and we got closer to Steve than we had been at the leeward mark.

After the windward mark, though, I had to deal with Jonathan coming up on starboard tack, and then got stopped.  Steve went right, but I tried to follow and had NO wind for a minute or so, and of course the boats behind, Jonathan and Bruce, caught up. 

Jonathan's and my courses converged going downwind, and he blanketed me for a time.  Then, fortunately, he decided to go right to get the inside overlap, which cleared my wind.  Bruce caught up while we were slowing each other down/playing tactics.  When we started back upwind, I must have got on the wrong side of a shift or otherwise goofed up, because I had to duck Bruce on a port-starboard crossing.  I'm pretty sure we had the boat trimmed ok, and were moving ok, but Bruce made up a number of boat lengths in the first part of the beat.  Gotta figure out how that kinda stuff happens, and make it not happen :-)

Anyway, Jonathan got a bit slow for a part of the upwind leg pinching to try to avoid tacking -- not a good idea in a J22, and we got a solid 3rd place.  In retrospect, I generally consider Bruce to be the most important competition and should probably keep at least a loose cover on him when I get the chance, which is rare.  The split early in the 2nd leg gave him a chance I didn't need to give him, and it worked for him real well. 

Trying to keep learning: that's where the fun is!

Tuesday, June 26, 2012

Sundowner Series, final race of first series

The ALYC Sundowner series is actually two series; the first is May and June, the second is July and August.  The last race of the first series was held last night in 6-10 knot winds inside Newport Harbor and started between Lido Island and the mainland.  Our group of six UCI J22s lined up for the start about 150 yards downwind from the sailbase.  Very convenient, in a way.  It's a very crowded start area. 

One of our group, Jonathan, elected not to raise his jib until the start, and had his jib already set up in the whisker pole.  Very clever, I thought.  I was about 10 seconds late to the start due to a misjudgement, and the series leader, Bruce, got a great start.  He tried to escape the wind shadow to the right, then was immediately blanketed by two other boats, so didn't get away, and we caught up gradually on the left side of the course.  The six boats jockeyed position all the way down the harbor to mark 6, a pylon channel marker, and I was about third rounding, right behind Bruce.  I tacked to get clear air and the next time I was in the group was in fifth position.  Every tack, I would look upwind and see one of our boats on my wind.  I started to feel like I had a target on me. 

The series leader and the third place boat for the series, Jonathan, were first and second at this point, and everyone else just ahead of us would tack onto our wind.  Oh, well.  We tried to ignore them and sail for speed on the shifts, but it was a challenge.  Definitely went the wrong way at least once, as one of the boats behind, Dave O' passed us.  We got ahead of two of the boats and Dave got by and away from us, so we established a solid 4th place.  As we went up the channel, the wind picked up a bit, and we were coming closer and closer to the third place boat, Dave O' who also was closing on second place Jonathan, but were unable to get close enough to threaten.

It was a very satisfying race, despite finishing 4th out of 6 boats, because it was so tight overall.  Going dead downwind in evenly matched boats is a very interesting exercise in tactics (protecting your wind, getting inside at the mark), and strategy, seeking the strongest winds.  I believe we ended up in 2nd place in the series, maybe 3rd.  We'll see how the scorers count it.

Monday, June 18, 2012

ALYC Sundowner Series 1, penultimate race

As the club is scoring this race, Bruce Thompson and I are tied for first heading into this one.  Naturally, I plan to get a great start, lead wire-to-wire, and win.  So much for that plan. 

We got a great start at the pin end, which appeared to be favored for getting down the course - closer to the leeward mark on the downwind start.  Again,  a traditional downwind start for the ALYC.  Would it have been so painful to send us up to a weather mark first?  Apparently, downwind is how ALYC starts, and that's that.

Only half of my regular crew was on board, B, plus Claudia who is delightful, obedient and very new.  While I thought B was up to speed with whisker pole work, I learned quickly that I was mistaken.  He and I have only spent one session doing the pole, and that simply wasn't enough to get the concepts cemented in place.  We spent the first 4 minutes of the race discussing how to set the whisker pole, and quickly slid from first to last place. 

In retrospect, I should have had him hold the tiller and keep the boat on course, while I set the pole up... but i didn't realize until too late that would have been the right course of action.  Oh, well.  We live and learn, right?

I spent the long downwind leg jockeying for position between Jane and Dave, i.e. between 4th and 6th place.  Somehow, I managed to break the overlap ahead with Dave toward the leeward mark, and then Jane had an encounter with a starboard tacker coming the other way, and took my stern.  So I got the mark rounding ok, then spent the rest of the race trying to figure out what tack to be on.  We did catch up a little on the boats ahead, but not nearly enough. 

So Bruce ended up over the horizon in first place, and I got a well earned fourth place.  I think this series will go to Bruce, unless a miracle happens next week. 

Thursday, June 7, 2012

Sailing for Performance III

One thing Frank B talks about in High Performance Sailing is "modes."  There are three basic modes of sailing: underpowered, adequately powered, and overpowered.  When underpowered, the sails need to be tuned to maximize lift, which pulls the boat forward most effectively.  The extra drag that goes with it is not important (or not so important) because we need full sails that give lots of power to accelerate and move quickly in light air.

When the power is adequate to power a boat at hull speed, the situation changes a lot.  To go upwind in this situation, the sails need to be set for maximum efficiency, or max lift/drag ratio.  To get there, we pull on some vang, flatten the jib some with halyard, apply some cunningham and outhaul to the main.  Twist is not needed, and the jib should flow as smoothly around the back side of the main as possible.  Efficiency means smooth airflow, sticking to the sail as much as possible.

Of course each of these three modes are subdivided further.  Underpowered goes down to "drifting" where you heel the boat like crazy just to get the sails to hang in a sail shape.  We do this so that when some air does start moving, it moves the boat in the desired direction.  Then as wind picks up to 2-4 kt, you set the sails for maximum fullness with lots of twist and flatten the hull out, maybe heeling a few degrees to leeward to help the sails keep their shape and give some weather helm.  Twist is needed because the apparent wind is more forward at the bottom of the sail than at the top.  Why?  The wind at the top of the sail is stronger than that at the bottom of the sail, and so the boat's forward motion affects the low, weaker wind more than the stronger, higher wind.

Monday, May 21, 2012

ALYC Sundowner Race 2

We left the dock as the "wind" went from a moderate breeze to a light breeze, and saw it shift from SSW to S in direction a few minutes before our race started.  The start was essentially a beam reach, and the race ranged from a close reach to a broad reach, out on starboard, back on port.  At times, the race was a drifter, then gusts came out of nowhere and pushed us forward.

The race was almost a parade, although I managed to snatch defeat from the jaws of victory...  I had a great start, right by the pin, moving at "full" speed, right as the horn sounded.  I might have got there a half second early, but the R/C called "all clear", and I started to breathe again.  Steve Reed was two boat lengths behind me, but I got hung up looking at him and not steering my boat, and let him go to weather of me and roll on by.  We stayed in second for the entire trip around.

In retrospect, I should have luffed early and decisively, and made it clear that if anyone wanted to pass, they could try, but only to leeward. One problem I had is that I thought the south wind (beam reach) was shifting back to a southwest wind, but it never really happened, and I'm not sure why I thought it would

Later in the first leg, we were in a gust and I had a chance to threaten Steve's lead: I went to weather slightly, he luffed hard, and I dove to leeward.  Back in my windsurfing days, a move like that might have worked, but in a J22 in light air?  Not so much. 

By the end of the race, I was 150 yards behind Steve, and the third place, Jonathan, was 200 yards back.  It was a parade, but not a tight one.

Monday, May 14, 2012

American Legion Sundowner Series 2012, Race 1A

Race 1A, because the R/C had some serious difficulties last week, and threw out the first race.  Oh, well.

Tonight, the wind was brisk, about 8-15 kt out of the west making almost a dead downwind start.  I sailed Sunday, and the wind Sunday was stronger and much gustier, with sharp edges on the gusts and sudden drops from 15 kt to 5 or so kt.  On Sunday Brent and Alice sailed with me.  Today when Alice and I arrived about 5:10 pm, Brent had the boat half rigged already.  Getting away from the dock went smoothly, and we got to the start with 15 minutes to spare, and got to time the line and the distance from the dock to the pin (port) end of the line before the A class started milling to start.  We were able to sail on a constant heading with the main luffing enough to determine that the wind changes were not big shifts, except near land which is normal, but mainly just speed changes.  In stronger breeze, I like to reach with a luff in the mainsail and use the amount of luff in the main while holding a heading to discern any significant changes in wind direction.

We figured we could get away with a close reach start, and with 1:30 to go before our start we were near the line.  We did a quick circle to kill time, then got into position for the close reach to the line.  We were set up with about 30 seconds to go, about 20 seconds from the line and moving slowly.  In 12 kt or so, it seems to take these boats about 15 seconds to accelerate to speed.  We slowly sheeted our sails in and started accelerating toward the pin with 20 seconds to go.  Other boats were on the line to our right, and one was behind us and after the start went left, and we got the left-most spot, and started with good speed within a few seconds after the start horn.  Nice!  Flogging around doing practice starts on Sunday really paid off!

As we were running downwind, the majority of the boats were bunching up to our right.  We noticed that the skipper who had been behind us, Dave O, had gone way over to the left, maybe 4  boat lengths closer to Lido island than us, and he was starting to pass us.  I gibed to port and went left to join Dave at Lido Island, then gibed back to starboard as we got close -- we were overlapped, and I had no interest in a luffing match.  I got maybe 1 boat length outside Dave, and steered more or less rhumb for the corner, and gibed again on a shift.  Yeah, I know I said the wind direction we measured before the start appeared steady.  You have to sail the wind you see, not the wind you expected!  I have to wonder if my method to determine shifts is not sensitive enough, or if the wind we saw on the course was actually shiftier than what we had before the start. 

At times, as we approached the lee of the island, the apparent wind was light, and we heeled the boat as needed to fill the jib.  When the wind was stronger, we heeled to weather to steer the boat where we were going with no force on the tiller.  I'm sure to an observer from shore, it looked like we were making very random movements.  Many compliments to Alice and Brent for following these changes constantly, conscientiously, and very smoothly.

We got into the lee of Lido Island in first place, and all the other boats were hollering and jostling for position.  Nice for us.  Dave got stuck close to the island, and as he told me later "got spit out the back".  Bummer.

Alice and Brent shifted gears really well again as we got into the dead air on the lee corner of the island, and we heeled to leeward and softened our sheets for temporary light air trim.  We knew we were getting into strong air soon, so our vang, jib halyard, cunningham and outhaul were tight, but we worked hard to take advantage of the minimal wind in the hole at the bottom of Lido Island.  We passed about 2 feet from the edge of the dock on the corner of the island, but that was enough for me, although my crew felt we should have maybe left some more space.  In the wind hole, we got a little lucky puff and shot away from the pack, and out into the gusty winds in the channel. 

As we tacked  up the channel on the north side of Lido Island to mark Z, Jonathan's was the closest boat behind and he managed to catch up by catching some good wind while I was in a hole.  I stayed on the right third of the channel which usually gives the best wind, but that didn't work so well today.  I may have messed up tactically -- I probably should have kept a loose cover on Jonathan as soon as he got close, but I really felt as if I was racing the pack not just him. 

As it happened, we got a fortunate shift on the right side and I was able to get  back in front of Jonathan, then tack on top of him.  That slowed him down some, and then Bruce caught up to him, and they started slowing each other.  That gave us the opportunity to pull away some and keep between the two of them and the wind, so we opened up some distance.

We went around mark Z - the only mark of the race - with a big lead, and it never shrank after that, so the race was basically over, although we kept sailing as fast as we know how, because you never know what might happen.

When we rounded the bottom end of Lido island again headed for the finish line, a cruising (crushing?) style boat named 401k was headed on starboard, about 15 boat lengths ahead of us.  Ahead of her there were two boats on port.  One was ahead and to leeward of the other, and 401k was heading right for that one.  401 called "starboard", and barreled on into the port tackers!  The leeward boat headed up to close hauled, then the windward one followed suit, and then the starboard tack 401 did the same.  I think there was some crunching of fiberglass based on how much hollering was going on.  Geez, how much beer are these guys drinking on these beer can races?  Just tack, hail "protest" and put up a flag.  Don't run into the other boat to prove the point!

When all this crap happened, I got kinda mesmerized by it, and here I was on starboard headed for the melee!  As soon as I "woke up" we tacked and got out of there.

At the awards ceremony, the other UCI J/22 sailors all carried a bottle or two of wine up to the race committee, and I got the honor of carrying the remainder of the case-and-a half we bought as homage for the committee gods.  They appreciated the grape juice, I'm sure.  It was a great honor to be able to take the major part of the gift up to the hard-working committee.  They had some serious screw-ups last week, to the point where they had to throw out the whole thing.  I have done race committee work and know just how stressful it can be when things go badly.  To make it worse, most of the racers who did well will bitch and moan for awhile.

It's a lot of work some dedicated souls do, so that others can enjoy themselves.  A nice gift to show our appreciation is the least we can do.


1st  us
2nd Bruce
3rd Jonathan
4th Jane
5th Dave O
6th Bill / Marty