My, How Things Change!

Our first birthday was in March, so we thought we'd share some pictures from before we moved in versus today. Enjoy!

test d3

<!DOCTYPE html>
<meta charset="utf-8">

body {
  font: 10px sans-serif;

.axis path,
.axis line {
  fill: none;
  stroke: #000;
  shape-rendering: crispEdges;

.dot {
  stroke: #000;

<script src="//"></script>

var margin = {top: 20, right: 20, bottom: 30, left: 40},
    width = 960 - margin.left - margin.right,
    height = 500 - - margin.bottom;

var x = d3.scale.linear()
    .range([0, width]);

var y = d3.scale.linear()
    .range([height, 0]);

var color = d3.scale.category10();

var xAxis = d3.svg.axis()

var yAxis = d3.svg.axis()

var svg ="body").append("svg")
    .attr("width", width + margin.left + margin.right)
    .attr("height", height + + margin.bottom)
    .attr("transform", "translate(" + margin.left + "," + + ")");

d3.tsv("data.tsv", function(error, data) {
  if (error) throw error;

  data.forEach(function(d) {
    d.sepalLength = +d.sepalLength;
    d.sepalWidth = +d.sepalWidth;

  x.domain(d3.extent(data, function(d) { return d.sepalWidth; })).nice();
  y.domain(d3.extent(data, function(d) { return d.sepalLength; })).nice();

      .attr("class", "x axis")
      .attr("transform", "translate(0," + height + ")")
      .attr("class", "label")
      .attr("x", width)
      .attr("y", -6)
      .style("text-anchor", "end")
      .text("Sepal Width (cm)");

      .attr("class", "y axis")
      .attr("class", "label")
      .attr("transform", "rotate(-90)")
      .attr("y", 6)
      .attr("dy", ".71em")
      .style("text-anchor", "end")
      .text("Sepal Length (cm)")

      .attr("class", "dot")
      .attr("r", 3.5)
      .attr("cx", function(d) { return x(d.sepalWidth); })
      .attr("cy", function(d) { return y(d.sepalLength); })
      .style("fill", function(d) { return color(d.species); });

  var legend = svg.selectAll(".legend")
      .attr("class", "legend")
      .attr("transform", function(d, i) { return "translate(0," + i * 20 + ")"; });

      .attr("x", width - 18)
      .attr("width", 18)
      .attr("height", 18)
      .style("fill", color);

      .attr("x", width - 24)
      .attr("y", 9)
      .attr("dy", ".35em")
      .style("text-anchor", "end")
      .text(function(d) { return d; });



Synesthetic Piano

Have you ever wondered what Beethoven's 5th symphony would look like as a painting? Of course not, that doesn't even make sense. Beethoven is music, meant to be enjoyed by the ears, not the eyes. But then, there are a lot of things we modify in order to see: vibrations of the earth's crust seen as graphs, magnetic resonance images, the gamma rays of a distant supernova, and on and on. So why can't we paint a song?

The Hill City Keys project seems like the perfect opportunity to find out. Since I can't play piano, I'll instead leverage the talent of the Lynchburg community. And since I've often heard some impressive music played at the community market piano, I decided to make it my painting piano. So I wired it up to a Raspberry Pi that detects the notes being played in real time, which then sends the notes to another Raspberry Pi at the Academy Center of the Arts, which controls a robotic arm that moves a paint brush depending on the note being sent, painting a picture of the music being played.

You can watch the arm paint in real time below, followed by a more detailed description of the project.

The Piano

Detecting Notes

There are many ways to detect the notes played on the piano. A few different options would be to put a touch sensor on each key, watch the keys being pressed with a camera, or you could detect the sound being played.

I decided to take the audio sampling route. Music notes are simply letters we assign to specific audio frequencies. When the air vibrates at 132Hz, that's middle C. So in order to detect the note played on the piano, we first need to record audio samples. The Synesthetic Piano does this using a simple USB microphone connected to a Raspberry Pi. The Pi records an audio sample for a short period of time, which contains a waveform of amplitude versus time. Unfortunately, amplitude is not what we're looking for. Any note can be played at any amplitude, what we need is the frequency. Fortunately, Joseph Fourier figured out that any function can be represented by a series of sine waves. Along with this realization, he came up with a clever way to transform a function of time into a function of frequency, which is exactly what we need. In essence, the Pi records an audio sample of amplitudes versus time, it then recreates that sample with a series of sin waves. Those sine waves have a known amplitude, frequency, and phase. The Pi then takes the sine wave with the highest amplitude, as it most likely represents the note being played. It then looks up the corresponding note of that frequency. Mathematically, it looks like this, with $f(t)$ being the amplitude versus time function and $f(\epsilon)$ being the resulting function of frequency.

$$f(\xi) = \int_{-\infty}^{\infty} f(t)e^{-2\pi i x\xi}dx$$

Python's wonderful Scipy library comes with a discreet Fourier transform function that does all the hard work for us. I just chose a sampling rate that keeps the notes accurate while reading one note every tenth of a second.

Sending and Receiving Data

Once the piano figures out what note you played, the data needs to be sent to the painter. Since the piano and the painter are very far from one another, I chose to transfer the data over the internet. Another challenge to consider is that these two devices are on two different networks, neither of which I have administrative rights on. This meant that I couldn't just send data directly from the piano to the painter. Instead, I decided to use the MQTT protocol by sending all the data through CloudMQTT


The Painter

The painter's job is to be inspired by music to paint something beautiful.

The Arm

The arm is made of aluminum, with stepper motors as the joints, and a 3D printed hand. When C, C#, D, and D# are played, the shoulder will quickly or slowly move clockwise or counter-clockwise. Similarly, E, F, F#, and G do the same for the elbow.

The Paint

There are four different color paints, each pumped by a 3D printed peristaltic pump. These are positive displacement pumps, which means they pump the same volume of paint with every step of the motor. When G#, A, A#, or B are played, one of the four paints are pumped onto the canvas.

The Big Picture

There are two things I look forward to learning from this experiment: are the paintings repeatable, and do good songs look better than a random mashing of the keys?


Check out the photos from our Hill City Robot Combat II event!

Our next combat robot event will be August 27th at Riverviews Artspace. Start building now!

Also, check out our summer project for 12-18 year olds to build combat robots.

Summer 2017 Internships

We’re looking for five interns to help us out this summer. It’s an opportunity to do something different, gain experience in a variety of fields (machining, computer software and hardware, woodworking, electronics, graphic design, etc.), and work with a mentor with expertise in your field of interest.

While the internships are unpaid, each intern is provided a $200 budget for their project, courtesy of the Lynchburg Morning Rotary Club.

Internship begins on June 12th and ends on August 4th.


10 hours per week: 4 hours on Tuesday and the other 6 hours decided on an individual basis. We’re looking for self-motivated individuals capable of recognizing problems and finding solutions.


Time should be equally divided between the following four duties:

  • Space improvement projects: Depending on your interests, this might mean building a drill press storage cabinet, optimizing our computer network, web administration, social media, etc. Sometimes you’ll have specific assignments, but you’ll also be expected to find your own projects. If we need a paper towel holder, 3D print one. If the drill bits are hard to find, build a storage case for them.
  • Prepare for and assist with classes and workshops: Setup the room layout, computers, materials, and experiments.
  • Clean and organize the space: vacuuming, sweeping, taking out trash, putting tools where they belong, etc.
  • Personal projects: Interns are expected to make something that they’ll write about and present to the board of directors at the end of the internship. This should be something that is personally interesting and takes advantage of the resources at Vector Space. The requirements are intentionally vague; this is your opportunity to be creative.

Here's one of our interns from the Summer of 2016 talking about his experience.

This program is generously sponsored by, Lynchburg Rotary


Apply Below


Deadline: 5/26 (extended)

Lynchburg Mini Maker Faire

Mini Maker Faire Comes to Lynchburg

(Lynchburg) On Sunday, March 26th from 12:00pm to 4:30pm, Vector Space will present the Lynchburg Mini Maker Faire, the first maker faire in our area in partnership with the national movement started by and in collaboration with Make: magazine from Maker Media. This event will take place on the campus of Randolph College.

In the words of Maker Media, a Maker Faire is, “Part science fair, part county fair, and part something entirely new. Maker Faire is an all-ages gathering of tech enthusiasts, crafters, educators, tinkerers, hobbyists, engineers, science clubs, authors, artists, students, and commercial exhibitors. All of these ‘makers’ come to Maker Faire to show what they have made and to share what they have learned.”

Maker Faire launched its first event in 2006 and is focused on showcasing makers across the spectrums involving technology, art, craft, science and engineering. The Lynchburg Mini Maker Faire encourages makers to come out of their workspaces and garages to demonstrate their talents for the local community, while inspiring others to find out how things are made and possibly even pick up a new hobby or interest in a skill.

We are proud to be partnering with Randolph College by making Lynchburg Mini Maker Faire a part of their annual Science Festival. Come out and enjoy hands-on activities, amazing exhibits, locally made products for sale, food trucks, a group build project and more. This event is free and family friendly as there will be activities for those ages four and up.

We would like to thank our partners and sponsors Make:, Vector Space, Randolph College, clutch Magazine and Opportunity Lynchburg. For more information please visit or call (804)387-1519 or email

Combat Robots

If you missed our first Robot Combat event back in November, don't worry, there's still time to get in on February's event!

Heat Transfer in less than 1kb

The hardware development community at put together a challenge to build something awesome in less than 1Kb, so we decided to join the fun. Here's our entry.


despite all of your friends who like to say that "heat goes up", heat actual moves according to this equation,
$$ \frac{\partial T}{\partial t} = \alpha \nabla^2 T $$

If you're wondering what on earth that means, you have two options: study differential equations for a few years or watch the colors change on our LED board. This LED board displays our solution to the 2D heat equation, written in less than 1Kb of program space, which we've entered in Hackaday's 1Kb Challenge. If you were to heat up a 14.5x10.9 inch sheet of copper, the heat would move through it exactly as our board displays. The same temperatures would be at the same locations at the same time. Don't believe it? Grab your thermocouple and follow the details over at Hackaday.



Give the gift of making! This holiday season, gift your loved ones with access to the tools, materials and community to create anything they can dream up.

Vector Space membership (age 18+) includes access to the computer and electronics lab, textile room, wood and metal shops, 3D printer, lounge, and classroom area. Members recieve tool safety training and an RFID tag to grant entry to the workshop 24/7. Project storage space and basic materials are included (plywood, sheet metal, resistors, printer filament, etc.). Throughout December, you can purchase a three month membership for just \$50/month - a \$30 discount!

Gift memberships are actived once the recipient signs up, and can be used any time. Questions? Find us at info [at] vector-space [dot] org.

Workshop Pass

Workshop passes are for ages 12+ to participate in any of our available workshops. Tools and materials are always included, and everyone leaves with something they've made! For a limited time you can purchase 5 workshop passes for just $150 - a $25 discount! Sewing, 3D printing, bookbinding, electronics (Raspberry Pi and Arduino), leather working, metal and woodworking (lathe training) are workshops that will be available in 2017. For a current workshop schedule, visit:

Nitro RC - Race #2

This Saturday's drag races were the second set of races in the Nitro RC series. In the week leading up, students were scrambling to get their cars together in time. Axles were rethreaded, wires re-soldered, a clever fix for a pull start that didn't quite fit, and a significant amount of carburetor tuning, ensuring each team would have just the right mixture of air and fuel.

Purple Power

The race they were preparing for was a 50 yard drag race. On race day, just an hour before the start time, Team Turbo finished assembling their car only to find that their steering mechanism wasn't working. They tried a few simple fixes before realizing they had over-tightened the hub carrier when installing new axles on the front wheels. This caused too much resistance on the balls that allow the wheels to pivot, so they quickly went back to work tearing off the front wheels to make the fix. At this point, the other teams had made their way to the track to start warming up.

Pull start rebuild

JJ Racing was coming off a win and had picked up a sponsorship from Pipette Repair Service the previous week, so they were considered the favorite. They replaced all of their suspension springs to get a stiffer ride for this race, and their warm up laps were looking good. Purple Power had spent more time than any other team tweaking their carburetor, and it showed. They were doing wheelies just to intimidate the competition. Meanwhile, team Doubtful Confidence left their car unstarted before the race; partly as their own form of intimidation, but mostly for fear of breaking their rather delicate pull start.

The first race put JJ Racing against Doubtful Confidence. Once Doubtful Confidence started up their engine, you could see the fear in the other racers' eyes. The green flag waved and they came roaring off the start leaving JJ Racing far behind. It was clear that while JJ Racing had their car in a very reliable configuration, they'd need to get a little riskier if they wanted to win. Next up, Team Turbo went up against Purple Power. Purple Power took off while Team Turbo remained at the start line, engine screaming as the drive shaft had become disconnected from the transmission. Purple Power took the win, but not without losing a wheel.

new springs

The races continued, working through the double elimination bracket. As the pressure of the competition built, last minute solutions to problems began to get creative. Team Turbo tried a few tricks to keep their drive shaft engaged, but without time to resize the shaft like they needed to the best they could do was wrap the coupling in duct tape. It was a noble effort, but unfortunately didn't do the trick. Meanwhile, Purple Power knew the lost wheel was going to be trouble, as it was much worse than just a loose nut. They ran back to Vector Space to super glue the wheel and axle, only to find that it simply didn't have the strength. They were given the five minute warning when in desperation they caught sight of some trash in the parking lot, a water bottle to be specific. Jason ran over to grab it and began duct taping the bottle on in place of the missing wheel. "It'll act like a ski", he said. Everyone laughed, and then the green flag waved for the race against their powerful opponent Doubtful Confidence.

We were surprised how quickly Purple Power came off the start. The water bottle broke a leak but the car seemed to only get faster. I stood alone at the finish line, not expecting much of a race until I had to jump out of the way of what was the fastest ski car I've ever seen. The finish was unbelievably close. I couldn't tell who won, but among the commotion everyone seemed to think it was Doubtful Confidence, not our water bottle underdogs. Fortunately we had a camera on the finish line, so I ran it back to Vector Space to upload the footage. I had to slow it down frame by frame until it was clear, before emailing the image to Jordan, and running back to the race track. On my way I heard a unified burst of astonishment as Jordan showed them the photo of Purple Power taking the win. From that moment on, Purple Power took on a new name: Team Water Bottle.

Doubtful Confidence ended up coming back from the loser's bracket, defeating Team Water Bottle twice to take the win. As usual, it was an exciting day for Nitro RC racing.

Thanks to our sponsors for supporting these teams.

AMG Future Focus Foundation
American Hofmann PRS


Subscribe to Blog