[{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/000/841/original/IMG_20240419_190706_1.jpg?1714053774","metadata":{"caption":""}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003cp\u003eThis is a project that was years in the making, I went through many iterations that failed one way or the other. However, the final project was only started about a few months ago. It's great to see this project realized at last! The trigger really works, it has the appropriate sound effects, it has two firing speeds, and a \"virtual ammo\" system that you replenish by physically removing and reinserting the cartridge. So, where did it all begin?\u003c/p\u003e\n\u003cp\u003eThe initial step of the process was to design the 3D printable case, which I did in blender. I found someone who extracted a model of the Necrochasm from the game itself and went to work sculpting out the finer details, hollowing out the interior, and adding LED areas. I also took this time to log into Destiny, and use my in-game Necrochasm to record the proper sound effects.\u003c/p\u003e\n      \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","metadata":{}},{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/000/842/original/Necro_Blender_Before-After.jpg?1714054316","metadata":{"caption":"Top: Original model, before any alterations. Bottom: Finished model with sculpted details and additional pieces."}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003cp\u003eI exported the resulting pieces from blender to fusion 360 where I added the hardware mounting features. My vision for this prop was to have one area where most of the electronics were stored. This trapezoidal area at the bottom-front of the prop looked like it had the most storage capacity.\u003c/p\u003e\n      \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","metadata":{}},{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/000/843/original/ElectronicsBay_Fusion360.jpg?1714057848","metadata":{"caption":""}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003cp\u003eAt the same time the model was in development with blender and fusion 360, I was getting my electronic parts in order. I decided early on that I wanted to use the prop-maker rp2040 feather because it had features that I would normally use separate parts for, like sound output and lipo charging. Not only that, but I had limited python skills, and writing circuitpython code for the prop-maker would be an excellent opportunity. Instead of writing the full code right away, I wrote a test script that would ensure all of my hardware was working as I was putting together this prop.\u0026nbsp;\u003c/p\u003e\n      \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","metadata":{}},{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/000/844/original/IMG_20240402_103330209.jpg?1714055209","metadata":{"caption":""}},{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/000/845/original/IMG_20240409_233351494_HDR.jpg?1714055254","metadata":{"caption":""}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003cp\u003eWhen printing the pieces, I used two colors of filament: black and translucent gray. The reason why I used a translucent gray filament instead of printing in clear was because I wanted the led backlit pieces to be less noticeable when the prop was turned off. It's quite obvious a lot of black filament was used, the main body of the prop alone came out in sixteen pieces, eight for each half. I used a special superglue for repairing gaming miniatures to stick the pieces together, then used an epoxy putty called \"green stuff\" (Yes, that is the name.) to smooth out the resulting seams. Then it was time for painting.\u003c/p\u003e\n      \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","metadata":{}},{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/000/846/original/IMG_20240411_000804933.jpg?1714055771","metadata":{"caption":"The first layer of paint was just a solid gray with some shading."}},{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/000/847/original/IMG_20240411_093757392.jpg?1714055806","metadata":{"caption":"Amazing what a black wash and some layers of light gray drybrushing will do."}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003cp\u003eOnce all the parts were painted, I finally moved on to the electronics assembly. First order of business was getting everything on the main electronics platform sorted out. The prop-maker feather sat on a lid covering the lipo battery I planned to power this model with, and a DC rumble motor sat right next to the feather. I put on the electronics platform a ground bus bar, installed a mini slide switch grounding the EN pin, hooked up the speaker and wired a single button. The trickiest part of this whole setup was the H-bridge motor driver board. I thought that 3.3v would be enough to power it but I was wrong, so very wrong. Worse, when I tried to use the motor, it made the speaker let out an ear-piercing screech. I eventually hooked up the driver board to the 5V pin on the terminal block.\u003c/p\u003e\n      \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","metadata":{}},{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/000/848/original/IMG_20240413_160956400.jpg?1714055926","metadata":{"caption":""}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003cp\u003eOne of the things I'm most proud of is how discreetly I put in the battery monitoring circuit. Per Adafruit's instructions, I soldered two 100K ohm resistors in series connecting the battery voltage pin to an analog pin and then to ground. However, I did so in a way that they would be barely noticeable.\u003c/p\u003e\n      \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","metadata":{}},{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/000/849/original/IMG_20240413_114659127.jpg?1714056440","metadata":{"caption":""}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003cp\u003eNext, I went to work on the main body of the prop. Basically, my plan was to have two symmetrical strips of neopixels lighting up both halves of the prop. However, there were some neopixels that sat in the middle of the prop, and there was also the removable cartridge to take care of. So, what I did was extend the strip on only one half of the case to account for these lights. The neopixels in the cartridge were the very last in the sequence, being the only removable aspect.\u003c/p\u003e\n      \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","metadata":{}},{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/000/851/original/IMG_20240413_165956332.jpg?1714057548","metadata":{"caption":"Fiber optics were used to pipe lighting from neopixels to small areas. This cluster of lights was also the first neopixel in the strip."}},{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/000/853/original/IMG_20240413_191632558.jpg?1714057781","metadata":{"caption":"I spliced a diffused neopixel bulb, which was an RGB LED into a GRB strip. This was color corrected in the final code."}},{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/000/854/original/IMG_20240413_211929979_HDR.jpg?1714057836","metadata":{"caption":"The inside of the Necrochasm casing. Messy, isn't it? The fact that it was tethered to my electronics platform made handing very difficult."}},{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/000/852/original/IMG_20240413_212024360_HDR.jpg?1714057619","metadata":{"caption":""}},{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/000/855/original/IMG_20240414_111717118_HDR.jpg?1714058091","metadata":{"caption":"The trigger was just a simple lever switch. Because the return force of the switch wasn't strong enough to move the trigger back, I haphazardly used a 3D pen to insert a compression spring."}},{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/000/856/original/IMG_20240416_104229751_HDR.jpg?1714058262","metadata":{"caption":"The targeting reticle, that green Y-shaped piece was the trickiest engineering feat of all. I used fiber optics to pipe light through the whole thing, and lit it up with a super bright green LED."}},{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/000/857/original/IMG_20240416_123244658.jpg?1714058584","metadata":{"caption":"Soldering the cartridge's magnetic connector. Note the purple line that is already connected to the black ground line. I used the purple wire for the pin that detects when the cartridge is inserted."}},{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/000/858/original/IMG_20240416_123251521.jpg?1714058787","metadata":{"caption":"In my test code, the prop-maker's onboard LED lit up when the cartridge pin was grounded."}},{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/000/860/original/IMG_20240416_132117555.jpg?1714059225","metadata":{"caption":"The cartridge also has a USB-C port for charging the prop."}},{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/000/859/original/IMG_20240416_135523633_HDR.jpg?1714059017","metadata":{"caption":"One half of the cartridge done. The other half just needed its own neopixels."}},{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/000/861/original/IMG_20240416_204222510_HDR.jpg?1714059290","metadata":{"caption":"To ensure both halves of the prop's casing had its LEDs wired the same way, I uploaded a new version of the code that separated sections by color. It actually looked really neat this way."}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003cp\u003eOnce all the electronics were wired up, the next step was to glue both halves of the casing together. Admittedly, making all those neopixels and the trigger non-serviceable was a risky move, but I was going for immersion when it came to this prop. However, the electronics platform, where the prop-maker was located, and the magnetic connector for the cartridge would be still accessible. This was especially important, because I was nowhere near done with the prop-maker's code at this stage.\u003c/p\u003e\n      \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","metadata":{}},{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/000/862/original/IMG_20240417_105920586_HDR.jpg?1714059699","metadata":{"caption":"Once the two halves were glued together, I got to work managing the tangle of wires that led to my electronics platform. The JST connector manages the non-neopixel LEDS, reload pin, and charging, while the header pin goes to the terminal block on the prop-maker."}},{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/000/863/original/IMG_20240417_125628936_HDR.jpg?1714059825","metadata":{"caption":"The external button pin on the prop-maker's terminal block goes to the trigger. This is represented by the blue wire."}},{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/000/864/original/IMG_20240417_125619541_HDR.jpg?1714059990","metadata":{"caption":"I also put in brass inserts once the two halves were glued together. This is the cartridge port, fully secured in its casing."}},{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/000/867/original/IMG_20240417_125635983_HDR.jpg?1714060913","metadata":{"caption":"Getting some cable management done with zip-ties."}},{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/000/865/original/IMG_20240418_074514097.jpg?1714060244","metadata":{"caption":"I used more green stuff to touch up the middle seam, and this was the perfect opportunity to go back and sand down all of my other seams. In hindsight, I didn't do so well the first time around."}},{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/000/866/original/IMG_20240418_203304303_HDR.jpg?1714060346","metadata":{"caption":"The finished project in a semi-working state. It's recieving a charge through the USB port. The horizontal stripe above the trigger is actually a battery indicator. The shorter it gets, the lower the battery voltage."}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003cp\u003eNow that all the hardware was working, it was time to program it. This was the biggest challenge of all. Animating the flame segments took a lot of the prop-maker's processing power, and it was messing up the timing of the code. After all, I had a few LEDs that were supposed to blink in sync with the firing sound effect. In the end, everything had to be subdued. I had to lower the brightness of the LEDs to give more power to the motor, the flame LEDs would stop animating when the Necrochasm was firing, but I think my biggest handicap of all was the fact this thing was written in python. I already knew how to program for the Arduino family of boards at this point, but I wanted to write the code for this in circuitpython as a learning experience, and I knew the prop-maker was Arduino compatible. Maybe I'll rewrite the code in the Arduino IDE at a later date, but I'm happy with how it turned out for now.\u003c/p\u003e\n      \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","metadata":{}},{"element_type":"code","content":"# Necrochasm Prop Maker Feather RP2040 Python Code\n# Written by Christopher Littlefield\n# \"Is your Light bright enough to stand in full gaze of the Hive's abyss?\"\n\nimport board\nimport analogio\nimport digitalio\nimport pwmio\nimport time\nimport random\nimport neopixel\nimport audiobusio\nimport audiocore\nimport audiomixer\nfrom adafruit_motor import motor\nfrom adafruit_debouncer import Debouncer\n\nmax_ammo = 50\nammo = 0\nrpm = 720  # The Necrochasm has two firing speeds: 720 and 900 rpm.\n# This value controls the timing of the code to make the prop's firing rate accurate.\nammo_interval = 60 / rpm\nammo_time = -3600\ninfinite_ammo = False\ninfinite_ammo_timer = 5.0\n# Desperation is an in-game feature where the Necrochasm's reload speed is temporailiy\n# increased to 900 RPM. In the prop, this is meant to be triggered by a button press,\n# then reloading the gun.\ndesperation_ready = False\ndesperation_activated = -3600.0\ndesperation_pressed = -3600.0\ndesperation_timer = 6.0\ndesperation_pin = digitalio.DigitalInOut(board.D12)\ndesperation_pin.direction = digitalio.Direction.INPUT\ndesperation_pin.switch_to_input(pull=digitalio.Pull.UP)\ndesperation_button = Debouncer(desperation_pin)\n\n# The reload pin is grounded while the ammo cartridge is inserted into the prop.\n# If the pin is open, the cartridge has been removed.\nreload_pin = digitalio.DigitalInOut(board.D11)\nreload_pin.direction = digitalio.Direction.INPUT\nreload_pin.switch_to_input(pull=digitalio.Pull.UP)\nreload = Debouncer(reload_pin)\ntrigger_pin = digitalio.DigitalInOut(board.EXTERNAL_BUTTON)\ntrigger_pin.direction = digitalio.Direction.INPUT\ntrigger_pin.switch_to_input(pull=digitalio.Pull.UP)\ntrigger = Debouncer(trigger_pin)\n# This LED flashes in sync with the Necrochasm's firing rate.\nbarrel_led = digitalio.DigitalInOut(board.D10)\nbarrel_led.direction = digitalio.Direction.OUTPUT\nbarrel_led.value = False\n\nrumble_a = pwmio.PWMOut(board.D24, frequency=50)\nrumble_b = pwmio.PWMOut(board.D25, frequency=50)\nrumble_motor = motor.DCMotor(rumble_a, rumble_b)\nthrottle_motor = throttle720 = 0.17\nthrottle900 = 0.25\n\n# Neopixel Indicies\nfiber_optics_indexA = 0\nlower_flames_index = fiber_optics_indexA + 1\nupper_flames_index = lower_flames_index + 13\ntargeting_light_index = upper_flames_index + 21\nfiber_optics_indexB = targeting_light_index + 1\ncore_stripes_index = fiber_optics_indexB + 1\nstripe_index = core_stripes_index + 3\ncore_index = stripe_index + 7\ncore_flames_index = core_index + 1\nridges_index = core_flames_index + 3\ncartridge_index = ridges_index + 5\nend_of_string = cartridge_index + 5\nnum_pixels = end_of_string + 1\n\n# NOTE: \"targeting_light_index\" refers to a RGB LED, as opposed to the regular GRB leds.\n# So, switch red and green values when programming color.\n\n# Enable the external power pin so the addressable LEDS and sound can be used.\nenable = digitalio.DigitalInOut(board.EXTERNAL_POWER)\nenable.direction = digitalio.Direction.OUTPUT\nenable.value = True\n\n# These variables help measure the battery level of the Necrochasm.\nvbat_voltage = analogio.AnalogIn(board.A3)\nbattery_voltage = 0.0\n\npixel = neopixel.NeoPixel(board.EXTERNAL_NEOPIXELS, num_pixels)\npixel.brightness = 0.1\nflame_start = 128\n# Audio Related\ni2s = audiobusio.I2SOut(board.I2S_BIT_CLOCK, board.I2S_WORD_SELECT, board.I2S_DATA)\nfire_wav = necro720 = audiocore.WaveFile(\"sounds/Necro720.wav\")\nnecro900 = audiocore.WaveFile(\"sounds/Necro900.wav\")\nheadshot = audiocore.WaveFile(\"sounds/Headshot.wav\")\nroar = audiocore.WaveFile(\"sounds/Roar.wav\")\n# The reason for the mixer is in the event the headshot file is played over the\n# normal firing sound.\nmixer = audiomixer.Mixer(voice_count=2, sample_rate=necro720.sample_rate,\n    channel_count=2, bits_per_sample=necro720.bits_per_sample, samples_signed=True)\ni2s.play(mixer)\nmixer.voice[0].level = 1  # voice 0 is used for firing the Necrochasm\nmixer.voice[1].level = 1  # voice 1 is used for playing the Headshot file\n\ndef animate_flames(pixel_array, low, high):\n    flame_increment = 40\n    flame_max_brightness = 255\n    for i in range(low, high):\n        color = list(pixel_array[i])  # Neopixel colors are a tuple, so convert to list.\n        # Pull Green value from index 1.\n        color[1] += flame_increment\n        if color[1] \u003e flame_max_brightness:\n            color[1] = random.randrange(0, int(flame_increment/2))\n        pixel_array[i] = (0, color[1], 0)\n\ndef get_voltage(pin):\n    return pin.value / 65535 * 3.3 * 2\n\n# Startup Sequence\nif reload.value is False:\n    ammo = max_ammo\nelse:\n    ammo = 0\nbattery_voltage = get_voltage(vbat_voltage)\n\npixel[fiber_optics_indexA] = (0, 255, 0)\nfor i in range(lower_flames_index, targeting_light_index):\n    pixel[i] = (0, random.randrange(0, flame_start), 0)\n# Remember, we swap red and green at this index.\npixel[targeting_light_index] = (255, 0, 0)\nfor i in range(fiber_optics_indexB, core_flames_index):\n    pixel[i] = (0, 255, 0)\nfor i in range(core_flames_index, ridges_index):\n            pixel[i] = (0, random.randrange(0, flame_start), 0)\nfor i in range(ridges_index, end_of_string):\n    pixel[i] = (0, 255, 0)\n\nwhile True:\n    reload.update()\n    desperation_button.update()\n    trigger.update()\n\n    #Battery Voltage Indicator\n    battery_voltage = get_voltage(vbat_voltage)\n    if battery_voltage \u003e 3.8:\n        pixel[stripe_index] = (0, 255, 0)\n    else:\n        pixel[stripe_index] = (0, 0, 0)\n    if battery_voltage \u003e 3.7:\n        pixel[stripe_index+1] = (0, 255, 0)\n    else:\n        pixel[stripe_index+1] = (0, 0, 0)\n    if battery_voltage \u003e 3.6:\n        pixel[stripe_index+2] = (0, 255, 0)\n    else:\n        pixel[stripe_index+2] = (0, 0, 0)\n    if battery_voltage \u003e 3.5:\n        pixel[stripe_index+3] = (0, 255, 0)\n    else:\n        pixel[stripe_index+3] = (0, 0, 0)\n    if battery_voltage \u003e 3.4:\n        pixel[stripe_index+4] = (0, 255, 0)\n    else:\n        pixel[stripe_index+4] = (0, 0, 0)\n    if battery_voltage \u003e 3.3:\n        pixel[stripe_index+5] = (0, 255, 0)\n    else:\n        pixel[stripe_index+5] = (0, 0, 0)\n    if battery_voltage \u003e 3.2:\n        pixel[stripe_index+6] = (0, 255, 0)\n    else:\n        pixel[stripe_index+6] = (0, 0, 0)\n\n    if trigger.fell and ammo \u003e 0:\n        mixer.voice[0].play(fire_wav, loop=infinite_ammo\n        )\n        rumble_motor.throttle = throttle_motor\n\n    if trigger.rose or ammo \u003c= 0:\n        mixer.voice[0].stop()\n        rumble_motor.throttle = 0\n        barrel_led.value = False\n        for i in range(ridges_index, cartridge_index):\n            pixel[i] = (0, 255, 0)\n\n    if trigger.value is False and ammo \u003e 0:\n        if time.monotonic() \u003e (ammo_time + (ammo_interval / 2)):\n            if barrel_led.value is False:\n                barrel_led.value = True\n                for i in range(ridges_index, cartridge_index):\n                    pixel[i] = (0, 255, 0)\n                ammo_time = time.monotonic()\n            else:\n                barrel_led.value = False\n                for i in range(ridges_index, cartridge_index):\n                    pixel[i] = (0, 0, 0)\n                ammo_time = time.monotonic()\n            if infinite_ammo is False:\n                ammo -= 1\n\n            if ammo \u003e 25:\n                topLED = (ammo - 25) * 10\n                pixel[cartridge_index] = pixel[cartridge_index + 2] = (0, 250, 0)\n                pixel[cartridge_index + 1] = pixel[cartridge_index + 3] = (0, topLED, 0)\n            else:\n                pixel[cartridge_index] = pixel[cartridge_index + 2] = (0, ammo * 10, 0)\n                pixel[cartridge_index + 1] = pixel[cartridge_index + 3] = (0, 0, 0)\n    else:\n        animate_flames(pixel, lower_flames_index, targeting_light_index)\n        animate_flames(pixel, core_flames_index, ridges_index)\n    if reload.fell:\n        ammo = max_ammo\n        for i in range(cartridge_index, cartridge_index + 4):\n            pixel[i] = (0, 255, 0)\n        if desperation_ready:\n            desperation_activated = time.monotonic()\n            rpm = 900\n            ammo_interval = 60 / rpm\n            fire_wav = necro900\n            throttle_motor = throttle900\n            desperation_ready = False\n\n    if reload.rose:\n        ammo = 0\n\n    if desperation_button.fell:\n        desperation_pressed = time.monotonic()\n\n    if desperation_button.rose:\n        if time.monotonic() \u003e (desperation_pressed + infinite_ammo_timer):\n            mixer.voice[1].play(roar, loop=False)\n            infinite_ammo = not infinite_ammo\n            ammo = max_ammo\n            for i in range(cartridge_index, cartridge_index + 4):\n                pixel[i] = (0, 255, 0)\n        else:\n            mixer.voice[1].play(headshot, loop=False)\n            desperation_ready = True\n\n    if time.monotonic() \u003e (desperation_activated + desperation_timer) and rpm == 900:\n        rpm = 720\n        ammo_interval = 60 / rpm\n        fire_wav = necro720\n        throttle_motor = throttle720\n        if trigger.value is False:\n            rumble_motor.throttle = throttle720\n        else:\n            rumble_motor.throttle = 0\n        if mixer.voice[0].playing:\n            mixer.voice[0].play(fire_wav, loop=True)","metadata":{"language":"python","linenums":false}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003cp\u003eI ended up using some parts from Adafruit, but a lot of my parts came from Amazon. The parts I did get from Adafruit are as follows:\u003c/p\u003e\n\u003cp\u003eFirst, the brains of the Necrochasm itself: the Prop-Maker Feather.\u003c/p\u003e\n      \n\n\n\n\n\n\n\n\n\n\n\n\n","metadata":{}},{"element_type":"product","content":"https://www.adafruit.com/product/5768","metadata":{}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003cp\u003eThe removable cartridge was accomplished thanks to a 5-pin magnetic connector.\u003c/p\u003e\n      \n\n\n\n\n\n\n\n\n\n\n","metadata":{}},{"element_type":"product","content":"https://www.adafruit.com/product/5413","metadata":{}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003cp\u003eMost of my LEDs were a generic addressable strip, but there were some exceptions.\u0026nbsp;\u003c/p\u003e\n      \n\n\n\n\n\n\n\n\n","metadata":{}},{"element_type":"product","content":"https://www.adafruit.com/product/1938","metadata":{}},{"element_type":"product","content":"https://www.adafruit.com/product/300","metadata":{}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n        \u003cp\u003eA small button on my electronics platform was backed by a soft tactile switch.\u003c/p\u003e\n      \n\n\n\n\n\n","metadata":{}},{"element_type":"product","content":"https://www.adafruit.com/product/3101","metadata":{}},{"element_type":"text","content":"\n  \n  \n  \n        \u003cp\u003eAnd that is how I did it! This was less of an instruction manual and more of a description of the process. Hopefully you enjoyed seeing how I brought my prop to life.\u003c/p\u003e\n      \n\n\n","metadata":{}}]