|Hand tools and fabrication machines:|
We're making Physical Visualizations of data that present information in a large format, super cool, instantly readable way. The concept is that you'd hang a set of FizViz widgets in your office, workshop, or wherever you want to watch and share data that matters:
- How many products did I sell today? How does that compare to my average?
- How many people visited my website? How many pages did they view?
- Am I getting more traffic because of my recent cat video post, or is everyone bouncing because it had nothing to do with my product?
Or, hook it up to other data sources:
- How much time is left in my 3D printing job?
- How many people are here?
- How many Challenge entries have already been submitted for the Hackster World's Largest Arduino Challenge?
Last year, our team created and launched our first "real" product. We designed, tweaked, crowd-funded, built, re-designed, certified, laughed, cried, swore, and ultimately..... shipped a product. Way harder than we thought (but that's what everyone says).
Then... We began the obsessive metrics watching. How many people visited our product page? Our store? How long did they stay? How did they get there? What happens when we tweet, blog, post, and share? Why the heck did we just sell 10 units when we weren't doing any of those things?
Enquiring minds wanted to know.
Even though we're a dedicated team, not everyone had access or interest in meticulously combing through Google Analytics trying to answer these questions. And, those of us that did found that we ended up looking up the same key analytics, sometimes many times a day. Often, they didn't change much when we looked, or changed a lot when we weren't looking.
Obviously, there are no shortage of online tools and systems for filtering, summarizing, and mashing data in every shape and form. But, they take you away from your flow, and require (somewhat arcane) knowledge of the workflow to get to the things you're interested in.
And, frankly, they're not all that exciting.
They don't get people around the office cheering. They don't broadcast the accomplishments of the team, and the rush of seeing success pile in. They're sterile, digital, and usually solitary experiences.
How does FizViz work?
A FizViz Widget consists of 3 components:
1) A Windows PC or Tablet (we love the Surface) that harvests your data and uses Windows Remote Arduino to send the current state to the FizViz Widget.
2) An Arduino MKR1000 that receives the data from the PC via WiFi and drives the physical controls on the FizViz Widget.
3) The physical components that display the data. Currently, we've got support for:
- NeoPixel Light Strips for coloured LED effects
- Stepper Motors for creating dials and gauges
- Switches for Zeroing or Calibrating Your Gagues (we use a reed switch to find zero on our RotoMoto FizViz Widget)
Basically, the PC does the heavy lifting - pulling data from your data source (we've included source for harvesting Google Analytics) and then sends over state and commands to the Arduino that drives the physical installation.
We've provided all the schematics and info for getting a basic NeoPixel widget with a stepper motor up and running. After that, you can be as creative as you want.
Our vision is to keep building different widgets for different types of data. We've started with one example, but FizViz is really about making the right visualization for the type of data you want to show. There are no rules!
Wiring up a FizViz is fairly straight forward. Our latest schematics are always found in the FizViz-Electrical repository on GitHub. Here are a few notes on the components:
- Arduino MKR1000 - The brains of our operation. Not too much to say here except that it's small, and works great!
- NeoPixel Strips - Connecting to NeoPixel strips is pretty straight forward - we use an 460ohm resistor (R1) between the data pin and the Arduino. Then, typically, we wire the power supply for the strip straight into our main 5v power supply for the system. Adafruit's NeoPixel Uberguide is the bible when it comes to integrating NeoPixels, and includes an Arduino library you can use in your project to simplify control. Strips may have two ground wires (black). They both get connected to a ground pin.
- Adafruit TB6612 Breakout Board - Controls any typical stepper motor. Really cool for making things that move accurately such as dials, gauges, or sliders. We used it to drive the needle in our RotoMoto FizViz. Not too much to add here. We followed the directions provided by Adafruit, making it compatible with the built-in Arduino Stepper library for control.
- Reed Switch - Our RotoMoto FizViz Widget uses a magnet in the needle and a reed switch to detect when the needle is at zero. A different switch such as a micro contact switch or pressure switch could be used here as well depending on the mechanics of your widget.
We packed our electronics down onto an Adafruit Perma-Proto Half-sized Breadboard to stuff into our widget, but depending on your form factor, you may need alternate shapes. Here's what ours looks like:
Firmware / Arduino Code Overview
Our FizViz-Arduino Repository on GitHub contains the latest and greatest version of the Arduino sketch that powers FizViz Widgets. There's a lot more information on the specifics needed to get the project up and running there, but here are a few important highlights:
- WiFi Configuration - Pay attention to the notes around WiFi config. If you've got a more exotic WiFi network, you may need to dig a bit deeper here.
- External Dependencies - We're fairly light in terms of external dependencies, but we do reference a few libraries that you may need to install. The latest libraries are always referenced at the bottom of the page.
Our FizViz-Windows Repository on GitHub is the home of the Windows code for FizViz. Once again, there's a great deal of more specific information on GitHub, so we recommend reading the instruction there in detail.
Our strategy was to start with the Remote Arduino Wiring code from ms-iot. Instead of controlling pins directly from the Windows app, we set up several custom Firmata control messages. We made a small change to the remote-wiring code to allow passing custom messages through to the Firmata layer. Then we implemented custom message handlers in the Arduino project that update the FizViz state based on the control commands from the Windows app.
We also added support for harvesting analytics data from Google Analytics as this is our primary use case for our own FizViz Widgets. Hopefully this will be helpful as a reference, even if you decide to connect to a different data source. There are a number of steps required to set up a Google Analytics account for API access, so please check the repo notes for more details.
Widget #1 - The "RotoMoto"
We built the RotoMoto to showcase the all the features FizViz. It exercises the platform by showing a very cool application of both our lighting and stepper controls in a widget that you could be proud to hang in any office. Our dream would be to have a suite of 4 or 5 of these beauties hanging side by side, but we're going to need more MKR1000's to make that happen!
Construction of your own RotoMoto is pretty straight forward. Even if you don't have all the same tools, there are a lot of ways to achieve the same effects as us with whatever you can get your hands on. The rest of the article explains the build and where you might be able to make some tweaks for different effects.
First off, we keep our CAD files on Github in the FizViz-CAD repo. You will find STEP and STL versions of the various parts we fabricated to make our RotoMoto widget.
Above and beyond our CAD design, here is a list of parts that we used in our assembly:
Description Supplier Part # Notes Stepper Pulley McMaster-Carr 1375K15 15 tooth Needle Pulley McMaster-Carr 1375K28 30 tooth Bearings McMaster-Carr 60355K701 Used 2 Belt McMaster-Carr 7887K28 Stepper Motor Screws De Mode Elec. 54-410-100 2.6mmx8mm Reed Switch Digikey 306-1124-1-ND Magnet Digikey 469-1002-ND 0.5"Dx0.125"H
The Mount Board
The backbone of the RotoMoto build is the mounting board. Basically, it houses the mechanical and electrical components and keeps everything tucked away cleanly behind the lit bezel of the display.
We used a ShopBot CNC to mill out our mounting board from 1" Thick MDF board. There's all kinds of other ways you can cut out the shapes (laser cutter, jigsaw, etc.) but since the CNC is here, that's what we used.
By far, the big feature of our build is the illuminated bezel. We cut this part from 1/2" thick acrylic sheet. Again, on the ShopBot. The key to the illumination technique is that anywhere "frosted" where the surface is cut will be illuminated. You could create markings using a Dremel or other hand-tools as well.
We provided our CAD models cut in half as it's more efficient to use material this way. Join the two parts together with acrylic cement, or merge the model if you plan to do it in one cut (this is how our demo was built).
The Inner Ring is a key piece in the build - it's where the NeoPixel strip is attached and concealed behind the acrylic bezel. Our fabrication consisted of 3D printing it in large chunks on our TAZ5 out of PLA, and then gluing it together. After a fair amount of filler, and priming, we had a pretty solid ring.
Motor and Mechanical
The CAD repository contains files for a motor mount for our Sanyo Pancake Stepper as well as belt tensioners and a shaft. Installation is fairly straight forward - the belts and pulleys are mounted as shown below. Using two bearings in the mount helps to increase rigidity and keeps the shaft straight.
Getting everything to fit is a bit tricky. First, you glue or tape your NeoPixel strip to the Inner Ring so that it's held in place firmly. Then, the wires for the reed switch and NeoPixels pass through the hole in the body of the mount. After that, the inner ring slides through the bezel and into the mount.
A picture is worth a thousand words.....
Last thing to pack in the wires and secure everything. It's a tight fit, but we packed it all in. Finish wiring up, and then you should have your very own RotoMoto!
Did you replicate this project? Share it!I made one
Love this project? Think it could be improved? Tell us what you think!