An Overview
In order to accelerate development I leveraged off-the-shelf hardware to build the prototype LapTracer. The devices utilize the Adafruit "Feather" family of boards including:
Adafruit Feather nRF52840 Express - Acting as the primary compute board
Adafruit Radio FeatherWing - RFM69HCW - Enabling D2D wireless communications
Adafruit FeatherWing OLED - 128x32 - Display for debugging in early models
Adafruit Ultimate GPS Breakout - Provided precise timing signals for device synchronization in early models.
DS3231 Precision RTC FeatherWing - Enabling timing accuracy up to a thousandth of a second.
I then soldered jumper wires to configure the pins as necessary for my specific use.
In order to integrate the various purchased hardware in an efficient way, I needed to design a custom PCB. This board also enabled easy connection to off board hardware such as the light strip connection, the DC buck converter and the buttons mounted on the case.
The board was designed in KiCad and sent to PCB fabrication in China. It took two days to learn KiCad well enough for my purposes and 7 days to print and ship to hardware.
Assembling the prototype devices required other additional new skills. Throughout development, I gained significant experience with multiple circuit engineering disciplines, including breadboard prototyping, soldering, and circuit modeling.
Each device is housed within a 3D printed case. The case was a fully custom design built using Autodesk Inventor. The case provides the structure and rigidity to protect the internal components while allowing for easy access when necessary. The hardest part of printing the case turned out to be successfully printing the large rectangular shape while avoiding material warpage. I learned a great deal about the properties of PETG in the process. In the end, we printed the cases onto Kapton tape to increase first level bed adhesion. We also placed the printer in a small heated room with low ventilation to slow down the material cooling process, replicating the effects of an enclosure and thus reducing forces on the corners as the material contracted.
Attached to each receiver case is a power switch, radio antenna, light-strip port, button, and a terminal through which to plug in the rechargeable power tool battery. Throughout the course of the project I developed three or four major case revisions as I trialed each prototype in the field.
One of the most notable evolutions in this project was the mechanism of providing power. Initial prototypes leveraged standard USB battery power banks, routing power through the Arduino boards. As we identified the need to use daylight visible LEDs, the strips required significantly more power than USB could provide. USB-C PD might have been an option, but a USB-C PD battery bank that could output the required volt/amp combination was cost prohibitive. Instead, I adapted the case to leverage an 18V Makita power tool battery and integrating a buck converter to bring power down the the required 5V logic level. I was able to adapt a Thingiverse design by wisestone to dock the battery directly to the case. With this new design, the devices are capable of handling a significant number of concurrent high power draw LEDs. The improved power source also enables runtime on the order of days.
The devices have two available light strip configurations - high power and low power. The high power strips are designed for day time use due to their extremely bright luminosity. These LEDs are less dense per meter, but provide usable light levels in most outdoor conditions. Meanwhile, the lower power strips have many more pixels per inch and provide a smoother effect that is more than bright enough in low-light conditions. Custom ports allow the light strips to quickly be interchanged between devices. Additionally, strips of the same type can be plugged in back to back to double or even triple the quantity of lights present at each receiver
The nRF52840 Express at the heart of each device is programmed using Arduino to allow for high efficiency.
Transmitter - The server is configured to advertise a custom communication protocol over the embedded BLE hardware. This allows the device to communicate with the user's iOS device to receive configuration commands and event triggers (start, stop, reset). Upon receiving an event trigger from the phone, the server will broadcast these commands to the distant devices using the Radio FeatherWing. To ensure device alignment, the transmitter uses the radio to synchronize the real-time-clock modules on each receiver at specific intervals. Additionally, the server manages all receiver connections for the capability to relay messages to individual receivers.
Receiver - Each receiver operates fully independently, relying only on a connection to the server to understand its current state. Upon receiving an event trigger from the server, the receiver will repeatedly run a custom algorithm to determine the light pattern to display at a given time. This algorithm is capable of inputing multiple different paces at different offsets, allowing for multiple groups to be run simultaneously and independently.
LapTracer configuration and use is managed through a bespoke application written in SwiftUI. The application is designed to communicate with the LapTracer transmitter over BLE to configure necessary information such as the device placement for each receiver. The app also manages group creation, tracking, and a full suite of stopwatch features to ensure it is the ultimate all-in-one tool. After configuring the desired settings for a group, the user is then able to trigger start, end, and reset commands that will be propagated through to the receivers.
Iterations
Primary Features/Changes
CircuitPython based modules to allow for quick testing cycles and due to relatively low coding experience
All stock components aside from custom 3D printed case, including simple 5 meter Neopixel strip, Adafruit 2x2 Featherwing bridge
Primary Features/Changes
Implemented custom PCB to allow for direct power distribution to LEDs instead of relying on the main Arduino board's USB passthrough
Allowed for ability to use Makita brand drill batteries as power source for all devices to allow for higher power draw from LED strips
Created larger NeoPixel strips capable of usage during the daytime
Reduced device footprint
Primary Features/Changes
Restructured device synchronization methods, allowing for the removal of GPS module and reducing setup time by over 10x
Refactored device code into Arduino/C++, significantly improving device efficiency
Fully integrated multi-group capabilities into both devices and control app
Introduced device addressing system to communication protocol to allow for transmitter networks and receiver-specific communication
Further reduced device footprint