Project tutorial


A waveboard with a personality. Keep him entertained!

  • 6 respects

Components and supplies

3D Plastic Filament (ABS)
Used in Afinia H-Series 3D Printer
Machine screw, 1/4 inch, gauge 6
Nut, gauge 6
Ard yun
Arduino Yun
Adafruit 3-Axis 3G Acceleremoter
Adafruit GPS Breakout Chip

About this project

Meet Jack

Jack is a waveboard you share with your friends.  Jack prefers to be social and spontaneous, likes trying new things.  When he's bored or lonely, he lets you know.  He posts his location and movement to a web application, so your friends can come pick him up and ride away with him.

Video Demo

Web Application


Jack uses the web application to report on his whereabouts.

Jack moving towards Hearst.

Activity Level

Jack also likes to let his friends know whether he's occupied.  The constantly shifting waves in the background of the web application reflect Jack's current activity level.

If he's still, they'll look something like this:

Sedentary Jack.

If he's moving around a bit more, they might look like this:

Active Jack.

The web application's audio also reflects changes in Jack's activity level.  The mysterious sound reflects and ramps up the tension of trying to track down Jack and steal him from other players.  When Jack is on the move --- when his acceleration increases --- the pitch rises, and you'd better get going if you want to catch him!

You can download a screen recording of the web application with audio below.  Online video hosting services process and compress video files in a way that grossly distorts Jack's unique sound, so this is only available as a direct download.

Generative audio

Expressing Himself

When Jack is getting to run around and cover a lot of ground, he's happy, and he lets you know.

Jack on a good day.

When he's been stuck in one place, Jack gets bored and starts asking friends to come pick him up.

Jack on a bad day.

Getaway Button

After stealing Jack away from another user, a user may need time to make a getaway.  In this situation he or she can use the "Getaway Repreive" button in the web application, which will bring up a login screen.  After a successful login, the server will completely stop serving sensor data for a predefined window of time, so that other users (like perhaps a vengeful recent loser of Jack, hot on the new user's heels in pursuit) will not be able to use the web application to locate Jack during the getaway period.  The login is required to prevent users from abusing the system by pressing the getaway button all the time to prevent other users from ever finding Jack.

The getaway button in action.

The Story

For a closer look at Jack's story, you might want to see the slide deck:


The process for making Jack is simple: 

1) Borrow, buy, or commandeer a Waveboard.

2) Download and print the STL file below for the chassis. This is where the Arduino and power source will sit.

3) Carefully open the Waveboard from the top. Use a dremel to hollow out a section of the inside, being careful to leave as much supporting material as possible while yet creating room for the requisite electronics.

4) Cut through bottom such that the 3D printed chassis fits snugly against body of Waveboard.

5) Drill a small hole through both the supporting material of the Waveboard and the chassis. Insert machine screw and tighten.

6) Hot-glue around chassis to secure.

7) Follow these directions for connecting your accelerometer:

8) Follow these directions for connecting your GPS component:

9) Also attach the battery of your choosing.

10) Download the arduino file and the python file included in the Source Code section above, to use on the arduino. In the arduino file, search for “TODO: choose server location” and change the associated line to indicate the server location of your choosing.

11) From the open top of the waveboard, insert the electronics with code pre-loaded. Be careful, for by this point your Waveboard will have gained sentience.

12) Replace the top of the waveboard.

13) Clone our github repository:

14) Grep for “TODO: choose server location” in the repository directory and change the associated lines to indicate the server location of your choosing.

15) Follow the directions in repository’s README to start the node server.

16) Direct your browser to the server location of your choosing, and see what Jack has to say.

17) Say hello to Jack! Ride safely and responsibly.


Our ideation process encompassed everything from wild and largely unstructured discussions to highly goal-directed brainstorming. During the early stages we touched on some of the ideas around Jack without seeing a fully formed concept emerge.

In one early brainstorming session we considered an automated version of hide and go seek, and how that might gamify stalking, ideas which would ultimately shape the design of Jack.In one discussion we touched on everything from an electronic version of the daemons from the His Dark Materials books to crutches that would become possessive of their user, ultimately discussing how we might manipulate a childhood game, introducing ideas that would affect the Jack concept. In another session we considered ideas as diverse as an IMBD-connected baby walker and sun-seeking shoes.
The idea of a device shared among friends, constantly stolen from each other, appealed immediately. We liked the juxtaposition of becoming a target as soon as one moves, when the device is intended explicitly for moving oneself.We considered the relationship to assassins, and king of the hill. We discussed whether the device should become more stealthy as you use it more, encouraging users to take it out, or less stealthy, to build up the tension between its purpose as transport and the consequences of use.We considered the consequences for the sharing rate of the various different sensor data reporting schemes we devised.We discussed different ways to take advantage of the wave motion of the waveboard, from identifying beaches with waves at a similar rate, to our ultimate plan of audializing and visualization the wave pattern.We considered whether the audialization and visualization were a show for friends, another way to show off board tricks, or whether they were a way to taunt friends.


Main Arduino CodeC/C++
The sketch for the Arduino Yun. We first gather accelerometer and GPS data, then POST it to our server through a Python script, accessible via Bridge.
#include <Bridge.h>
#include <Process.h>
#include <Adafruit_GPS.h>
#include <SoftwareSerial.h>
#define GPSECHO false

Adafruit_GPS GPS(&Serial1);
HardwareSerial mySerial = Serial1;
uint32_t timer = millis();
const int sampleSize = 10;
const int xInput = A0;
const int yInput = A1;
const int zInput = A2;

// Raw Ranges:
int xRawMin = 378;
int xRawMax = 633;

int yRawMin = 377;
int yRawMax = 640;

int zRawMin = 380;
int zRawMax = 630;

void setup() {
  Serial.println("Adafruit GPS library basic test!");
  //turn on RMC and GGA (fix data) including altitude
  // Set the update rate


void loop() {
  char c =;
  if (GPS.newNMEAreceived()) {
    if (!GPS.parse(GPS.lastNMEA())) { return; }

  if (timer > millis()) { timer = millis(); }
  if (millis() - timer > 2000) {
    //reset the timer
    timer = millis();
    int xRaw = ReadAxis(xInput);
    int yRaw = ReadAxis(yInput);
    int zRaw = ReadAxis(zInput);
    long xScaled = map(xRaw, xRawMin, xRawMax, -1000, 1000);
    long yScaled = map(yRaw, yRawMin, yRawMax, -1000, 1000);
    long zScaled = map(zRaw, zRawMin, zRawMax, -1000, 1000);
    float xAccel = xScaled / 1000.0;
    float yAccel = yScaled / 1000.0;
    float zAccel = zScaled / 1000.0;

    Serial.print("\nTime: ");
    Serial.print(GPS.hour, DEC); Serial.print(':');
    Serial.println(GPS.minute, DEC);
    Serial.print("Fix: "); Serial.print((int)GPS.fix);
    Serial.print(" quality: "); Serial.println((int)GPS.fixquality); 
    if (GPS.fix) {
      Serial.print("Location: ");
      Serial.print(GPS.latitude, 4); Serial.print(;
      Serial.print(", "); 
      Serial.print(GPS.longitude, 4); Serial.println(GPS.lon);
      Serial.print("Satellites: "); Serial.println((int)GPS.satellites);
      String gps = String(GPS.latitude) + String( + ", " + String(GPS.longitude) + String(GPS.lon);
      post(gps, String(xAccel), String(yAccel), String(zAccel));

int ReadAxis(int axisPin) {
  long reading = 0;
  for (int i = 0; i < sampleSize; i++)
    reading += analogRead(axisPin);
  return reading/sampleSize;

void post(String gps, String x, String y, String z) {
  Process p;
POST Python ScriptPython
The Python script we run via Arduino's Bridge to POST data to our server
#! /usr/local/bin/python

import pycurl
import os, sys
from urllib import urlencode

c = pycurl.Curl()
c.setopt(c.URL, 'http://localhost:8000/data') #TODO: choose server location

post_data = {'gps': sys.argv[1], 'x': sys.argv[2], 'y': sys.argv[3], 'z': sys.argv[4] }
postfields = urlencode(post_data)
c.setopt(c.POSTFIELDS, postfields)

All the code is available in our github repository. Jack's hardware uses an arduino script to record accelerometer and GPS data and a Python script to POST that data to a node server.  The node server uses websockets to push the data to the web application.  The web application uses the Google Maps API to display GPS readings.  A custom HTML5 Canvas visualization reflects current accelerometer data.  The accelerometer readings are also audialized using the Web Audio API.

Custom parts and enclosures



Similar projects you might like

Track and Control Your Car Remotely

Project tutorial by Ashraf Nabil

  • 80 respects

Track ME

Project tutorial by Hugo Gomes

  • 105 respects

Auto Ultrasonic Car

by Ishaq Yang

  • 24 respects

Mobile Controlled Bluetooth Car || Easy || Simple || HC-05

Project tutorial by Team Vishal soni

  • 31 respects


Project tutorial by zhaoshentech

  • 131 respects


Project showcase by benoitdr

  • 66 respects
Add projectSign up / Login