Whistling Birds Gauntlet Darts guide

Software and configuration

Install, update, and configure the Whistling Birds firmware.

This page covers the firmware and configuration file on the CIRCUITPY drive. Come here when a new version is released, when you want to change settings, or when you need to reflash after a problem.

This page covers installing or updating the Whistling Birds firmware and configuring the settings on the CIRCUITPY drive. Come here when a new version is released, when you want to change settings, or when you need to reflash after a problem.

Update Firmware

The prop runs CircuitPython on the Adafruit RP2040 Prop-Maker Feather. Updating replaces the project files on the CIRCUITPY drive. Your config.py settings are preserved unless the release notes say otherwise.

Flash or Update CircuitPython

If a release requires a newer CircuitPython version, or if the board needs to be reflashed from scratch:

  1. Use the bundled runtime first. The release package includes a tested CircuitPython 10.1.4 .uf2 in Software/circuitpython-runtime/. If you only have the source repository and not the packaged release ZIP, download the board-specific runtime from circuitpython.org/board/adafruit_feather_rp2040_prop_maker.
  2. Enter bootloader mode. Connect the board via USB-C. Hold BOOT/BOOTSEL, press and release RESET, then release BOOT. The RPI-RP2 drive appears.
  3. Flash the runtime. Copy the .uf2 file to RPI-RP2. The board reboots and reappears as CIRCUITPY.

Copy Project Files

Whether this is a fresh install or an update, the project files go to the root of the CIRCUITPY drive.

In the release package, open Software/whistling-birds-firmware/ and copy that folder's contents to CIRCUITPY.

  1. Back up your config. If updating, copy config.py from CIRCUITPY to your desktop so you can restore your settings afterward.
  2. Clear the drive. Select all files on CIRCUITPY and delete them. Confirm permanent deletion if prompted.
  3. Open the firmware folder. In the extracted release package, open Software/whistling-birds-firmware/.
  4. Copy the new files. Copy everything inside Software/whistling-birds-firmware/ and paste it to the root of CIRCUITPY. Files must end up at the root level, not inside a subfolder.
  5. Restore your config. If you backed up config.py, compare it with the new version and carry your settings forward. New releases may add settings — always start from the new template and copy your values in.
  6. Wait for the transfer to finish. CircuitPython drives write slowly. Do not eject or unplug until the copy is complete.
Troubleshooting file copy issues
  • Drive disappears mid-copy: The board rebooted during the transfer. Re-enter bootloader, reflash CircuitPython, then retry.
  • Copied the folder instead of its contents: Open Software/whistling-birds-firmware/ and move the files inside it to the drive root. code.py must be at the top level or the firmware will not start.

Configure Settings

Open config.py at the root of the CIRCUITPY drive in any text editor. Changes take effect on the next power cycle. Settings not covered here can also be changed on-device via the Configuration Mode menu.

Setting Default What it controls
Visual effects
DART_TIP_COLOR “blue” LED color on the dart tips when armed and extended. Valid names are listed in lib/neopixel_control.py.
AFTERBURNER_COLOR “red” Post-fire afterburner glow color. Valid names are listed in lib/neopixel_control.py.
DART_COLOR_CYCLE [“red”, “orange”, …] Color list available in the on-device color selector menus. Add, remove, or reorder names to customize the cycle.
SELECTED_ANIMATION “solid_primary” Default idle LED animation while armed.
Firing configuration
SALVO_SIZES [0, 1, 4, 12] Ordered darts-per-trigger list. The prop cycles through entries exactly as written, so you can use values from 012 in any order and repeat values if you want. 0 fires one full row; other values fire that number of individual darts.
DARTS_PER_SALVO 0 Startup salvo size. Must match a value present in SALVO_SIZES. 0 starts in row-firing mode.
Gesture sensitivity
TILT_THRESHOLD 5.0 Angle in degrees needed to register a tilt gesture. Lower = more sensitive. Range: 1.0–10.0.
SHAKE_THRESHOLD 15 Sensitivity for shake detection. Lower = more sensitive. Range: 5–50.
TAP_THRESHOLD 127 Sensitivity for tap detection. Lower = more sensitive. Range: 20–127.
FIRE_WITH_SHAKE False Initial firing gesture on startup. True fires with shake; False fires with tilt. Also changeable in the on-device menu.
Demo mode
DEMO_MODE_TIMEOUT 0 Seconds before demo mode auto-exits. 0 disables the timeout. Range: 0–3600.
DEMO_BRIGHTNESS 0.5 LED brightness during demo mode. Range: 0.0–1.0.
Advanced
_SERVO_ANGLES [0, 70, 120, 180] Servo positions for Off, Outer row, Middle row, and Inner row. Adjust only if your servo calibration differs from stock.
AUDIO_LEVEL 1 Sound effect volume. Range: 0.0 (muted) to 1.0 (maximum).
DEBUG_MODE False Enables serial console debug output. Set True only when diagnosing firmware issues.
  1. Choose dart and afterburner colors. Set DART_TIP_COLOR and AFTERBURNER_COLOR to any color name listed in lib/neopixel_control.py. Colors can also be changed on the device using the configuration menu.
  2. Review SALVO_SIZES. The default [0, 1, 4, 12] is just an example. Edit the list to any sequence of values from 012, in any order, and repeat values if you want some salvo sizes to appear more than once while cycling.
  3. Save and verify. Save config.py. The board restarts automatically after a few seconds. A blue startup flash confirms the updated configuration loaded.

Verify Boot

After copying files or saving a config change, the board reboots and runs the firmware automatically. Watch the LED on the center of the microcontroller.