LeadMe - Details for Nerds
At the heart of the anklet is an ATMega328-based microcontroller with an onboard crystal and other necessary components (pull-up resistor on the reset line; decoupling capacitors). The firmware on the board utilizes the Arduino bootloader and a custom script. The script receives direction instructions over UART (coded with a custom protocol optimized for the anklet) and determines PWM outputs for some of five different ports, mixing duty cycles to estimate the direction as precisely as possible. It also returns current PWM values.
Communication is interfaced over an HC-05-based propriatery bluetooth module which is paired with an Android phone. Each PWM line drives one of 5 MOSFETs on two motor control boards, which in turn drive one of the five coin-style vibration motors spaced evenly around the device. The system is powered by a Lithium-Polymer cell and the voltage is regulated to 3v3. Onboard is also a USB LiPo charger connected to a Micro-USB port on the rear of the device.
The anklet consists of a unibody casing that houses the electronics and has a buckle for your ankle. It is made of a soft yet sturdy silicone rubber cast in a 3D printed mold. The mold is coated with a laminating epoxy designed to get rid of all imperfections and striations. The casing and buckle is made using a unique three phase casting process. We first coat the bottom half of the mold with a thin layer of silicone to form the outside of the buckle. Once that dries, we place in the electronics and fill the bottom half of the mold. After six hours, we then join the top half of the mold with the bottom half and fill it to the top. Throughout this entire process we degas the mold regularly to ensure there are no air bubbles in the silicone.
The USB charging port is neatly hidden at the very back of the bracelet for inconspicuous and easy access. In addition, we have an indicator LED displaying the device's Bluetooth status - whether or not a phone is paired.
The mold went through five iterations, each time improving a single feature. Through these five iterations, we improved sizing for a variety of ankles, buckle design and dimensions, size of the mold cavity to house the electronics, different surface finishes, vent holes, sprue holes, and degassing methods.
External Dependencies
The LeadMe app would not work as well without the help of some external libraries and APIs:
- Google Directions API to find the route to your destination
- Google Places API for suggesting desinations while you are typing
- Google Maps API V2 for basic map display and visualization
- Volley to seamlessly handle HTTP requests
The app was designed to have five major functions:
- Find a destination
- Determine route to destination
- Visualize route
- Determine required heading
- Transmitting heading to anklet
In order to find your destination you must type it into the search bar, as you are typing the Places API offers three predicted destinations. These locations are biased around your location, and change as you continue typing. Once you select a suggested destination, or type in your own, an HTTP request is made to the Directions API. The result of this request is a JSON object with information about the route to the destination.
This information is parsed for two major reasons, the first to visualize the route on a map, and the second is to get the cardinal direction that you must move in based on your current location and the next route waypoint.
The cardinal direction you must go is one half of determining in which direction you should walk. The second requirement is to determine the direction you are presently facing. Initially information from the compass is used to get a heading, but as you move a listener adds additional GPS coordinates that allow the app to gain a more accurate understanding of the direction you are walking. With your current bearing, required cardinal direction and some trigonometry we can determine whether the anklet needs to guide you forward, left right or back.
This information is relayed to the anklet via a Bluetooth thread that runs in the background of the app.
All of this was done with a budget of $250. Here's a full list of where the money went: