Where’s The (ele)Vator?

Demo of my hackathon to recommend which elevator to select at work.

Tinkur Park Assist


Val and I recently got a new car – a Subaru Outback.¬† The 12 year old Subaru Forester was still doing ok, but it was time to get a new car with better safety features.¬† However, the new Outback was a bit bigger – length and width.¬† And since we’d used up a significant¬†portion of our garage space for Tinkurlab’s workshop, I wanted to park the Outback as close to the garage door as possible to leave maximum room in front of the car to walk between the workshop and our house.¬† What to do?¬† Hang a tennis ball from the ceiling?¬† Not for a maker!¬† Time for a new project!

Introducing Tinkur Park Assist, a project to help you park your car irresponsibly close to the garage door, with only inches to spare.

“a project to help you park your car irresponsibly close to the garage door, with only inches to spare”


Tinkur Park Assist is pretty simple, consisting of an ultrasonic range sensor to determine the distance between the wall and the car, a big LED for feedback about the distance of the car from the sensor, and an Arduino to make sense of it all.  I initially used an IR distance sensor, but I found that an ultrasonic sensor works much better for the car which is highly reflective and curved.  It seems accurate to within an inch.

I also had the opportunity to design my own housing for the project to hide all the messy wires and electronics.  I chose to 3D print the housing, which was much easier vs. previous housings that were constructed of acrylic milled with a CNC machine.  After a few iterations of the 3D model design, I was able to create a housing that has openings in all the right spots and has an easy to add / remove snap-on lid.

How it Works?

Tinkur¬†Park Assist continuously monitors the distance between the ultrasonic sensor and whatever is in front of it.¬† If the distance hasn’t changed in a while, the LED light turns off.¬† When the distance starts changing, the LED light turns yellow¬†as the object in front of it gets into close range (< 5.5 feet in this case) and turns green when the object is in the ideal range (30 to 38 inches from the sensor in this case).¬† If the object is too close (< 30 inches), the LED turns red.¬† Tinkur Park Assist also saves the 3x last distance values, using the median value for making decisions¬†to reduce false positives from random fluctuations in data (ex. a person walking in front of the sensor).

What’s Next?

I’ll give some time to test Tinkur¬†Park Assist.¬† I think likely iterations may include:

  • Tweaking trigger distances.
  • Increasing the sampling rate for faster LED changes.
  • Tweaking the “no motion detected” logic and thresholds to make sure the LED is off when a car isn’t approaching.

How to Learn More?

Check out the docs and source code at https://github.com/TinkurLab/TinkurParkingAssist.

Check out the 3D model at https://www.thingiverse.com/thing:2836728.

Tagged , , , ,

3D Print Pegboard Tool Holders

It’s helpful to have a well-organized workspace.¬† Knowing where to find a part or a tool saves time and frustration (not to mention saving money by not purchasing a tool only to realize you already had one).¬† And having a clear area to work helps me to focus on the task at hand and improves the quality of the result.¬† I’ve been working to create a better workshop space since we moved a few years ago.¬† It’s coming along nicely with a workbench, pegboard, lots of storage, and an increasing number of tools and parts.

Getting the workbench organized

A post shared by Adam Z (@tinkurlab) on

That said, I still need to find a home for a few things –¬†small screws and fasteners, a few hand tools, and especially microcontrollers and associated small electronics parts.¬† There was extra space pegboard and I decided I wanted to hang some frequently used hand tools – files, small screwdrivers, etc – for quick access.¬† What a perfect project for TinkurLab’s new 3D printer!

I started by trying some existing 3D models from Thingiverse, however, these didn’t fit into my pegboard which is¬†¬†3/16″ holes spaced every 1″.¬† So I decided to do what any maker would – design my own ūüėČ

A co-worker who also has a 3D printer recently told me about using Tinkercad for creating and editing 3D models.  Tinkercad is an entirely web-based CAD editor which works on the premise of using simple shapes Рboxes, spheres, etc Рcombined to make 3D models.  A shape in Tinkercad can either be sold (additive) or a hole (subtractive).  Combined with a few simple tools for aligning, joining, and measuring, Tinkercad seems like an easy to use tool for most basic 3D modeling needs.

Knowing I’d likely need to iterate on the design a few times (aka trial and error), I decided to¬†start by 3D printing the pegboard hooks on a small connective box.¬† This allowed me to test the riskiest assumption quickly – the design, size, and spacing of the pegboard hooks.¬† By only printing the hooks, I was able to print the part much more quickly without wasting 3D filament or time.¬† After testing, the hook size and spacing was correct but the hooks needed a bit more vertical material to ensure they’d stay attached to the pegboard.

After adjusting the model, I printed a full 3D model of my small tool holder which was intended to hold small screwdrivers and drill bits.  The full 3D print was a success with clean and sharp edges.  However, when trying to hang it on the pegboard, I realized the hooks were too low on the back of the part.  So as to not waste more time and material, I used a saw to remove a bit of the extra material and adjusted the 3D model for future prints.

I hope to make a few more pegboard holders over time as the need presents itself.  With the pegboard hook design validated, I can now quickly iterate on existing designs to meet additional needs.

You can find all my 3D models on Thingiverse, including the pegboard holders:

Small Tool Pegboard Holder


Large Tool Pegboard Holder


Box Pegboard Holder



TinkurLab Goes 3D!

TinkurLab finally has it’s first 3D printer – a Anycubic¬†Kossel Linear Plus.¬† It’s a $300 kit build-it-yourself¬† printer.¬† Learning to use a 3D printer is a journey.¬† It takes trial and error to learn about a printer and find the settings that work best for different types of 3D prints.¬† We’ll be keeping notes and 3D models on GitHub at https://github.com/TinkurLab/TinkurLab-Anycubic-3D-Printer.¬† Follow along!

3D Printing #LearningByDoing

A post shared by Adam Z (@tinkurlab) on

Every Idea Needs a ???

Demo of my hackathon to create an interactive LED display that allows people to add and remove words to a public wall art installation.

Chatbot Pull Request Bumper

Demo of my hackathon to create a Pull Request bumper for Hubot that shows open GitHub Pull Requests that were mentioned in a team’s chat flow.

Chatbot Pull Request Watcher / Notifier

Demo of my hackathon to create a Jenkins Build Watcher for Hubot that watches an active build in Jenkins and provide updates when the build completes.

Chatbot Out of Office

I haven’t shared many new projects¬†recently, but that’s because I’m been hacking at work – at CA Technologies (formerly Rally Software).¬† Every 3 months, we take a week to hack on something that we feel is valuable to the company.¬† The following are a few of my most recent hacks.¬† Enjoy!

Demo of my hackathon to create an Out of Office for Hubot that lets people know when you’re out of the office or busy:


TinkurWash – A Talking Dishwasher

I love technology because it enables new ways of solving old problems.

TinkurWash HipChat

Working in an office with only a single kitchen and 50+ busy software engineers, testers, and designers, my coworkers use quite a few dishes throughout each day. The kitchen is the hub of the office – a communal space for eating, talking, and taking a break. However it’s also easy for dishes to pile up, especially since there’s only one dishwasher. ¬†To maximize the capacity of the dishwasher its important to make sure it gets loaded, washed, and emptied as soon as possible so its ready for the next set of dishes. While most of my coworkers help with the dishwasher from time to time, its use isn‚Äôt always optimized with dishes stacking up on the counter and in the sink. ¬†Someone may not realize the dishwasher is full and needs started.¬† Someone else may think the dishwasher is still washing when really its dry and needs unloaded, especially since the office dishwasher‚Äôs status light is on the top of the door and the dishwasher is fairly quiet.


I wanted to give the dishwasher a voice – a social experiment. If the dishwasher could talk to people – telling them when it needs run or when it needs unloaded – would it help optimizing the flow of dishes? Most people want to be helpful, but sometimes they need better instrumentation and information.

TinkurWash v1.0.0

I started prototyping TinkurWash earlier in the year.  The initial concept was to instrument the dishwasher using vibration, temperature, tilt, etc to deduce when the dishwasher is in its various cycles. I wanted to instrument the dishwasher in a non invasive manner, allowing the solution to be added to an existing dishwasher without having to wire directly into the dishwasher. I decided to use an Arduino as the base platform, also deciding to use the Adafruit CC3000 WiFi shield as this project needed to be located near the dishwasher potentially far away from wired networking connections.


The initial prototype used a temperature sensor for heat detection, a piezo sensor for vibration detection, and a tilt sensor for detecting if the door is open, and a RGB led to provide visual feedback about the dishwasher’s status. This was my first time working with a piezo sensor and tilt sensor. When working with new sensors, I start by writing a small unit of code that demonstrates the capabilities of the sensor. I save this sketch in a unit test directory of my project. This not only helps me to learn about the sensor, buy also provides documentation for future reference and a test in case there are issues in the future. These unit examples are especially useful when debugging the sensor after it’s integrates into a larger code base with multiple sensors and other hardware components.


After integrating the unit examples together, the next step was to learn how to use this instrumentation to determine the state of the dishwasher.  I temporarily mounted an Arduino with sensors to the dishwasher. I ran the dishwasher and recorded a log of sensor readings over time to understand the values that occurred during washing, drying, unloading, etc. Vibration steadily increased as the dishwasher began fling with water, washed, and rinsed the dishes. Temperature rose more slowly, peaking part way through the washing and rinsing cycle and continuing through the drying cycles. So how to use this information?


I outlined the questions I needed to answer.


Is the dishwasher running?
When the dishwasher is not running, there is very little vibration and it occurs inconsistently when it does occur.  These random vibrations might occur when opening the dishwasher to add dirty dishes, opening an nearby cabinet, or even walking nearby. However when the dishwasher is washing and rinsing it generates significant and fairly sustained vibration over a long period of time. However, the levels of vibration can very between different dishwashers, so I implemented a function to baseline the ambient vibration when TinkurWash boots up. I also implemented a median library and function which records the 10 most recent vibration readings, using the median value to eliminate outlier data. When the median vibration is greater than 3x the baseline vibration, the dishwasher is assumed to be in a running status.  The LED also changes color when the dishwasher is in a washing status.


Is the dishwasher drying?
When the dishwasher is drying, vibrations return to near baseline levels, however temperature continues to remain high during drying. While a temperature sensor did provide the ability to measure temperature and dedice the drying cycle length, it also required mounting the temperature sensor fairly close to the dishwasher. After some consideration of the best mounting options, I decided to remove the sensor. From a user’s perceptive, they could remove the dishes from the dishwasher after the washing cycle and dry the dishes by hand – a realistic scenario. Therefore, I added another state to differentiate between washing and drying, changing the LED color as well to provide a visual indicator so a user can take action if desired. ¬†Since I removed the temperature sensor, I simplified the drying status using a 60 minute timer to approximate the length of the drying cycle. While I may add a temperature sensor in the future, the timer solution seemed adequate for an initial minimal viable product.

TinkurWash Beta Testing at Work

Is the dishwasher done and needs unloaded?
When the 60 minute timer completes, the dishwasher is assumed to be in a clean status and ready to be unloaded. Using a tilt sensor, I could determine when the dishwasher door was open. Based on timing my own usage, it seemed to take me at least a few minutes to fully unload the dishwasher. Therefore, similar to the drying state solution of using a timer, if the dishwasher door is open for more than 60 seconds it’s called beside red to be unloaded.


Is the dishwasher ready to be loaded with dirty dishes?
This one is a bit trickier. How does one measure when a dishwasher needs to be washed. ¬†As a user, you‚Äôll probably know that you like to run the dishwasher every night after dinner or just have packed it full of dishes and know it needs washed. ¬†For now, TinkurWash provides visual feedback via its LED that it’s ready for dirty dishes and washing, however, it’s the users responsibility to run it. In the future, I anticipate using data collected from the sensors to determine the users patterns and proactively ask them if the dishwasher needs to be run based on those patterns.



There are a variety of ways TinkurWash can communicate with users.
TinkurWash has a large diffused RGB led so users can easily see its status from just a glance.

TinkurWash Status Colors

In addition to providing glanceable visual feedback about the status of the dishwasher, it is also integrated with our company’s chat tool – HipChat. Each of our teams had their own HipChat room in addition to a whole company chat room used for questions, news, or just chatting. TinkurWash posts messages to the company wide chat room when it starts washing or finishes drying, providing real time information that will hopefully help my coworkers take care of the dishes.


Every 30 seconds TinkurWash connects to Xively, a service for storing and retrieving IoT data.  TinkurWash stores the median vibration value, the tilt value, the dishwasher door status, the dishwasher status, and an uptime value since the last reboot.  These values are useful for debugging, are used with another integration with Zapier to post messages to HipChat, and also store the data for future use in algorithms to determine when to recommend running the dishwasher and other potentially other insights.

Learning and Pivoting

TinkurWash has had many pivots along the way Рas most projects do.  While I plan to discuss some of these in more detailed standalone posts to provide lessons learned, , the following major pivots occurred:


After having issues mounting and monitoring vibration using a piezo sensor, I switched to using a 3 axis accelerometer. ¬†A¬†accelerometer can be used to measure movement over time, which provided to add an even greater level of granularity to the vibration instrumentation. ¬†The accelerometer also replaced the tilt sensor, providing the ability to determine if the dishwasher door is tilted and again providing much greater granularity.¬† While the accelerometer ($15) is 700% the cost of a piezo ($1) and tilt ($1) sensors it’s much more reliable and is still a very acceptable costs for a hobby project.¬† While the outcome was much better, refactoring hardware + software is somewhat more involved than refactoring software alone.


I finally wanted to have a proper housing for this project. In the past, I’ve used boxes or storage containers as a poor mans housing for my projects.  I had cutting acrylic with my CNC machine in the past, but hadn’t made a useable housing for a project.  After having the opportunity to see the Adafruit Raspberry Pi Thermal Printer housing when assembling a printer kit, I saw how awesome an acrylic housing can be and an example of how to fabricate one.  After a few pivots of the design using cardboard in inlace of acrylic, I fabricated a slot fit acrylic housing, learning lots of lessons Рand breaking a few bits Рalong the way.  I also hope to write another poshope to write another post on this topic in the future.


After getting TinkurWash‚Äôs sensors and code fairly reliable, I started noticing it stopped posting data anywhere from a few hours to a few days. ¬†After reading around the internet about the CC3000 WiFi chip, I read about similar stability issues. ¬†After trying a few different solutions, including a firmware upgrade, I ultimately implemented a watchdog timer that resets TinkurWash if a successful network connection isn’t made every 60 seconds. ¬†Before resetting, TinkurWash stores it’s current state into non volatile EEPROM memory, reloading the state variables from EEPROM after rebooting.

Source Code



What’s Next

While I certainly have some ideas for new features to enhance the smartness of TinkurWash, including more advanced algorithms using historical data, for now my primary focus is beta testing in the office to monitor stability, learn about any unanticipated real world scenarios, and collect user feedback.

The Future of Hardware, Software, and The Physical World – Takeaways from O’Reilly Solid 2014

Last week, I attended the O’Reilly Solid Conference, focusing on solid Рthe intersection of hardware + software + physical things. While hardware and software have existed for decades and are mature in their own rights, it is often the intersection of disparate things that creates innovation though collisions of innovation. And so over 1,400  curious people gathered together to collide.

I wasn’t sure what to expect of conference. ¬†I am passionate about hardware + software and the new possibilities for interactions and solutions that it enables. ¬†And while wasn’t exactly what I thought it would be, it surprised, delighted, and taught me, leaving me hopeful and inspired in the future of solid.

While I’ll share some focused takeaways and observations in the remainder of this post, perhaps the thing that made the biggest impression on me was the diversity of the attendees and speakers. From professors to mechanical engineers to startup founders to artists to hackers to industrial designers to the just interested, solid is well poised to collide ideas to enable new and unexpected outcomes. It will be interesting to see the collisions it creates in the future, as well as who composes the community in the coming years.

After attending a diverse set of sessions and chatting with many attendees, the following takeaways standout for me:

  1. Don’t make a better solution for an unnecessary process. Focus on the user’s desired outcome and make a solution for that. Hardware + software enables new solutions that were hard or impossible previously. ¬†Think about how things should work, not how they do work. This may mean remaking or even eliminating a process. Disruptive change.
  2. Hardware should know us. And it shouldn’t require a separate identity for each device. It should know our preferences and learn about us, no matter where we are. We need single sign on for the physical world. We should be able to interact with the whole world, not just a lightbulb in our living room. ¬†The entire would should be a continuous interaction.
  3. Making is still too hard, but lots of people and companies are working hard to make it easier. ¬†There is a huge complexity difference between 3D printing and CNC. Additional complexity is free in 3D printing while it’s not in CNC due to extra fixturing, rotation, etc. Also new making machines and materials are enabling new solutions like combo CAD / CAM / CNC / Laser / 3D printing all in one.
  4. Most remaining problems in the world are physical and require a physical solution, be that hardware + software / etc, to solve them. Software can partially solve it, but can’t bring a full solution to bear alone.
  5. We have tons of gadgets that don’t interact with each other. They need to be able to interact. Users want outcomes not brand specific ecosystems and proprietary closed solutions.
  6. Prototypes spark conversations. Build hardware prototypes fast, fail fast, fail often = more time to iterate and make it great. Sometimes the prototype is just a conversation starter Рa way to get other people sharing their perspectives, even if they drastically change your initial direction.  Also, firmware can be used to dramatically iterate a physical product.
  7. You are the button. Hardware enables new methods of interaction. Maybe it’s where you are. Maybe it’s where you aren’t. Maybe it’s where you’re pointing. Maybe it’s who you’re with. Maybe it’s tapping one device to another. Maybe it’s flicking content from one device to another. Reimagine. Be playful. Some things will stick, the rest will be fun.
  8. Hardware can be soft. Just because something is physical doesn’t mean it must be rigid and frozen. Fabrics and flexible materials enable soft hardware, much like humans and animals with skin, mussels, and bone. ¬†And often these are simpler to implement.
  9. Some promising tools and services:
    • Temboo: A service for orchestrating the Internet of Things, offering integrations with 100s of APIs and 1000s of API Calls. ¬†Helps to limit the resources needed on¬†limited resource embedded devices.
    • Mellow: A home sous vide machine for cooking food, design more like the Nest in terms of thinking about real use cases you care about. ¬†Examples: It keeps food cold and starts it later in the day so it’s ready when you arrive home. ¬†It asks you how you liked your meal and learn about you to better suite your needs in the future. ¬†I love things the speak, and Mellow is a great example.
    • Node Red: A visual editor for Node.js to orchestrate interactions between the Internet of Things.
    • MQTT: A broker for publishing and subscribing to data using a lightweight protocol, limiting the resources needed on limited resource embedded devices.
    • noam.io: A service for rapid hardware prototyping through easy data storage.
  10. We’ve come so far, but we are only at the beginning… Some of these things may take years or decades to mature, but the attendees of Soid are leading the way.