Better Ski Maps – Tinkurlab: SlopeStyle

Tinkurlab is going spatial!

We’re adding maps and spatial data to our visualization techniques.
Keep reading for the first foray into mapping…ski slopes!


You’ve heard it all before.

“This run would totally be a green out west.” “This resort isn’t as hard as my home mountain.” “A blue here doesn’t equal a blue there.”

Really? Are you sure? The resorts themselves state that trail ratings are subjective to that particular mountain. Green – Blue – Black – Double Black…and what are those RED trails about in Europe? Even snow conditions can change the rating of one particular trail.

Tinkurlab's collection of trail maps from the 2013/2014 season...each one different

Tinkurlab’s collection of trail maps from the 2013/2014 season…each one different

Ski trail maps are works of art; designed by a couple people to make you want to visit the resort and display the number of trails- but how much can a color tell you? If it’s the right color, turns out a whole lot.  Enter Tinkurlab:SlopeStyle.


Earlier this winter, Adam and I relocated from Washington DC to Denver, and had many more ski resorts available to us within a 2 hour drive. Resources like FreshyMap helped us determine which one to hit up with a quick glance.   With so many choices, I was curious about finding a way to objectively compare resorts and tell which parts of the resorts I wanted to ski.  In ski progression, it’s easy to both stay on terrain that you are better than or find yourself in way over your head.  I wanted a way to know what I was getting into before I took that first turn.

Tinkurlab:Slopestyle lets you visually explore the pitch and slope angle of your favorite ski runs.  With this data, you can easily compare these runs with others at the same resort to find new terrain.  Additionally, since the color-coding is the same across the maps, you can now compare resorts with each other.  Pink is pink, no matter where you are!  The site performs the same on a desktop as on a phone, allowing you to plan your runs from   any type of chair you’re sitting on.   Happy skiing!  If interested, please read further for the technical details on how the site was created.

Built by processing USGS elevation data with GIS commands to calculate and thematically render slope pitch in degrees.

What I needed to start was elevation data.  I found what I was looking for thanks to the USGS.  They publish layers in varying degrees of resolution and are available for download using The National Map.  I selected the files for the sections of Colorado and California that I required, and set about processing the data.

I used the GDAL utility as my primary GIS tool.  It’s open source, and allows the user to execute a variety of commands for translating and processing raster data.  Using the command-line operators, I was able to create greyscale hillshade layers and calculate the slope for the terrain I was interested in.  I then selected break points for the slope degrees, and generated a color-reilef map based on the pitch.

Example commands:
gdaldem hillshade -s 111120 DEM.adf hillshade.tif
gdaldem slope -s 111120 DEM.adf slopedegree.tif
gdaldem color-relief slopedegree.tif slope-ramp.txt slopeshade.tif -alpha -co ALPHA=YES
Vail Hillshade TIFF

Vail Hillshade TIFF

Vail Slopeshade TIFF

Vail Slopeshade TIFF

Ski resort data overlaid using OpenStreetMap exports stored in PostGIS databases.

The next step was to get the trail map data.  My initial plan was to find a web service containing the features and add it to my map.  That search did not yield great results, so I switched to plan B and learned how to use OpenStreetMap exports.

I used JOSM to extract the aerialway, downhill and woods features for the ski resorts included in my beta site.   Once I had the .osm data, I used osm2pgsql commands to add the features to a PostGIS extended PostgreSQL database.   I found the LearnOSM tutorial extremely helpful (I’m using a Mac with OSX Mavericks, and was able to follow along with the Windows prompts.)

Visualized using Mapbox TileMill and Mapbox Javascript API.

Once I had the data downloaded and processed, it was time to put it all together and create some maps.  I chose to use Mapbox TileMill to combine my layers and create map tiles.  The Carto CSS-like language enabled styling control, and the built in raster and PostGIS support made adding data incredibly easy.


Slopestyle TileMill Interface

The tile packages were uploaded to the Tinkurlab Mapbox account, and I set about creating the interactive web map using their javascript API.   The examples are straightforward, and with a couple lines of code, I was up and running.

SlopeStyle - Mapbox Javascript API

SlopeStyle – Mapbox Javascript API

Packaged in a responsive website.

It was important to house the webmap in code that would render correctly on any device.  You might investigate the resorts on a desktop at home, but on the mountain, you’re going to be on a phone.  The Twitter Bootstrap framework is perfectly suited for this application.  Both Tinkurlab:Maps and SlopeStyle are built using Bootstrap with some custom CSS files.

The application defaults to the I70 corridor resorts in Colorado, but the user has the option to switch to the Lake Tahoe area and back.   I chose to focus on the resorts that we skied the season, but plan on expanding in the future.  Other features in the future might include the ability to select a run to view it’s entire slope profile, as well as rendering the slope colors based on your personal ski preferences.  Keep checking back for updates!

– Val

TinkurCrate – Where’s The Dog?!


One of my favorite things about the Internet of Things is “giving a voice to things”.  And who’s more deserving of a voice – and a Twitter account – than our roommate’s dog, Tyr.  Tyr, an English Springer Spaniel enjoys running, playing with his toys, and hanging out in his crate.  In fact, he’s got a fancy crate located in a prime location in our living room.  TinkurCrate is the first in a series of projects to learn more about Tyr’s activities and connect him to the IoT.  TinkurCrate uses an Arduino with Ethernet and a proximity sensor to determine when Tyr is in his crate.  The Arduino posts the data to Xively for storage, which sends Web Hook triggers to Xively when Tyr enters and exits his crate – triggering Tweets on TinkurLab’s IO Twitter account – @TinkurLabIO.





Wiring for the project is pretty simple, just connect the proximity sensor to the Arduino Ethernet shield as follows:

  • Red to 5v
  • Black to Ground
  • Yellow to Analog Pin 5

TinkurCrate Wiring



<br />/*<br /><br />Published:  2014<br />Author:     Adam - TINKURLAB<br />Web:<br /><br />Copyright:  This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.<br /><br />Contributors:<br />-Xively code based on<br />-Median library<br /><br /><%%KEEPWHITESPACE%%> */<br /><br />#include &lt;SPI.h&gt;<br />#include &lt;Ethernet.h&gt;<br />#include "RunningMedian.h"<br /><br />#define APIKEY         "xxxxxxxxxxx" // replace your Xively API Key here<br />#define FEEDID         xxxxxxxxxxx // replace your Xively Feed ID here<br />#define USERAGENT      "TinkurCrate" // user agent is the project name<br /><br />// assign a MAC address for the ethernet controller.<br />// Newer Ethernet shields have a MAC address printed on a sticker on the shield<br />// fill in your address here:<br />byte mac[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; // replace your Mac Address here<br /><br />// fill in an available IP address on your network here,<br />// for manual configuration:<br />//IPAddress ip(10,0,1,20);<br />// initialize the library instance:<br />EthernetClient client;<br /><br />char server[] = "";   // name address for xively API<br /><br />unsigned long lastConnectionTime = 0;          // last time you connected to the server, in milliseconds<br />boolean lastConnected = false;                 // state of the connection last time through the main loop<br />const unsigned long postingInterval = 10*1000; //delay between updates to<br /><br />int modeSwitch = 1;<br /><br />int incrate = 0;<br /><br />RunningMedian proximityLast10 = RunningMedian(10);<br /><br />int timesincrate = 0;<br /><br />int sensorReading = 0;<br /><br />int sensorReadingMedian = 0;<br /><br />void setup() {<br /><%%KEEPWHITESPACE%%>  // Open serial communications and wait for port to open:<br /><%%KEEPWHITESPACE%%>  Serial.begin(9600);<br /><br /><%%KEEPWHITESPACE%%>  delay(2000);<br /><br /><%%KEEPWHITESPACE%%> // Connect to network amd obtain an IP address using DHCP<br /><%%KEEPWHITESPACE%%>  if (Ethernet.begin(mac) == 0)<br /><%%KEEPWHITESPACE%%>  {<br /><%%KEEPWHITESPACE%%>    Serial.println("DHCP Failed, reset Arduino to try again");<br /><%%KEEPWHITESPACE%%>    Serial.println();<br /><%%KEEPWHITESPACE%%>  }<br /><%%KEEPWHITESPACE%%>  else<br /><%%KEEPWHITESPACE%%>  {<br /><%%KEEPWHITESPACE%%>    Serial.println("Arduino connected to network using DHCP");<br /><%%KEEPWHITESPACE%%>    Serial.println();<br /><%%KEEPWHITESPACE%%>  }<br />}<br /><br />void loop() {<br /><br /><%%KEEPWHITESPACE%%>  if (modeSwitch == 1)<br /><%%KEEPWHITESPACE%%>  {<br /><%%KEEPWHITESPACE%%>    // read the analog sensor:<br /><%%KEEPWHITESPACE%%>    sensorReading = analogRead(A5);<br /><br /><%%KEEPWHITESPACE%%>    proximityLast10.add(sensorReading);<br /><br /><%%KEEPWHITESPACE%%>    sensorReadingMedian = proximityLast10.getMedian();<br /><br /><%%KEEPWHITESPACE%%>    Serial.println();<br /><br /><%%KEEPWHITESPACE%%>    Serial.print("Proximity: ");<br /><%%KEEPWHITESPACE%%>    Serial.println(sensorReading);<br /><br /><%%KEEPWHITESPACE%%>    Serial.print("Median Proximity: ");<br /><%%KEEPWHITESPACE%%>    Serial.print(sensorReadingMedian);<br /><%%KEEPWHITESPACE%%>    Serial.print(" w/ ");<br /><%%KEEPWHITESPACE%%>    Serial.print(proximityLast10.getCount());<br /><%%KEEPWHITESPACE%%>    Serial.println(" samples");<br /><br /><%%KEEPWHITESPACE%%>    delay(1000);<br /><br /><%%KEEPWHITESPACE%%>    if (sensorReadingMedian &gt; 160)<br /><%%KEEPWHITESPACE%%>    {<br /><%%KEEPWHITESPACE%%>      incrate = 1;<br /><%%KEEPWHITESPACE%%>    }<br /><br /><%%KEEPWHITESPACE%%>    if (sensorReadingMedian &lt; 100)<br /><%%KEEPWHITESPACE%%>    {<br /><%%KEEPWHITESPACE%%>      incrate = 1;<br /><%%KEEPWHITESPACE%%>    }<br /><br /><%%KEEPWHITESPACE%%>    Serial.print("Is In Crate: ");<br /><%%KEEPWHITESPACE%%>    Serial.println(incrate);<br /><br /><%%KEEPWHITESPACE%%>    Serial.println();<br /><br /><%%KEEPWHITESPACE%%>  }<br /><br /><%%KEEPWHITESPACE%%>  // convert the data to a String<br /><%%KEEPWHITESPACE%%>  String dataString = "proximity,";<br /><%%KEEPWHITESPACE%%>  dataString += String(sensorReadingMedian);<br /><br /><%%KEEPWHITESPACE%%>  // you can append multiple readings to this String to<br /><%%KEEPWHITESPACE%%>  // send the xively feed multiple values<br /><%%KEEPWHITESPACE%%>  dataString += "\nincrate,";<br /><%%KEEPWHITESPACE%%>  dataString += String(incrate);<br /><br /><%%KEEPWHITESPACE%%>  // if there's incoming data from the net connection.<br /><%%KEEPWHITESPACE%%>  // send it out the serial port.  This is for debugging<br /><%%KEEPWHITESPACE%%>  // purposes only:<br /><%%KEEPWHITESPACE%%>  if (client.available()) {<br /><%%KEEPWHITESPACE%%>    char c =;<br /><%%KEEPWHITESPACE%%>    Serial.print(c);<br /><%%KEEPWHITESPACE%%>  }<br /><br /><%%KEEPWHITESPACE%%>  // if there's no net connection, but there was one last time<br /><%%KEEPWHITESPACE%%>  // through the loop, then stop the client:<br /><%%KEEPWHITESPACE%%>  if (!client.connected() &amp;&amp; lastConnected) {<br /><%%KEEPWHITESPACE%%>    Serial.println();<br /><%%KEEPWHITESPACE%%>    Serial.println("disconnecting.");<br /><br /><%%KEEPWHITESPACE%%>    resetMode();<br /><br /><%%KEEPWHITESPACE%%>    client.stop();<br /><br /><%%KEEPWHITESPACE%%>  }<br /><br /><%%KEEPWHITESPACE%%>  // if you're not connected, and ten seconds have passed since<br /><%%KEEPWHITESPACE%%>  // your last connection, then connect again and send data:<br /><%%KEEPWHITESPACE%%>  if(!client.connected() &amp;&amp; (millis() - lastConnectionTime &gt; postingInterval)) {<br /><br /><%%KEEPWHITESPACE%%>    modeSwitch = 2;<br /><br /><%%KEEPWHITESPACE%%>    sendData(dataString);<br /><%%KEEPWHITESPACE%%>  }<br /><%%KEEPWHITESPACE%%>  // store the state of the connection for next time through<br /><%%KEEPWHITESPACE%%>  // the loop:<br /><%%KEEPWHITESPACE%%>  lastConnected = client.connected();<br /><br />}<br /><br />// this method makes a HTTP connection to the server:<br />void sendData(String thisData) {<br /><br /><%%KEEPWHITESPACE%%>  // if there's a successful connection:<br /><%%KEEPWHITESPACE%%>  if (client.connect(server, 80)) {<br /><%%KEEPWHITESPACE%%>    Serial.println("connecting...");<br /><%%KEEPWHITESPACE%%>    // send the HTTP PUT request:<br /><%%KEEPWHITESPACE%%>    client.print("PUT /v2/feeds/");<br /><%%KEEPWHITESPACE%%>    client.print(FEEDID);<br /><%%KEEPWHITESPACE%%>    client.println(".csv HTTP/1.0");<br /><%%KEEPWHITESPACE%%>    client.println("Host:");<br /><%%KEEPWHITESPACE%%>    client.print("X-ApiKey: ");<br /><%%KEEPWHITESPACE%%>    client.println(APIKEY);<br /><%%KEEPWHITESPACE%%>    client.print("Content-Length: ");<br /><%%KEEPWHITESPACE%%>    client.println(thisData.length());<br /><br /><%%KEEPWHITESPACE%%>    // last pieces of the HTTP PUT request:<br /><%%KEEPWHITESPACE%%>    client.println("Content-Type: text/csv");<br /><%%KEEPWHITESPACE%%>    client.println("Connection: close");<br /><%%KEEPWHITESPACE%%>    client.println();<br /><br /><%%KEEPWHITESPACE%%>    // here's the actual content of the PUT request:<br /><%%KEEPWHITESPACE%%>    client.println(thisData);<br /><%%KEEPWHITESPACE%%>    Serial.println(thisData);<br /><br /><%%KEEPWHITESPACE%%>    client.println();<br /><br /><%%KEEPWHITESPACE%%>  }<br /><%%KEEPWHITESPACE%%>  else {<br /><%%KEEPWHITESPACE%%>    // if you couldn't make a connection:<br /><%%KEEPWHITESPACE%%>    Serial.println("connection failed");<br /><%%KEEPWHITESPACE%%>    Serial.println();<br /><%%KEEPWHITESPACE%%>    Serial.println("disconnecting.");<br /><%%KEEPWHITESPACE%%>    client.stop();<br /><%%KEEPWHITESPACE%%>  }<br /><%%KEEPWHITESPACE%%>   // note the time that the connection was made or attempted:<br /><%%KEEPWHITESPACE%%>  lastConnectionTime = millis();<br />}<br /><br />void resetMode()<br />{<br /><%%KEEPWHITESPACE%%> modeSwitch = 1;<br /><%%KEEPWHITESPACE%%> incrate = 0;<br />}<br />

Source code also available on GitHub at


Xively Setup

Xively is a service for powering the Internet of Things, providing API access for data storage, data retrieval, triggers, and data charting.  After registering for a free Xively account, perform the following steps:

1) Add Device.

2) Add Channels for “incrate” and “proximity”.


3) Setup Triggers for “incrate” status change.  One Trigger calls the Zappier “Entering Crate” Zap, and the other Trigger calls the Zappier “Exiting Crate” Zap.



Zapier Setup

Zapier is a service for orchestrating and automating the Internet of Things and popular online services.  After registering for a free Zapier account, perform the following steps:

1) Create a new Zap, using a Web Hook – Catch Hook event, triggering a Twitter – Crate Tweet event.


2) Authorize your Twitter account if needed, and add a Filter to only trigger when the Xively trigger is “1” (when the dog enters the crate).


3) Setup a Message to post to Twitter and save the Zap.


You can view Tyr’s live status at and his Tweets at @TinkurLabIO.

What’s Next

While TinkurCrate is a good beginning, I hope to add a few more sensors to Tyr’s world.  Possibilities include:

  • Pressure sensors to determine when Tyr is on the sofa
  • Continuity sensor to determine when Tyr’s water bowl is empty
  • Processing visualization of Tyr’s in crate / out of crate activity by time of day and day of week

Have any other ideas or suggestions.  Tweet @TinkurLab.



TinkurBooth Photobooth

I remember the first time I visited my friend Jim at college many years ago.  Upon walking into his small two person dorm room, the first thing I noticed was all the Polaroid photos hanging around his door frame – of smiling friends and a few funny faces.  Jim had a tradition of taking a Polaroid picture when someone new visited him – a way to remember all the great people that one encounters at college.  I’ve always had a love of candid photography – photos the capture the essence of a moment or a person.  Photobooths and Polaroids are great tools for capturing candid pictures – they’re easy, quick, and produce a tangible result.

TinkurBooth Prototype

A basic prototype of TinkurBooth.

While I still love the Four Frames Photobooth, it takes a bit of time to transport, set up, and take down.  Although Four Frames Photobooth has had a busy life – attending multiple weddings, a few business parties, and even a happy hour – I wanted something the would be, well, easier, quicker, and a ‘lil bit more playful.  Meet TinkurBooth – a platform for taking quick and candid photos with endless possibilities for innovation.

TinkurBooth was my first project using a Rasberry Pi.  Many of TinkurLab’s creations have already used microcontrollers such as the Arduino.  However, I’ve been looking for an excuse to try a Raspberry Pi.  Not only are Pis cheap ($30-40) the Pi Camera module is also cheap ($30) and you can use a cheap ($10) wi-fi adapter for connectivity – < $100 for a photobooth is a pretty good deal.  And honestly, there’s just something geekily awesome about taking pictures using shell commands and switches!

“And honestly, there’s just something geekily awesome about taking pictures using shell commands and switches!”

I wanted TinkurBooth to be more then a “once and done” photobooth.  I wanted it to be a platform for experimentation and play – for trying new ideas.  Coming from my day job as an agile leader and coach, I am often reminded about the countless opportunities for experimentation – to try new things, test a hypothesis, and validate the outcome.  The TinkurBooth experience is built around four steps, which allow for many possibilities: Trigger + Interaction + Capture + Sharing.


Trigger + Interaction + Capture + Sharing

“Aren’t you going a bit too far?  It’s just a photobooth!” is what you’re probably thinking right now.  Let me explain.  Thinking of each of these steps as separate but related, helps me think about the possibilities of changing one or more of the steps to create a different experience that engages different people in different ways.  For example, one day the TinkurBooth could use a motion trigger while another day it could use a sound trigger that listens for a clap.  As another example, TinkurBooth could capture a single black and white photo one day while another day it could take four photos and merge them into an animated GIF.  In fact, my goal for the next year is to have a new version of TinkurBooth every month or two to see how each variation changes the user experience.



This step is about the system knowing the user wants to interact with it (or convincing the user to interact with it).  Examples of triggers could include:

  • Button: Pressing a button

  • Motion: Passing within a certain area (width and depth)

  • Sound: A loud sound or a certain type of sound (ex. a clap or whistle)

  • Light: A dramatic change in light, indicating something has changed

  • Distance and Movement: Coming within a certain distance

  • Time: A certain amount of elapsed time

  • Proximity: Being within a certain distance, although not necessarily within visual proximity (ex. think about using geo location)

  • Something You Have: Needing a smartphone to interact with it

  • Pattern: Press a button in a certain pattern

And let’s not forget about the possibility of mashups such as Distance + Time.  For example, an early prototype of TinkurBooth required the user to be standing within a 2 foot area before it would take a picture.  Too close and it would yell at you to stand back.  Too far away and it would start to worry and ask you to come back.  Really far away and it would ask you to come play.  And if you stood in just the right spot for two seconds, with would take your picture.



While the trigger could directly move to the capture step, there’s a great opportunity for interaction at this point to engage and delight the user.  Examples of interaction could include:


  • Engage: In the Distance + Time example above, the photobooth is playful, using an LCD screen with text based on distance and time to engage the user.

  • Inform: The LCD screen could also be used to tell the user how to interact with the photobooth.  In the above example, before starting taking pictures, the photobooth asked the user to make a funny face and then showed the user a random word such as “crazy” just before taking the picture.

  • Give and Take: Interaction could also consist of the user providing something, such as their Twitter username, in return for the photobooth taking a picture.  The photobooth could then use the Twitter username to tag the photo.



The photography step of the equation.  Examples of capture could include:

  • Timing: The time between pictures or a random time

  • Number of Pictures: The number of pictures taken or a random number

  • Shape of Pictures: Vertical, horizontal, square

  • Filters: Color, B&W, think Instagram

  • Lighting: Flash, No Flash, Ringflash

  • Post Processing: Keep pictures separate, merge photos into a 4 x 1 strip, merge photos into an animated GIF



One of the greatest challenges with photography is doing something with all those pictures.  Sharing is the part of the equation that allows people to share and remember moments.  Examples of sharing could include:

  • Twitter: Posting to Twitter

  • Printing: Printing a photostrip

  • Emailing: Emailing to the user



However, before experimenting with variations, I had to create a working prototype.  There are lots of great tutorials and troubleshooting posts all over the Internet, so I won’t provide step by step instructions here.  However, if you have specific questions, feel free to contact me.

One of the first animated GIF examples posted to Tumblr by TinkurBooth.

How It Works

The following is an overview of the TinkurBooth Platform workflow:

  1. Run sudo python script

  2. Script monitors for motion

  3. When motion is detected, four pictures are taken using the raspistill command and saved locally; code based on

  4. The four photos are merged together using ImageMagick and saved locally as an animated GIF

  5. The annimated GIF is uploaded to a Gmail account; code based on

  6. The If Then Then That (IFTTT) service monitors the Gmail account and runs macros to post the animated GIF to Tumblr (and thanks for Tumblr for being so awesome as to actually support annimated GIFs!)





  1. Follow the awesome Adafruit Raspberry Pi Tutorials

    1. Prepare SD Card and Install Raspbian OS ://

    2. Configure Pi

    3. Configure Network

    4. Configure VNC (so you can program from yoru desktop or laptop)

    5. Setup GPIO (General Purpose Input Output) Libraries

    6. Trying Sensing Some Movement

  2. Setup and configure the Raspberry Pi Camera
  3. Download the TinkurBooth source code from GitHub at


Helpful Tutorials


What’s Next

Stay tuned for future posts about TinkurBooth.  Forth the 1st “TinkurBooth” of the month, I’m going to be creating a version that is activated by distance and uses an LCD screen to interact with the user asking them to play a game to act out a event that will be turned into an animated GIF.

And if you’re wondering about that Polaroid from Jim’s dorm room, here’s it is – Jim, Adam, and Val.

Jim Adam and Val Polaroid


Tagged , ,

Raspberry Pi Camera Command List

Now that I got my Raspberry Pi’s Camera Module working, I’m sure I’ll need to keep a list of the software commands handy.  The following is the list of commands supported by v1.1 for the RaspiStill Camera App:

Use from a command line.  Usage: raspistill [options]

Image Parameter Commands

-?, –help : This help information
-w, –width : Set image width <size>
-h, –height : Set image height <size>
-q, –quality : Set jpeg quality <0 to 100>
-r, –raw : Add raw bayer data to jpeg metadata
-o, –output : Output filename <filename> (to write to stdout, use ‘-o -‘). If not specified, no file is saved
-v, –verbose : Output verbose information during run
-t, –timeout : Time (in ms) before takes picture and shuts down (if not specified, set to 5s)
-th, –thumb : Set thumbnail parameters (x:y:quality)
-d, –demo : Run a demo mode (cycle through range of camera options, no capture)
-e, –encoding : Encoding to use for output file (jpg, bmp, gif, png)
-x, –exif : EXIF tag to apply to captures (format as ‘key=value’)
-tl, –timelapse : Timelapse mode. Takes a picture every <t>ms

Preview Parameter Commands

-p, –preview : Preview window settings <‘x,y,w,h’>
-f, –fullscreen : Fullscreen preview mode
-op, –opacity : Preview window opacity (0-255)
-n, –nopreview : Do not display a preview window

Image Parameter Commands

-sh, –sharpness : Set image sharpness (-100 to 100)
-co, –contrast : Set image contrast (-100 to 100)
-br, –brightness : Set image brightness (0 to 100)
-sa, –saturation : Set image saturation (-100 to 100)
-ISO, –ISO : Set capture ISO
-vs, –vstab : Turn on video stablisation
-ev, –ev : Set EV compensation
-ex, –exposure : Set exposure mode (see Notes)
-awb, –awb : Set AWB mode (see Notes)
-ifx, –imxfx : Set image effect (see Notes)
-cfx, –colfx : Set colour effect (U:V)
-mm, –metering : Set metering mode (see Notes)
-rot, –rotation : Set image rotation (0-359)
-hf, –hflip : Set horizontal flip
-vf, –vflip : Set vertical flip

Exposure mode options :

AWB mode options :

Image Effect mode options :

Metering Mode options :

Tagged , , ,

Sticky Notes – Awesome for Brainstorming and Collaboration

There’s a stereotype out there – that agile teams use a lot of sticky notes.  Well guess what – it’s true!  If you walk around the workspace of almost any agile team, you are likely to see countless colorful sticky notes on walls and windows everywhere.  But why?  In my experience, sticky notes are one of the most powerful and versatile tools for collaboration I’ve ever used – including software tools.  But I’ve also learned it can take a bit of convincing and learning by doing to help others understand the “Power of Post-Its“.  Through a series of blog posts, I hope to turn you into a believer too!

Sticky Notes

As an agile practitioner and coach, I am often facilitating collaborative sessions – to brainstorm, to prioritize, to turn a vision into a plan, to collect feedback, to estimate, to sync on progress.  And my number one tool of choice are sticky notes.  The seemingly simple pieces of paper are a powerful tool to get the whole team to participate and rapidly share their knowledge and perspectives while collaborating towards a shared goal.

While I’ll discuss how to use sticky notes for many different types of collaboration in future posts, let’s start by looking at the many benefits of sticky notes as a tool:


Capturing a thought on a sticky note is quick.  Just grab a pen or Sharpie marker – my favorite writing implement – and jot down your thought in a few words.  Great!  Now write down another.  And another.  Awesome – you’re rapidly brainstorming!

Compact and Concise

With limited time and attention it’s often important to distill the most important facts down to a few meaningful words or sentences – or a picture.  Sticky notes have a finite amount of space, requiring each note to contain a simple and focused idea.  Can’t fit it all one sticky note?  Good – use a second and third, making sure each item is focused.   I bet you didn’t think less space was a good thing!

Divide and Conquer

Sticky notes allow a whole team of people to brainstorm independently at the same time.  Just ask each person to write down as many ideas as they can within a 5 to 10 minute time box.  Don’t worry about evaluating, discussing, or prioritizing sticky notes yet.  Brainstorming is all about unfiltered idea anyway.  And by asking everyone to work in parallel without discussion, you’ll get lots of ideas written down.

The Sticky Factor

Sticky notes stick to just about anything – walls, windows, desks – especially the Super Sticky Post-It Notes which I highly recommend.  When I’m facilitating collaborative sessions, I often use painter’s or artist’s tape to create an appropriate set of buckets on the wall and then ask team members to add their sticky notes to each area.  For example, while facilitating an team retrospective to determine how to improve the team and their process, I’ll make buckets such as “do more of”, “do less of”, “what if…”.


One of my favorite reasons for using sticky notes is that they’re colorful and visible. By putting your sticky notes in a public space such as an office wall, you and your team are constantly reminded of the sticky notes and encourage others to check out what’s happening.  It’s a great way to radiate information and invite other to participate in collaboration.


You can touch a sticky note.  It’s real.  When you’re discussing it, you can pick it up so others know which thing you’re talking about.  When you’ve made progress, you can move it from an in progress bucket to a done bucket.  When you’re done done with it you can tear it up and throw it away – my favorite!

Simple or Complex

Just like software tools, sticky notes can support just about any process and metadata you can invent. Want to track new features vs. defect – use different colored sticky notes. Want to track how many days something has been in progress – add a dot to the lower left corner of the sticky note each day. Want to track who’s working on what – give each person a unique sticker to add to sticky notes.

Repositionable and Groupable

Combined with a wall or window and some painter’s tape to create some buckets, sticky notes make a great system to track just about anything.  And best of all – they’re built to be moved around over and over and over.  Try reconfiguring your software tools to match your process that quickly!

While I also use many other agile tools, sticky notes are one of my favorite.  Try it out yourself and see if you become a believer!  Or check out some other team’s sticky notes.


Tagged , , , , , , ,

What’s the best tool in our hackerspace workshop? A Dremel. Hands down.

Tales of Tools and a Panning Timelapse GoPro Timer.

So what is the best tool in TinkurLab’s workshop?  A Dremel!  Hands down!  Well, 1 minute quick drying epoxy is a close second, but let’s save that for another day.

It can cut.  I can grind.  It can drill.  It can route.  It can sand.  It can polish.  It’s pretty small.  You can get new bits cheap.

So how did we get to this epiphany?  I recently completed a small project to update my timelapse panning timer – affectionately named TinkurLapse.  TinkurLapse rotates my GoPro camera as it takes a photo every few seconds, creating a panning timelapse video.  My original timer was basically a $2 Ikea kitchen timer with a ¼”x20 screw glued to it to screw into the GoPro’s tripod mount.  BTW a standard camera tripod mount takes a – you guessed it – ¼”x20 screw.  Remember that for your next trivia night.  Anyway, in the spirit of most Tinkurlab projects, the goal was to get a minimally viable product out the door quickly to start really learning about it and to make improvements.  “Learning by doing” in other words.

TinkurLapse Panning Time-Lapse Camera Timer

And learn I did.  While the first version of TinkurLapse worked, it had a few issues.  First and foremost, having a tiny base, relatively high height, and very light weight resulted in an unbalanced base for the GoPro which easily fell over.  Many early experiments resulted in setting the camera up for a 60 minute timelapse only to return after an hour to find the camera lying sideways rotating the timer under its base.  Pretty uneventful video! The other issue was its size.  While it wasn’t huge, it wasn’t small either.  Given that most of my GoPro shooting occurs during travels and adventures like hiking, skiing, etc, it would be ideal to make the panning timer as small as possible.  While the first version of the panning timer worked, I didn’t use it very much.  It just wasn’t good enough for me.  I value it provided didn’t overcome the cost of using it.  My goal of creating awesome panning timelapse videos was blocked.

So one day while aimlessly wandering the Internet, I decided to search for a prebuilt device.  I know – it was a moment of weakness.  How un-DIY of me.  There are not very many panning timelapse devices on the market (at least not under less than a few $100s for professional use), but while browsing through the catalog of Photojojo, I came across the Camalapse.  However, aside from the $30 price tag, it has the same problem as the first version of TinkurLapse – not stable enough.  Camalapse is only 2 ounces, with a small base.  A featherweight.  However, it does support mounting to a tripod to provide a more stable base, so it has potential.

After knocking some sense into myself, I set out to research ways to improve the initial design.  I found a great video from a serious panning timelapser, who posted a great tutorial.  The tutorial suggested using the same Ikea kitchen timer I used in the first version of TinkurLapse – no problem, I bought 3x just for this reason.  The tutorial also had some other great ideas – remove the done bell as to not scare all people and wildlife in 1 mile radius, and mounting the timer to a Gorillapod tripod to provide a more stable base.  Perfect!

Enter the Dremel.  After some drilling, grinding, and gluing I had completed version two of TinkurLapse.  On to testing.  The initial test run resulted in rotation of about 90 degrees before stopping.  After some investigation, I determined that excess glue and some of the timer’s parts were obstructing the rotation of the GoPro mount.  What to do?  Dremel it!  After some precise grinding and sanding, I had trimmed down the responsible obstructions.  The next test passed without issue, even removing the annoying done bell at the end.

TinkurLapse v2 is ready for some more real world testing!  I’m looking forward to a few upcoming skiing trips to use the new TinkurLapse.  I’ll post some videos.  Until then, happy tinkering!

Example Timelapse Video 1

Example Timelapse Video 2



Tagged , , , ,

“Sprint to Success” and Other Agile Stickers and Swag

Another project completed!  What does it do?  It sticks to things and looks cool.  That’s right – stickers!

I haven’t done much design work lately, so I recently fired up my new Adobe CS6 Suite tools to create some cool stickers to promote agile and agile practices.  In addition to working on Tinkurlab projects, I happen to be a Scrum Master for agile software development by day – working on projects to create websites, mobile websites, mobile apps, other interesting things.  And I’m a huge believer in agile principals, methodologies, and tools – from Scrum to Extreme Programming to Kanban to the collective knowledge and experiences of all the great agile doers out there who get stuff done done with agile.  Anyway, here are a few of the stickers; you can check out the full collection in the Cafe Press store (and buy them as well).  Stick them everywhere you can!  Enjoy!

Check out the full collection at




Tagged , , , , , , , , , , , ,

Das Bot 2.0 – Now with more beer!

How quickly time goes by.  It seems like we only just completed Das Bot v1.0, but with Oktoberfest 2012 quickly approaching we started one of the biggest projects we’ve completed to date – Das Bot 2.0.  Instrumented beer on a grand scale!

The final setup, ready for the party to start.


Das Bot is a system for monitoring and controlling access to beer through RFID tags. Built on top of an internet-connected Arduino, the system accepts an RFID tag, checks to make sure you’re registered, opens the solenoid valves in the beer lines, lets you pour a beer and monitors how much you’ve poured, saves the data to a database, and prints out a receipt. Oh, and there’s prize badges you can win as well. There were three beers on tap this year (a homebrewed Dunkelweizen, a homebrewed Hefeweizen, and a Hofbrauhaus Oktoberfest) and each beer was tracked independently.

The Hardware

Das Bot contains the following pieces of hardware:

  • Arduino (with Ethernet shield) – the brains of the operation. This micro controller is what reads the RFID tags, talks to the PHP/MySQL site, controls the solenoid valves, prints to the thermal printer, and reads the data from the flow meters.
  • RFID Reader – reads the values from the RFID chips and sends the value to the Arduino.
  • 3 Solenoid Valves – similar to the ones on Adafruit’s site, these valves are normally closed (restricting access to vital beer) and are only opened when the Arduino gives the go ahead. After 10 seconds of no beer flowing, they close again. Since these draw more current and run at 12v, we used an old 12v wall wart we had laying around to power these (through the relay).
  • RelayThis relay controls the power to the solenoids.
  • 3 Flow Meters – we used the ones from Adafruit to send the flow data to the Arduino.
  • Thermal Printer – printed a welcome message, current stats, and final pour total for each pour.
  • Electrical Box – from the big box home improvement store, this water (and beer-proof) project enclosure was perfect for housing the Arduino, printer, and other electrical components.
  • RGB LED – when the light turns blue, pour your beer
  • Piezzo Buzzer – something this complicated needs to beep. Ours beeps when an RFID is successfully read.
  • Jockey Box – this converted cooler has a 7-pass plate chiller inside and once covered with ice, chills the beer as it flows through. This means no need to keep the kegs in giant plastic tubs with 800lbs of ice.
  • Tap Handles – no jockey box is complete without custom milled tap handles.
  • The Override Switch – this can not be over-appreciated. Buried in an undisclosed location was a switch that would override the arduino and open the solenoid valves. In the event of catastrophic failure, this is the switch represented the difference between beer and no beer. I’m always going to support the side with beer.

Closeup shot of the solenoids

The override switch. Luckily, this wasn’t needed this year. But it’s nice to know it’s there.


The Software

The hardware was almost the easy part of this project. We had experience with Das Bot v1.0, so adding some additional sensors wasn’t too difficult. The hard part was getting everything to talk to each other at the right times, with the right data.
Here’s what the software side looked like:
  • Arduino code – this is the air traffic control system. When an RFID chip is read, it sends the data to a web service and gets back the user’s current status. If they’re not registered, they get one (and ONLY one) free beer before they’re required to register. The flow meters are opened and activity from the meters is recorded. After 10 seconds of no flow, the system closes the valves and sends the pour volume data to the web service. The Arduino then prints out a receipt listing pour volumes and any badges that were won on this pour.
  • PHP/MySQL – a website used to store and present data during the party. The web service components were built using some simple PHP with a MySQL back end. The dashboard (running on an iPad taped inside the kitchen window during the party) presented current keg stats, leaderboards, badge summary, and other interesting bits of info. We also included the calibration for the flow meters in the database to allow for different keg sizes and to help more accurately record the data.

The welcome message displayed once an RFID tag is scanned

 The Dashboard

Want to become mayor of the Hofbrauhaus? Brag about having the largest drinking vessel? Why not turn an entire party into a drinking game? With all of the data we were collecting, it seemed natural to present this information back to the user. The thermal printer can only present so much data. The kegs were also under the table, making the “just lift it to see how much is left” method rather difficult. So, we created the dashboard to give a quick way to see how much fun we were having (note to self: next year, add a “fun” meter).

The dashboard presented the current leaders, the amount of beer consumed for each keg, the 5 most recent pours, and some other random stats. Some badges were mysteries, only visible once unlocked. Others were hinted at by the icon. Either way, the best way to win a badge was to drink beer. Actually, that was the only way.

How much fun are we having right now? Oh, THAT much. This was displayed on an iPad safely taped to the inside of the kitchen window. It was visible from the taps.

Future Enhancements

Some ideas for the 2013 Oktoberfest:

  • Integrate the photobooth – haven’t been inside the booth in the last hour? No beer for you!
  • More badges to win – need target different needs in people’s psyche, not just the “I drank more than you did” desire
  • Allow “offline” badges – someone won the beer stein race, but we’ll never remember who it was. We’ll need a way to award spot badges from mobile devices.
  • More notifications when a badge is won – I’m thinking car horns, disco balls, or fireworks. Perhaps all three.
  • Breathalyzer integration – imagine tracking this against the volume consumed overlayed with the photobooth pictures. None of our friends will ever be politicians.


Additional images from the project:


RFID chips. Everyone got one. There were also zip ties to attach the chips to your beer stein.

The custom tap handles came out well.

The system, all condensed.

Water and electricity don’t mix, so we taped the electronics inside the cooler to the lid.

Additional photos can be found on Flickr




*Disclaimer – Please note that this system was built for responsible adults. EVERY person in the “leader boards” either spent the night (and likely much of the next day) at the location or were driven home by a designated driver. We might mix water, beer, and electricity together from time to time, but we certainly don’t drink and drive.

Tagged , , , , ,

Four Frames Photubooth

I love photographs. Their ability to capture a single candid moment of life. The play of light – black, white, shades of grey. Reminders of the people, places, and things that make life special. Ever since my friend Jim introduced me to photography as a teenager, I’ve had a special place in my heart for photography – taking pictures, post processing and darkroom, incorporating photography into my daily life and adventures, collecting vintage cameras, pushing myself to become a better photographer.  Out of all my photographs, the ones I enjoy the most are candid shots of family and friends. So I suppose  its a logic extension that I have a special interest in photobooths – the ultimate candid moment maker. Four Frames – four frames of uninhibited glory to do whatever you want. So with that love of photography and photobooths, TINKURLAB’s newest creation is the Four Frames Photobooth.

Four Frames Photobooth

A modified a dryer duct diffuser provides a finished opening for the camera lens. The extra room in the opening enables adjustment of the camera height and angle for different shooting situations.

The Four Frames Photobooth is based on an earlier photobooth named Das Booth created for our 2010 Oktoberfest party – “Fest”. Das Booth had no housing, with all the components freely exposed – a Nikon D200 digital SLR camera, a netbook computer, an Alien Bee 400 watt studio strobe, DIY Photo Bits software, and of course a big button. All this gear was setup in a small shed attached to our house (from the 1950s – it has odd storage locations). We also spruced up the inside shed, hanging black fabric on the walls and adding a small bench for those who didn’t want to hang upside down, through the door, do handstands, etc. After entering the booth, partygoers pressed the button, struck a pose, and took 4x pictures. After a minute of inactivity, a slideshow of random photos began playing on the screen – almost as popular as the actual taking of photos. The photobooth was a hit, and ever since has been an staple of Fest.

Four Frames Photobooth

Photostrip catch basket catches photostrips as they leave the printer, awaiting pickup by event guests.


Fast forward to 2012, Val and I had 4 weddings to attend in 2012, three of which were interested in having a photobooth. So as Matt and I started talking about all of these upcoming weddings, his among them, we decided to take Das Booth to the next level – to build a photobooth that would be of high reliability and quality (aka pretty to look at) for use at his own weddings. That seemed like a good high level acceptance criteria. We continued to discuss “must have” features, and decided on the following:

Automated Photo Taking

  • Show descriptive “how to start” instruction on screen
  • Press button to start
  • Take four photos
  • High quality photos and lighting
  • Save original photos and photo strips to computer

Print 2x Photostrips

  • Print 2x photostrip of four photos
  • Photostrips must be 2″x6″ (not 4″x6″ requiring manual cutting)

Highly Reliable and Self Sustaining

  • Zero failures during event usage
  • Take, store, and print 300+ photostrips of 4 photos each without materials replacement (paper, ink) during 5 hour event


  • Able to be set up in 30min or less by one person
  • Able to be torn down in 30min or less by one person
  • Must fit in a mid sized SUV

Well Packaged

  • Look good
  • Look professional
  • Something we’d want at our own wedding / event and would pay money for renting

We also kept a backlog of other “nice to have” features that may be implemented in the future.

So with our features identified we set a deadline of the end of March 2012 to have the new photobooth fully completed and tested to ensure ample time for the bride and groom’s to make other plans if the photobooth wasn’t ready in time. And as things often go, we started working on the photobooth in mid April 2012 – two months before the first wedding, and well after our deadline. Hey, it was ski season!  Gota get in the turns while you can.

Four Frames Photobooth

Locking wheels provide for mobility to and from the event location. A single 30′ power cord provides an umbilical for all power in the photobooth and is long enough to deal with far away electrical outlets – a common challenge at events.

Development and Testing

Because I already had a lot of confidence in the photography and automation aspects of the photobooth, our initial focus were on the largest risks:

Packing (the housing for the photobooth) took the most time of the project. We were trying to keep the costs down, so we were constrained by finding materials that looked good, were durable, but could also breakdown for our transportation and speed requirements – all at a reasonable cost. Matt, Val, and I all set out working on designs – together and independently, finding examples of photobooths that we liked, creating sketches, and periodically reviewing together.  In terms of material, we initially gravitated towards 80/20, dubbed the “industrial erector set, a system of aluminum stock and connectors that all work together to build almost anything. After learning a bit about 80/20 through online research, Matt and I created a specifications and a parts list. 80/20 is generally only sold through resellers, one of which offered to created a CAD schematic to validate the design – ours was spot on. After receiving quotes, the total cost for just the housing was coming to over $3000 – over our budget. The most expensive component were acrylic panels that would form the sides, top, and bottom of the photobooth. Realizing that spending so much money on a material we had never worked with, combined with the cost and looming schedule, I was hesitant to proceed. I also wasn’t happy with the look of the material – the design was busy – not simplistic and clean enough. So we did that anyone would do in such a situation – Matt, Val, and I went to Ikea and didn’t leave until we found the best possible solution – a large white cabinet of wheels that separated into two halves with a window on the top for the flash. About $200. Perfect. The exercise provided us a great constraint to work with what was available, and allowed us to move forward. We can always change the packaging in the future, after we’ve had some real world testing to learn more about the pros and cons.  We also decided to make the photobooth “open”, not having any enclosure for partygoers.  This is also something we can add in the future, but during testing we actually found out that allowing people waiting to use the booth to see people using the booth can actually create excitement and boost usage. Check.

Das Booth was fairly reliable. But sometimes it locked up. Or crashed. Maybe one or twice during a party – but still too frequently for someone else’s event. It was also important to us that the photobooth be highly reliable, not requiring any maintenance during an event. Given the looming schedule, we decided to buy a reliable and cost effective photobooth software package. While we will certainly want to do custom scripting in the future and may develop our own software, we felt the best decision was to invest the $150 rather then potentially invest $1000s of our own time without having enough real world testing to learn more. After a few rounds of testing the software, we confirmed it was rock solid. Check.

The last major area that needed presented a risk was the photo printing. After consulting with a friend who is a sports photographer and does onsite printing, we decided to buy a HiTi dye sublimation printer – that same type used in professional photo labs. The printer uses a roll of paper which is capable of printing 330 4″x6″ photos without replacing ink or paper, and has an average print time of 12 seconds. As an added bonus, the printer also cuts a 4″x6″ photo into two 2″x6″ photostrips. Perfect. Check.

The first integrated test of the photobooth occurred one evening when George and Matt, two of the grooms, were over for dinner. What better way to convince potential clients then a demo! After setting up the gear in the middle of our living room, we took a few test shots. Awesome! I love how everyone just knows to act crazywhen there’s a photobooth. Both “clients” were convinced and we also got some great photostrips as well.

Four Frames Photobooth

The finished photobooth, complete with flash diffuser, camera, touchscreen, and photostrip catch basket (left).  A very clean design.

More to come in another post about alpha and beta testing (aka weddings), example photostrips, and what’s next. Stay tuned for posts in the near future.  Until then, check out


  • Ikea Cabinet
  • Fluorescent Light Cover Material (for flash diffusion)
  • Nikon D200 camera and 28 f/2.8 lens
  • Tripod Ball Head (for mounting camera to shelf and providing adjustability)
  • Dryer Duct Diffuser (for camera lens cut in cabinet)
  • Alien Bee 800 watt Studio Strobe
  • Lug Bolt and Nuts (for mounting flash to shelf and general in cabinet mounting)
  • Asus Netbook Computer
  • Photobooth Software
  • HiTi Printer
  • HiTi Paper and Ink
  • Wire Basket (for catching photostrips)
  • Power and Data Cables

Four Frames v.Next Potential Features

  • Interaction with social media (Facebook and Twitter)
  • Allow users to tag photos or automatically tag using RFID or NFC
  • Create interaction with other products (ex. Das Bot)
  • Gamification
  • Allow users to request reprints
  • Taunts (when inactive, taunt users to take photos)
  • Other Activation Methods (sound, motion, face detection)
  • Random Timing (take random number of photos and/or random timing)



Tagged , , , ,