Project Info
π‘
Inspiration
As a team who values accessible and immersive gaming experiences, we wanted to create a hack that embodied both of these ideas across software, hardware, and design. Taking inspiration from the Nintendo Wii and Switch consoles, we choose to create a Physical Digital Dart which allows the user to perform throwing motions as they would in real life, captures that motion with an accelerometer, and simulates the result on a digital dartboard. π― What It Does After the MPU6050 accelerometer reads its current angles, those angles are filtered for noise on the Arduino Nano which then transmits the button state, roll, pitch, and yaw of the Physical Digital Dart via serial monitor to our Python dartboard simulator which launches a dart in the correct direction on the buttonβs release at the angle given by the MPU6050. To account for drift, a double tap of the button re-calibrates the dartβs orientation to a standardized orientation. π οΈ How We Built It To optimize space and keep the dart as small as possible, we utilized small gauge wires for connections and assembled them to minimize wire overlap. The dart-like 3D printed casing contains an Arduino nano which is connected to a MPU6050 accelerometer via perfboard Along the side of the Physical Digital Dart is one button to keep track of the start (when pressed) and end of the throw (when released). π§± Challenges We Ran Into The accelerometer we were provided is an MPU6050 accelerometer and gyroscope. This type of small MEMS sensor is great for finding orientation, but velocity and position are far out of reach for the level of inaccuracy and drift found in the sensor. In order to fix this, we developed a specialized filtering algorithm for our application that was able to combat these issues and keep the drift in check. Additionally, as we sought to use the 3D printers on the first day of the hackathon, we found that 3/4 were malfunctioning. In order to print our design and let others print theirs we worked through the night to fix the Prusa I3 Mark 2, the Ender 3, and the Ender 3 V2 SE, ultimately getting all 3 printers into a functioning state. π Accomplishments That We're Proud Of Combining software, hardware, AND 3D design into a working product with very limited time Creating a product which can be adjusted in shape to meet the needs of its users Creating a product which combines the physical and digital worlds, redefining what it means to βplay a game." π What We Learned For our future hackathons, we noted that it would be best to bring as much personal hardware as needed, considering that there may not be a sufficient amount of hardware available to borrow from the venue. π What's Next for Digital Physical Darts (Wii Darts) 2D β 3D Since our current version is 2D, we would like to implement a 3D version with better visuals and more character. Some additional features include: Player-versus-player gameplay A Wii Sports-like aesthetics Fix Accelerometer Drift Originally, our team wanted to track the position of the dart at all times but found that the drift of the MPU6050 made the double integration necessary to find that position highly accurate. A more precise accelerometer combined with a more intense filtering algorithm such as a Kalman filter would yield better results.
Physical Digital Darts
π‘ Inspiration
As a team who values accessible and immersive gaming experiences, we wanted to create a hack that embodied both of these ideas across software, hardware, and design. Taking inspiration from the Nintendo Wii and Switch consoles, we choose to create a Physical Digital Dart which allows the user to perform throwing motions as they would in real life, captures that motion with an accelerometer, and simulates the result on a digital dartboard.
π― What It Does
After the MPU6050 accelerometer reads its current angles, those angles are filtered for noise on the Arduino Nano which then transmits the button state, roll, pitch, and yaw of the Physical Digital Dart via serial monitor to our Python dartboard simulator which launches a dart in the correct direction on the buttonβs release at the angle given by the MPU6050.
To account for drift, a double tap of the button re-calibrates the dartβs orientation to a standardized orientation.
π οΈ How We Built It
To optimize space and keep the dart as small as possible, we utilized small gauge wires for connections and assembled them to minimize wire overlap. The dart-like 3D printed casing contains an Arduino nano which is connected to a MPU6050 accelerometer via perfboard Along the side of the Physical Digital Dart is one button to keep track of the start (when pressed) and end of the throw (when released).
π§± Challenges We Ran Into
The accelerometer we were provided is an MPU6050 accelerometer and gyroscope. This type of small MEMS sensor is great for finding orientation, but velocity and position are far out of reach for the level of inaccuracy and drift found in the sensor. In order to fix this, we developed a specialized filtering algorithm for our application that was able to combat these issues and keep the drift in check.
Additionally, as we sought to use the 3D printers on the first day of the hackathon, we found that 3/4 were malfunctioning. In order to print our design and let others print theirs we worked through the night to fix the Prusa I3 Mark 2, the Ender 3, and the Ender 3 V2 SE, ultimately getting all 3 printers into a functioning state.
π Accomplishments That We're Proud Of
- Combining software, hardware, AND 3D design into a working product with very limited time
- Creating a product which can be adjusted in shape to meet the needs of its users
- Creating a product which combines the physical and digital worlds, redefining what it means to βplay a game."
π What We Learned
For our future hackathons, we noted that it would be best to bring as much personal hardware as needed, considering that there may not be a sufficient amount of hardware available to borrow from the venue.
π What's Next for Digital Physical Darts (Wii Darts)
2D β 3D
Since our current version is 2D, we would like to implement a 3D version with better visuals and more character. Some additional features include:
- Player-versus-player gameplay
- A Wii Sports-like aesthetics
Fix Accelerometer Drift
Originally, our team wanted to track the position of the dart at all times but found that the drift of the MPU6050 made the double integration necessary to find that position highly accurate. A more precise accelerometer combined with a more intense filtering algorithm such as a Kalman filter would yield better results.
Analysis
View
Metric
- 22
- 11
- 1
Figures cover GitHub contributors during the hackathon window. A co-authored commit counts in full for each author, so per-member totals add up to more than the whole-team figures.
Technology
- PythonIn code
- RustIn code
2 of 2 appear in the indexed code.
AI coding agents
No AI coding agent signals were found in this repository.
Detected from committed agent config files and commit authorship. Absence of a signal is not proof an agent was unused.
Codebase size
Source size
34 KB
Source files
10
Counts recognized source files only; vendored directories, binaries and lockfiles are excluded, so this is smaller than the repository on disk.
Repository
commonkestrel/physical-digital-darts
21 files Β· 408 KB Β· @ a5b0269
Structure
Application logic
13 files Β· 62%Domain rules, services and shared utilities.
Supporting
Layers are inferred from where files sit in the tree, not from reading the code. A project that names its directories unconventionally will read oddly here β open the file browser to check anything the diagram implies.
Languages
- Python48%
- Rust39%
- Markdown13%
Share of indexed source by file size. Binary and vendored files are excluded.
Dependencies
accel/Cargo.toml
cargo Β· 7- arduino-hal
- avr-device
- embedded-hal
- micromath
- nb
- panic-halt
- ufmt
Declared in the repositoryβs manifests at the indexed commit. A declared package is not proof it is used, and runtime dependencies are listed first.
Feature verification
Digital dartboard rendering and collision/scoring regionsVerified
Simulates the result on a digital dartboard
Claimed on Devposthigh confidencepython/DartboardClasses.py:141β Dartboard class builds concentric rings of Polar_Rectangle regions (bullseye, doubles, triples) with pygame rendering and collision detectionpython/PhysicsSimClasses.py:12β DartManager applies gravity and updates dart position each frame, checked against dartboard collisions
Double tap of button re-calibrates orientation to standard positionVerified
To account for drift, a double tap of the button re-calibrates the dart's orientation to a standardized orientation
Claimed on readmehigh confidenceaccel/src/main.rs:70β On button release, if time since last release < 500ms (double tap), roll/pitch/yaw/vx are reset to initial standardized values computed from the initial accelerometer reading
MPU6050 accelerometer/gyroscope reading on Arduino NanoVerified
The MPU6050 accelerometer reads its current angles on the Arduino Nano
Claimed on readmehigh confidenceaccel/src/mpu6050.rs:108β Mpu6050::update() reads accel/gyro registers over I2C and returns MpuData with accel_x/y/z, gyro_x/y/zaccel/src/main.rs:39β main() initializes Mpu6050 over I2C and calls imu.update() in the loop
Noise filtering of angles (complementary filter)Verified
Angles are filtered for noise on the Arduino Nano using a specialized filtering algorithm
Claimed on readmehigh confidenceaccel/src/main.rs:103β Complementary filter blends gyro-integrated roll/pitch with accelerometer-derived angles using ALPHA weightingaccel/src/rolling_buffer.rs:3β Collection ring buffer used to average recent samples for drift/gain correction (rolling.avg())
Pygame-based dartboard visualizationVerified
Built with pygame
Claimed on Devposthigh confidencepython/DartboardSimulator.py:1β imports and initializes pygame, creates a display window and render loop
Pyserial-based serial communicationVerified
Built with pyserial
Claimed on Devposthigh confidencepython/SimulateDartboard.py:1β imports serial.tools.list_ports and uses serial.Serial to read data from the Arduino
Python dartboard simulator launches dart on button release at given angleVerified
The Python dartboard simulator launches a dart in the correct direction on the button's release at the angle given by the MPU6050
Claimed on readmehigh confidencepython/SimulateDartboard.py:50β dart_should_be_thrown checks parsedButtonState == 3 (just released) then computes velocity components from parsedYaw/parsedPitch and calls throw_dartpython/DartboardSimulator.py:93β throw_dart forwards exit velocity to DartManager which spawns a Dart object
Rust firmware built with arduino-hal for Arduino Nano (ATmega328p)Verified
Built with rust (per Built With list) for the embedded firmware
Claimed on Devposthigh confidenceaccel/Cargo.toml:1β Rust crate configured for AVR/arduino_hal targetaccel/src/main.rs:1β no_std/no_main AVR entry point using arduino_hal and avr_device interrupts
Serial transmission of button state, roll, pitch, yaw to PythonVerified
Data is transmitted via serial monitor to a Python dartboard simulator including button state, roll, pitch, yaw
Claimed on readmehigh confidenceaccel/src/main.rs:130β ufmt::uwriteln! sends event, roll, pitch, yaw, and speed over serial at 115200 baudpython/SimulateDartboard.py:9β pyserial opens a serial connection at 115200 baud and reads/parses these fields
Single button tracks start (press) and end (release) of throwVerified
One button along the side keeps track of the start (pressed) and end (release) of the throw
Claimed on readmehigh confidenceaccel/src/main.rs:31β pins.d3 configured as pull-up input for the buttonaccel/src/main.rs:66β event codes 0/1/2/3 derived from prev/new button state transitions distinguish press, hold, and release
3D printed dart body/lid/fin designCode-supported
Physical dart-like 3D printed casing with adjustable shape
Claimed on readmemedium confidencecad files/DartBody.stlβ STL file for a 3D printable dart body exists in the repocad files/DartLid.stlβ STL file for a dart lid existscad files/Fin (x3).stlβ STL file for dart fins exists, supporting the physical build claim though not itself executable/verifiable code
3D version with better visuals, character, player-vs-player, Wii Sports aestheticsClaimed only
Future work: implement a 3D version with player-versus-player gameplay and Wii Sports-like aesthetics
Claimed on readmehigh confidenceKalman filter / improved drift correction for position trackingClaimed only
Future work: use a more precise accelerometer and Kalman filter to fix accelerometer drift and enable position tracking
Claimed on readmehigh confidenceMPU6050 connected to Arduino Nano via perfboard in 3D printed dart casingBlocked
The dart-like 3D printed casing contains an Arduino Nano connected to an MPU6050 via perfboard
Claimed on readmemedium confidence
An AI agent derived these features from the projectβs Devpost page and readme, then searched the code for each one. Verified features are backed by cited code; claimed-only features had no supporting code, which is not by itself proof a feature is missing.
Export this project's context (description, README, evidence, key source files) to chat with an AI agent elsewhere.