Sunday, November 8, 2015

Saeco Aroma PID Makeover 2.0

It has been a while since I put PID control on my original Saeco Aroma espresso machine and it has been in dependable service ever since, but I have always had a nagging dislike for the way it had mains voltages sitting out in the relative open (behind the display) above the water tank. There were also a few things that I would have done differently in retrospect given further thought and my recent experience adding PID control to my Rancilio Silvia, so with that project still fresh in mind I decided the time was ripe to re-visit the Saeco Aroma.

Here are the improvements that I set out to make over my first version:

  • Improve the temperature resolution: I wasn't using the full scale range of the ADC on the first version since I was using the default 5V analog reference and the temperature sensor output only spanned about 2.5V. This time I used the same dedicated 2.5V LDO for the analog reference that I used on the Silvia conversion.
  • Take control of the pump: I liked having the shot timer on the Silvia, and the ability to lock out the pump when the water level is low (as detected by the float switch, see next item).
  • Add a float switch: To enable the pump lock-out this was needed, and it is also just convenient even though the Saeco is better than the Rancilio in that it has a clear water tank with the level visible from the side through a cutout in the stainless steel body.
  • Install the electronics internal to the housing: No more mains voltages out in the open!
  • Have the control board mounted directly on the display: In my previous version I used a long-ish ribbon cable to connect these, and the E-M pulses from shutting the vibration motor on and off would sometimes couple into these lines and put the display in an unintended state (showing jibberish on the screen). It was easily fixed with a reset, but not ideal behavior. I wanted to keep the lines between the control board and the display short enough that this would not be an issue.
  • Replace the incandescent button backlights with LEDs: the light output of the original button lights was really weak, and by replacing them with LEDs I could both make them brighter and take control of them to make them part of the user interface (for visual feedback on what mode it is in and what the boiler is doing).
And here are a couple of improvements that I made over the Silvia project that I had just done:
  • Use quick connect tabs instead of high voltage connectors: these little tabs are way cheaper than the plastic connectors that I used in the Silvia project, take up way less PCB real estate, and are consistent with the wiring on the rest of the machine.
  • Use a mechanical relay for the pump instead of an SSR: these are way cheaper, and since it won't be switching much noise from it won't be an issue (the main reason I use an SSR for the boiler relay).
And one more feature unrelated to previous builds:
  • Add a keypad so that the machine can be locked unless the correct code is entered: now that the Silvia had displaced this machine from my kitchen for my morning coffee, I wanted to bring it into work so that I could use it for my afternoon coffee (although the baristas at Top Pot Donuts do a great job also). The problem is I work in an office space with a shared kitchen and I wanted the ability to constrain use of the machine to people who had been trained on it and knew how to use it properly. This way I could enable people to use the machine by giving them the code once I knew they were able to use it in a competent manner.
So, with those goals in mind I set out on the re-design. The first step was to figure out where to physically mount the control board/display; the Saeco is a tighter package than the Silvia so the options here were a bit more constrained. I originally wanted to have it in the upper compartment with the boiler so it would be on the faceplate of the machine with the other panel switches, but it was just too tight so after some thought I decided to drop it down to the lower panel, just above the drip tray. The issue with this was that the coffee cup could block the view of the display, so to get around that I decided to use a smaller display (2x8 character LCD instead of 2x16) and place it far enough off to one side so that it would not be blocked by the cup. This location also enabled me to put everything on one board vs. the Silvia which had a main board and a power board, making the wiring a little simpler.

I re-used most the schematic blocks from the Silvia so these went quickly, and the layout was pretty fast too since I still remembered how to use the tool unlike other projects where I have gone a few years between using the tool. Both were done in Eagle based on the merits of it being free, here they are:

I then ordered parts and built everything up, with the most challenging part probably being cutting the opening for the display since the dremel tool access wasn't as good as in the location on the upper face plate. Bring-up went smoothly also, with the most interesting thing I learned being that the Atmel ATMEGA 328 MCU doesn't have pull-up resistors on the pins used for the A6/A7 inputs. I had previously assumed that any of the analog inputs could be configured as digital inputs with full functionality, but this is not true for these pins. I would have thought this would have been documented in the Arduino reference pages, but it was not and I eventually came to this conclusion myself and then confirmed it with searches on a few forums. It wasn't a big deal since I could just tack on some pull-ups and use them as analog inputs (they were reading two of the keypad buttons), but good to know for next time. 

So, without further ado here are the images from the build. Here is the view of the machine after it is just turned on with both buttons illuminated and the LCD displaying a welcome message. You can see the keypad mounted on the side panel, just around the corner from the LCD:

When the machine is powered on it displays the welcome message and then prompts the user to enter the access code before the boiler comes on or any of the front panel buttons (brew and steam) are enabled:

You can see that is just a 4-button keypad, I was GPIO constrained on the ATMEGA 328 and I don't see this as a high value target for code crackers so it seemed acceptable. After typing in the code it goes into the normal mode, pulsing the brew button LED to indicate the warming to brew mode and then putting it solidly on once brew temperature is reached and the same for steam mode.

Here is the view of where the board is mounted, directly behind the display, between the drip tray and the water tank. The large black box is the AC/DC supply, with the relays above that and all of the low voltage circuitry below. I am holding the water tank up in this shot, the black cable going up and to the left connects to the float switch.

And here is a view of the boiler compartment. I didn't have to change much here, other than re-working the switches to replace the incandescent bulbs with LEDs. The astute observer will also notice that the temperature sensor is held on place on the boiler with a piece of metal that has the boot of Italy on it (salvaged from the lid from a jar of pasta sauce). All of the cabling is run down into the lower compartment though the existing opening for the power cord.

And now the most important question: does it work? Of course! Here is a plot of the temperature profile while making a latte (degrees C on the Y axis, time in seconds on the X axis). Here are the events labeled: At (0) the code is entered into the keypad and the temperature rises to the brew temperature of 95 C. There is a bit of overshoot here, I just re-used the PID gain constants from the Silvia project and they could probably benefit from a little tuning. At (1) I begin pulling the shot and you can see that the temperature drop down to about 80 C over the course of the 25 second shot. At (2) I stop pulling the shot and push the steam button, and the temperature then rises up toward the steaming temperature of 130 C. At (3) there is a small inflection where I purge the water from the steam wand, then at (4) a drop while I start steaming the milk. I finish at (5) at which point the temperature begins to rise, then at (6) I shut off the steam button and the temperature begins dropping back to the brew preset of 95 C.

One thing I did notice after having done this conversation and the Silvia conversion before it in quick succession is that the Saeco Aroma rises to temperature WAY faster than the Silvia. A cursory inspection reveals that this is likely due to a much higher boiler power to thermal mass ratio: the Silvia boiler is significantly larger than the Aroma, but the heating element power is not that different (950 W for the Aroma, 1100 W for the Silvia). I think I still prefer the Silvia overall, but if you are after a quick morning cup of coffee and you don't mind a sub-par steam wand then the Aroma might be the way to go.

And finally, here is the victory picture of a shot being pulled from the device under test. From the display you can see that it is 6 seconds into the shot and the temperature has dropped to 86 C.

Wednesday, October 14, 2015

Rancilio Silvia PID Conversion

It has been quite a while since my last project post, and there are two very good reasons for that, in the form of my young daughters. About a year ago I had a burst of enthusiasm and bought a used and broken Rancilio Silvia espresso machine on eBay, thinking that I would do another PID conversion similar to what I did for my Saeco Aroma but with a few improvements. After receiving the machine I cleaned it up and figured out what was wrong with it (the thermostat and the solenoid needed replacement; the thermostat didn't matter since I would replace it with a temperature sensor for the PID control but I bought a new solenoid). The reality of having two young daughters soon settled back in though, and the project went on hold for the better part of a year until this past August when I found myself between jobs with some time on my hands and with an IT band injury that was preventing me from running as much as I wanted to. So, I got to work and now here I am with a souped up Miss Silvia having displaced the Saeco Aroma from my kitchen counter!

I had learned a few things from doing the Saeco project, many of which I had forgotten in the intervening 3+ years, but here were the things that I wanted to do better/differently on this one (in no particular order, now that I am working again my blog posts are written late at night and so have a stream-of-consciousness style):

  • Take control of the pump as well as the boiler to allow for feedforward control while a shot was being pulled, and to add an interlock to shut the pump off when the water tank was empty. There is actually an additional relay needed on the Silvia for the solenoid that is involved in the hot water function so this project would have 3 relays to control instead of the single one on the Saeco project.
  • Use an OLED display instead of a back-lit LCD. OLEDs have way better contrast than LCDs, and since Miss Silvia is a higher end machine I thought she deserved a sexier display.
  • Make it safer. The Saeco physical arrangement was a bit of a hack job with the mains voltages on the single board mounted out in the open on top of the water tank. Nobody electrocuted themselves in its 3 years of operation, but I was always a little nervous about that setup.
  • Do a better job integrating it. This is related to the previous one, on the Saeco the display was on a piece of plexiglass that extended up from the machine, I wanted this one to be built into the face plate.
  • Add a float switch to detect when the water level was low. This would allow for the boiler/pump interlock mentioned in the first bullet to be integrated, and is also more needed on the Silvia because while the Saeco has a clear water tank that is visible from the side through a cutout in the housing, the water tank on the Silvia is completely concealed.
  • Add a separate voltage regulator to generate a clean supply for the A/D reference and make better use of the full range of the temperature sensor. I wanted to get better temperature then I had on the Saeco where I was just using the 5V rail for the analog reference on the MCU.
  • Have the display co-located with the MCU board. On the Saeco they there connected by a long-ish ribbon cable, and with all the E-M noise being thrown around by pumps, relays, and switches, the cable would pick up enough where it would occasionally put the LCD display into a weird state so that it showed a bunch of gibberish and needed to be reset. In this one I wanted to mount the MCU board directly on the back of the display.
I started with the schematics from the Aroma project and made updates as needed. The most significant was that in order to achieve the goals above I divided the design into two separate boards: the MCU board with all of the low voltage electronics was located directly behind the display, inside the main upper compartment of the Silvia. The second board was located down below the water tank, beside the pump, and would have the AC/DC converter and the three solid-state relays. There were two reasons for this: first, these components were the most bulky so it would have been a bit of a squeeze to fit them all in the upper compartment (though it could have been done), and second, heat dissipation is an issue for the SSRs so putting them next to a 140 degree celsius boiler didn't seem like a great idea.

I did the schematics in Eagle which may not have the smoothest work flow but the price is right (free for small non-commercial projects) and it gets the job done. Here is the schematic for the main board. As with the Saeco project it was based around an Atmel ATMEGA328 MCU that was programmed with the Arduino framework.

And here is the schematic for the power/relay board, not much here compared to the other one:

I then moved on to the layouts which is a nice diversion if you like playing with shapes and colors. Here is the main board layout, which is the same size as the outline of the OLED display that I used with the row of 16 pins along the top plugging directly into that:

And here is the layout for the power/relay board. The 4 large blocks are the high voltage connectors, I used pluggable ones that there really nice and easy to connect (with an eminently satisfying "click") but given that only happens once during assembly I think they are not worth the board real estate and I would use quick connect tabs from Faston or equivalent next time (similar to the stock electrical connections in the Silvia). Another change I would make for next time is that I would only use a solid-state relay for the boiler where you need it to implement the PWM heat control scheme, I would use mechanical relays for the pump and solenoid since they are way cheaper.

Once the layout was complete I kicked the boards out for fabrication at OSH Park (what a great service, thank you to the people who run it!), ordered the parts from Digikey, and two weeks later I had shiny purple PCBs ready to be populated. By that point I was again gainfully employed which significantly hampered my rate of progress but I was determined to finish what I had started.

There was the odd hiccup in getting things up and running but things more or less worked, so before too long I had done enough testing to start building them into Miss Silvia. Here is a shot of the power board installed beside the pump. The rainbow ribbon cable connects to the main board in the upper compartment and carries the relay drive signals and low voltage power/ground.

And here is a shot of main board installed on the back of the display in the main compartment. I guess I totally skipped over this, but cutting out the slot in the sheet metal enclosure to mount the display was a bit of an adventure. Another thing I did was replace the original incandescent indicators in the panel switches with LEDs. I did this mostly because I no longer was running mains voltage to these switches, but it had the nice side benefit that the LEDs are way brighter than the original incandescents so it looks a lot better. This was actually a lot easier than I thought it would be, 3mm through-hole LEDs nestled right into the slot formerly occupied by the incandescent bulb.

And here is a shot of the complete unshrouded machine from the back:

And here is a workbench shot of Miss Silvia from the front with her clothes back on, right after I breathed life back into her. I hadn't yet replaced the LED in the power switch at this stage so it isn't illuminated yet. That one took a little more work since I wasn't naturally running the low voltage required by the LED so that switch, and it was still switching the line voltage.

Next up was to bring Miss Silvia up out of the depths of our basement where my work bench has been relegated and into the kitchen to start pulling some shots and tuning the PID constants. I guess I skipped over the part where I wrote the firmware, but it was based to a large extent on what I had done previously for the Saeco project so it wasn't too bad. The firmware is implemented in a pretty simple state machine that moves between states depending on the condition of the switches and the boiler temperature. 

One of the nicer things I was able to do with now having control of the pump and having a float switch to detect when the water reservoir is low is add an interlock condition that shuts down the pump and boiler when this happens. If a low water condition is detected during the hot water function (pumping hot water out of the steam wand) then it shuts both down automatically. If a lot water condition is detected while a shot is being pulled then it waits a until either the shot is complete (by the user stopping it via the panel switch) or for a maximum of 30 seconds after the condition was detected. This is so that you don't ruin your shot if the float switch activates partway through. Another nice thing was that since I took over control of the panel light next to the power switch (by replacing the original lights with LEDs) I was able to make it part of the UI, so that it pulses while the boiler is heating, goes solid once the final temperature is reached, and then shuts off while cooling from steam to brew or if the low water state is entered. One other improvement of this over my Silvia project was that because I had control of the pump I was able to add a shot timer to the display.

Anyway, back to the PID tuning: I did this by using the serial port on the MCU to push the current tenperature, all of the PID variables (P, I, and D), and the heater drive out to a logging program on a laptop (actually a Microsoft Surface 3, which is what I used for all of the development work on this project). I used the Cool Term application on the Surface to log the data to a text file, and would then import to Excel, plot the results, and adjust the constants for the next run. One thing I learned part way through is that the boiler can have a variable water level depending on what operation was last carried out (steam vs. brew) which changes the thermal mass of the system which in turn changes the system dynamics and how it will respond for a given set of P, I, and D gain constants. So, I now run the pump briefly until water comes out of the group head at the start of each heating cycle to make sure the boiler water level is at a known state.

Here is an example of one of the tuning plots:

Things worth noting:
  • The boiler temperature is not plotted here, but the P-term (blue) gives the same information since it is the error (target - actual) multiplied by the P constant, so as the blue line drops to zero that is the temperature reaching the target.
  • The red line is the I-term, I adjusted the code for this so that the I-term does not start accumulated until the temperature is around 15 degrees out from the target. Otherwise it winds way up during the initial heating and would then blow way past the target. The range within which the I-term starts accumulating was one of the variables that I optimized for (in addition to the P, I, and D gain constants).
  • The grey line is the D-term, this one is spiky because the terms are updated every second but the temperature does not change every second (at least once the rate of change slows down as it approaches the target).
  • The yellow line is the heater drive which is the sum of the previous three terms, it is capped at 1000 since the PWM-drive for the boiler has a scale of 0-1000 (corresponding with how many milliseconds of the 1 second window that the boiler will be active for).
Okay, now for the punchline: does it work? Of course it does! The real question is how much better is it than the stock thermostat, so I did a run with the stock boiler thermostat hooked back up for comparison purposes (I left it intact in the rebuild) and the comparative results are shown below.

You can see that the temperature swings with the thermostat are pretty dramatic, dropping from a high of 96.8 degrees C to a low of 80.1 degrees C and repeating the cycle over and over (although you can see the period lengthens as the rest of the machine heats up which slows down the rate of cooling for the boiler). This means that the temperature of a given shot is a random variable with a uniform distribution from 80.1 C to 96.8 C, not ideal. It is pretty easy to see that the temperature stability is better with the PID control.

Once the shot is pulled there isn't much difference since while I did add some feedforward control to drive the boiler at 100% when the pump is active (to counteract the effect of cold water rushing into the boiler), the time delays in the system are such that there isn't much benefit seen from that during the relatively short 20-30 second window during which the shot is being pulled. So, if you happen to start the shot with the stock Silvia during one of the peaks where the temperature coincides with the PID set point then it would be no different, the PID will just provide more consistent shots.

Another benefit is in the steaming performance (though I never actually tried steaming with the stock Silvia, I am just interpolating from what I saw on the Saeco Aroma project), since at the low extreme of the temperature swing for the steam thermostat the steam power gets pretty weak, while with the PID control it responds more quickly and never lets the boiler temperature drop that low.

Well, that is about all I can think off, I guess I'll end with a few photos of Miss Silvia doing her thing on my kitchen counter. Here she is getting warmed up:

And here is a zoomed out shot with other coffee paraphernalia. The cable exiting on the left side of Miss Silvia is the UART lines connected to the laptop through an FTDI cable.

And finally, here is the obligatory pulling a shot image. Sadly, I pulled this one at 11pm while finishing off this write-up so I wasn't able to enjoy it. Thanks for reading!

Sunday, July 5, 2015

StM: Birthday Challenge 2015

I have gotten a bit lax on birthday challenge execution over the past few years, which may have something to do with these new cubs that keep arriving around June 15. In any case, I had decided that this year was going to be different, and the challenge that I had in mind was riding my bike from Seattle to Mazama. We are in the process of building a cabin in Mazama so I have done the drive many times over the past few years, and often thought that it would make a great ride. The route is about 295 km in total (185 miles), and is pretty flat for the first 2/3 of it until you hit the North Cascades, then has some great climbing and spectacular scenery as you pass through the mountains with about 9000' of climbing in total (including all of the ups and downs, the high point is 5500' at Washington Pass).

I had actually semi-planned on doing this ride last year, but then I ended up spending about a month of the summer in Chamonix, France with no bike on hand (hooray for paternity leave!). I did a lot of trail running there but no riding, so when I got back to Seattle at the end of August I didn't have enough time to build any bike fitness before the end of the summer (my 2-mile bike commute to work didn't help matters much in that department either).

This year was different on two fronts though: firstly, no new cubs arrived in June, and secondly, I changed jobs in April and in doing so lengthened my bike commute from 2 miles each way to 17 miles each way. So, while I still don't have much time to ride, I get some built in training by going to and from work and as a result I was starting to feel like I should pull the trigger and go for it by the time my birthday in June rolled around.

We had a trip to Mazama planned for the June 20/21 weekend so I had initially planned on doing the ride then, but decided to push it back by two weeks due to a nagging Achilles tendon issue that I was still getting over. I had been getting in decent cycling volume due to my commute (though I don't usually ride both ways, probably averaging doing the ride about 5 times per week) and some good intensity in the Thursday evening criteriums at Seward Park that I have been trying to get out to regularly, but I hadn't really done any long rides so as a test of my ability to sit on a bike seat for long periods I did the classic Sultan Bakery ride the week before on Saturday, June 27. This ended up being 106 miles with 6000' of climbing and I felt fine, so that was a good sign for the StM adventure.

The route I would take spends a fair bit of time on pretty busy roads with high speed limits (60 mph) which was a bit of a stinker, but there aren't any other options to get across the North Cascades and the shoulders are pretty decent in most places. Still, in the interests of being safe I decided to prepare by getting a yellow fluoro bike jersey, and in the interests of not looking like a complete dork I decided to make sure it was made in Italy by Castelli. The bright yellow jersey arrived two days before the ride, as did my high-cut yellow fluoro socks, another nod to being seen by crazed motorists towing RVs on the July 4th long weekend. One other challenge I was up against was that it looked like it would be pretty hot on the day I would ride (Friday, July 3), with a forecasted high of 102 F in Mazama (yikes!). This was not ideal, but I knew there were streams, rivers, and lakes that I could jump in along the way, and I prepared further by getting insulated water bottles that I could fill with slushies at gas stations along the way.

My alarm went off at 4:45am on the day of reckoning, and after remembering why I was getting up so early I headed upstairs for the breakfast of champions (oatmeal, fruit, and yogurt) and a cappuccino before heading out the door and jumping on my bike at 5:15am. The sun wasn't quite up yet but it was completely light out and a perfect temperature of 67 F as I headed north on the Burke Gilman trail. As you might expect there were not many other trail users out at this hour, so fortunately I didn't have to dodge the usual masses of rollerbladers and dog walkers as I made my way up to Bothell. From Bothell I took a few back roads  to continue north before dropping down into the Snoqualmie Valley and heading up to Snohomish. It was a bit hard to take photos, but here is one I took of my shadow as I rolled through some nice fields in the early morning sun:

From Snohomish I picked up the Centennial trail which is an old rail road grade that has been paved as a multi-use trail (and thus is dead flat) and would amazingly take me all the way north to Arlington where I would pick up SR 530 and from thereafter would be on the route that we normally drive. The Centennial trail was amazing, dead flat, totally deserted since it was still early, and complete flat. Did I mention that there were no hills? The miles clicked by really quickly, even more so because at the start of this section I met another rider who was also out on a long-ish ride and we chatted most of the way. The funniest part of the conversation was an interchange in which he asked me where I was headed and I told him I was headed to Mazama. He didn't sound surprised at all, and as a rejoinder he asked me if I would do more riding once I got there. I told him that the 185 miles of riding to get there would probably sate my desire to ride for at least a day or two, and I hadn't planned any other big rides for the rest of the holiday weekend. Funny!

It was nice to hit Arlington because the landmarks were then familiar, and I rolled along SR-530 through Oso and the other small towns with a nice tailwind at my back. After about 128 km and 5 hours in the saddle I rolled into Darrington, and I decided it was time for a break. I headed into the IGA where I realized two things: the locals in Darrington are a lot different then the locals in Capitol Hill, and they didn't have a very good bakery. I debated for a while and eventually decided to go with a cookie-based nutrition plan for the day, so I purchased 4 different cookies (and a donut for good measure), some sort of weird cold coffee/energy drink beverage that I will never drink again, and a lemon-flavored Powerade with a disgusting after taste (it turns out it was on sale for a very good reason). I enjoyed these culinary delights at a picnic table in the shade with a great view across the parking lot of Whitehorse Peak (which I need to climb sometime):

After finishing my cookies and juice I managed to wrench myself away from the entertaining interchanges between the locals in the parking lot and jumped back on my bike, heading for Rockport and the junction of SR-530 with SR-20. I still felt quite good, especially since there hadn't been any climbing to speak of yet, with biggest challenge being that my seat was getting a little uncomfortable. It hadn't gotten too hot yet either, and there were good amounts of shade on the side of the road I was on so the riding was quite pleasant as I rolled along the river with views of the mountains to come:

I arrived at Rockport 20 miles after leaving Darrington, and continued west on the road that I would stay on for the entire rest of the way to Mazama. This road wasn't much busier than the SR-530, and luckily most of the cars came in climbs with about 10 vehicles that wished they were driving faster all stuck behind someone in a camper going 50 mph. There was still a fair bit of shade also, here I am still enjoying a pleasant cruise on mostly flat roads:

I passed through Marblemount before continuing on to Newhalem, where I decided it was time for another break both because it had been 2-3 hours since my last one, and because this was the last town before the real business of the north cascades started (actually the last town before Mazama, and not really even a town since all it has is a general store). The Newhalem General Store had even fewer options than the Darrington IGA so I decided to roll with a similar theme and purchased three cookies, some sort of raspberry bar, another cold coffee drink (but this time not hybridized with an energy drink), some lemony soda, and a green gatorade of indeterminate flavor (but it might have been sour apple if I had to guess, and it tasted much better than the Powerade). I unbuckled my shoes and sat down to enjoy my spread in front of the big black locomotive that they have on display:

I thought I had a similar amount of food to what I had put down in Darrington without any issues, but I must have either been not as hungry or just overdosing on cookies because after the pumpkin flavored one and the ginger-raisin one I totally ran out of steam and had to put the double chocolate one and the raspberry bar in my pocket for later. I had also overestimated my need for liquid as I was feeling totally fine before even starting the giant "Squirt" soda that I had purchased. However, I knew that I still had about 50 miles of riding to go in the hottest part of the day with almost all of the climbing and no chance to fill up with water from a reliable source (plenty of mountain streams though), so I forced myself to down about 3/4 of the giant Squirt soda before tapping out and pouring out the rest. I would later come to realize that force feeding yourself carbonated drinks and cookies is not the best way to start a ride through the north cascades on the hottest day of the year, but in the moment I just enjoyed one last look at the big black train, climbed on my bike, and started pedaling.

Upon leaving Newhalem the road immediately pointed up, so I unzipped my jersey (with a full length zipper, of course), clicked into my lowest gear, and started grinding along. Pretty soon I realized that it was stinkin' hot, and soon after that I started having opportunities to eat those cookies all over again as they started making their way back up my digestive tract, no doubt aided by the propulsive forces of the "Squirt" carbonation coming out of solution. Fortunately none of this actually made it out of my mouth onto the road, and I had eaten the cookies recently enough that they still tasted pretty good so I just enjoyed it for what it was and kept on pedaling, likely with a bit more of a pained expression then I had earlier on the flatter and cooler sections:

I took a break at the Diablo Lake overlook after a particularly hot and unshaded section, right after seeing a sign that warned about severe sidewinds ahead and thinking that actually sounded pretty good since if they didn't blow me off the road they would probably be pretty effective at cooling me down. After sitting in the shade for about 5 minutes at the overlook I decided it was time to roll along, so I continued on my way. Luckily I had driven this so many times that passing familiar landmarks provided good motivation.

An hour or so after the stop at the overlook I could feel my energy starting to fade, and I recalled a recent blog post I had read from someone who attempted a 50 mile run through the South Dakota badlands a week or so earlier. It sounded like the guy had almost passed from this world on account of dehydration and heat exhaustion, but the thing I remembered was that he had talked about finding shallow pools of water and feeling really good after sitting in them. The the realization hit me: I am riding by cool mountain streams every 15 minutes or so, why the heck aren't I stopping to sit in them?!? So, shortly after that I took my first creek break at "County Line Creek", where the steep and rocky nature of it made it a bit too awkward to sit in but I was able to repeatedly dump waterbottles fill of cold water over my head and feel really good and re-energized as a result.

It also helped that by this time the cookies were no longer making their presence known, so I downed an energy gel and hopped on my bike with renewed vigor (or at least as renewed as you can be after sitting on a bike in the sun for 9 hours). I chugged on for another hour or so before my next creek break which felt even better, since at the previous one I had made efforts to keep my bike shorts dry in the interests of avoiding chafing while at this one I abandoned all notions of keeping any part of my body dry (except for my shoes, socks, and jersey which were removed prior to the creek dip). I once again was able to re-tap my energy reserves and started rolling again, cresting Rainy Pass at 4800' before too long.

From Rainy Pass the road drops sharply before again starting to climb up toward Washington Pass, and as I worked my way up the final grade I heard shouts of "Allez, allez, allez!!" behind me and turned my head to see the welcome sight of a dark blue Subaru containing my lovely wife and our two cubs rolling up behind me. Roanne pulled over on the shoulder and I stopped for a chat with her and the cubs, and also traded the cookie and raspberry bar that I had been carrying for some water since I had just run out of my reserves from Newhalem and had been about to start drinking the two full bottles of creek water that I had filled up. After waving goodbye I had a brief period of motivation from the contact with my fan base but then started to get really hot and tired again, at which point I started using a new technique where I would squirt water from my bottle onto my head as I rode, which felt amazing.

Before long I had crested Washington Pass and I buckled in for the long mostly-downhill stretch to Mazama. This was a great way to finish since there wasn't that much pedaling in the final 20 km or so from Washington Pass to Mazama (or was it 20 miles? I can't remember) though I did notice the temperatures rising a lot as a I dropped toward the floor of the Methow Valley. I could still turn the pedals and luckily hadn't had any real physical issues (my legs threatened to cramp a number of times, but never actually did), and as I turned into the Chechaquo Loop and onto Trailside Road I still had enough coordination to post up for an often-practiced rarely-used victory salute:

That evening we enjoyed the Mazama night life at Beer-and-Bratwurst night at the Mazama store, and the rest of the long weekend was spent relaxing in the hammock (look closely and you'll notice Miss Etta pretending to read her "Frozen" story book in between my legs, with "Pinkalicious" on deck beside her):

As well as trying unsuccessfully to keep Cleo out of the dirt:

And coaching Etta on the new dirt jump track we are building at the edge of Chechaquo meadow:

So, there you have it. Another year, another birthday challenge in the books, and a really long blog post that I doubt anyone will actually read except for my brother-in-law Beno. Here is the ride detail:

Tuesday, April 28, 2015

Capitol Peak 50-Mile Race (and some catch up)

I would like to extend my sincere apologies to my many followers for not writing a blog entry in almost 2 years. I have been meaning to write one for a while, and lately my brother-in-law Beno has been haranguing me so that combined with me having done something worthwhile this past weekend has resulted in me sitting at a table, drinking whiskey, and writing a blog post. The dearth of posts over the past two years is due to having had a second daughter (Cleo Rose) in the summer of 2014, and the following reduction in free time that has resulted in fewer adventures and no time to write about them.

Here is a short listing of the adventures that I would have written about over the past two years if I had the time:

February, 2014: Skied the Birkie (50km Nordic ski race in Wisconsin) for the second time with my brother Trev and a good crew from work and other connections. Bing and I started in the 4th wave and we managed to finish in almost the exact same time of 3:27 (though that fit little stinker sprinted away from me in the finishing straight). This was good enough to qualify for the first wave for 2015, so I was locked into skiing it again the following year.

August, 2014: Cleo was born in June, and in late July Roanne and I took advantage of our respective maternity/paternity leave policies to spend 1 week in the UK visiting her family and then 3 weeks in Chamonix (the most amazing place on earth). Chamonix is like a magical fantasy land for anyone who has not been there, I won't even attempt to describe it since it is too good for words. Anyone who hasn't been there should go as soon as they can. While we were there I did a bunch of trail running, culminating in a great 45 mile day that took me into Switzerland and back into France (I meant to write a blog post about it but I don't think it will happen now). So. Awesome.
February, 2015: I skied the Birkie again with the same crew, and took advantage of much better conditions and being seeded in the first wave to knock my time down under 3 hours to 2:57. Here is a photo of Trev and myself with our ski beards on the bus ride back from the finish. Trev knocked almost 1:15 off from his time the year before, which resulted in Bing sculpting his likeness out of a large block of butter.

 Okay, give or take a few notable adventures that I may have forgotten about that brings us right up to the present. I have two summer projects for this year, one is to ride my bike from Seattle to Mazama in a day (more details to follow in a subsequent post, hopefully before 2017) and the second is to complete a 100 mile trail running race. I selected the Cascade Crest 100 as the event of choice and joined the entrant lottery back in February but unfortunately was not selected (there are more people than you would think who want to do these races, almost all of the more prominent ones have lottery-based entry). I did get waitlisted for it, and apparently if you complete the mandatory pre-requisites (finish a 50 mile+ race before August and do 8 hours of volunteer trail work) you have a very good chance of getting in, so that is what I am banking on.
My longest trail race before this year was the Bellingham Trail Marathon that I did last fall (great course), so back in February I registered for a 50 mile trail race on April 26th, the Capitol Peak 50-mile that is the subject of this blog post (if I ever get to describing the race itself). I had wanted to register for one a month or two later in order to have more time to build more fitness, but apparently other people had the same idea since they were all full. No self-respecting skier would switch to running while there was still snow on the ground, so I knew that I would be faced with a pretty short preparation time from mid-March until the race in late April.
My training program consisted of getting out for 1 or 2 runs of 5-6 miles midweek (usually on my lunch hour from work), and then one longer run each weekend that built from 10 miles up to 30 miles over the course of 5 weeks. My fairly unstructured training program went well, and after completing the final long run (30 miles) I was pleasantly surprised to find myself still not injured and moderately well equipped to take on my first 50 mile race. My goal was to finish in under 10 hours since I wasn't quite sure how the course would be (it had 7200 feet of elevation gain but I wasn't sure how steep the climbs would be) and I had never run a race that long before.
I managed to get to bed by 9:30pm the night before the race, so that I fit in over 6 hours of sleep before my alarm went off at 3:45am the next morning to start the drive down to Olympia. I arrived at the trailhead at 5:30am, at which time it was still completely dark and pretty cold. I picked up my race bib and went back to the car to get changed and wait for the start at 6:00am. At around 5:50am I headed over to the start line to hear the pre-race briefing with the 74 other hardy souls who had managed to get up that early, and at 6:00am the gun went off (actually the race director just yelled "go!") and we headed up the trail.
I knew I wanted to start off at a conservative pace so I tried not to be too excited and just stayed in amongst others who seemed to be going about the same speed I was. Everyone at the start seemed really skinny and fit, so it was hard to tell visually who the fast people would be. The race started with a long climb of about 2000 feet or so, topping out on what I am guessing was Capitol Peak since it seemed to be the highest thing around. I walked all of the steep parts of the ascent which was definitely a good call especially since I passed a number of people who were "running", expending way more energy to go at a slower pace than I was walking at. Of course, I did pick up my pace when I saw a photographer near the top:
We hit the first real aid station at about 9 miles in, and I stopped to drink some electrolyte stuff and grab some peanut butter sandwiches and an oreo that I ate as I headed off down the trail. By this point I was solo with no one else in sight, so it became more like a long run until each successive aid station. I felt pretty good until around mile 30 at which point I started to feel not so great, and began thinking that a 100 mile race was a very bad idea. At around mile 35 I was re-caught by a runner that I had passed around mile 30, and fortunately this served to light a fire under me and I started to go faster and feel better (and pull away from him again in the process). Here I am with him just having caught back up to me, starting to get my second wind:

From this point on I felt really good (with a few aches that came and went), and had no more issues with motivation. It also helped that by this time I was starting to catch runners from the 55km race who had started after us and were doing a slightly different course, it is always a good boost to pass people even if you technically aren't racing against them. The last part of the course was predominately downhill, and I managed to finish feeling pretty decent in a time of 8:51 which was good enough for 11th place overall (10th for the men, as my friend Aussie Ben would say I did get "chicked" by one woman who finished in 8th). At the finish they had really good food and I managed to eat three slices of pizza, two slices of pie, a bowl of soup, and two cookies.

So, step 1 of my two-step plan to get into the Cascade Crest 100 was a great success and in the books. Now I just need to find time for 8 hours of trail work (I am hoping that I can work on mountain bike trails instead of hiking trails since that is a much better cause) and hope that enough people drop off the wait/entry list that I can get in.

Monday, September 2, 2013

Birthday Challenge: Stevens Pass to Snoqualmie Pass Trail Run

As I mentioned in a previous post, I have been doing some preparation this summer for my planned birthday challenge of running/shuffling from Stevens Pass to Snoqualmie Pass on the PCT in a day. This clocks in at 74 miles (118km) in distance with 19,800 feet of ascending and 20,800 feet of descending (Snoqualmie is 1000 feet lower in elevation than Stevens).

My preparation has consisted of trying to run regularly (usually 5-10 miles and 2-3 times per week), doing a flat 20 mile run in Mazma, doing a 45 mile out and back run on the PCT to test the waters, and then doing my first marathon a week ago. I have been feeling an urgency to give this a shot since the weather has taken a turn for the worse lately and the days are getting shorter. I was too sore all last week from the marathon to get out on any runs, but by Friday my legs were feeling better again and since I had ordered some lightweight trekking poles on Monday and had them arrive earlier than expected on Thursday, I took that as a sign that I should give it a shot on Saturday (Aug. 31).

Friday evening I spent an hour pulling together everything that I would need, before setting out for Stevens Pass just after 8:30pm. The plan was for me to leave a car at the Stevens Pass trailhead to be picked up on a subsequent day, and on Saturday morning Roanne would drop off a car at the Snoqualmie Pass trailhead while going for a hike with a friend so that it would be there for me when I (hopefully) arrived Saturday night.

I pulled into the Stevens Pass PCT parking lot just after 10:15pm, and promptly deployed my sleeping bag in the back of the truck and went to sleep. I used to have trouble falling asleep before big events, but since having Etta I am in a state of perpetual sleep deficit so I never have problems with that anymore.

My alarm went off at 1:45am (I think 3 hours of sleep is a reasonable minimum to strive for) and after an Illy coffee, an orange juice, a banana, and 2 sticky cinnamon buns (one too many based on how I felt when I got going) I suited up, donned my headlamp, and headed up the trail. Here I am trying to wake myself just before getting going:

I had adjusted my approach based on my 45 mile trail run so that I wasn't running any of the uphills, just the flats and downhills. I was also using the new poles that I had just acquired (Black Diamond Ultra Distance, they are awesome) which I was really happy with and proved to be a godsend in the latter stages of the run.

I set off down the trail at 2:12am and the miles ticked by quickly in the dark, as I had a lot of energy and was excited to be finally trying my much-anticipated challenge. I was really happy that I had done the trial run on the first part of the trail that I was doing in the dark, since I was able to recognize landmarks and not have any doubts that I was going the right way. The only fly in the ointment which I hadn't considered was that in the pre-dawn hours all of the trailside foliage was completely soaked with dew, and as this section of the PCT is not as well traveled as other parts the foliage hangs over into the trail and as I made my way through the water on the plans was transferred to my legs, and then ran down my legs and onto my socks and shoes so that a few miles in my feet were completely soaked (to the point where you can feel water sloshing around in the shoes, as if I had just stepped in a lake). This wasn't the end of the world for the time being (though it did make my shoes a fair bit heavier), but I was concerned about the blister ramifications later in the run.

By around 5:00am the sky started brightening with the rising sun, and by 6:00am as I was on my way up to Piper Pass (about 14 miles in) it was bright enough that I no longer needed my headlamp. Here I am on my way up to Piper Pass with the morning sun just about to start hitting Glacier Peak (the large mountain on the horizon):

I contined on to Deception Pass (22 miles, the turnaround for my previous run) which I reached at the 5.5hr mark, not too much slower than the 5hrs it had taken me the previous time when I was running many more of the uphills. I was feeling good still (aside from my wet feet), with my approach of not running any uphills working out well. Soon after Deception Pass I came upon some trees that had been downed in the storms we had the previous week, it would have been dramatic to have been out in the mountains while that was happening!

And here I am after rounding a corner and getting hit by sunshine for the first time, that felt good!

Soon after that I came upon a deer who didn't seem to want to move off the trail, so I paused for a bit to watch him. Having had a recent experience running through farmers fields in the UK and getting chased by a bunch of cows I am now more cautious around large mammals, but eventually he moved along and I continued on my way.

As I made my way up toward Cathedral Pass, while running a short flat section I felt a twinge in my right hamstring followed by a shooting pain on a few of my next strides. Yikes! The pain came during the landing part of my stride when my leg was fully extended, so I tried to run a bit gingerly and it seemed to be okay so I soldiered on. By this point I was about 26 miles in, so I was pretty committed.
I reached Cathedral Pass just before 9:00 am (about 28 miles in), and it was fun to see the spot where Roanne and I had camped a year ago with our young cub (sleeping in a tent at 5500 feet with a 2-month-old is not recommended). I took my first sit-down break here, eating a sandwich and swapping out my soaked socks for a new pair (which prompty got wet as soon as I put them in my wet shoes, but not as wet as the first pair). Here is the view from my rest spot across to Cathedral Peak:

I don't know who mows the lawn up here, but they sure do a great job as the meadow looked very well kept. It was nice to sit in the sunshine, but after 10 minutes it was time to get going so I headed on down toward Deep Lake. The downhills through this section were really runnable; while I find the gentle grade of PCT switchbacks frustrating on the way up I certainly appreciate them on the way down (maybe they could rework the PCT to be a 1-way trail with steep uphills and gentle downhills?).

I reached Deep Lake and continued on a long fairly flat section that ran beside Spinola Creek to Waptus Lake. I was starting to feel my hamstring a bit more, but at this point I was still relatively pain free and it wasn't impacting my stride too much aside from slight shortening of my left leg's motion. The trail beside Waptus Lake went quickly, and I reached the Waptus River (38 miles in) just after 11:30am, having been on the go for around 9.5 hours. Not bad, over halfway and I was well on pace for my aim of completing the run in under 20 hours.

From the Waptus River bridge I started another long ascent. The PCT follows a pattern of ascending to cross 5000 foot+ passes and then dropping down to lakes in the 3000 foot range so there are a number of 2000 foot+ ascents. I knew I was starting to get low on water (I had started with 3 liters), but I didn't want to head back the river to fill up and was thinking there would likely be streams running across the trail on the ascent. Unfortunately by about half way up the climb all of the springs had been dry and I was starting to get a little worried. Here I am still feeling good but getting a little thirsty:

Luckily at mile 45 (just after seeing a black bear!) I happened upon a small trickle coming out of the rock. By this point I was completely out of water, and although I had intended to use purification tables  for trailside water sources, they need 30 minutes to act and since I was really thirsty I decided to take a gamble and rely on my iron constitution. The other consideration is that when I was purchasing the water purification tablets it was a little scary reading all of the warnings on the back about how toxic they are if not used properly. Something like that can't be good for you, so at some point you are weighing the merits of ingesting some live bacteria or ingesting some dead bacteria along with the poisin that did them in.

Continuing on through the flat-ish section after the climb I tried to resume running, but by this point my left hamstring was getting pretty painful and it took a fair bit of gritting my teeth to get going. My blisters were also starting to act up at this point, so it was fortunate that the scenery was so spectacular as this distracted me from the fact that I still had almost 30 miles to cover. I able to get into a good rhythm on the section down to Lemah Meadow, I started by counting steps between switchbacks to distract myself and eventually I became a bit conditioned to the pain and didn't even need to count anymore.

I reach the former site of a bridge across the Lemah River (mile 53) at 4:00pm, just under 14 hours in. I had now dropped slightly below the 4 miles/hour average pace that I had been targeting, mostly due to the hamstring issues I was having. I say "former site of a bridge" since the bridge had been washed out:

I was actually happy about this since I had been thinking that dipping my blistered feet into a cold mountain stream would be good treatment (and it was, it felt awesome). Taking a dip in a cold alpine lake or stream on a hot day in the middle of a long trail run has to be on a my top ten list of the best things in life. After drying off and putting my shoes back on I felt considerably less awesome, but was still able to muster something that was closer to a run than a walk as I approached the long climb up to Spectacle Lake.

Once on the climb I settled into my standard power walking (actually, by this point most of the power had gone by the wayside and it was just walking) for the long ascent up to and above the lake. By this time even walking was getting a bit painful when I would try to get a strong push off from my left leg. Here I am paused at a nice waterfall around mile 55:

I reached the top of the ascent at mile 58 just before 6:00pm (having been on the go for 16 hours). I stopped here for another sock swap (I had been operating in a pattern of sock-swapping, always having one pair of socks on the outside of my pack drying that was ready to be swapped out for the still wet-ish pair that I was wearing), and sat down for one last break in the sun. Here is the nice meadow at my rest stop:

 As I set off down the descent I made an effort to do something that approximated running, but it was so painful that I gave up after a few hundred meters and slowly came to accept that I would be walking the last 16 miles since running was no longer possible with my hamstring being the way that it was (the rest of me felt surprisingly decent, my quads were really tired but still functional).

Stinker! Luckily I soon after rounded the corner on a ridge top and was presented with a view of Mount Thompson, at least I was getting back into familiar territory (I had climbed it last year with the approach being on the PCT). This was good timing, as the sun was dropping in the sky and it was nice that the final part that I would be covering in the dark was familiar to be. On the unfortunate side, the trail now consisted of long sections of scree and talus which would have been tough to run in any state, and in my current state were a lot harder to walk (especially in flimsy running shoes).

I soldiered on, with the sun setting just as I approach Huckleberry Mountain at mile 62. Here are the sun's final rays catching some nice flowering heather:

And here is the view down the trail just after the sun set with Mount Rainier visible on the horizon:

I managed another mile or two in the dusk before it was too dark to see, so I stopped and put on my long sleeve shirt (it was getting cooler with the sun down) and donned my headlamp for round 2 of hiking in the dark. I wasn't moving that fast but I was moving, and before too long I reached Ridge Lake which I had hiked to a few times, so it was nice to be on familiar ground. I continued on to the Kendall Catwalk which was exciting to cross in the dark (a narrow walkway with the sides plunging off steeply into a dark abyss, yikes!).

By this point my stomach had started going a bit wonky (possibly due to the warm cheese sandwiches that I had been eating, possibly due to bacteria from untreated water, or possibly due to having been on the go for over 20 hours) and my morale was starting to sag so it was really nice to round the corner on Kendall Peak and have vehicle lights on I-5 come into view. Civilization! It looked like I was going to make it after all. I still had just under 6 miles to go, but with the end in sight it became much easier (though I did spend a lot of time cursing the PCT for the long switchbacks) and at 12:36am I emerged into the parking lot at the PCT trail head. Great success! It had been 22 hours and 24 minutes on the go, I had accumulated over 33,000 fuel points on my Nike Fuel Band (a new PB), and I was happy to be done. Here I am in the parking lot, happy to be done:

Here is a shot of my Fuel Band about to explode from having accumulated so much fuel in one day:

And here is one of the blisters that I saw when I took my shoes off. You know your blisters are getting serious when they're filled with blood instead of clear fluid:

I was pretty tired, but luckily I had stocked the car that Roanne dropped off for me with cans of Illy coffee, so I passed the time on the drive back to Seattle by sipping coffee and didn't fall asleep until I fell into my bed.

In case anyone wants tips and tricks for repeating this endeavor, here is the list of everything that I brought:

  • Running shoes (Nike Pegasus)
  • 3 pairs of socks
  • Running shorts
  • Short sleeve synthetic shirt
  • Long sleeve synthetic shirt
  • Hat
  • Head band
Food (all consumed except where noted)
  • 3 liters of water (and filled up more along the way)
  • Electrolyte tablets (to make the water taste more interesting)
  • 4 Probars (I had 3 of these left over at the end)
  • 6 Odwalla bars (I had 4 of these left over at the end)
  • 2 buns with peanut butter and honey
  • 2 buns with peanut butter and nutella
  • 6 avocado/hummus/cheese sandwiches
  • Camelbak (18L carrying capacity, 3L water capacity)
  • Ibuprofen (boy was I happy to have this!)
  • Water purification tablets (didn't use any of these)
  • Toilet paper
  • Duct tape (didn't use this for anything)
  • Cell phone (only for taking pictures since there was no cell reception)
  • Map
  • Lighter (my nod to survival gear in the event that I had to spend the night out)
  • Headlamp
  • Trekking poles
And finally, here is the list of things that I would do differently if I were to do it again:
  1. Don't bring so many of the same sandwiches, I was really happy with the avocado/hummus/cheese sandwich when I tasted the first one but by the 6th one I was pretty sick of them.
  2. Don't bring any energy bars, they are disgusting. As my friend Bing would say, only bring human food.
  3. Don't get wet feet at the start of the run. I'm not quite sure what I would have done differently to avoid this, but if anyone has ideas I would love to hear them.
  4. Stretch at the start of the run, in the hopes of avoiding the issues that I experienced with my hamstring. Come to think of it, maybe another idea would be not doing my first marathon the week before. Oops.
  5. Don't eat so many cinnamon buns for breakfast before starting out. My standard breakfast fare for endurance events lately has been a giant serving of baked goods, but I think I am going to switch to something healthier so that I don't feel sick for the first hour.
  6. Bring a pin or something to pop blisters. I had matching blisters on the outsides of my heels, and the one that popped itself partway through was in way better shape at the end then the one that stayed intact.
  7. Put some anti-friction rub on the back of my underarms. My shirt tends to chafe here and I always forget to do something about it before the run.