├── Arduino ├── Neutrino_Wand │ └── Neutrino_Wand.ino ├── Neutrino_Wand_With_Graph │ └── Neutrino_Wand_With_Graph.ino ├── Neutrino_Wand_With_Graph_And_ECig_Relay │ └── Neutrino_Wand_With_Graph_And_ECig_Relay.ino ├── SpiritMinimial │ ├── README.md │ └── SpiritMinimial.ino ├── bargraph_code │ ├── README.md │ └── bargraph_code.ino └── libraries │ ├── Adafruit_NeoPixel │ ├── Adafruit_NeoPixel.cpp │ ├── Adafruit_NeoPixel.h │ ├── COPYING │ ├── README.md │ ├── esp8266.c │ ├── examples │ │ ├── RGBWstrandtest │ │ │ ├── .esp8266.test.skip │ │ │ ├── .trinket.test.skip │ │ │ └── RGBWstrandtest.ino │ │ ├── StrandtestBLE │ │ │ ├── .test.skip │ │ │ ├── BLESerial.cpp │ │ │ ├── BLESerial.h │ │ │ └── StrandtestBLE.ino │ │ ├── buttoncycler │ │ │ ├── .esp8266.test.skip │ │ │ └── buttoncycler.ino │ │ ├── simple │ │ │ ├── .esp8266.test.skip │ │ │ └── simple.ino │ │ └── strandtest │ │ │ ├── .esp8266.test.skip │ │ │ └── strandtest.ino │ ├── keywords.txt │ └── library.properties │ ├── Adafruit_Soundboard_library │ ├── Adafruit_Soundboard.cpp │ ├── Adafruit_Soundboard.h │ ├── README.md │ ├── examples │ │ └── menucommands │ │ │ └── menucommands.ino │ └── library.properties │ ├── QueueArray │ ├── COPYING │ ├── Examples │ │ └── ManageString │ │ │ └── ManageString.ino │ ├── QueueArray.h │ └── keywords.txt │ └── SparkFun_SX1509_Arduino_Library │ ├── README.md │ ├── examples │ ├── analogWrite │ │ └── analogWrite.ino │ ├── blink │ │ └── blink.ino │ ├── breathe │ │ └── breathe.ino │ ├── clock │ │ └── clock.ino │ ├── demo │ │ └── demo.ino │ ├── digitalRead │ │ └── digitalRead.ino │ ├── digitalReadInterrupt │ │ └── digitalReadInterrupt.ino │ ├── digitalWrite │ │ └── digitalWrite.ino │ ├── keypad │ │ └── keypad.ino │ └── keypadInterrupt │ │ └── keypadInterrupt.ino │ ├── extras │ └── sx150x_789.pdf │ ├── keywords.txt │ ├── library.properties │ └── src │ ├── SparkFunSX1509.cpp │ ├── SparkFunSX1509.h │ └── util │ └── sx1509_registers.h ├── EAGLE ├── proton_pack_neopixel_driver.brd ├── proton_pack_neopixel_driver.sch ├── wand_io.brd └── wand_io.sch ├── Fritzing ├── Spirit_Proton_Pack.fzz ├── proton_pack_no_bargraph.fzz └── proton_pack_with_bargraph.fzz ├── LICENSE ├── Model ├── 83_Percent_Pack │ ├── back_brace_pvc_plug.stl │ ├── back_brace_standoff.stl │ ├── back_brace_top.stl │ ├── base_1.stl │ ├── base_2.stl │ ├── base_3.stl │ ├── booster_1.stl │ ├── booster_2.stl │ ├── booster_3.stl │ ├── booster_4.stl │ ├── booster_straight_barb.stl │ ├── bumper_1.stl │ ├── bumper_2.stl │ ├── bumper_3.stl │ ├── bumper_4.stl │ ├── clippard_base.stl │ ├── connectors.stl │ ├── crankgen_1.stl │ ├── crankgen_2.stl │ ├── crankgen_3.stl │ ├── cyclotron_1_closed.stl │ ├── cyclotron_1_open.stl │ ├── cyclotron_2.stl │ ├── cyclotron_3.stl │ ├── cyclotron_light_covers.stl │ ├── cyclotron_light_holder_neopixel.stl │ ├── dale.stl │ ├── gunbracket_1.stl │ ├── gunbracket_2.stl │ ├── gunmount_1.stl │ ├── gunmount_2.stl │ ├── gunmount_3.stl │ ├── hga.stl │ ├── individual_neopixel_holder.stl │ ├── ion_1.stl │ ├── ion_2.stl │ ├── ion_arm_90_barb.stl │ ├── ion_arm_90_female.stl │ ├── ion_rod_short.stl │ ├── knob.stl │ ├── ladder.stl │ ├── mb_mount.stl │ ├── motherboard_standoff_long.stl │ ├── nfilter_venting_neopixel_holder.stl │ ├── plating_1.stl │ ├── plating_2.stl │ ├── plating_3.stl │ ├── plating_4.stl │ ├── powercell_1.stl │ ├── powercell_2.stl │ ├── powercell_3.stl │ ├── powercell_neopixel_mount.stl │ ├── ribbon_cable_mount.stl │ ├── syncgen_1.stl │ ├── syncgen_2.stl │ ├── syncgen_3.stl │ ├── syncgen_4.stl │ ├── syncgen_5.stl │ ├── syncgen_6.stl │ ├── syncgen_7.stl │ ├── syncgen_loom_mount.stl │ ├── tab.stl │ └── top_90_barb.stl ├── 83_Percent_Pack_Lefty │ ├── back_brace_standoff.stl │ ├── base_1.stl │ ├── base_2.stl │ ├── base_3.stl │ ├── booster_1.stl │ ├── booster_2.stl │ ├── booster_3.stl │ ├── booster_4.stl │ ├── booster_straight_barb.stl │ ├── bumper_1.stl │ ├── bumper_2.stl │ ├── bumper_3.stl │ ├── bumper_4.stl │ ├── clippard_base.stl │ ├── connectors.stl │ ├── crankgen_1.stl │ ├── crankgen_2.stl │ ├── crankgen_3.stl │ ├── cyclotron_1_closed.stl │ ├── cyclotron_1_open.stl │ ├── cyclotron_2.stl │ ├── cyclotron_3.stl │ ├── cyclotron_light_covers.stl │ ├── cyclotron_light_holder_neopixel.stl │ ├── dale.stl │ ├── gunbracket_1.stl │ ├── gunbracket_2.stl │ ├── gunmount_1.stl │ ├── gunmount_2.stl │ ├── gunmount_3.stl │ ├── hga.stl │ ├── individual_neopixel_holder.stl │ ├── ion_1.stl │ ├── ion_2.stl │ ├── ion_3.stl │ ├── ion_arm_90_barb.stl │ ├── ion_arm_90_female.stl │ ├── ion_rod_long.stl │ ├── ion_rod_short.stl │ ├── knob.stl │ ├── ladder.stl │ ├── mb_mount.stl │ ├── motherboard_standoff_long.stl │ ├── nfilter_venting_neopixel_holder.stl │ ├── plating_1.stl │ ├── plating_2.stl │ ├── plating_3.stl │ ├── plating_4.stl │ ├── powercell_1.stl │ ├── powercell_2.stl │ ├── powercell_3.stl │ ├── powercell_4.stl │ ├── powercell_neopixel_mount.stl │ ├── ribbon_cable_mount.stl │ ├── syncgen_1.stl │ ├── syncgen_2.stl │ ├── syncgen_3.stl │ ├── syncgen_4.stl │ ├── syncgen_5.stl │ ├── syncgen_6.stl │ ├── syncgen_7.stl │ ├── syncgen_loom_mount.stl │ ├── tab.stl │ └── top_90_barb.stl ├── 83_Percent_Proton_Wand │ ├── clippard.stl │ ├── front_green_tube_barbs.stl │ ├── front_handle_clear_tube_adapter.stl │ ├── front_handle_end_piece.stl │ ├── front_handle_finger_guard.stl │ ├── front_handle_hose_mount.stl │ ├── front_handle_mount.stl │ ├── front_handle_wing.stl │ ├── front_nose_spacer.stl │ ├── gunbox_back_handle_valve.stl │ ├── gunbox_back_panel_knob.stl │ ├── gunbox_base.stl │ ├── gunbox_baseplate_combined.stl │ ├── gunbox_front.stl │ ├── gunbox_front_cover.stl │ ├── gunbox_front_panel_side_connector.stl │ ├── gunbox_front_trigger_box.stl │ ├── gunbox_front_valve.stl │ ├── gunbox_grip.stl │ ├── gunbox_heatsink.stl │ ├── gunbox_main_side_large_knob.stl │ ├── gunbox_main_side_small_knob.stl │ ├── gunbox_side_knob.stl │ ├── gunbox_top_knob.stl │ ├── gunbox_vent_light_mount.stl │ └── individual_neopixel_holder.stl └── SpiritHalloweenProtonPackMods │ ├── cyclotron_individual_neopixel.stl │ ├── front_handle_clear_tube_adapter.stl │ ├── gunbracket_base.stl │ ├── gunbracket_female.stl │ ├── gunbracket_male.stl │ ├── guntrack_spirit.stl │ └── powercell_neopixel_mount.stl ├── Proton Pack Circuit Diagram - No Bargraph.png ├── Proton Pack Circuit Diagram - With Bargraph.png ├── README.md ├── Sounds ├── T00.wav ├── T01.wav ├── T02.wav ├── T03.wav ├── T03_short.wav ├── T04.wav ├── T05.wav ├── T06.wav ├── T07.wav ├── T08.wav ├── T09.wav ├── T10.wav ├── T11.wav ├── T12.wav ├── T13.wav ├── T14.wav └── T15.wav ├── Spirit Halloween Proton Pack - Alternate Pack Light Circuit.png ├── Spirit Halloween Proton Pack - Pack Light Circuit.png ├── bargraph_front.jpg ├── bargraph_rear.jpg ├── eagle_proton_pack_neopixel_driver.png ├── eagle_proton_pack_neopixel_driver_wiring_example.png ├── eagle_wand_io.png └── eagle_wand_io_internal.png /Arduino/SpiritMinimial/README.md: -------------------------------------------------------------------------------- 1 | I had a bunch of extra components lying around so I decided I would use them to upgrade the lighting on my Spirit pack. I wanted the standard powercell and cyclotron animations while I walk around. I kept the flashing light in the powercell when firing the wand but removed them on the cyclotron. The result can be seen here: 2 | 3 | [![IMAGE ALT TEXT](http://img.youtube.com/vi/f6RJXqUei0Q/0.jpg)](https://www.youtube.com/watch?v=f6RJXqUei0Q "Spirit Halloween Ghostbusters Proton Pack Lighting Upgrade") 4 | 5 | There are options in the code to use the video game cyclotron animation or just the regular light cycle. 6 | ``` 7 | const bool useGameCyclotronEffect = true; // set this to true to get the fading previous cyclotron light in the idle sequence 8 | const bool useCyclotronFadeInEffect = true; // Instead of the yellow alternate flashing on boot this fades the cyclotron in from off to red 9 | ``` 10 | 11 | You can also adjust the speed of the animations by updating these variables: 12 | ``` 13 | // ############################## 14 | // bootup animation speeds 15 | // ############################## 16 | const int pwr_boot_interval = 30; // How fast to do the powercell drop animation on bootup 17 | const int cyc_boot_interval = 400; // If useCyclotronFadeInEffect is false this alternates the cycltron lights yellow 18 | const int cyc_boot_alt_interval = 100; // How fast to fade in the cyclotron lights from black to red on bootup 19 | 20 | // ############################## 21 | // idle animation speeds 22 | // ############################## 23 | const int pwr_interval = 50; // how fast the powercell cycles 24 | const int cyc_interval = 750; // how fast the cycltron cycles from one cell to the next 25 | const int cyc_fade_interval = 1; // if useGameCyclotronEffect is true this is how fast to fade the previous cyclotron to light to nothing 26 | ``` 27 | 28 | Example components used for this update 29 | 30 | * [Optional power converter set to 5V output: 6 for $9.69](https://www.amazon.com/gp/product/B01MQGMOKI) 31 | * [Arduino Nano: 3 for $11.86](https://www.amazon.com/gp/product/B0713XK923) 32 | * [Two Neopixel Sticks: 1 for $7.99](https://www.amazon.com/ACROBOTIC-8-Pixel-Addressable-NeoPixels-WS2812B/dp/B06XRPLCV1) 33 | * [Individual Neopixel: 100 for $15.88](https://www.amazon.com/gp/product/B01AG8X1X8) 34 | 35 | You can probably find these components cheaper if you look around. For instance I have found packages of the sticks for under $10 for 5 of them before 36 | 37 | Here is a fritzing diagram of the whole setup with the power converter: 38 | 39 | [![IMAGE ALT TEXT](https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/master/Spirit%20Halloween%20Proton%20Pack%20-%20Pack%20Light%20Circuit.png) 40 | 41 | If you wanted to not use the power converter and are ok with the lights being a bit dimmer you can use this setup which would be simpler to solder up. The code would be the same 42 | [![IMAGE ALT TEXT](https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/master/Spirit%20Halloween%20Proton%20Pack%20-%20Alternate%20Pack%20Light%20Circuit.png) 43 | 44 | For my pack I'll be using an old 11.1v 1800mah lipo I had laying around. You could easily use 4 AAA's as well for this setup and they would last a long time. Something like this: https://www.amazon.com/Sackorange-Battery-Spring-Plastic-Holder/dp/B071ZQ3DGT would work well if you wanted to use that. 45 | 46 | I like to use the power converter set to 5v output as the neopixels like more stable voltage than the 5v out on the arduino can handle. It allows you to go brighter with the neopixels. You could simplify this even more and remove the converter and use the arduino vin to take in the battery. I also like to use connectors but this whole setup could be easily soldered all together since it only uses 2 pins on the arduino. 47 | 48 | I also used some red and blue transparent folders to upgrade the light windows. Here are some pictures of the board I made and the installation. I created 2 models for 3d printing to make the installation easier. Those are also included in the github repo 49 | 50 | https://github.com/CountDeMonet/ArduinoProtonPack/tree/master/Model/SpiritHalloweenProtonPackMods 51 | 52 | I installed everything with hot glue. Easy and effective. I'll probably add a switch to turn the lights on and off instead of plugging the battery in each time but the install only took a few minutes. 53 | 54 | [![IMAGE ALT TEXT](https://i2.wp.com/vineripesoftware.files.wordpress.com/2017/10/img_20171015_095239274-copy.jpg?ssl=1&w=850) 55 | 56 | [![IMAGE ALT TEXT](https://i1.wp.com/vineripesoftware.files.wordpress.com/2017/10/img_20171015_095416093-copy.jpg?ssl=1&w=850) 57 | 58 | [![IMAGE ALT TEXT](https://i1.wp.com/vineripesoftware.files.wordpress.com/2017/10/img_20171015_102713199-copy.jpg?ssl=1&w=850) 59 | 60 | [![IMAGE ALT TEXT](https://i1.wp.com/vineripesoftware.files.wordpress.com/2017/10/img_20171015_102542397-copy.jpg?ssl=1&w=850) 61 | 62 | [![IMAGE ALT TEXT](https://i2.wp.com/vineripesoftware.files.wordpress.com/2017/10/img_20171015_102544974-copy.jpg?ssl=1&w=850) 63 | 64 | [![IMAGE ALT TEXT](https://i0.wp.com/vineripesoftware.files.wordpress.com/2017/10/img_20171015_104157688-copy.jpg?ssl=1&w=850) 65 | -------------------------------------------------------------------------------- /Arduino/bargraph_code/README.md: -------------------------------------------------------------------------------- 1 | All of this assumes you are using a 15 led bar graph. I'm combining a 5 led and a 10 led bargraph from Digikey. 2 | 3 | From the bargraph_code.ino you need to do the following: 4 | 5 | What this chunk does is include the sx1509 libraries and sets up the configuration. This assumes the library is configured stock and the address has not been changed. It also defines the LED locations for the bar graph. Take this code and insert it into the header of the Neutrino_Wand.ino file 6 | 7 | ```c++ 8 | #include // Include the I2C library (required) 9 | #include // Include SX1509 library 10 | 11 | // SX1509 I2C address (set by ADDR1 and ADDR0 (00 by default): 12 | const byte SX1509_ADDRESS = 0x3E; // SX1509 I2C address 13 | SX1509 io; // Create an SX1509 object to be used throughout 14 | 15 | // bargraph helper variables 16 | int seq_1_current = 0; // current led in sequence 1 17 | const int num_led = 15; // total number of leds in bar graph 18 | 19 | // SX1509 pin definitions for the leds on the graph: 20 | const byte SX1509_BAR_01 = 0; 21 | const byte SX1509_BAR_02 = 1; 22 | const byte SX1509_BAR_03 = 2; 23 | const byte SX1509_BAR_04 = 3; 24 | const byte SX1509_BAR_05 = 4; 25 | const byte SX1509_BAR_06 = 5; 26 | const byte SX1509_BAR_07 = 6; 27 | const byte SX1509_BAR_08 = 7; 28 | const byte SX1509_BAR_09 = 8; 29 | const byte SX1509_BAR_10 = 9; 30 | const byte SX1509_BAR_11 = 10; 31 | const byte SX1509_BAR_12 = 11; 32 | const byte SX1509_BAR_13 = 12; 33 | const byte SX1509_BAR_14 = 13; 34 | const byte SX1509_BAR_15 = 14; 35 | ``` 36 | 37 | The next chunk is added to the setup() function. This initialized the sx1509 board and makes sure the arduino is communicating. It configures the pin modes for the LED's as inputs and shutdown all of the LED's so they are not lit 38 | 39 | ```c++ 40 | // Call io.begin(
) to initialize the SX1509. If it 41 | // successfully communicates, it'll return 1. 42 | if (!io.begin(SX1509_ADDRESS)) { 43 | while (1) ; // If we fail to communicate, loop forever for now but it would be nice to warn the user somehow 44 | } 45 | 46 | // configuration for the bargraph LED's 47 | io.pinMode(SX1509_BAR_01, OUTPUT); 48 | io.pinMode(SX1509_BAR_02, OUTPUT); 49 | io.pinMode(SX1509_BAR_03, OUTPUT); 50 | io.pinMode(SX1509_BAR_04, OUTPUT); 51 | io.pinMode(SX1509_BAR_05, OUTPUT); 52 | io.pinMode(SX1509_BAR_06, OUTPUT); 53 | io.pinMode(SX1509_BAR_07, OUTPUT); 54 | io.pinMode(SX1509_BAR_08, OUTPUT); 55 | io.pinMode(SX1509_BAR_09, OUTPUT); 56 | io.pinMode(SX1509_BAR_10, OUTPUT); 57 | io.pinMode(SX1509_BAR_11, OUTPUT); 58 | io.pinMode(SX1509_BAR_12, OUTPUT); 59 | io.pinMode(SX1509_BAR_13, OUTPUT); 60 | io.pinMode(SX1509_BAR_14, OUTPUT); 61 | io.pinMode(SX1509_BAR_15, OUTPUT); 62 | 63 | // set everything off initially 64 | shutdown_leds(); 65 | ``` 66 | 67 | Right above the Loop() function in neutrino_wand.ino there are a number of intervals defined. The interval for the bargraph is already defined in neutrino_wand.ino. What this does is defines how often the bar graph is updated. If you wanted to speed up the bargraph this is the variable you would adjust. We define it here because in the main loop() we update this parameter so the bargraph can go faster when firing 68 | 69 | ```c++ 70 | long firing_interval = 40; // interval at which to cycle firing lights on the bargraph. We update this in the loop to speed up the animation so must be declared here (milliseconds). 71 | ``` 72 | 73 | The last part is to replace the stub functions in neutrino_wand.ino. At the very bottom of the neutrino_wand.ino file you will see these stubs 74 | 75 | ```c++ 76 | /*************** Bar Graph Animations *********************/ 77 | void shutdown_leds() { 78 | // stubb function for when I re-enable to bargraph 79 | } 80 | void barGraphSequenceOne(int currentMillis) { 81 | // stubb function for when I re-enable to bargraph 82 | } 83 | void barGraphSequenceTwo(int currentMillis) { 84 | // stubb function for when I re-enable to bargraph 85 | } 86 | ``` 87 | 88 | I kept the code that calls the bargraph in the file so all you have to do is update these stubs with the actual code. Simply copy this code and replace the stubbs with this. 89 | 90 | ```c++ 91 | /*************** Bar Graph Animations *********************/ 92 | // This is the idle sequence 93 | unsigned long prevBarMillis_on = 0; // bargraph on tracker 94 | const int pwrcl_interval = 60; // interval at which to cycle lights (milliseconds). 95 | bool reverseSequenceOne = false; 96 | 97 | void barGraphSequenceOne(int currentMillis) { 98 | // normal sync animation on the bar graph 99 | if (currentMillis - prevBarMillis_on > pwrcl_interval) { 100 | // save the last time you blinked the LED 101 | prevBarMillis_on = currentMillis; 102 | 103 | if ( reverseSequenceOne == false ) { 104 | switch_graph_led(seq_1_current, HIGH); 105 | seq_1_current++; 106 | if ( seq_1_current > num_led ) { 107 | reverseSequenceOne = true; 108 | } 109 | } else { 110 | switch_graph_led(seq_1_current, LOW); 111 | seq_1_current--; 112 | if ( seq_1_current < 0 ) { 113 | reverseSequenceOne = false; 114 | } 115 | } 116 | } 117 | } 118 | 119 | // This is the firing sequence 120 | unsigned long prevBarMillis_fire = 0; // bargraph firing tracker 121 | int fireSequenceNum = 1; 122 | 123 | void barGraphSequenceTwo(int currentMillis) { 124 | if (currentMillis - prevBarMillis_fire > firing_interval) { 125 | // save the last time you blinked the LED 126 | prevBarMillis_fire = currentMillis; 127 | 128 | switch (fireSequenceNum) { 129 | case 1: 130 | switch_graph_led(2, LOW); 131 | switch_graph_led(14, LOW); 132 | switch_graph_led(1, HIGH); 133 | switch_graph_led(15, HIGH); 134 | fireSequenceNum++; 135 | break; 136 | case 2: 137 | switch_graph_led(1, LOW); 138 | switch_graph_led(15, LOW); 139 | switch_graph_led(2, HIGH); 140 | switch_graph_led(14, HIGH); 141 | fireSequenceNum++; 142 | break; 143 | case 3: 144 | switch_graph_led(2, LOW); 145 | switch_graph_led(14, LOW); 146 | switch_graph_led(3, HIGH); 147 | switch_graph_led(13, HIGH); 148 | fireSequenceNum++; 149 | break; 150 | case 4: 151 | switch_graph_led(3, LOW); 152 | switch_graph_led(13, LOW); 153 | switch_graph_led(4, HIGH); 154 | switch_graph_led(12, HIGH); 155 | fireSequenceNum++; 156 | break; 157 | case 5: 158 | switch_graph_led(4, LOW); 159 | switch_graph_led(12, LOW); 160 | switch_graph_led(5, HIGH); 161 | switch_graph_led(11, HIGH); 162 | fireSequenceNum++; 163 | break; 164 | case 6: 165 | switch_graph_led(5, LOW); 166 | switch_graph_led(11, LOW); 167 | switch_graph_led(6, HIGH); 168 | switch_graph_led(10, HIGH); 169 | fireSequenceNum++; 170 | break; 171 | case 7: 172 | switch_graph_led(6, LOW); 173 | switch_graph_led(10, LOW); 174 | switch_graph_led(7, HIGH); 175 | switch_graph_led(9, HIGH); 176 | fireSequenceNum++; 177 | break; 178 | case 8: 179 | switch_graph_led(7, LOW); 180 | switch_graph_led(9, LOW); 181 | switch_graph_led(6, HIGH); 182 | switch_graph_led(10, HIGH); 183 | fireSequenceNum++; 184 | break; 185 | case 9: 186 | switch_graph_led(6, LOW); 187 | switch_graph_led(10, LOW); 188 | switch_graph_led(5, HIGH); 189 | switch_graph_led(11, HIGH); 190 | fireSequenceNum++; 191 | break; 192 | case 10: 193 | switch_graph_led(5, LOW); 194 | switch_graph_led(11, LOW); 195 | switch_graph_led(4, HIGH); 196 | switch_graph_led(12, HIGH); 197 | fireSequenceNum++; 198 | break; 199 | case 11: 200 | switch_graph_led(4, LOW); 201 | switch_graph_led(12, LOW); 202 | switch_graph_led(3, HIGH); 203 | switch_graph_led(13, HIGH); 204 | fireSequenceNum++; 205 | break; 206 | case 12: 207 | switch_graph_led(3, LOW); 208 | switch_graph_led(13, LOW); 209 | switch_graph_led(2, HIGH); 210 | switch_graph_led(14, HIGH); 211 | fireSequenceNum = 1; 212 | break; 213 | } 214 | } 215 | } 216 | 217 | /************************* Shutdown and helper functions ****************************/ 218 | void shutdown_leds() { 219 | // reset the sequence 220 | seq_1_current = 1; 221 | fireSequenceNum = 1; 222 | 223 | // shut all led's off 224 | for (int i = 1; i <= 15; i++) { 225 | switch_graph_led(i, LOW); 226 | } 227 | } 228 | 229 | void switch_graph_led(int num, int state) { 230 | switch (num) { 231 | case 1: 232 | io.digitalWrite(SX1509_BAR_01, state); 233 | break; 234 | case 2: 235 | io.digitalWrite(SX1509_BAR_02, state); 236 | break; 237 | case 3: 238 | io.digitalWrite(SX1509_BAR_03, state); 239 | break; 240 | case 4: 241 | io.digitalWrite(SX1509_BAR_04, state); 242 | break; 243 | case 5: 244 | io.digitalWrite(SX1509_BAR_05, state); 245 | break; 246 | case 6: 247 | io.digitalWrite(SX1509_BAR_06, state); 248 | break; 249 | case 7: 250 | io.digitalWrite(SX1509_BAR_07, state); 251 | break; 252 | case 8: 253 | io.digitalWrite(SX1509_BAR_08, state); 254 | break; 255 | case 9: 256 | io.digitalWrite(SX1509_BAR_09, state); 257 | break; 258 | case 10: 259 | io.digitalWrite(SX1509_BAR_10, state); 260 | break; 261 | case 11: 262 | io.digitalWrite(SX1509_BAR_11, state); 263 | break; 264 | case 12: 265 | io.digitalWrite(SX1509_BAR_12, state); 266 | break; 267 | case 13: 268 | io.digitalWrite(SX1509_BAR_13, state); 269 | break; 270 | case 14: 271 | io.digitalWrite(SX1509_BAR_14, state); 272 | break; 273 | case 15: 274 | io.digitalWrite(SX1509_BAR_15, state); 275 | break; 276 | } 277 | } 278 | ``` 279 | 280 | And with that everything should work. You'll have the idle animation on the bar graph and the firing animation with the speed increasing as you hold the button down as I showed in some of the videos. 281 | -------------------------------------------------------------------------------- /Arduino/bargraph_code/bargraph_code.ino: -------------------------------------------------------------------------------- 1 | #include // Include the I2C library (required) 2 | #include // Include SX1509 library 3 | 4 | // SX1509 I2C address (set by ADDR1 and ADDR0 (00 by default): 5 | const byte SX1509_ADDRESS = 0x3E; // SX1509 I2C address 6 | SX1509 io; // Create an SX1509 object to be used throughout 7 | 8 | // bargraph helper variables 9 | int seq_1_current = 0; // current led in sequence 1 10 | const int num_led = 15; // total number of leds in bar graph 11 | 12 | // SX1509 pin definitions for the leds on the graph: 13 | const byte SX1509_BAR_01 = 0; 14 | const byte SX1509_BAR_02 = 1; 15 | const byte SX1509_BAR_03 = 2; 16 | const byte SX1509_BAR_04 = 3; 17 | const byte SX1509_BAR_05 = 4; 18 | const byte SX1509_BAR_06 = 5; 19 | const byte SX1509_BAR_07 = 6; 20 | const byte SX1509_BAR_08 = 7; 21 | const byte SX1509_BAR_09 = 8; 22 | const byte SX1509_BAR_10 = 9; 23 | const byte SX1509_BAR_11 = 10; 24 | const byte SX1509_BAR_12 = 11; 25 | const byte SX1509_BAR_13 = 12; 26 | const byte SX1509_BAR_14 = 13; 27 | const byte SX1509_BAR_15 = 14; 28 | 29 | void setup() { 30 | // Call io.begin(
) to initialize the SX1509. If it 31 | // successfully communicates, it'll return 1. 32 | if (!io.begin(SX1509_ADDRESS)) { 33 | while (1) ; // If we fail to communicate, loop forever for now but it would be nice to warn the user somehow 34 | } 35 | 36 | // configuration for the bargraph LED's 37 | io.pinMode(SX1509_BAR_01, OUTPUT); 38 | io.pinMode(SX1509_BAR_02, OUTPUT); 39 | io.pinMode(SX1509_BAR_03, OUTPUT); 40 | io.pinMode(SX1509_BAR_04, OUTPUT); 41 | io.pinMode(SX1509_BAR_05, OUTPUT); 42 | io.pinMode(SX1509_BAR_06, OUTPUT); 43 | io.pinMode(SX1509_BAR_07, OUTPUT); 44 | io.pinMode(SX1509_BAR_08, OUTPUT); 45 | io.pinMode(SX1509_BAR_09, OUTPUT); 46 | io.pinMode(SX1509_BAR_10, OUTPUT); 47 | io.pinMode(SX1509_BAR_11, OUTPUT); 48 | io.pinMode(SX1509_BAR_12, OUTPUT); 49 | io.pinMode(SX1509_BAR_13, OUTPUT); 50 | io.pinMode(SX1509_BAR_14, OUTPUT); 51 | io.pinMode(SX1509_BAR_15, OUTPUT); 52 | 53 | // set everything off initially 54 | shutdown_leds(); 55 | } 56 | 57 | unsigned long firing_interval = 40; // interval at which to cycle firing lights on the bargraph. We update this in the loop to speed up the animation so must be declared here (milliseconds). 58 | 59 | void loop() { 60 | // get the current time 61 | int currentMillis = millis(); 62 | } 63 | 64 | 65 | /*************** Bar Graph Animations *********************/ 66 | // This is the idle sequence 67 | unsigned long prevBarMillis_on = 0; // bargraph on tracker 68 | const unsigned long pwrcl_interval = 60; // interval at which to cycle lights (milliseconds). 69 | bool reverseSequenceOne = false; 70 | 71 | void barGraphSequenceOne(unsigned long currentMillis) { 72 | // normal sync animation on the bar graph 73 | if ((unsigned long)(currentMillis - prevBarMillis_on) > pwrcl_interval) { 74 | // save the last time you blinked the LED 75 | prevBarMillis_on = currentMillis; 76 | 77 | if ( reverseSequenceOne == false ) { 78 | switch_graph_led(seq_1_current, HIGH); 79 | seq_1_current++; 80 | if ( seq_1_current > num_led ) { 81 | reverseSequenceOne = true; 82 | } 83 | } else { 84 | switch_graph_led(seq_1_current, LOW); 85 | seq_1_current--; 86 | if ( seq_1_current < 0 ) { 87 | reverseSequenceOne = false; 88 | } 89 | } 90 | } 91 | } 92 | 93 | // This is the firing sequence 94 | unsigned long prevBarMillis_fire = 0; // bargraph firing tracker 95 | int fireSequenceNum = 1; 96 | 97 | void barGraphSequenceTwo(unsigned long currentMillis) { 98 | if ((unsigned long)(currentMillis - prevBarMillis_fire) > firing_interval) { 99 | // save the last time you blinked the LED 100 | prevBarMillis_fire = currentMillis; 101 | 102 | switch (fireSequenceNum) { 103 | case 1: 104 | switch_graph_led(2, LOW); 105 | switch_graph_led(14, LOW); 106 | switch_graph_led(1, HIGH); 107 | switch_graph_led(15, HIGH); 108 | fireSequenceNum++; 109 | break; 110 | case 2: 111 | switch_graph_led(1, LOW); 112 | switch_graph_led(15, LOW); 113 | switch_graph_led(2, HIGH); 114 | switch_graph_led(14, HIGH); 115 | fireSequenceNum++; 116 | break; 117 | case 3: 118 | switch_graph_led(2, LOW); 119 | switch_graph_led(14, LOW); 120 | switch_graph_led(3, HIGH); 121 | switch_graph_led(13, HIGH); 122 | fireSequenceNum++; 123 | break; 124 | case 4: 125 | switch_graph_led(3, LOW); 126 | switch_graph_led(13, LOW); 127 | switch_graph_led(4, HIGH); 128 | switch_graph_led(12, HIGH); 129 | fireSequenceNum++; 130 | break; 131 | case 5: 132 | switch_graph_led(4, LOW); 133 | switch_graph_led(12, LOW); 134 | switch_graph_led(5, HIGH); 135 | switch_graph_led(11, HIGH); 136 | fireSequenceNum++; 137 | break; 138 | case 6: 139 | switch_graph_led(5, LOW); 140 | switch_graph_led(11, LOW); 141 | switch_graph_led(6, HIGH); 142 | switch_graph_led(10, HIGH); 143 | fireSequenceNum++; 144 | break; 145 | case 7: 146 | switch_graph_led(6, LOW); 147 | switch_graph_led(10, LOW); 148 | switch_graph_led(7, HIGH); 149 | switch_graph_led(9, HIGH); 150 | fireSequenceNum++; 151 | break; 152 | case 8: 153 | switch_graph_led(7, LOW); 154 | switch_graph_led(9, LOW); 155 | switch_graph_led(6, HIGH); 156 | switch_graph_led(10, HIGH); 157 | fireSequenceNum++; 158 | break; 159 | case 9: 160 | switch_graph_led(6, LOW); 161 | switch_graph_led(10, LOW); 162 | switch_graph_led(5, HIGH); 163 | switch_graph_led(11, HIGH); 164 | fireSequenceNum++; 165 | break; 166 | case 10: 167 | switch_graph_led(5, LOW); 168 | switch_graph_led(11, LOW); 169 | switch_graph_led(4, HIGH); 170 | switch_graph_led(12, HIGH); 171 | fireSequenceNum++; 172 | break; 173 | case 11: 174 | switch_graph_led(4, LOW); 175 | switch_graph_led(12, LOW); 176 | switch_graph_led(3, HIGH); 177 | switch_graph_led(13, HIGH); 178 | fireSequenceNum++; 179 | break; 180 | case 12: 181 | switch_graph_led(3, LOW); 182 | switch_graph_led(13, LOW); 183 | switch_graph_led(2, HIGH); 184 | switch_graph_led(14, HIGH); 185 | fireSequenceNum = 1; 186 | break; 187 | } 188 | } 189 | } 190 | 191 | /************************* Shutdown and helper functions ****************************/ 192 | void shutdown_leds() { 193 | // reset the sequence 194 | seq_1_current = 1; 195 | fireSequenceNum = 1; 196 | 197 | // shut all led's off 198 | for (int i = 1; i <= 15; i++) { 199 | switch_graph_led(i, LOW); 200 | } 201 | } 202 | 203 | void switch_graph_led(int num, int state) { 204 | switch (num) { 205 | case 1: 206 | io.digitalWrite(SX1509_BAR_01, state); 207 | break; 208 | case 2: 209 | io.digitalWrite(SX1509_BAR_02, state); 210 | break; 211 | case 3: 212 | io.digitalWrite(SX1509_BAR_03, state); 213 | break; 214 | case 4: 215 | io.digitalWrite(SX1509_BAR_04, state); 216 | break; 217 | case 5: 218 | io.digitalWrite(SX1509_BAR_05, state); 219 | break; 220 | case 6: 221 | io.digitalWrite(SX1509_BAR_06, state); 222 | break; 223 | case 7: 224 | io.digitalWrite(SX1509_BAR_07, state); 225 | break; 226 | case 8: 227 | io.digitalWrite(SX1509_BAR_08, state); 228 | break; 229 | case 9: 230 | io.digitalWrite(SX1509_BAR_09, state); 231 | break; 232 | case 10: 233 | io.digitalWrite(SX1509_BAR_10, state); 234 | break; 235 | case 11: 236 | io.digitalWrite(SX1509_BAR_11, state); 237 | break; 238 | case 12: 239 | io.digitalWrite(SX1509_BAR_12, state); 240 | break; 241 | case 13: 242 | io.digitalWrite(SX1509_BAR_13, state); 243 | break; 244 | case 14: 245 | io.digitalWrite(SX1509_BAR_14, state); 246 | break; 247 | case 15: 248 | io.digitalWrite(SX1509_BAR_15, state); 249 | break; 250 | } 251 | } 252 | -------------------------------------------------------------------------------- /Arduino/libraries/Adafruit_NeoPixel/Adafruit_NeoPixel.h: -------------------------------------------------------------------------------- 1 | /*-------------------------------------------------------------------- 2 | This file is part of the Adafruit NeoPixel library. 3 | 4 | NeoPixel is free software: you can redistribute it and/or modify 5 | it under the terms of the GNU Lesser General Public License as 6 | published by the Free Software Foundation, either version 3 of 7 | the License, or (at your option) any later version. 8 | 9 | NeoPixel is distributed in the hope that it will be useful, 10 | but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | GNU Lesser General Public License for more details. 13 | 14 | You should have received a copy of the GNU Lesser General Public 15 | License along with NeoPixel. If not, see 16 | . 17 | --------------------------------------------------------------------*/ 18 | 19 | #ifndef ADAFRUIT_NEOPIXEL_H 20 | #define ADAFRUIT_NEOPIXEL_H 21 | 22 | #if (ARDUINO >= 100) 23 | #include 24 | #else 25 | #include 26 | #include 27 | #endif 28 | 29 | // The order of primary colors in the NeoPixel data stream can vary 30 | // among device types, manufacturers and even different revisions of 31 | // the same item. The third parameter to the Adafruit_NeoPixel 32 | // constructor encodes the per-pixel byte offsets of the red, green 33 | // and blue primaries (plus white, if present) in the data stream -- 34 | // the following #defines provide an easier-to-use named version for 35 | // each permutation. e.g. NEO_GRB indicates a NeoPixel-compatible 36 | // device expecting three bytes per pixel, with the first byte 37 | // containing the green value, second containing red and third 38 | // containing blue. The in-memory representation of a chain of 39 | // NeoPixels is the same as the data-stream order; no re-ordering of 40 | // bytes is required when issuing data to the chain. 41 | 42 | // Bits 5,4 of this value are the offset (0-3) from the first byte of 43 | // a pixel to the location of the red color byte. Bits 3,2 are the 44 | // green offset and 1,0 are the blue offset. If it is an RGBW-type 45 | // device (supporting a white primary in addition to R,G,B), bits 7,6 46 | // are the offset to the white byte...otherwise, bits 7,6 are set to 47 | // the same value as 5,4 (red) to indicate an RGB (not RGBW) device. 48 | // i.e. binary representation: 49 | // 0bWWRRGGBB for RGBW devices 50 | // 0bRRRRGGBB for RGB 51 | 52 | // RGB NeoPixel permutations; white and red offsets are always same 53 | // Offset: W R G B 54 | #define NEO_RGB ((0 << 6) | (0 << 4) | (1 << 2) | (2)) 55 | #define NEO_RBG ((0 << 6) | (0 << 4) | (2 << 2) | (1)) 56 | #define NEO_GRB ((1 << 6) | (1 << 4) | (0 << 2) | (2)) 57 | #define NEO_GBR ((2 << 6) | (2 << 4) | (0 << 2) | (1)) 58 | #define NEO_BRG ((1 << 6) | (1 << 4) | (2 << 2) | (0)) 59 | #define NEO_BGR ((2 << 6) | (2 << 4) | (1 << 2) | (0)) 60 | 61 | // RGBW NeoPixel permutations; all 4 offsets are distinct 62 | // Offset: W R G B 63 | #define NEO_WRGB ((0 << 6) | (1 << 4) | (2 << 2) | (3)) 64 | #define NEO_WRBG ((0 << 6) | (1 << 4) | (3 << 2) | (2)) 65 | #define NEO_WGRB ((0 << 6) | (2 << 4) | (1 << 2) | (3)) 66 | #define NEO_WGBR ((0 << 6) | (3 << 4) | (1 << 2) | (2)) 67 | #define NEO_WBRG ((0 << 6) | (2 << 4) | (3 << 2) | (1)) 68 | #define NEO_WBGR ((0 << 6) | (3 << 4) | (2 << 2) | (1)) 69 | 70 | #define NEO_RWGB ((1 << 6) | (0 << 4) | (2 << 2) | (3)) 71 | #define NEO_RWBG ((1 << 6) | (0 << 4) | (3 << 2) | (2)) 72 | #define NEO_RGWB ((2 << 6) | (0 << 4) | (1 << 2) | (3)) 73 | #define NEO_RGBW ((3 << 6) | (0 << 4) | (1 << 2) | (2)) 74 | #define NEO_RBWG ((2 << 6) | (0 << 4) | (3 << 2) | (1)) 75 | #define NEO_RBGW ((3 << 6) | (0 << 4) | (2 << 2) | (1)) 76 | 77 | #define NEO_GWRB ((1 << 6) | (2 << 4) | (0 << 2) | (3)) 78 | #define NEO_GWBR ((1 << 6) | (3 << 4) | (0 << 2) | (2)) 79 | #define NEO_GRWB ((2 << 6) | (1 << 4) | (0 << 2) | (3)) 80 | #define NEO_GRBW ((3 << 6) | (1 << 4) | (0 << 2) | (2)) 81 | #define NEO_GBWR ((2 << 6) | (3 << 4) | (0 << 2) | (1)) 82 | #define NEO_GBRW ((3 << 6) | (2 << 4) | (0 << 2) | (1)) 83 | 84 | #define NEO_BWRG ((1 << 6) | (2 << 4) | (3 << 2) | (0)) 85 | #define NEO_BWGR ((1 << 6) | (3 << 4) | (2 << 2) | (0)) 86 | #define NEO_BRWG ((2 << 6) | (1 << 4) | (3 << 2) | (0)) 87 | #define NEO_BRGW ((3 << 6) | (1 << 4) | (2 << 2) | (0)) 88 | #define NEO_BGWR ((2 << 6) | (3 << 4) | (1 << 2) | (0)) 89 | #define NEO_BGRW ((3 << 6) | (2 << 4) | (1 << 2) | (0)) 90 | 91 | // Add NEO_KHZ400 to the color order value to indicate a 400 KHz 92 | // device. All but the earliest v1 NeoPixels expect an 800 KHz data 93 | // stream, this is the default if unspecified. Because flash space 94 | // is very limited on ATtiny devices (e.g. Trinket, Gemma), v1 95 | // NeoPixels aren't handled by default on those chips, though it can 96 | // be enabled by removing the ifndef/endif below -- but code will be 97 | // bigger. Conversely, can disable the NEO_KHZ400 line on other MCUs 98 | // to remove v1 support and save a little space. 99 | 100 | #define NEO_KHZ800 0x0000 // 800 KHz datastream 101 | #ifndef __AVR_ATtiny85__ 102 | #define NEO_KHZ400 0x0100 // 400 KHz datastream 103 | #endif 104 | 105 | // If 400 KHz support is enabled, the third parameter to the constructor 106 | // requires a 16-bit value (in order to select 400 vs 800 KHz speed). 107 | // If only 800 KHz is enabled (as is default on ATtiny), an 8-bit value 108 | // is sufficient to encode pixel color order, saving some space. 109 | 110 | #ifdef NEO_KHZ400 111 | typedef uint16_t neoPixelType; 112 | #else 113 | typedef uint8_t neoPixelType; 114 | #endif 115 | 116 | class Adafruit_NeoPixel { 117 | 118 | public: 119 | 120 | // Constructor: number of LEDs, pin number, LED type 121 | Adafruit_NeoPixel(uint16_t n, uint8_t p=6, neoPixelType t=NEO_GRB + NEO_KHZ800); 122 | Adafruit_NeoPixel(void); 123 | ~Adafruit_NeoPixel(); 124 | 125 | void 126 | begin(void), 127 | show(void), 128 | setPin(uint8_t p), 129 | setPixelColor(uint16_t n, uint8_t r, uint8_t g, uint8_t b), 130 | setPixelColor(uint16_t n, uint8_t r, uint8_t g, uint8_t b, uint8_t w), 131 | setPixelColor(uint16_t n, uint32_t c), 132 | setBrightness(uint8_t), 133 | clear(), 134 | updateLength(uint16_t n), 135 | updateType(neoPixelType t); 136 | uint8_t 137 | *getPixels(void) const, 138 | getBrightness(void) const; 139 | int8_t 140 | getPin(void) { return pin; }; 141 | uint16_t 142 | numPixels(void) const; 143 | static uint32_t 144 | Color(uint8_t r, uint8_t g, uint8_t b), 145 | Color(uint8_t r, uint8_t g, uint8_t b, uint8_t w); 146 | uint32_t 147 | getPixelColor(uint16_t n) const; 148 | inline bool 149 | canShow(void) { return (micros() - endTime) >= 300L; } 150 | 151 | protected: 152 | 153 | boolean 154 | #ifdef NEO_KHZ400 // If 400 KHz NeoPixel support enabled... 155 | is800KHz, // ...true if 800 KHz pixels 156 | #endif 157 | begun; // true if begin() previously called 158 | uint16_t 159 | numLEDs, // Number of RGB LEDs in strip 160 | numBytes; // Size of 'pixels' buffer below (3 or 4 bytes/pixel) 161 | int8_t 162 | pin; // Output pin number (-1 if not yet set) 163 | uint8_t 164 | brightness, 165 | *pixels, // Holds LED color values (3 or 4 bytes each) 166 | rOffset, // Index of red byte within each 3- or 4-byte pixel 167 | gOffset, // Index of green byte 168 | bOffset, // Index of blue byte 169 | wOffset; // Index of white byte (same as rOffset if no white) 170 | uint32_t 171 | endTime; // Latch timing reference 172 | #ifdef __AVR__ 173 | volatile uint8_t 174 | *port; // Output PORT register 175 | uint8_t 176 | pinMask; // Output PORT bitmask 177 | #endif 178 | }; 179 | 180 | #endif // ADAFRUIT_NEOPIXEL_H 181 | -------------------------------------------------------------------------------- /Arduino/libraries/Adafruit_NeoPixel/COPYING: -------------------------------------------------------------------------------- 1 | GNU LESSER GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | 9 | This version of the GNU Lesser General Public License incorporates 10 | the terms and conditions of version 3 of the GNU General Public 11 | License, supplemented by the additional permissions listed below. 12 | 13 | 0. Additional Definitions. 14 | 15 | As used herein, "this License" refers to version 3 of the GNU Lesser 16 | General Public License, and the "GNU GPL" refers to version 3 of the GNU 17 | General Public License. 18 | 19 | "The Library" refers to a covered work governed by this License, 20 | other than an Application or a Combined Work as defined below. 21 | 22 | An "Application" is any work that makes use of an interface provided 23 | by the Library, but which is not otherwise based on the Library. 24 | Defining a subclass of a class defined by the Library is deemed a mode 25 | of using an interface provided by the Library. 26 | 27 | A "Combined Work" is a work produced by combining or linking an 28 | Application with the Library. The particular version of the Library 29 | with which the Combined Work was made is also called the "Linked 30 | Version". 31 | 32 | The "Minimal Corresponding Source" for a Combined Work means the 33 | Corresponding Source for the Combined Work, excluding any source code 34 | for portions of the Combined Work that, considered in isolation, are 35 | based on the Application, and not on the Linked Version. 36 | 37 | The "Corresponding Application Code" for a Combined Work means the 38 | object code and/or source code for the Application, including any data 39 | and utility programs needed for reproducing the Combined Work from the 40 | Application, but excluding the System Libraries of the Combined Work. 41 | 42 | 1. Exception to Section 3 of the GNU GPL. 43 | 44 | You may convey a covered work under sections 3 and 4 of this License 45 | without being bound by section 3 of the GNU GPL. 46 | 47 | 2. Conveying Modified Versions. 48 | 49 | If you modify a copy of the Library, and, in your modifications, a 50 | facility refers to a function or data to be supplied by an Application 51 | that uses the facility (other than as an argument passed when the 52 | facility is invoked), then you may convey a copy of the modified 53 | version: 54 | 55 | a) under this License, provided that you make a good faith effort to 56 | ensure that, in the event an Application does not supply the 57 | function or data, the facility still operates, and performs 58 | whatever part of its purpose remains meaningful, or 59 | 60 | b) under the GNU GPL, with none of the additional permissions of 61 | this License applicable to that copy. 62 | 63 | 3. Object Code Incorporating Material from Library Header Files. 64 | 65 | The object code form of an Application may incorporate material from 66 | a header file that is part of the Library. You may convey such object 67 | code under terms of your choice, provided that, if the incorporated 68 | material is not limited to numerical parameters, data structure 69 | layouts and accessors, or small macros, inline functions and templates 70 | (ten or fewer lines in length), you do both of the following: 71 | 72 | a) Give prominent notice with each copy of the object code that the 73 | Library is used in it and that the Library and its use are 74 | covered by this License. 75 | 76 | b) Accompany the object code with a copy of the GNU GPL and this license 77 | document. 78 | 79 | 4. Combined Works. 80 | 81 | You may convey a Combined Work under terms of your choice that, 82 | taken together, effectively do not restrict modification of the 83 | portions of the Library contained in the Combined Work and reverse 84 | engineering for debugging such modifications, if you also do each of 85 | the following: 86 | 87 | a) Give prominent notice with each copy of the Combined Work that 88 | the Library is used in it and that the Library and its use are 89 | covered by this License. 90 | 91 | b) Accompany the Combined Work with a copy of the GNU GPL and this license 92 | document. 93 | 94 | c) For a Combined Work that displays copyright notices during 95 | execution, include the copyright notice for the Library among 96 | these notices, as well as a reference directing the user to the 97 | copies of the GNU GPL and this license document. 98 | 99 | d) Do one of the following: 100 | 101 | 0) Convey the Minimal Corresponding Source under the terms of this 102 | License, and the Corresponding Application Code in a form 103 | suitable for, and under terms that permit, the user to 104 | recombine or relink the Application with a modified version of 105 | the Linked Version to produce a modified Combined Work, in the 106 | manner specified by section 6 of the GNU GPL for conveying 107 | Corresponding Source. 108 | 109 | 1) Use a suitable shared library mechanism for linking with the 110 | Library. A suitable mechanism is one that (a) uses at run time 111 | a copy of the Library already present on the user's computer 112 | system, and (b) will operate properly with a modified version 113 | of the Library that is interface-compatible with the Linked 114 | Version. 115 | 116 | e) Provide Installation Information, but only if you would otherwise 117 | be required to provide such information under section 6 of the 118 | GNU GPL, and only to the extent that such information is 119 | necessary to install and execute a modified version of the 120 | Combined Work produced by recombining or relinking the 121 | Application with a modified version of the Linked Version. (If 122 | you use option 4d0, the Installation Information must accompany 123 | the Minimal Corresponding Source and Corresponding Application 124 | Code. If you use option 4d1, you must provide the Installation 125 | Information in the manner specified by section 6 of the GNU GPL 126 | for conveying Corresponding Source.) 127 | 128 | 5. Combined Libraries. 129 | 130 | You may place library facilities that are a work based on the 131 | Library side by side in a single library together with other library 132 | facilities that are not Applications and are not covered by this 133 | License, and convey such a combined library under terms of your 134 | choice, if you do both of the following: 135 | 136 | a) Accompany the combined library with a copy of the same work based 137 | on the Library, uncombined with any other library facilities, 138 | conveyed under the terms of this License. 139 | 140 | b) Give prominent notice with the combined library that part of it 141 | is a work based on the Library, and explaining where to find the 142 | accompanying uncombined form of the same work. 143 | 144 | 6. Revised Versions of the GNU Lesser General Public License. 145 | 146 | The Free Software Foundation may publish revised and/or new versions 147 | of the GNU Lesser General Public License from time to time. Such new 148 | versions will be similar in spirit to the present version, but may 149 | differ in detail to address new problems or concerns. 150 | 151 | Each version is given a distinguishing version number. If the 152 | Library as you received it specifies that a certain numbered version 153 | of the GNU Lesser General Public License "or any later version" 154 | applies to it, you have the option of following the terms and 155 | conditions either of that published version or of any later version 156 | published by the Free Software Foundation. If the Library as you 157 | received it does not specify a version number of the GNU Lesser 158 | General Public License, you may choose any version of the GNU Lesser 159 | General Public License ever published by the Free Software Foundation. 160 | 161 | If the Library as you received it specifies that a proxy can decide 162 | whether future versions of the GNU Lesser General Public License shall 163 | apply, that proxy's public statement of acceptance of any version is 164 | permanent authorization for you to choose that version for the 165 | Library. 166 | -------------------------------------------------------------------------------- /Arduino/libraries/Adafruit_NeoPixel/README.md: -------------------------------------------------------------------------------- 1 | # Adafruit NeoPixel Library [![Build Status](https://travis-ci.org/adafruit/Adafruit_NeoPixel.svg?branch=master)](https://travis-ci.org/adafruit/Adafruit_NeoPixel) 2 | 3 | Arduino library for controlling single-wire-based LED pixels and strip such as the [Adafruit 60 LED/meter Digital LED strip][strip], the [Adafruit FLORA RGB Smart Pixel][flora], the [Adafruit Breadboard-friendly RGB Smart Pixel][pixel], the [Adafruit NeoPixel Stick][stick], and the [Adafruit NeoPixel Shield][shield]. 4 | 5 | After downloading, rename folder to 'Adafruit_NeoPixel' and install in Arduino Libraries folder. Restart Arduino IDE, then open File->Sketchbook->Library->Adafruit_NeoPixel->strandtest sketch. 6 | 7 | Compatibility notes: Port A is not supported on any AVR processors at this time 8 | 9 | [flora]: http://adafruit.com/products/1060 10 | [strip]: http://adafruit.com/products/1138 11 | [pixel]: http://adafruit.com/products/1312 12 | [stick]: http://adafruit.com/products/1426 13 | [shield]: http://adafruit.com/products/1430 14 | -------------------------------------------------------------------------------- /Arduino/libraries/Adafruit_NeoPixel/esp8266.c: -------------------------------------------------------------------------------- 1 | // This is a mash-up of the Due show() code + insights from Michael Miller's 2 | // ESP8266 work for the NeoPixelBus library: github.com/Makuna/NeoPixelBus 3 | // Needs to be a separate .c file to enforce ICACHE_RAM_ATTR execution. 4 | 5 | #if defined(ESP8266) || defined(ESP32) 6 | 7 | #include 8 | #ifdef ESP8266 9 | #include 10 | #endif 11 | 12 | static uint32_t _getCycleCount(void) __attribute__((always_inline)); 13 | static inline uint32_t _getCycleCount(void) { 14 | uint32_t ccount; 15 | __asm__ __volatile__("rsr %0,ccount":"=a" (ccount)); 16 | return ccount; 17 | } 18 | 19 | #ifdef ESP8266 20 | void ICACHE_RAM_ATTR espShow( 21 | uint8_t pin, uint8_t *pixels, uint32_t numBytes, boolean is800KHz) { 22 | #else 23 | void espShow( 24 | uint8_t pin, uint8_t *pixels, uint32_t numBytes, boolean is800KHz) { 25 | #endif 26 | 27 | #define CYCLES_800_T0H (F_CPU / 2500000) // 0.4us 28 | #define CYCLES_800_T1H (F_CPU / 1250000) // 0.8us 29 | #define CYCLES_800 (F_CPU / 800000) // 1.25us per bit 30 | #define CYCLES_400_T0H (F_CPU / 2000000) // 0.5uS 31 | #define CYCLES_400_T1H (F_CPU / 833333) // 1.2us 32 | #define CYCLES_400 (F_CPU / 400000) // 2.5us per bit 33 | 34 | uint8_t *p, *end, pix, mask; 35 | uint32_t t, time0, time1, period, c, startTime, pinMask; 36 | 37 | pinMask = _BV(pin); 38 | p = pixels; 39 | end = p + numBytes; 40 | pix = *p++; 41 | mask = 0x80; 42 | startTime = 0; 43 | 44 | #ifdef NEO_KHZ400 45 | if(is800KHz) { 46 | #endif 47 | time0 = CYCLES_800_T0H; 48 | time1 = CYCLES_800_T1H; 49 | period = CYCLES_800; 50 | #ifdef NEO_KHZ400 51 | } else { // 400 KHz bitstream 52 | time0 = CYCLES_400_T0H; 53 | time1 = CYCLES_400_T1H; 54 | period = CYCLES_400; 55 | } 56 | #endif 57 | 58 | for(t = time0;; t = time0) { 59 | if(pix & mask) t = time1; // Bit high duration 60 | while(((c = _getCycleCount()) - startTime) < period); // Wait for bit start 61 | #ifdef ESP8266 62 | GPIO_REG_WRITE(GPIO_OUT_W1TS_ADDRESS, pinMask); // Set high 63 | #else 64 | gpio_set_level(pin, HIGH); 65 | #endif 66 | startTime = c; // Save start time 67 | while(((c = _getCycleCount()) - startTime) < t); // Wait high duration 68 | #ifdef ESP8266 69 | GPIO_REG_WRITE(GPIO_OUT_W1TC_ADDRESS, pinMask); // Set low 70 | #else 71 | gpio_set_level(pin, LOW); 72 | #endif 73 | if(!(mask >>= 1)) { // Next bit/byte 74 | if(p >= end) break; 75 | pix = *p++; 76 | mask = 0x80; 77 | } 78 | } 79 | while((_getCycleCount() - startTime) < period); // Wait for last bit 80 | } 81 | 82 | #endif // ESP8266 83 | -------------------------------------------------------------------------------- /Arduino/libraries/Adafruit_NeoPixel/examples/RGBWstrandtest/.esp8266.test.skip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Arduino/libraries/Adafruit_NeoPixel/examples/RGBWstrandtest/.esp8266.test.skip -------------------------------------------------------------------------------- /Arduino/libraries/Adafruit_NeoPixel/examples/RGBWstrandtest/.trinket.test.skip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Arduino/libraries/Adafruit_NeoPixel/examples/RGBWstrandtest/.trinket.test.skip -------------------------------------------------------------------------------- /Arduino/libraries/Adafruit_NeoPixel/examples/RGBWstrandtest/RGBWstrandtest.ino: -------------------------------------------------------------------------------- 1 | #include 2 | #ifdef __AVR__ 3 | #include 4 | #endif 5 | 6 | #define PIN 6 7 | 8 | #define NUM_LEDS 60 9 | 10 | #define BRIGHTNESS 50 11 | 12 | Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_GRBW + NEO_KHZ800); 13 | 14 | byte neopix_gamma[] = { 15 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 17 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 18 | 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 19 | 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 20 | 10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 14, 14, 15, 15, 16, 16, 21 | 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 24, 24, 25, 22 | 25, 26, 27, 27, 28, 29, 29, 30, 31, 32, 32, 33, 34, 35, 35, 36, 23 | 37, 38, 39, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 50, 24 | 51, 52, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 66, 67, 68, 25 | 69, 70, 72, 73, 74, 75, 77, 78, 79, 81, 82, 83, 85, 86, 87, 89, 26 | 90, 92, 93, 95, 96, 98, 99,101,102,104,105,107,109,110,112,114, 27 | 115,117,119,120,122,124,126,127,129,131,133,135,137,138,140,142, 28 | 144,146,148,150,152,154,156,158,160,162,164,167,169,171,173,175, 29 | 177,180,182,184,186,189,191,193,196,198,200,203,205,208,210,213, 30 | 215,218,220,223,225,228,231,233,236,239,241,244,247,249,252,255 }; 31 | 32 | 33 | void setup() { 34 | // This is for Trinket 5V 16MHz, you can remove these three lines if you are not using a Trinket 35 | #if defined (__AVR_ATtiny85__) 36 | if (F_CPU == 16000000) clock_prescale_set(clock_div_1); 37 | #endif 38 | // End of trinket special code 39 | strip.setBrightness(BRIGHTNESS); 40 | strip.begin(); 41 | strip.show(); // Initialize all pixels to 'off' 42 | } 43 | 44 | void loop() { 45 | // Some example procedures showing how to display to the pixels: 46 | colorWipe(strip.Color(255, 0, 0), 50); // Red 47 | colorWipe(strip.Color(0, 255, 0), 50); // Green 48 | colorWipe(strip.Color(0, 0, 255), 50); // Blue 49 | colorWipe(strip.Color(0, 0, 0, 255), 50); // White 50 | 51 | whiteOverRainbow(20,75,5); 52 | 53 | pulseWhite(5); 54 | 55 | // fullWhite(); 56 | // delay(2000); 57 | 58 | rainbowFade2White(3,3,1); 59 | 60 | 61 | } 62 | 63 | // Fill the dots one after the other with a color 64 | void colorWipe(uint32_t c, uint8_t wait) { 65 | for(uint16_t i=0; i= 0 ; j--){ 82 | for(uint16_t i=0; i 255 - fadeMax ){ 120 | fadeVal--; 121 | } 122 | 123 | strip.show(); 124 | delay(wait); 125 | } 126 | 127 | } 128 | 129 | 130 | 131 | delay(500); 132 | 133 | 134 | for(int k = 0 ; k < whiteLoops ; k ++){ 135 | 136 | for(int j = 0; j < 256 ; j++){ 137 | 138 | for(uint16_t i=0; i < strip.numPixels(); i++) { 139 | strip.setPixelColor(i, strip.Color(0,0,0, neopix_gamma[j] ) ); 140 | } 141 | strip.show(); 142 | } 143 | 144 | delay(2000); 145 | for(int j = 255; j >= 0 ; j--){ 146 | 147 | for(uint16_t i=0; i < strip.numPixels(); i++) { 148 | strip.setPixelColor(i, strip.Color(0,0,0, neopix_gamma[j] ) ); 149 | } 150 | strip.show(); 151 | } 152 | } 153 | 154 | delay(500); 155 | 156 | 157 | } 158 | 159 | void whiteOverRainbow(uint8_t wait, uint8_t whiteSpeed, uint8_t whiteLength ) { 160 | 161 | if(whiteLength >= strip.numPixels()) whiteLength = strip.numPixels() - 1; 162 | 163 | int head = whiteLength - 1; 164 | int tail = 0; 165 | 166 | int loops = 3; 167 | int loopNum = 0; 168 | 169 | static unsigned long lastTime = 0; 170 | 171 | 172 | while(true){ 173 | for(int j=0; j<256; j++) { 174 | for(uint16_t i=0; i= tail && i <= head) || (tail > head && i >= tail) || (tail > head && i <= head) ){ 176 | strip.setPixelColor(i, strip.Color(0,0,0, 255 ) ); 177 | } 178 | else{ 179 | strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255)); 180 | } 181 | 182 | } 183 | 184 | if(millis() - lastTime > whiteSpeed) { 185 | head++; 186 | tail++; 187 | if(head == strip.numPixels()){ 188 | loopNum++; 189 | } 190 | lastTime = millis(); 191 | } 192 | 193 | if(loopNum == loops) return; 194 | 195 | head%=strip.numPixels(); 196 | tail%=strip.numPixels(); 197 | strip.show(); 198 | delay(wait); 199 | } 200 | } 201 | 202 | } 203 | void fullWhite() { 204 | 205 | for(uint16_t i=0; i> 16); 254 | } 255 | uint8_t green(uint32_t c) { 256 | return (c >> 8); 257 | } 258 | uint8_t blue(uint32_t c) { 259 | return (c); 260 | } 261 | 262 | -------------------------------------------------------------------------------- /Arduino/libraries/Adafruit_NeoPixel/examples/StrandtestBLE/.test.skip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Arduino/libraries/Adafruit_NeoPixel/examples/StrandtestBLE/.test.skip -------------------------------------------------------------------------------- /Arduino/libraries/Adafruit_NeoPixel/examples/StrandtestBLE/BLESerial.cpp: -------------------------------------------------------------------------------- 1 | #include "BLESerial.h" 2 | 3 | // #define BLE_SERIAL_DEBUG 4 | 5 | BLESerial* BLESerial::_instance = NULL; 6 | 7 | BLESerial::BLESerial(unsigned char req, unsigned char rdy, unsigned char rst) : 8 | BLEPeripheral(req, rdy, rst) 9 | { 10 | this->_txCount = 0; 11 | this->_rxHead = this->_rxTail = 0; 12 | this->_flushed = 0; 13 | BLESerial::_instance = this; 14 | 15 | addAttribute(this->_uartService); 16 | addAttribute(this->_uartNameDescriptor); 17 | setAdvertisedServiceUuid(this->_uartService.uuid()); 18 | addAttribute(this->_rxCharacteristic); 19 | addAttribute(this->_rxNameDescriptor); 20 | this->_rxCharacteristic.setEventHandler(BLEWritten, BLESerial::_received); 21 | addAttribute(this->_txCharacteristic); 22 | addAttribute(this->_txNameDescriptor); 23 | } 24 | 25 | void BLESerial::begin(...) { 26 | BLEPeripheral::begin(); 27 | #ifdef BLE_SERIAL_DEBUG 28 | Serial.println(F("BLESerial::begin()")); 29 | #endif 30 | } 31 | 32 | void BLESerial::poll() { 33 | if (millis() < this->_flushed + 100) { 34 | BLEPeripheral::poll(); 35 | } else { 36 | flush(); 37 | } 38 | } 39 | 40 | void BLESerial::end() { 41 | this->_rxCharacteristic.setEventHandler(BLEWritten, NULL); 42 | this->_rxHead = this->_rxTail = 0; 43 | flush(); 44 | BLEPeripheral::disconnect(); 45 | } 46 | 47 | int BLESerial::available(void) { 48 | BLEPeripheral::poll(); 49 | int retval = (this->_rxHead - this->_rxTail + sizeof(this->_rxBuffer)) % sizeof(this->_rxBuffer); 50 | #ifdef BLE_SERIAL_DEBUG 51 | Serial.print(F("BLESerial::available() = ")); 52 | Serial.println(retval); 53 | #endif 54 | return retval; 55 | } 56 | 57 | int BLESerial::peek(void) { 58 | BLEPeripheral::poll(); 59 | if (this->_rxTail == this->_rxHead) return -1; 60 | uint8_t byte = this->_rxBuffer[this->_rxTail]; 61 | #ifdef BLE_SERIAL_DEBUG 62 | Serial.print(F("BLESerial::peek() = ")); 63 | Serial.print((char) byte); 64 | Serial.print(F(" 0x")); 65 | Serial.println(byte, HEX); 66 | #endif 67 | return byte; 68 | } 69 | 70 | int BLESerial::read(void) { 71 | BLEPeripheral::poll(); 72 | if (this->_rxTail == this->_rxHead) return -1; 73 | this->_rxTail = (this->_rxTail + 1) % sizeof(this->_rxBuffer); 74 | uint8_t byte = this->_rxBuffer[this->_rxTail]; 75 | #ifdef BLE_SERIAL_DEBUG 76 | Serial.print(F("BLESerial::read() = ")); 77 | Serial.print((char) byte); 78 | Serial.print(F(" 0x")); 79 | Serial.println(byte, HEX); 80 | #endif 81 | return byte; 82 | } 83 | 84 | void BLESerial::flush(void) { 85 | if (this->_txCount == 0) return; 86 | this->_txCharacteristic.setValue(this->_txBuffer, this->_txCount); 87 | this->_flushed = millis(); 88 | this->_txCount = 0; 89 | BLEPeripheral::poll(); 90 | #ifdef BLE_SERIAL_DEBUG 91 | Serial.println(F("BLESerial::flush()")); 92 | #endif 93 | } 94 | 95 | size_t BLESerial::write(uint8_t byte) { 96 | BLEPeripheral::poll(); 97 | if (this->_txCharacteristic.subscribed() == false) return 0; 98 | this->_txBuffer[this->_txCount++] = byte; 99 | if (this->_txCount == sizeof(this->_txBuffer)) flush(); 100 | #ifdef BLE_SERIAL_DEBUG 101 | Serial.print(F("BLESerial::write(")); 102 | Serial.print((char) byte); 103 | Serial.print(F(" 0x")); 104 | Serial.print(byte, HEX); 105 | Serial.println(F(") = 1")); 106 | #endif 107 | return 1; 108 | } 109 | 110 | BLESerial::operator bool() { 111 | bool retval = BLEPeripheral::connected(); 112 | #ifdef BLE_SERIAL_DEBUG 113 | Serial.print(F("BLESerial::operator bool() = ")); 114 | Serial.println(retval); 115 | #endif 116 | return retval; 117 | } 118 | 119 | void BLESerial::_received(const uint8_t* data, size_t size) { 120 | for (int i = 0; i < size; i++) { 121 | this->_rxHead = (this->_rxHead + 1) % sizeof(this->_rxBuffer); 122 | this->_rxBuffer[this->_rxHead] = data[i]; 123 | } 124 | #ifdef BLE_SERIAL_DEBUG 125 | Serial.print(F("BLESerial::received(")); 126 | for (int i = 0; i < size; i++) Serial.print((char) data[i]); 127 | Serial.println(F(")")); 128 | #endif 129 | } 130 | 131 | void BLESerial::_received(BLECentral& /*central*/, BLECharacteristic& rxCharacteristic) { 132 | BLESerial::_instance->_received(rxCharacteristic.value(), rxCharacteristic.valueLength()); 133 | } 134 | -------------------------------------------------------------------------------- /Arduino/libraries/Adafruit_NeoPixel/examples/StrandtestBLE/BLESerial.h: -------------------------------------------------------------------------------- 1 | #ifndef _BLE_SERIAL_H_ 2 | #define _BLE_SERIAL_H_ 3 | 4 | #include 5 | #include 6 | 7 | class BLESerial : public BLEPeripheral, public Stream 8 | { 9 | public: 10 | BLESerial(unsigned char req, unsigned char rdy, unsigned char rst); 11 | 12 | void begin(...); 13 | void poll(); 14 | void end(); 15 | 16 | virtual int available(void); 17 | virtual int peek(void); 18 | virtual int read(void); 19 | virtual void flush(void); 20 | virtual size_t write(uint8_t byte); 21 | using Print::write; 22 | virtual operator bool(); 23 | 24 | private: 25 | unsigned long _flushed; 26 | static BLESerial* _instance; 27 | 28 | size_t _rxHead; 29 | size_t _rxTail; 30 | size_t _rxCount() const; 31 | uint8_t _rxBuffer[BLE_ATTRIBUTE_MAX_VALUE_LENGTH]; 32 | size_t _txCount; 33 | uint8_t _txBuffer[BLE_ATTRIBUTE_MAX_VALUE_LENGTH]; 34 | 35 | BLEService _uartService = BLEService("6E400001-B5A3-F393-E0A9-E50E24DCCA9E"); 36 | BLEDescriptor _uartNameDescriptor = BLEDescriptor("2901", "UART"); 37 | BLECharacteristic _rxCharacteristic = BLECharacteristic("6E400002-B5A3-F393-E0A9-E50E24DCCA9E", BLEWriteWithoutResponse, BLE_ATTRIBUTE_MAX_VALUE_LENGTH); 38 | BLEDescriptor _rxNameDescriptor = BLEDescriptor("2901", "RX - Receive Data (Write)"); 39 | BLECharacteristic _txCharacteristic = BLECharacteristic("6E400003-B5A3-F393-E0A9-E50E24DCCA9E", BLENotify, BLE_ATTRIBUTE_MAX_VALUE_LENGTH); 40 | BLEDescriptor _txNameDescriptor = BLEDescriptor("2901", "TX - Transfer Data (Notify)"); 41 | 42 | void _received(const uint8_t* data, size_t size); 43 | static void _received(BLECentral& /*central*/, BLECharacteristic& rxCharacteristic); 44 | }; 45 | 46 | #endif 47 | -------------------------------------------------------------------------------- /Arduino/libraries/Adafruit_NeoPixel/examples/StrandtestBLE/StrandtestBLE.ino: -------------------------------------------------------------------------------- 1 | /**************************************************************************** 2 | * This example was developed by the Hackerspace San Salvador to demonstrate 3 | * the simultaneous use of the NeoPixel library and the Bluetooth SoftDevice. 4 | * To compile this example you'll need to add support for the NRF52 based 5 | * following the instructions at: 6 | * https://github.com/sandeepmistry/arduino-nRF5 7 | * Or adding the following URL to the board manager URLs on Arduino preferences: 8 | * https://sandeepmistry.github.io/arduino-nRF5/package_nRF5_boards_index.json 9 | * Then you can install the BLEPeripheral library avaiable at: 10 | * https://github.com/sandeepmistry/arduino-BLEPeripheral 11 | * To test it, compile this example and use the UART module from the nRF 12 | * Toolbox App for Android. Edit the interface and send the characters 13 | * 'a' to 'i' to switch the animation. 14 | * There is a delay because this example blocks the thread of execution but 15 | * the change will be shown after the current animation ends. (This might 16 | * take a couple of seconds) 17 | * For more info write us at: info _at- teubi.co 18 | */ 19 | #include 20 | #include 21 | #include "BLESerial.h" 22 | #include 23 | 24 | #define PIN 15 25 | 26 | // Parameter 1 = number of pixels in strip 27 | // Parameter 2 = Arduino pin number (most are valid) 28 | // Parameter 3 = pixel type flags, add together as needed: 29 | // NEO_KHZ800 800 KHz bitstream (most NeoPixel products w/WS2812 LEDs) 30 | // NEO_KHZ400 400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers) 31 | // NEO_GRB Pixels are wired for GRB bitstream (most NeoPixel products) 32 | // NEO_RGB Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2) 33 | // NEO_RGBW Pixels are wired for RGBW bitstream (NeoPixel RGBW products) 34 | Adafruit_NeoPixel strip = Adafruit_NeoPixel(64, PIN, NEO_GRB + NEO_KHZ800); 35 | 36 | // IMPORTANT: To reduce NeoPixel burnout risk, add 1000 uF capacitor across 37 | // pixel power leads, add 300 - 500 Ohm resistor on first pixel's data input 38 | // and minimize distance between Arduino and first pixel. Avoid connecting 39 | // on a live circuit...if you must, connect GND first. 40 | 41 | // define pins (varies per shield/board) 42 | #define BLE_REQ 10 43 | #define BLE_RDY 2 44 | #define BLE_RST 9 45 | 46 | // create ble serial instance, see pinouts above 47 | BLESerial BLESerial(BLE_REQ, BLE_RDY, BLE_RST); 48 | 49 | uint8_t current_state = 0; 50 | uint8_t rgb_values[3]; 51 | 52 | void setup() { 53 | Serial.begin(115200); 54 | Serial.println("Hello World!"); 55 | // custom services and characteristics can be added as well 56 | BLESerial.setLocalName("UART_HS"); 57 | BLESerial.begin(); 58 | 59 | strip.begin(); 60 | changeColor(strip.Color(0, 0, 0)); 61 | 62 | //pinMode(PIN, OUTPUT); 63 | //digitalWrite(PIN, LOW); 64 | 65 | current_state = 'a'; 66 | } 67 | 68 | 69 | void loop() { 70 | while(BLESerial.available()) { 71 | uint8_t character = BLESerial.read(); 72 | switch(character) { 73 | case 'a': 74 | case 'b': 75 | case 'c': 76 | case 'd': 77 | case 'e': 78 | case 'f': 79 | case 'g': 80 | case 'h': 81 | case 'i': 82 | current_state = character; 83 | break; 84 | }; 85 | } 86 | switch(current_state) { 87 | case 'a': 88 | colorWipe(strip.Color(255, 0, 0), 20); // Red 89 | break; 90 | case 'b': 91 | colorWipe(strip.Color(0, 255, 0), 20); // Green 92 | break; 93 | case 'c': 94 | colorWipe(strip.Color(0, 0, 255), 20); // Blue 95 | break; 96 | case 'd': 97 | theaterChase(strip.Color(255, 0, 0), 20); // Red 98 | break; 99 | case 'e': 100 | theaterChase(strip.Color(0, 255, 0), 20); // Green 101 | break; 102 | case 'f': 103 | theaterChase(strip.Color(255, 0, 255), 20); // Green 104 | break; 105 | case 'g': 106 | rainbowCycle(20); 107 | break; 108 | case 'h': 109 | rainbow(20); 110 | break; 111 | case 'i': 112 | theaterChaseRainbow(20); 113 | break; 114 | } 115 | } 116 | 117 | void changeColor(uint32_t c) { 118 | for(uint16_t i=0; i 7 | 8 | #define BUTTON_PIN 2 // Digital IO pin connected to the button. This will be 9 | // driven with a pull-up resistor so the switch should 10 | // pull the pin to ground momentarily. On a high -> low 11 | // transition the button press logic will execute. 12 | 13 | #define PIXEL_PIN 6 // Digital IO pin connected to the NeoPixels. 14 | 15 | #define PIXEL_COUNT 16 16 | 17 | // Parameter 1 = number of pixels in strip, neopixel stick has 8 18 | // Parameter 2 = pin number (most are valid) 19 | // Parameter 3 = pixel type flags, add together as needed: 20 | // NEO_RGB Pixels are wired for RGB bitstream 21 | // NEO_GRB Pixels are wired for GRB bitstream, correct for neopixel stick 22 | // NEO_KHZ400 400 KHz bitstream (e.g. FLORA pixels) 23 | // NEO_KHZ800 800 KHz bitstream (e.g. High Density LED strip), correct for neopixel stick 24 | Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800); 25 | 26 | bool oldState = HIGH; 27 | int showType = 0; 28 | 29 | void setup() { 30 | pinMode(BUTTON_PIN, INPUT_PULLUP); 31 | strip.begin(); 32 | strip.show(); // Initialize all pixels to 'off' 33 | } 34 | 35 | void loop() { 36 | // Get current button state. 37 | bool newState = digitalRead(BUTTON_PIN); 38 | 39 | // Check if state changed from high to low (button press). 40 | if (newState == LOW && oldState == HIGH) { 41 | // Short delay to debounce button. 42 | delay(20); 43 | // Check if button is still low after debounce. 44 | newState = digitalRead(BUTTON_PIN); 45 | if (newState == LOW) { 46 | showType++; 47 | if (showType > 9) 48 | showType=0; 49 | startShow(showType); 50 | } 51 | } 52 | 53 | // Set the last button state to the old state. 54 | oldState = newState; 55 | } 56 | 57 | void startShow(int i) { 58 | switch(i){ 59 | case 0: colorWipe(strip.Color(0, 0, 0), 50); // Black/off 60 | break; 61 | case 1: colorWipe(strip.Color(255, 0, 0), 50); // Red 62 | break; 63 | case 2: colorWipe(strip.Color(0, 255, 0), 50); // Green 64 | break; 65 | case 3: colorWipe(strip.Color(0, 0, 255), 50); // Blue 66 | break; 67 | case 4: theaterChase(strip.Color(127, 127, 127), 50); // White 68 | break; 69 | case 5: theaterChase(strip.Color(127, 0, 0), 50); // Red 70 | break; 71 | case 6: theaterChase(strip.Color( 0, 0, 127), 50); // Blue 72 | break; 73 | case 7: rainbow(20); 74 | break; 75 | case 8: rainbowCycle(20); 76 | break; 77 | case 9: theaterChaseRainbow(50); 78 | break; 79 | } 80 | } 81 | 82 | // Fill the dots one after the other with a color 83 | void colorWipe(uint32_t c, uint8_t wait) { 84 | for(uint16_t i=0; i 5 | #ifdef __AVR__ 6 | #include 7 | #endif 8 | 9 | // Which pin on the Arduino is connected to the NeoPixels? 10 | // On a Trinket or Gemma we suggest changing this to 1 11 | #define PIN 6 12 | 13 | // How many NeoPixels are attached to the Arduino? 14 | #define NUMPIXELS 16 15 | 16 | // When we setup the NeoPixel library, we tell it how many pixels, and which pin to use to send signals. 17 | // Note that for older NeoPixel strips you might need to change the third parameter--see the strandtest 18 | // example for more information on possible values. 19 | Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); 20 | 21 | int delayval = 500; // delay for half a second 22 | 23 | void setup() { 24 | // This is for Trinket 5V 16MHz, you can remove these three lines if you are not using a Trinket 25 | #if defined (__AVR_ATtiny85__) 26 | if (F_CPU == 16000000) clock_prescale_set(clock_div_1); 27 | #endif 28 | // End of trinket special code 29 | 30 | pixels.begin(); // This initializes the NeoPixel library. 31 | } 32 | 33 | void loop() { 34 | 35 | // For a set of NeoPixels the first NeoPixel is 0, second is 1, all the way up to the count of pixels minus one. 36 | 37 | for(int i=0;i 2 | #ifdef __AVR__ 3 | #include 4 | #endif 5 | 6 | #define PIN 6 7 | 8 | // Parameter 1 = number of pixels in strip 9 | // Parameter 2 = Arduino pin number (most are valid) 10 | // Parameter 3 = pixel type flags, add together as needed: 11 | // NEO_KHZ800 800 KHz bitstream (most NeoPixel products w/WS2812 LEDs) 12 | // NEO_KHZ400 400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers) 13 | // NEO_GRB Pixels are wired for GRB bitstream (most NeoPixel products) 14 | // NEO_RGB Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2) 15 | // NEO_RGBW Pixels are wired for RGBW bitstream (NeoPixel RGBW products) 16 | Adafruit_NeoPixel strip = Adafruit_NeoPixel(60, PIN, NEO_GRB + NEO_KHZ800); 17 | 18 | // IMPORTANT: To reduce NeoPixel burnout risk, add 1000 uF capacitor across 19 | // pixel power leads, add 300 - 500 Ohm resistor on first pixel's data input 20 | // and minimize distance between Arduino and first pixel. Avoid connecting 21 | // on a live circuit...if you must, connect GND first. 22 | 23 | void setup() { 24 | // This is for Trinket 5V 16MHz, you can remove these three lines if you are not using a Trinket 25 | #if defined (__AVR_ATtiny85__) 26 | if (F_CPU == 16000000) clock_prescale_set(clock_div_1); 27 | #endif 28 | // End of trinket special code 29 | 30 | 31 | strip.begin(); 32 | strip.show(); // Initialize all pixels to 'off' 33 | } 34 | 35 | void loop() { 36 | // Some example procedures showing how to display to the pixels: 37 | colorWipe(strip.Color(255, 0, 0), 50); // Red 38 | colorWipe(strip.Color(0, 255, 0), 50); // Green 39 | colorWipe(strip.Color(0, 0, 255), 50); // Blue 40 | //colorWipe(strip.Color(0, 0, 0, 255), 50); // White RGBW 41 | // Send a theater pixel chase in... 42 | theaterChase(strip.Color(127, 127, 127), 50); // White 43 | theaterChase(strip.Color(127, 0, 0), 50); // Red 44 | theaterChase(strip.Color(0, 0, 127), 50); // Blue 45 | 46 | rainbow(20); 47 | rainbowCycle(20); 48 | theaterChaseRainbow(50); 49 | } 50 | 51 | // Fill the dots one after the other with a color 52 | void colorWipe(uint32_t c, uint8_t wait) { 53 | for(uint16_t i=0; i 5 | sentence=Arduino library for controlling single-wire-based LED pixels and strip. 6 | paragraph=Arduino library for controlling single-wire-based LED pixels and strip. 7 | category=Display 8 | url=https://github.com/adafruit/Adafruit_NeoPixel 9 | architectures=* 10 | -------------------------------------------------------------------------------- /Arduino/libraries/Adafruit_Soundboard_library/Adafruit_Soundboard.cpp: -------------------------------------------------------------------------------- 1 | /*************************************************** 2 | This is a library for the Adafruit Sound Boards in UART mode 3 | 4 | ----> http://www.adafruit.com/products/2342 5 | ----> http://www.adafruit.com/products/2341 6 | ----> http://www.adafruit.com/products/2217 7 | ----> http://www.adafruit.com/products/2210 8 | ----> http://www.adafruit.com/products/2133 9 | ----> http://www.adafruit.com/products/2220 10 | 11 | Check out the links above for our tutorials and wiring diagrams 12 | This sound fx driver uses TTL Serial to communicate 13 | 14 | Adafruit invests time and resources providing this open source code, 15 | please support Adafruit and open-source hardware by purchasing 16 | products from Adafruit! 17 | 18 | Written by Limor Fried/Ladyada for Adafruit Industries. 19 | MIT license, all text above must be included in any redistribution 20 | ****************************************************/ 21 | 22 | #include "Adafruit_Soundboard.h" 23 | 24 | //#define DEBUG 1 25 | 26 | // Constructor 27 | Adafruit_Soundboard::Adafruit_Soundboard(Stream *s, Stream *d, int8_t r) 28 | : stream(s), debug(d), reset_pin(r) 29 | { 30 | stream->setTimeout(500); 31 | writing = false; 32 | files = 0; 33 | } 34 | 35 | 36 | int Adafruit_Soundboard::readLine(void) { 37 | int x = stream->readBytesUntil('\n', line_buffer, LINE_BUFFER_SIZE); 38 | line_buffer[x] = 0; 39 | 40 | if (stream->peek() == '\r') stream->read(); 41 | //stream->readBytesUntil('\r', line_buffer, LINE_BUFFER_SIZE); 42 | return x; 43 | } 44 | 45 | 46 | // Anything printed to Soundboard object will be split to both the sound card 47 | // and debug streams. Saves having to print everything twice in debug code. 48 | size_t Adafruit_Soundboard::write(uint8_t c) { 49 | if(debug) { 50 | if(!writing) { 51 | debug->print(F("---> ")); 52 | writing = true; 53 | } 54 | debug->write(c); 55 | } 56 | return stream->write(c); 57 | } 58 | 59 | // Do a hard reset by bringing the RST pin low 60 | // then read out the output lines 61 | boolean Adafruit_Soundboard::reset(void) { 62 | digitalWrite(reset_pin, LOW); 63 | pinMode(reset_pin, OUTPUT); 64 | delay(10); 65 | pinMode(reset_pin, INPUT); 66 | delay(1000); // give a bit of time to 'boot up' 67 | 68 | // eat new line 69 | readLine(); 70 | #ifdef DEBUG 71 | Serial.println(line_buffer); // Date and name 72 | #endif 73 | 74 | readLine(); 75 | // "Adafruit FX Sound Board 9/10/14" 76 | #ifdef DEBUG 77 | Serial.println(line_buffer); // Date and name 78 | #endif 79 | if (! strstr(line_buffer, "Adafruit FX Sound Board")) return false; 80 | 81 | delay(250); 82 | 83 | readLine(); 84 | //Serial.print("3>"); Serial.println(line_buffer); // FAT type 85 | readLine(); 86 | //Serial.print("4>"); Serial.println(line_buffer); // # of files 87 | 88 | return true; 89 | } 90 | 91 | 92 | 93 | // Query the board for the # of files and names/sizes 94 | uint8_t Adafruit_Soundboard::listFiles(void) { 95 | uint32_t filesize; 96 | 97 | while (stream->available()) 98 | stream->read(); 99 | 100 | stream->println('L'); // 'L' for 'l'ist 101 | 102 | files=0; 103 | 104 | while (stream->readBytesUntil('\n', line_buffer, LINE_BUFFER_SIZE)) { 105 | // copy over the file name 106 | memcpy(filenames[files], line_buffer, 12); 107 | filenames[files][11] = 0; 108 | 109 | // parse out the file size after the name + tab 110 | filesizes[files] = 0; 111 | for (uint8_t i=0; i<16; i++) { 112 | uint8_t c = line_buffer[12 + i]; 113 | if ((c > '9') || (c < '0')) { 114 | break; 115 | } 116 | 117 | filesizes[files] *= 10; 118 | 119 | filesizes[files] += c - '0'; 120 | } 121 | 122 | files++; 123 | if (files >= MAXFILES) break; 124 | } 125 | return files; 126 | } 127 | 128 | // for public consumption 129 | char * Adafruit_Soundboard::fileName(uint8_t n) { 130 | if (n >= files) return NULL; 131 | 132 | return filenames[n]; 133 | } 134 | 135 | uint32_t Adafruit_Soundboard::fileSize(uint8_t n) { 136 | if (n >= files) return 0; 137 | 138 | return filesizes[n]; 139 | } 140 | 141 | 142 | boolean Adafruit_Soundboard::playTrack(uint8_t n) { 143 | while (stream->available()) 144 | stream->read(); 145 | 146 | stream->print("#"); stream->println(n); 147 | 148 | readLine(); // eat return 149 | 150 | readLine(); 151 | 152 | #ifdef DEBUG 153 | Serial.print("<---"); Serial.println(line_buffer); 154 | #endif 155 | 156 | // check we got "play" back 157 | if (strstr(line_buffer, "play") == 0) { 158 | return false; 159 | } 160 | // check the # is correct 161 | int playing = atoi(line_buffer+5); 162 | #ifdef DEBUG 163 | Serial.print("# = "); Serial.println(playing); 164 | #endif 165 | if (n != playing) return false; 166 | 167 | return true; 168 | } 169 | 170 | boolean Adafruit_Soundboard::playTrack(char *name) { 171 | while (stream->available()) 172 | stream->read(); 173 | 174 | stream->print("P"); stream->println(name); 175 | 176 | readLine(); // eat return 177 | #ifdef DEBUG 178 | Serial.print("\n\r<--- "); Serial.println(line_buffer); 179 | #endif 180 | 181 | readLine(); 182 | 183 | #ifdef DEBUG 184 | Serial.print("\n\r<--- "); Serial.println(line_buffer); 185 | #endif 186 | 187 | // check we got "play" back 188 | if (strstr(line_buffer, "play") == 0) { 189 | return false; 190 | } 191 | return true; 192 | } 193 | 194 | 195 | uint8_t Adafruit_Soundboard::volUp() { 196 | while (stream->available()) 197 | stream->read(); 198 | 199 | stream->println("+"); 200 | readLine(); 201 | //Serial.println(line_buffer); 202 | 203 | uint8_t v = atoi(line_buffer); 204 | 205 | return v; 206 | } 207 | 208 | uint8_t Adafruit_Soundboard::volDown() { 209 | while (stream->available()) 210 | stream->read(); 211 | 212 | stream->println("-"); 213 | readLine(); 214 | //Serial.println(line_buffer); 215 | 216 | uint8_t v = atoi(line_buffer); 217 | 218 | return v; 219 | } 220 | 221 | boolean Adafruit_Soundboard::pause() { 222 | while (stream->available()) 223 | stream->read(); 224 | 225 | stream->print("="); 226 | if (! stream->readBytes(line_buffer, 1)) 227 | return false; 228 | 229 | if (line_buffer[0] != '=') 230 | return false; 231 | return true; 232 | } 233 | 234 | 235 | boolean Adafruit_Soundboard::unpause() { 236 | while (stream->available()) 237 | stream->read(); 238 | 239 | stream->print(">"); 240 | if (! stream->readBytes(line_buffer, 1)) 241 | return false; 242 | 243 | if (line_buffer[0] != '>') 244 | return false; 245 | return true; 246 | } 247 | 248 | boolean Adafruit_Soundboard::stop() { 249 | while (stream->available()) 250 | stream->read(); 251 | 252 | stream->print("q"); 253 | readLine(); 254 | 255 | if (line_buffer[0] != 'q') 256 | return false; 257 | 258 | return true; 259 | } 260 | 261 | 262 | boolean Adafruit_Soundboard::trackTime(uint32_t *current, uint32_t *total) { 263 | while (stream->available()) 264 | stream->read(); 265 | 266 | stream->print('t'); 267 | readLine(); 268 | //Serial.println(line_buffer); 269 | //Serial.println(strlen(line_buffer)); 270 | if (strlen(line_buffer) != 12) return false; 271 | *current = atoi(line_buffer); 272 | *total = atoi(line_buffer+6); 273 | 274 | return true; 275 | } 276 | 277 | boolean Adafruit_Soundboard::trackSize(uint32_t *remain, uint32_t *total) { 278 | while (stream->available()) 279 | stream->read(); 280 | 281 | stream->print('s'); 282 | readLine(); 283 | //Serial.println(line_buffer); 284 | //Serial.println(strlen(line_buffer)); 285 | if (strlen(line_buffer) != 22) return false; 286 | *remain = atol(line_buffer); 287 | *total = atol(line_buffer+11); 288 | 289 | return true; 290 | } 291 | -------------------------------------------------------------------------------- /Arduino/libraries/Adafruit_Soundboard_library/Adafruit_Soundboard.h: -------------------------------------------------------------------------------- 1 | /*************************************************** 2 | This is a library for the Adafruit Sound Boards in UART mode 3 | 4 | ----> http://www.adafruit.com/products/2342 5 | ----> http://www.adafruit.com/products/2341 6 | ----> http://www.adafruit.com/products/2217 7 | ----> http://www.adafruit.com/products/2210 8 | ----> http://www.adafruit.com/products/2133 9 | ----> http://www.adafruit.com/products/2220 10 | 11 | Check out the links above for our tutorials and wiring diagrams 12 | This sound fx driver uses TTL Serial to communicate 13 | 14 | Adafruit invests time and resources providing this open source code, 15 | please support Adafruit and open-source hardware by purchasing 16 | products from Adafruit! 17 | 18 | Written by Limor Fried/Ladyada for Adafruit Industries. 19 | MIT license, all text above must be included in any redistribution 20 | ****************************************************/ 21 | 22 | #ifndef _ADAFRUIT_SOUNDBOARD_H_ 23 | #define _ADAFRUIT_SOUNDBOARD_H_ 24 | 25 | #include "Arduino.h" 26 | 27 | #define LINE_BUFFER_SIZE 80 28 | #define MAXFILES 25 29 | 30 | class Adafruit_Soundboard : public Print { 31 | public: 32 | Adafruit_Soundboard(Stream *s, Stream *d, int8_t r); 33 | 34 | boolean reset(void); 35 | 36 | int readLine(void); 37 | uint8_t listFiles(void); 38 | 39 | char *fileName(uint8_t n); 40 | uint32_t fileSize(uint8_t n); 41 | 42 | 43 | uint8_t volUp(void); 44 | uint8_t volDown(void); 45 | 46 | boolean playTrack(uint8_t n); 47 | boolean playTrack(char *name); 48 | boolean pause(void); 49 | boolean unpause(void); 50 | boolean stop(void); 51 | 52 | boolean trackTime(uint32_t *current, uint32_t *total); 53 | boolean trackSize(uint32_t *current, uint32_t *total); 54 | 55 | private: 56 | Stream *stream; // -> sound board, e.g. SoftwareSerial or Serial1 57 | Stream *debug; // -> host, e.g. Serial 58 | 59 | int8_t reset_pin; 60 | char line_buffer[LINE_BUFFER_SIZE]; 61 | boolean writing; 62 | 63 | // File name & size caching 64 | uint8_t files; 65 | char filenames[MAXFILES][12]; 66 | uint32_t filesizes[MAXFILES]; 67 | 68 | 69 | virtual size_t write(uint8_t); // Because Print subclass 70 | }; 71 | #endif 72 | -------------------------------------------------------------------------------- /Arduino/libraries/Adafruit_Soundboard_library/README.md: -------------------------------------------------------------------------------- 1 | # Adafruit_Soundboard_library 2 | 3 | This is a library for the Adafruit Audio FX Sound Boards in UART mode 4 | 5 | * [Adafruit Audio FX Mini Sound Board - WAV/OGG Trigger - 2MB Flash](https://www.adafruit.com/products/2342) 6 | * [Adafruit Audio FX Mini Sound Board - WAV/OGG Trigger - 16MB Flash](https://www.adafruit.com/products/2341) 7 | * [Adafruit Audio FX Sound Board + 2x2W Amp - WAV/OGG Trigger - 2MB](https://www.adafruit.com/products/2210) 8 | * [Adafruit Audio FX Sound Board + 2x2W Amp - WAV/OGG Trigger - 16MB](https://www.adafruit.com/products/2217) 9 | * [Adafruit Audio FX Sound Board - WAV/OGG Trigger with 2MB Flash](https://www.adafruit.com/products/2133) 10 | * [Adafruit Audio FX Sound Board - WAV/OGG Trigger with 16MB Flash](https://www.adafruit.com/products/2220) 11 | 12 | Check out the links above for our tutorials and wiring diagrams 13 | This sound fx driver uses TTL Serial to communicate 14 | 15 | Adafruit invests time and resources providing this open source code, 16 | please support Adafruit and open-source hardware by purchasing 17 | products from Adafruit! 18 | 19 | Written by Limor Fried/Ladyada for Adafruit Industries. 20 | MIT license, all text above must be included in any redistribution 21 | 22 | To download. click the DOWNLOADS button in the top right corner, rename the uncompressed folder Adafruit_Soundboard. Check that the Adafruit_Soundboard folder contains Adafruit_Soundboard.cpp and Adafruit_Soundboard.h 23 | 24 | Place the Adafruit_Soundboard library folder your *arduinosketchfolder*/libraries/ folder. You may need to create the libraries subfolder if its your first library. Restart the IDE 25 | 26 | We also have a great tutorial at: 27 | https://learn.adafruit.com/adafruit-audio-fx-sound-board 28 | -------------------------------------------------------------------------------- /Arduino/libraries/Adafruit_Soundboard_library/examples/menucommands/menucommands.ino: -------------------------------------------------------------------------------- 1 | /* 2 | Menu driven control of a sound board over UART. 3 | Commands for playing by # or by name (full 11-char name) 4 | Hard reset and List files (when not playing audio) 5 | Vol + and - (only when not playing audio) 6 | Pause, unpause, quit playing (when playing audio) 7 | Current play time, and bytes remaining & total bytes (when playing audio) 8 | 9 | Connect UG to ground to have the sound board boot into UART mode 10 | */ 11 | 12 | #include 13 | #include "Adafruit_Soundboard.h" 14 | 15 | 16 | // Choose any two pins that can be used with SoftwareSerial to RX & TX 17 | #define SFX_TX 5 18 | #define SFX_RX 6 19 | 20 | // Connect to the RST pin on the Sound Board 21 | #define SFX_RST 4 22 | 23 | // You can also monitor the ACT pin for when audio is playing! 24 | 25 | // we'll be using software serial 26 | SoftwareSerial ss = SoftwareSerial(SFX_TX, SFX_RX); 27 | 28 | // pass the software serial to Adafruit_soundboard, the second 29 | // argument is the debug port (not used really) and the third 30 | // arg is the reset pin 31 | Adafruit_Soundboard sfx = Adafruit_Soundboard(&ss, NULL, SFX_RST); 32 | // can also try hardware serial with 33 | // Adafruit_Soundboard sfx = Adafruit_Soundboard(&Serial1, NULL, SFX_RST); 34 | 35 | void setup() { 36 | Serial.begin(115200); 37 | Serial.println("Adafruit Sound Board!"); 38 | 39 | // softwareserial at 9600 baud 40 | ss.begin(9600); 41 | // can also do Serial1.begin(9600) 42 | 43 | if (!sfx.reset()) { 44 | Serial.println("Not found"); 45 | while (1); 46 | } 47 | Serial.println("SFX board found"); 48 | } 49 | 50 | 51 | void loop() { 52 | flushInput(); 53 | 54 | Serial.println(F("What would you like to do?")); 55 | Serial.println(F("[r] - reset")); 56 | Serial.println(F("[+] - Vol +")); 57 | Serial.println(F("[-] - Vol -")); 58 | Serial.println(F("[L] - List files")); 59 | Serial.println(F("[P] - play by file name")); 60 | Serial.println(F("[#] - play by file number")); 61 | Serial.println(F("[=] - pause playing")); 62 | Serial.println(F("[>] - unpause playing")); 63 | Serial.println(F("[q] - stop playing")); 64 | Serial.println(F("[t] - playtime status")); 65 | Serial.println(F("> ")); 66 | 67 | while (!Serial.available()); 68 | char cmd = Serial.read(); 69 | 70 | flushInput(); 71 | 72 | switch (cmd) { 73 | case 'r': { 74 | if (!sfx.reset()) { 75 | Serial.println("Reset failed"); 76 | } 77 | break; 78 | } 79 | 80 | case 'L': { 81 | uint8_t files = sfx.listFiles(); 82 | 83 | Serial.println("File Listing"); 84 | Serial.println("========================"); 85 | Serial.println(); 86 | Serial.print("Found "); Serial.print(files); Serial.println(" Files"); 87 | for (uint8_t f=0; f"); 109 | char name[20]; 110 | readline(name, 20); 111 | 112 | Serial.print("\nPlaying track \""); Serial.print(name); Serial.print("\""); 113 | if (! sfx.playTrack(name) ) { 114 | Serial.println("Failed to play track?"); 115 | } 116 | break; 117 | } 118 | 119 | case '+': { 120 | Serial.println("Vol up..."); 121 | uint16_t v; 122 | if (! (v = sfx.volUp()) ) { 123 | Serial.println("Failed to adjust"); 124 | } else { 125 | Serial.print("Volume: "); Serial.println(v); 126 | } 127 | break; 128 | } 129 | 130 | case '-': { 131 | Serial.println("Vol down..."); 132 | uint16_t v; 133 | if (! (v=sfx.volDown()) ) { 134 | Serial.println("Failed to adjust"); 135 | } else { 136 | Serial.print("Volume: "); 137 | Serial.println(v); 138 | } 139 | break; 140 | } 141 | 142 | case '=': { 143 | Serial.println("Pausing..."); 144 | if (! sfx.pause() ) Serial.println("Failed to pause"); 145 | break; 146 | } 147 | 148 | case '>': { 149 | Serial.println("Unpausing..."); 150 | if (! sfx.unpause() ) Serial.println("Failed to unpause"); 151 | break; 152 | } 153 | 154 | case 'q': { 155 | Serial.println("Stopping..."); 156 | if (! sfx.stop() ) Serial.println("Failed to stop"); 157 | break; 158 | } 159 | 160 | case 't': { 161 | Serial.print("Track time: "); 162 | uint32_t current, total; 163 | if (! sfx.trackTime(¤t, &total) ) Serial.println("Failed to query"); 164 | Serial.print(current); Serial.println(" seconds"); 165 | break; 166 | } 167 | 168 | case 's': { 169 | Serial.print("Track size (bytes remaining/total): "); 170 | uint32_t remain, total; 171 | if (! sfx.trackSize(&remain, &total) ) 172 | Serial.println("Failed to query"); 173 | Serial.print(remain); Serial.print("/"); Serial.println(total); 174 | break; 175 | } 176 | 177 | } 178 | } 179 | 180 | 181 | 182 | 183 | 184 | 185 | /************************ MENU HELPERS ***************************/ 186 | 187 | void flushInput() { 188 | // Read all available serial input to flush pending data. 189 | uint16_t timeoutloop = 0; 190 | while (timeoutloop++ < 40) { 191 | while(ss.available()) { 192 | ss.read(); 193 | timeoutloop = 0; // If char was received reset the timer 194 | } 195 | delay(1); 196 | } 197 | } 198 | 199 | char readBlocking() { 200 | while (!Serial.available()); 201 | return Serial.read(); 202 | } 203 | 204 | uint16_t readnumber() { 205 | uint16_t x = 0; 206 | char c; 207 | while (! isdigit(c = readBlocking())) { 208 | //Serial.print(c); 209 | } 210 | Serial.print(c); 211 | x = c - '0'; 212 | while (isdigit(c = readBlocking())) { 213 | Serial.print(c); 214 | x *= 10; 215 | x += c - '0'; 216 | } 217 | return x; 218 | } 219 | 220 | uint8_t readline(char *buff, uint8_t maxbuff) { 221 | uint16_t buffidx = 0; 222 | 223 | while (true) { 224 | if (buffidx > maxbuff) { 225 | break; 226 | } 227 | 228 | if (Serial.available()) { 229 | char c = Serial.read(); 230 | //Serial.print(c, HEX); Serial.print("#"); Serial.println(c); 231 | 232 | if (c == '\r') continue; 233 | if (c == 0xA) { 234 | if (buffidx == 0) { // the first 0x0A is ignored 235 | continue; 236 | } 237 | buff[buffidx] = 0; // null term 238 | return buffidx; 239 | } 240 | buff[buffidx] = c; 241 | buffidx++; 242 | } 243 | } 244 | buff[buffidx] = 0; // null term 245 | return buffidx; 246 | } 247 | /************************ MENU HELPERS ***************************/ -------------------------------------------------------------------------------- /Arduino/libraries/Adafruit_Soundboard_library/library.properties: -------------------------------------------------------------------------------- 1 | name=Adafruit Soundboard library 2 | version=1.0.0 3 | author=Adafruit 4 | maintainer=Adafruit 5 | sentence=Arduino Library for UART control of the Adafruit Soundboard 6 | paragraph=Arduino Library for UART control of the Adafruit Soundboard 7 | category=Device Control 8 | url=https://github.com/adafruit/Adafruit_Soundboard_library 9 | architectures=* 10 | -------------------------------------------------------------------------------- /Arduino/libraries/QueueArray/Examples/ManageString/ManageString.ino: -------------------------------------------------------------------------------- 1 | /* 2 | * Manage a string by using a generic, dynamic queue data structure. 3 | * 4 | * Copyright (C) 2010 Efstathios Chatzikyriakidis (contact@efxa.org) 5 | * 6 | * This program is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * This program is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with this program. If not, see . 18 | */ 19 | 20 | // include queue library header. 21 | #include 22 | 23 | // declare a string message. 24 | const String msg = "Happy Hacking!"; 25 | 26 | // create a queue of characters. 27 | QueueArray queue; 28 | 29 | // startup point entry (runs once). 30 | void 31 | setup () { 32 | // start serial communication. 33 | Serial.begin (9600); 34 | 35 | // set the printer of the queue. 36 | queue.setPrinter (Serial); 37 | 38 | // enqueue all the message's characters to the queue. 39 | for (int i = 0; i < msg.length (); i++) 40 | queue.enqueue (msg.charAt (i)); 41 | 42 | // dequeue all the message's characters from the queue. 43 | while (!queue.isEmpty ()) 44 | Serial.print (queue.dequeue ()); 45 | 46 | // print end of line character. 47 | Serial.println (); 48 | } 49 | 50 | // loop the main sketch. 51 | void 52 | loop () { 53 | // nothing here. 54 | } 55 | -------------------------------------------------------------------------------- /Arduino/libraries/QueueArray/QueueArray.h: -------------------------------------------------------------------------------- 1 | /* 2 | * QueueArray.h 3 | * 4 | * Library implementing a generic, dynamic queue (array version). 5 | * 6 | * --- 7 | * 8 | * Copyright (C) 2010 Efstathios Chatzikyriakidis (contact@efxa.org) 9 | * 10 | * This program is free software: you can redistribute it and/or modify 11 | * it under the terms of the GNU General Public License as published by 12 | * the Free Software Foundation, either version 3 of the License, or 13 | * (at your option) any later version. 14 | * 15 | * This program is distributed in the hope that it will be useful, 16 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 | * GNU General Public License for more details. 19 | * 20 | * You should have received a copy of the GNU General Public License 21 | * along with this program. If not, see . 22 | * 23 | * --- 24 | * 25 | * Version 1.0 26 | * 27 | * 2014-02-03 Brian Fletcher 28 | * 29 | * - added enqueue(), dequeue() and front(). 30 | * 31 | * 2010-09-29 Efstathios Chatzikyriakidis 32 | * 33 | * - added resize(): for growing, shrinking the array size. 34 | * 35 | * 2010-09-25 Efstathios Chatzikyriakidis 36 | * 37 | * - added exit(), blink(): error reporting and handling methods. 38 | * 39 | * 2010-09-24 Alexander Brevig 40 | * 41 | * - added setPrinter(): indirectly reference a Serial object. 42 | * 43 | * 2010-09-20 Efstathios Chatzikyriakidis 44 | * 45 | * - initial release of the library. 46 | * 47 | * --- 48 | * 49 | * For the latest version see: http://www.arduino.cc/ 50 | */ 51 | 52 | // header defining the interface of the source. 53 | #ifndef _QUEUEARRAY_H 54 | #define _QUEUEARRAY_H 55 | 56 | // include Arduino basic header. 57 | #include 58 | 59 | // the definition of the queue class. 60 | template 61 | class QueueArray { 62 | public: 63 | // init the queue (constructor). 64 | QueueArray (); 65 | 66 | // clear the queue (destructor). 67 | ~QueueArray (); 68 | 69 | // add an item to the queue. 70 | void enqueue (const T i); 71 | 72 | // remove an item from the queue. 73 | T dequeue (); 74 | 75 | // push an item to the queue. 76 | void push (const T i); 77 | 78 | // pop an item from the queue. 79 | T pop (); 80 | 81 | // get the front of the queue. 82 | T front () const; 83 | 84 | // get an item from the queue. 85 | T peek () const; 86 | 87 | // check if the queue is empty. 88 | bool isEmpty () const; 89 | 90 | // get the number of items in the queue. 91 | int count () const; 92 | 93 | // check if the queue is full. 94 | bool isFull () const; 95 | 96 | // set the printer of the queue. 97 | void setPrinter (Print & p); 98 | 99 | private: 100 | // resize the size of the queue. 101 | void resize (const int s); 102 | 103 | // exit report method in case of error. 104 | void exit (const char * m) const; 105 | 106 | // led blinking method in case of error. 107 | void blink () const; 108 | 109 | // the initial size of the queue. 110 | static const int initialSize = 2; 111 | 112 | // the pin number of the on-board led. 113 | static const int ledPin = 13; 114 | 115 | Print * printer; // the printer of the queue. 116 | T * contents; // the array of the queue. 117 | 118 | int size; // the size of the queue. 119 | int items; // the number of items of the queue. 120 | 121 | int head; // the head of the queue. 122 | int tail; // the tail of the queue. 123 | }; 124 | 125 | // init the queue (constructor). 126 | template 127 | QueueArray::QueueArray () { 128 | size = 0; // set the size of queue to zero. 129 | items = 0; // set the number of items of queue to zero. 130 | 131 | head = 0; // set the head of the queue to zero. 132 | tail = 0; // set the tail of the queue to zero. 133 | 134 | printer = NULL; // set the printer of queue to point nowhere. 135 | 136 | // allocate enough memory for the array. 137 | contents = (T *) malloc (sizeof (T) * initialSize); 138 | 139 | // if there is a memory allocation error. 140 | if (contents == NULL) 141 | exit ("QUEUE: insufficient memory to initialize queue."); 142 | 143 | // set the initial size of the queue. 144 | size = initialSize; 145 | } 146 | 147 | // clear the queue (destructor). 148 | template 149 | QueueArray::~QueueArray () { 150 | free (contents); // deallocate the array of the queue. 151 | 152 | contents = NULL; // set queue's array pointer to nowhere. 153 | printer = NULL; // set the printer of queue to point nowhere. 154 | 155 | size = 0; // set the size of queue to zero. 156 | items = 0; // set the number of items of queue to zero. 157 | 158 | head = 0; // set the head of the queue to zero. 159 | tail = 0; // set the tail of the queue to zero. 160 | } 161 | 162 | // resize the size of the queue. 163 | template 164 | void QueueArray::resize (const int s) { 165 | // defensive issue. 166 | if (s <= 0) 167 | exit ("QUEUE: error due to undesirable size for queue size."); 168 | 169 | // allocate enough memory for the temporary array. 170 | T * temp = (T *) malloc (sizeof (T) * s); 171 | 172 | // if there is a memory allocation error. 173 | if (temp == NULL) 174 | exit ("QUEUE: insufficient memory to initialize temporary queue."); 175 | 176 | // copy the items from the old queue to the new one. 177 | for (int i = 0; i < items; i++) 178 | temp[i] = contents[(head + i) % size]; 179 | 180 | // deallocate the old array of the queue. 181 | free (contents); 182 | 183 | // copy the pointer of the new queue. 184 | contents = temp; 185 | 186 | // set the head and tail of the new queue. 187 | head = 0; tail = items; 188 | 189 | // set the new size of the queue. 190 | size = s; 191 | } 192 | 193 | // add an item to the queue. 194 | template 195 | void QueueArray::enqueue (const T i) { 196 | // check if the queue is full. 197 | if (isFull ()) 198 | // double size of array. 199 | resize (size * 2); 200 | 201 | // store the item to the array. 202 | contents[tail++] = i; 203 | 204 | // wrap-around index. 205 | if (tail == size) tail = 0; 206 | 207 | // increase the items. 208 | items++; 209 | } 210 | 211 | // push an item to the queue. 212 | template 213 | void QueueArray::push (const T i) { 214 | enqueue(i); 215 | } 216 | 217 | // remove an item from the queue. 218 | template 219 | T QueueArray::dequeue () { 220 | // check if the queue is empty. 221 | if (isEmpty ()) 222 | exit ("QUEUE: can't pop item from queue: queue is empty."); 223 | 224 | // fetch the item from the array. 225 | T item = contents[head++]; 226 | 227 | // decrease the items. 228 | items--; 229 | 230 | // wrap-around index. 231 | if (head == size) head = 0; 232 | 233 | // shrink size of array if necessary. 234 | if (!isEmpty () && (items <= size / 4)) 235 | resize (size / 2); 236 | 237 | // return the item from the array. 238 | return item; 239 | } 240 | 241 | // pop an item from the queue. 242 | template 243 | T QueueArray::pop () { 244 | return dequeue(); 245 | } 246 | 247 | // get the front of the queue. 248 | template 249 | T QueueArray::front () const { 250 | // check if the queue is empty. 251 | if (isEmpty ()) 252 | exit ("QUEUE: can't get the front item of queue: queue is empty."); 253 | 254 | // get the item from the array. 255 | return contents[head]; 256 | } 257 | 258 | // get an item from the queue. 259 | template 260 | T QueueArray::peek () const { 261 | return front(); 262 | } 263 | 264 | // check if the queue is empty. 265 | template 266 | bool QueueArray::isEmpty () const { 267 | return items == 0; 268 | } 269 | 270 | // check if the queue is full. 271 | template 272 | bool QueueArray::isFull () const { 273 | return items == size; 274 | } 275 | 276 | // get the number of items in the queue. 277 | template 278 | int QueueArray::count () const { 279 | return items; 280 | } 281 | 282 | // set the printer of the queue. 283 | template 284 | void QueueArray::setPrinter (Print & p) { 285 | printer = &p; 286 | } 287 | 288 | // exit report method in case of error. 289 | template 290 | void QueueArray::exit (const char * m) const { 291 | // print the message if there is a printer. 292 | if (printer) 293 | printer->println (m); 294 | 295 | // loop blinking until hardware reset. 296 | blink (); 297 | } 298 | 299 | // led blinking method in case of error. 300 | template 301 | void QueueArray::blink () const { 302 | // set led pin as output. 303 | pinMode (ledPin, OUTPUT); 304 | 305 | // continue looping until hardware reset. 306 | while (true) { 307 | digitalWrite (ledPin, HIGH); // sets the LED on. 308 | delay (250); // pauses 1/4 of second. 309 | digitalWrite (ledPin, LOW); // sets the LED off. 310 | delay (250); // pauses 1/4 of second. 311 | } 312 | 313 | // solution selected due to lack of exit() and assert(). 314 | } 315 | 316 | #endif // _QUEUEARRAY_H 317 | -------------------------------------------------------------------------------- /Arduino/libraries/QueueArray/keywords.txt: -------------------------------------------------------------------------------- 1 | ####################################### 2 | # Syntax Coloring Map For QueueArray 3 | ####################################### 4 | 5 | ####################################### 6 | # Datatypes (KEYWORD1) 7 | ####################################### 8 | 9 | QueueArray KEYWORD1 10 | 11 | ####################################### 12 | # Methods and Functions (KEYWORD2) 13 | ####################################### 14 | 15 | push KEYWORD2 16 | pop KEYWORD2 17 | peek KEYWORD2 18 | isEmpty KEYWORD2 19 | isFull KEYWORD2 20 | count KEYWORD2 21 | setPrinter KEYWORD2 22 | -------------------------------------------------------------------------------- /Arduino/libraries/SparkFun_SX1509_Arduino_Library/README.md: -------------------------------------------------------------------------------- 1 | SparkFun SX1509 IO Expander Breakout Arduino Library 2 | ======================================== 3 | 4 | [![SparkFun SX1509 IO Expander Breakout](https://cdn.sparkfun.com//assets/parts/1/0/9/5/6/13601-01.jpg)](https://www.sparkfun.com/products/13601) 5 | 6 | [*SparkFun SX1509 IO Expander Breakout (SKU)*](https://www.sparkfun.com/products/13601) 7 | 8 | Arduino library for the SX1509 16-I/O expander. Capable of driving LEDs - with blink, and breathe functions - or monitoring up to 64 buttons in an 8x8 array. 9 | 10 | Repository Contents 11 | ------------------- 12 | 13 | * **/examples** - Example sketches for the library (.ino). Run these from the Arduino IDE. 14 | * **/extras** - Additional documentation for the user. These files are ignored by the IDE. 15 | * **/src** - Source files for the library (.cpp, .h). 16 | * **keywords.txt** - Keywords from this library that will be highlighted in the Arduino IDE. 17 | * **library.properties** - General library properties for the Arduino package manager. 18 | 19 | Documentation 20 | -------------- 21 | 22 | * **[SparkFun SX1509 Breakout Board Hookup Guide](https://learn.sparkfun.com/tutorials/sx1509-io-expander-breakout-hookup-guide)** - SparkFun tutorial demonstrating how to hook up the SX1509 Breakout and use this library. 23 | * **[Installing an Arduino Library Guide](https://learn.sparkfun.com/tutorials/installing-an-arduino-library)** - Basic information on how to install an Arduino library. 24 | * **[Product Repository](https://github.com/sparkfun/SX1509_IO-Expander)** - Main repository (including hardware files) for the SX1509 IO Expander Breakout. 25 | 26 | Products that use this Library 27 | --------------------------------- 28 | 29 | * [BOB-13601](https://www.sparkfun.com/products/13601) - SX1509 16 I/O Breakout Board (v2.0) 30 | * [BOB-11502](https://www.sparkfun.com/products/retired/11502)- (Retired) 16 I/O I2C port expander. 31 | 32 | Version History 33 | --------------- 34 | 35 | * [V_2.0.1](https://github.com/sparkfun/SparkFun_SX1509_Arduino_Library/tree/V_2.0.1) - Version 2.0.1. More user-friendly function calls. Increased clock functionality. More examples. Mostly backwards compatible with older versions. 36 | * [V_1.0.0](https://github.com/sparkfun/SparkFun_SX1509_Arduino_Library/tree/V_1.0.0) - Version 1.0.0 37 | 38 | License Information 39 | ------------------- 40 | 41 | This product is _**open source**_! 42 | 43 | The **code** is beerware; if you see me (or any other SparkFun employee) at the local, and you've found our code helpful, please buy us a round! 44 | 45 | Please use, reuse, and modify these files as you see fit. Please maintain attribution to SparkFun Electronics and release anything derivative under the same license. 46 | 47 | Distributed as-is; no warranty is given. 48 | 49 | - Your friends at SparkFun. 50 | -------------------------------------------------------------------------------- /Arduino/libraries/SparkFun_SX1509_Arduino_Library/examples/analogWrite/analogWrite.ino: -------------------------------------------------------------------------------- 1 | /************************************************************* 2 | analogWrite.ino 3 | SparkFun SX1509 I/O Expander Example: pwm output (analogWrite) 4 | Jim Lindblom @ SparkFun Electronics 5 | Original Creation Date: September 21, 2015 6 | https://github.com/sparkfun/SparkFun_SX1509_Arduino_Library 7 | 8 | This example demonstrates the SX1509's analogWrite function. 9 | Connect an LED to the SX1509's pin 15 (or any other pin, they 10 | can all PWM!). The SX1509 can either sink or source current, 11 | just don't forget your limiting resistor! 12 | 13 | Hardware Hookup: 14 | SX1509 Breakout ------ Arduino -------- Breadboard 15 | GND -------------- GND 16 | 3V3 -------------- 3.3V 17 | SDA ------------ SDA (A4) 18 | SCL ------------ SCL (A5) 19 | 15 -------------------------------- LED+ 20 | LED- -/\/\/\- GND 21 | 330 22 | 23 | Development environment specifics: 24 | IDE: Arduino 1.6.5 25 | Hardware Platform: Arduino Uno 26 | SX1509 Breakout Version: v2.0 27 | 28 | This code is beerware; if you see me (or any other SparkFun 29 | employee) at the local, and you've found our code helpful, 30 | please buy us a round! 31 | 32 | Distributed as-is; no warranty is given. 33 | *************************************************************/ 34 | 35 | #include // Include the I2C library (required) 36 | #include // Include SX1509 library 37 | 38 | // SX1509 I2C address (set by ADDR1 and ADDR0 (00 by default): 39 | const byte SX1509_ADDRESS = 0x3E; // SX1509 I2C address 40 | SX1509 io; // Create an SX1509 object to be used throughout 41 | 42 | // SX1509 Pin definition: 43 | const byte SX1509_LED_PIN = 15; // LED to SX1509's pin 15 44 | 45 | void setup() 46 | { 47 | // Call io.begin(
) to initialize the SX1509. If it 48 | // successfully communicates, it'll return 1. 49 | if (!io.begin(SX1509_ADDRESS)) 50 | { 51 | while (1) ; // If we fail to communicate, loop forever. 52 | } 53 | 54 | // Use the pinMode(, ) function to set our led 55 | // pin as an ANALOG_OUTPUT, which is required for PWM output 56 | io.pinMode(SX1509_LED_PIN, ANALOG_OUTPUT); 57 | } 58 | 59 | void loop() 60 | { 61 | // Ramp brightness up, from 0-255, delay 2ms in between 62 | // analogWrite's 63 | for (int brightness=0; brightness<256; brightness++) 64 | { 65 | // Call io.analogWrite(, <0-255>) to configure the 66 | // PWM duty cycle 67 | io.analogWrite(SX1509_LED_PIN, brightness); 68 | delay(2); // Delay 2 milliseconds 69 | } 70 | delay(500); // Delay half-a-second 71 | 72 | // Ramp brightness down, from 255-0, delay 2ms in between 73 | // analogWrite's 74 | for (int brightness=255; brightness>=0; brightness--) 75 | { 76 | io.analogWrite(SX1509_LED_PIN, brightness); 77 | delay(2); // Delay 2 milliseconds 78 | } 79 | delay(500); // Delay half-a-second 80 | 81 | } 82 | -------------------------------------------------------------------------------- /Arduino/libraries/SparkFun_SX1509_Arduino_Library/examples/blink/blink.ino: -------------------------------------------------------------------------------- 1 | /************************************************************* 2 | blink.ino 3 | SparkFun SX1509 I/O Expander Example: blink output 4 | Jim Lindblom @ SparkFun Electronics 5 | Original Creation Date: September 21, 2015 6 | https://github.com/sparkfun/SparkFun_SX1509_Arduino_Library 7 | 8 | This example demonstrates the SX1509's set-it-and-forget-it 9 | blink function. We'll set the pin up as an OUTPUT, and call 10 | io.blink() all in setup(), then watch the LED blink by itself 11 | in loop(). 12 | 13 | Hardware Hookup: 14 | SX1509 Breakout ------ Arduino -------- Breadboard 15 | GND -------------- GND 16 | 3V3 -------------- 3.3V 17 | SDA ------------ SDA (A4) 18 | SCL ------------ SCL (A5) 19 | 15 -------------------------------- LED+ 20 | LED- -/\/\/\- GND 21 | 330 22 | 23 | Development environment specifics: 24 | IDE: Arduino 1.6.5 25 | Hardware Platform: Arduino Uno 26 | SX1509 Breakout Version: v2.0 27 | 28 | This code is beerware; if you see me (or any other SparkFun 29 | employee) at the local, and you've found our code helpful, 30 | please buy us a round! 31 | 32 | Distributed as-is; no warranty is given. 33 | *************************************************************/ 34 | 35 | #include // Include the I2C library (required) 36 | #include // Include SX1509 library 37 | 38 | // SX1509 I2C address (set by ADDR1 and ADDR0 (00 by default): 39 | const byte SX1509_ADDRESS = 0x3E; // SX1509 I2C address 40 | SX1509 io; // Create an SX1509 object to be used throughout 41 | 42 | // SX1509 Pin definition: 43 | const byte SX1509_LED_PIN = 15; // LED to SX1509's pin 15 44 | 45 | void setup() 46 | { 47 | // Call io.begin(
) to initialize the SX1509. If it 48 | // successfully communicates, it'll return 1. 49 | if (!io.begin(SX1509_ADDRESS)) 50 | { 51 | while (1) ; // If we fail to communicate, loop forever. 52 | } 53 | 54 | // Set up the SX1509's clock to use the internal 2MHz 55 | // oscillator. The second parameter divides the oscillator 56 | // clock to generate a slower LED clock. 4 divides the 2MHz 57 | // clock by 2 ^ (4-1) (8, ie. 250kHz). The divider parameter 58 | // can be anywhere between 1-7. 59 | io.clock(INTERNAL_CLOCK_2MHZ, 4); 60 | 61 | io.pinMode(SX1509_LED_PIN, OUTPUT); // Set LED pin to OUTPUT 62 | 63 | // Blink the LED pin -- ~1000 ms LOW, ~500 ms HIGH: 64 | io.blink(SX1509_LED_PIN, 1000, 500); 65 | // The timing parameters are in milliseconds, but they 66 | // aren't 100% exact. The library will estimate to try to 67 | // get them as close as possible. Play with the clock 68 | // divider to maybe get more accurate timing. 69 | } 70 | 71 | void loop() 72 | { 73 | // Relax! The SX1509's got this... 74 | } 75 | -------------------------------------------------------------------------------- /Arduino/libraries/SparkFun_SX1509_Arduino_Library/examples/breathe/breathe.ino: -------------------------------------------------------------------------------- 1 | /************************************************************* 2 | breathe.ino 3 | SparkFun SX1509 I/O Expander Example: breathe output 4 | Jim Lindblom @ SparkFun Electronics 5 | Original Creation Date: September 21, 2015 6 | https://github.com/sparkfun/SparkFun_SX1509_Arduino_Library 7 | 8 | This example demonstrates the SX1509's set-it-and-forget-it 9 | breathe function. The SX1509 will pulse an LED, smoothly 10 | ramping its brightness up-then-down. We'll set the pin up as 11 | an ANALOG_OUTPUT, and call io.breathe() all in setup(), then 12 | watch the LED pulse by itself in loop(). 13 | 14 | Hardware Hookup: 15 | SX1509 Breakout ------ Arduino -------- Breadboard 16 | GND -------------- GND 17 | 3V3 -------------- 3.3V 18 | SDA ------------ SDA (A4) 19 | SCL ------------ SCL (A5) 20 | 15 --------------------------------- LED+ 21 | LED- -/\/\/\- GND 22 | 330 23 | 24 | Development environment specifics: 25 | IDE: Arduino 1.6.5 26 | Hardware Platform: Arduino Uno 27 | SX1509 Breakout Version: v2.0 28 | 29 | This code is beerware; if you see me (or any other SparkFun 30 | employee) at the local, and you've found our code helpful, 31 | please buy us a round! 32 | 33 | Distributed as-is; no warranty is given. 34 | *************************************************************/ 35 | 36 | #include // Include the I2C library (required) 37 | #include // Include SX1509 library 38 | 39 | // SX1509 I2C address (set by ADDR1 and ADDR0 (00 by default): 40 | const byte SX1509_ADDRESS = 0x3E; // SX1509 I2C address 41 | SX1509 io; // Create an SX1509 object to be used throughout 42 | 43 | // SX1509 Pin definition: 44 | const byte SX1509_LED_PIN = 15; // LED to SX1509's pin 15 45 | 46 | void setup() 47 | { 48 | // Call io.begin(
) to initialize the SX1509. If it 49 | // successfully communicates, it'll return 1. 50 | if (!io.begin(SX1509_ADDRESS)) 51 | { 52 | while (1) ; // If we fail to communicate, loop forever. 53 | } 54 | 55 | // Use the internal 2MHz oscillator. 56 | // Set LED clock to 500kHz (2MHz / (2^(3-1)): 57 | io.clock(INTERNAL_CLOCK_2MHZ, 3); 58 | 59 | // To breathe an LED, make sure you set it as an 60 | // ANALOG_OUTPUT, so we can PWM the pin: 61 | io.pinMode(SX1509_LED_PIN, ANALOG_OUTPUT); 62 | 63 | // Breathe an LED: 1000ms LOW, 500ms HIGH, 64 | // 500ms to rise from low to high 65 | // 250ms to fall from high to low 66 | io.breathe(SX1509_LED_PIN, 1000, 500, 500, 250); 67 | // The timing parameters are in milliseconds, but they 68 | // aren't 100% exact. The library will estimate to try to 69 | // get them as close as possible. Play with the clock 70 | // divider to maybe get more accurate timing. 71 | } 72 | 73 | void loop() 74 | { 75 | // Enjoy your hypnotically breathing LED! 76 | } 77 | -------------------------------------------------------------------------------- /Arduino/libraries/SparkFun_SX1509_Arduino_Library/examples/clock/clock.ino: -------------------------------------------------------------------------------- 1 | /************************************************************* 2 | clock.ino 3 | SparkFun SX1509 I/O Expander Example: clock output 4 | Jim Lindblom @ SparkFun Electronics 5 | Original Creation Date: September 21, 2015 6 | https://github.com/sparkfun/SparkFun_SX1509_Arduino_Library 7 | 8 | This example demonstrates the SX1509's clock output 9 | functionality. The OSC pins (OSCIO in the datasheet), can be 10 | configured as either a clock input, clock output, or an 11 | extra output! 12 | 13 | Hardware Hookup: 14 | SX1509 Breakout ------ Arduino 15 | GND -------------- GND 16 | 3V3 -------------- 3.3V 17 | SDA ------------ SDA (A4) 18 | SCL ------------ SCL (A5) 19 | OSC ------------- Check with a multimeter or o-scope 20 | 21 | Development environment specifics: 22 | IDE: Arduino 1.6.5 23 | Hardware Platform: Arduino Uno 24 | SX1509 Breakout Version: v2.0 25 | 26 | This code is beerware; if you see me (or any other SparkFun 27 | employee) at the local, and you've found our code helpful, 28 | please buy us a round! 29 | 30 | Distributed as-is; no warranty is given. 31 | *************************************************************/ 32 | 33 | #include // Include the I2C library (required) 34 | #include // Include SX1509 library 35 | 36 | // SX1509 I2C address (set by ADDR1 and ADDR0 (00 by default): 37 | const byte SX1509_ADDRESS = 0x3E; // SX1509 I2C address 38 | SX1509 io; // Create an SX1509 object to be used throughout 39 | 40 | void setup() 41 | { 42 | // Call io.begin(
) to initialize the SX1509. If it 43 | // successfully communicates, it'll return 1. 44 | if (!io.begin(SX1509_ADDRESS)) 45 | { 46 | while (1) ; // If we fail to communicate, loop forever. 47 | } 48 | 49 | // Configure clock: 50 | // - INTERNAL_CLOCK_2MHZ: Set clock to internal 2MHz 51 | // - 2: Set LED clock to divide by 2^(2-1) (2) 52 | // - OUTPUT: Configure OSCIO pin as a clock OUTPUT 53 | // - outputFreq: Sets the frequncy of output 54 | // - 0: 0Hz LOW 55 | // - 0x1-0xE: fOSCout = Fosc / 2 ^ (outputFreq - 1) Hz 56 | // - 0xF: 0Hz HIGH 57 | byte outputFreq = 6; // Set output freq. to 62.5 kHz 58 | io.clock(INTERNAL_CLOCK_2MHZ, 2, OUTPUT, outputFreq); 59 | } 60 | 61 | void loop() 62 | { 63 | } 64 | -------------------------------------------------------------------------------- /Arduino/libraries/SparkFun_SX1509_Arduino_Library/examples/demo/demo.ino: -------------------------------------------------------------------------------- 1 | /************************************************************* 2 | demo.ino 3 | SparkFun SX1509 I/O Expander Example: fun time demo! 4 | Jim Lindblom @ SparkFun Electronics 5 | Original Creation Date: September 21, 2015 6 | https://github.com/sparkfun/SparkFun_SX1509_Arduino_Library 7 | 8 | This is a massive demo sketch to show off what the SX1509 can 9 | do! It combines the keypad engine, LED driving, digital 10 | inputs, interrupt triggering, and we even emulate a simple SPI 11 | interface with it! 12 | 13 | All 16 of the SX1509's pins are used. Connected to a 12-button 14 | keypad, Serial 7-Segment Display, and three buttons-with-LEDs: 15 | 16 | - 12-Button Keypad: https://sfe.io/p8653 17 | - Serial 7-Segment (S7S): https://sfe.io/p11441 18 | - 3x LED Buttons: https://sfe.io/p10443 19 | 20 | Hardware Hookup: 21 | SX1509 Breakout ------ Arduino ------------ Component 22 | GND -------------- GND 23 | 3V3 -------------- 3.3V 24 | SDA ------------ SDA (A4) 25 | SCL ------------ SCL (A5) 26 | 0 --------------------------------- Keypad 2 (row 1) 27 | 1 --------------------------------- Keypad 7 (row 2) 28 | 2 --------------------------------- Keypad 6 (row 3) 29 | 3 --------------------------------- Keypad 4 (row 4) 30 | 4 --------------------------------- S7S SS 31 | 5 --------------------------------- Button 1 32 | 6 --------------------------------- Button 2 33 | 7 --------------------------------- Button 3 34 | 8 --------------------------------- Keypad 3 (col 1) 35 | 9 --------------------------------- Keypad 1 (col 2) 36 | 10 -------------------------------- Keypad 5 (col 3) 37 | 11 -------------------------------- S7S SDI 38 | 12 -------------------------------- S7S SCK 39 | 13 -------------------------------- LED 1 40 | 14 -------------------------------- LED 2 41 | 15 -------------------------------- LED 3 42 | 43 | Development environment specifics: 44 | IDE: Arduino 1.6.5 45 | Hardware Platform: Arduino Uno 46 | SX1509 Breakout Version: v2.0 47 | 48 | This code is beerware; if you see me (or any other SparkFun 49 | employee) at the local, and you've found our code helpful, 50 | please buy us a round! 51 | 52 | Distributed as-is; no warranty is given. 53 | *************************************************************/ 54 | 55 | #include // Include the I2C library (required) 56 | #include // Include SX1509 library 57 | 58 | // SX1509 I2C address (set by ADDR1 and ADDR0 (00 by default): 59 | const byte SX1509_ADDRESS = 0x3E; // SX1509 I2C address 60 | SX1509 io; // Create an SX1509 object to be used throughout 61 | 62 | #define KEY_ROWS 4 // Number of rows in the keypad matrix 63 | #define KEY_COLS 3 // Number of columns in the keypad matrix 64 | 65 | // keyMap maps row/column combinations to characters: 66 | char keyMap[KEY_ROWS][KEY_COLS] = { 67 | { '0', '1', '2'}, 68 | { '3', '4', '5'}, 69 | { '6', '7', '8'}, 70 | { '*', '0', '#'}}; 71 | 72 | // SX1509 Pins: 73 | #define SX1509_RED_LED 13 // Red LED on breath-able pin 74 | #define SX1509_GRN_LED 14 // Green LED on breath-able pin 75 | #define SX1509_BLU_LED 15 // Blue LED on breath-able pin 76 | 77 | #define SX1509_RED_BTN 5 // Red button, active-low 78 | #define SX1509_GRN_BTN 6 // Green button, active-low 79 | #define SX1509_BLU_BTN 7 // Blue button, active-low 80 | 81 | #define SX1509_SDO_PIN 11 // S7S SDI pin (serial-data in) 82 | #define SX1509_SCK_PIN 12 // S7S SCK pin (serial clock) 83 | #define SX1509_SS_PIN 4 // S7S SS pin (slave-select) 84 | 85 | // Arduino Pins: 86 | #define ARDUINO_INT_PIN 2 // External interrupt pin 87 | 88 | void setup() 89 | { 90 | // Serial is used to display the keypad presses 91 | Serial.begin(9600); 92 | // Call io.begin(
) to initialize the SX1509. If it 93 | // successfully communicates, it'll return 1. 94 | if (!io.begin(SX1509_ADDRESS)) 95 | { 96 | Serial.println("Failed to communicate."); 97 | while (1) ; 98 | } 99 | 100 | // Initialize the keypad. 101 | // Sleep time off (0). 16ms scan time, 8ms debounce: 102 | io.keypad(KEY_ROWS, KEY_COLS, 0, 16, 8); 103 | 104 | // Set up the LED pins as ANALOG_OUTPUTs: 105 | io.pinMode(SX1509_RED_LED, ANALOG_OUTPUT); 106 | io.pinMode(SX1509_GRN_LED, ANALOG_OUTPUT); 107 | io.pinMode(SX1509_BLU_LED, ANALOG_OUTPUT); 108 | 109 | // Then configure each of the LED pins to breathe at 110 | // different rates. Red LED is HIGH 2000ms, LOW 2000ms, and 111 | // takes 1000ms to rise/fall 112 | io.breathe(SX1509_RED_LED, 2000, 2000, 1000, 1000); 113 | // Green LED is on/off for 8s, and takes 4s to rise/fall: 114 | // We can also set the on/off intensity. On intensity is 115 | // 127 off is 16 out of 255. 116 | io.breathe(SX1509_GRN_LED, 8000, 8000, 4000, 4000, 117 | 127, 16); 118 | // You can set the breathe pulse to either LOGARITHMIC or 119 | // LINEAR. They default to LINEAR. 120 | // Blue LED is on/off for 500 ms, rises/falls in 500ms: 121 | io.breathe(SX1509_BLU_LED, 500, 500, 500, 500, 122 | 255, 0, LOGARITHMIC); 123 | 124 | // Instead of breathing the entire duration, we can write a 125 | // breathing pin HIGH to initiate SINGLE-SHOT mode. After a 126 | // HIGH write, each pin will do its breathe pulse once, 127 | // then stop. 128 | io.digitalWrite(SX1509_GRN_LED, HIGH); 129 | io.digitalWrite(SX1509_RED_LED, HIGH); 130 | io.digitalWrite(SX1509_BLU_LED, HIGH); 131 | // Call io.sync() to synchronize all LED outputs. 132 | io.sync(); 133 | 134 | // Set up the button inputs. They'll all be active-low, so 135 | // configure them with internal pull-ups 136 | io.pinMode(SX1509_RED_BTN, INPUT_PULLUP); 137 | io.pinMode(SX1509_GRN_BTN, INPUT_PULLUP); 138 | io.pinMode(SX1509_BLU_BTN, INPUT_PULLUP); 139 | // Enable interrupts on each button pin. Generate an 140 | // interrupt on either a rise or fall using CHANGE. 141 | io.enableInterrupt(SX1509_RED_BTN, CHANGE); 142 | io.enableInterrupt(SX1509_GRN_BTN, CHANGE); 143 | io.enableInterrupt(SX1509_BLU_BTN, CHANGE); 144 | 145 | // Set up the outputs for the serial 7-segment display's 146 | // SPI interface. 147 | io.pinMode(SX1509_SDO_PIN, OUTPUT); // SDO (S7S's SDI) 148 | io.digitalWrite(SX1509_SDO_PIN, HIGH); 149 | io.pinMode(SX1509_SCK_PIN, OUTPUT); // SCK (serial clock) 150 | io.digitalWrite(SX1509_SCK_PIN, HIGH); 151 | io.pinMode(SX1509_SS_PIN, OUTPUT); // SS (Slave-select) 152 | io.digitalWrite(SX1509_SS_PIN, HIGH); 153 | 154 | // Finally, set up our Arduino pin(s). Set the interrupt as 155 | // an INPUT_PULLUP. SX1509's interrupt output is active-low. 156 | pinMode(ARDUINO_INT_PIN, INPUT_PULLUP); 157 | } 158 | 159 | void loop() 160 | { 161 | // If the interrupt triggers (goes LOW): 162 | if (!digitalRead(ARDUINO_INT_PIN)) 163 | { 164 | // Don't know if keypad or a button triggered the int 165 | doKeypad(); // Check the keypad first. 166 | 167 | // Then check the buttons. 168 | // The io.checkInterrupt() function can check if a 169 | // single pin triggered the interrupt. Note that this 170 | // function will not clear the interrupt. 171 | if (io.checkInterrupt(SX1509_RED_BTN)) // Red button 172 | { 173 | // If the button was pressed turn the LED of. 174 | // If the button was released. Single-shot 175 | // the LED's breathe mode. 176 | io.digitalWrite(SX1509_RED_LED, 177 | io.digitalRead(SX1509_RED_BTN)); 178 | } 179 | if (io.checkInterrupt(SX1509_GRN_BTN)) // Green button 180 | { 181 | io.digitalWrite(SX1509_GRN_LED, 182 | io.digitalRead(SX1509_GRN_BTN)); 183 | } 184 | if (io.checkInterrupt(SX1509_BLU_BTN)) // Blue button 185 | { 186 | io.digitalWrite(SX1509_BLU_LED, 187 | io.digitalRead(SX1509_BLU_BTN)); 188 | } 189 | } 190 | } 191 | 192 | void doKeypad() 193 | { 194 | static int lastKeyPress = 255; 195 | static unsigned long lastKeyPressTime = 0; 196 | 197 | static int digitPos = 0; 198 | 199 | // Use io.readKeypad() to check which (if any) row and 200 | // columns are active. 201 | unsigned int keyData = io.readKeypad(); 202 | // readKeypad may be 0, which means the keypad didn't 203 | // generate the interrupt. If not, though... 204 | if (keyData != 0) 205 | { 206 | // Use getRow() and getCol() to parse the row and column: 207 | byte row = io.getRow(keyData); 208 | byte col = io.getCol(keyData); 209 | // Use those values to get the key pressed: 210 | int key = keyMap[row][col]; 211 | 212 | // If it's a new key press, or enough time has passed 213 | if ((keyData != lastKeyPress) || 214 | (lastKeyPressTime < millis() - 100)) //100ms 215 | { 216 | // Print the key press to serial for debugging: 217 | Serial.print(String(row) + " | " + String(col) + " | "); 218 | Serial.println(key); 219 | lastKeyPress = keyData; 220 | lastKeyPressTime = millis(); 221 | 222 | // Use the SX1509's I/O pins to write an "SPI" byte 223 | // to the serial 7-segment display. 224 | sendSPIByte(key); 225 | } 226 | } 227 | } 228 | 229 | void sendSPIByte(byte data) 230 | { 231 | // Mock up a simple SPI output transfer using a data 232 | // output (SDO), clock (SCK), and slave-select (SS). 233 | // Begin with all pins LOW. 234 | io.digitalWrite(SX1509_SDO_PIN, LOW); 235 | io.digitalWrite(SX1509_SCK_PIN, LOW); 236 | // Setting SS LOW initiates the SPI transfer: 237 | io.digitalWrite(SX1509_SS_PIN, LOW); 238 | 239 | // Cycle through all 8-bits of the data value, from 240 | // high to low: 241 | for (int b=7; b>=0; b--) 242 | { 243 | if (data & 1< // Include the I2C library (required) 39 | #include // Include SX1509 library 40 | 41 | // SX1509 I2C address (set by ADDR1 and ADDR0 (00 by default): 42 | const byte SX1509_ADDRESS = 0x3E; // SX1509 I2C address 43 | SX1509 io; // Create an SX1509 object to be used throughout 44 | 45 | // SX1509 Pins: 46 | const byte SX1509_BUTTON_PIN = 0; // Active-low button 47 | const byte SX1509_INPUT_PIN = 8; // Floating or jumpered input 48 | 49 | void setup() 50 | { 51 | // Serial is used in this example to display the input value 52 | // of the SX1509_INPUT_PIN input: 53 | Serial.begin(9600); 54 | // Call io.begin(
) to initialize the SX1509. If it 55 | // successfully communicates, it'll return 1. 56 | if (!io.begin(SX1509_ADDRESS)) 57 | { 58 | Serial.println("Failed to communicate."); 59 | while (1) ; 60 | } 61 | 62 | // use io.pinMode(, ) to set input pins as either 63 | // INPUT or INPUT_PULLUP. Set up a floating (or jumpered to 64 | // either GND or 3.3V) pin to an INPUT: 65 | io.pinMode(SX1509_INPUT_PIN, INPUT); 66 | // Use a pull-up resistor on the button's input pin. When 67 | // the button is pressed, the pin will be read as LOW: 68 | io.pinMode(SX1509_BUTTON_PIN, INPUT_PULLUP); 69 | } 70 | 71 | void loop() 72 | { 73 | // use io.digitalRead() to check if an SX1509 input 74 | // pin is either HIGH or LOW. 75 | if (io.digitalRead(SX1509_BUTTON_PIN) == LOW) 76 | { 77 | // If the button is pressed (the pin reads LOW) 78 | // Print the status of the other pin: 79 | Serial.print("SX1509_INPUT_PIN status: "); 80 | // Read the pin to print either 0 or 1 81 | Serial.println(io.digitalRead(SX1509_INPUT_PIN)); 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /Arduino/libraries/SparkFun_SX1509_Arduino_Library/examples/digitalReadInterrupt/digitalReadInterrupt.ino: -------------------------------------------------------------------------------- 1 | /************************************************************* 2 | digitalReadInterrupt.ino 3 | SparkFun SX1509 I/O Expander Example: digital in w/ interrupt 4 | Jim Lindblom @ SparkFun Electronics 5 | Original Creation Date: September 21, 2015 6 | https://github.com/sparkfun/SparkFun_SX1509_Arduino_Library 7 | 8 | This example combines the SX1509's digitalRead and interrupt 9 | output functionalities. When a button connected to pin 0 is 10 | pressed, the SX1509 will generate an active-low interrupt, 11 | signalling to the Arduino that a button has been pressed. 12 | 13 | After uploading the sketch, open your serial monitor and 14 | set it to 9600 baud. 15 | 16 | Hardware Hookup: 17 | SX1509 Breakout ------ Arduino -------- Breadboard 18 | INT --------------- 2 19 | GND -------------- GND 20 | 3V3 -------------- 3.3V 21 | SDA ------------ SDA (A4) 22 | SCL ------------ SCL (A5) 23 | 0 ---------------------------------BTN----GND 24 | 25 | Development environment specifics: 26 | IDE: Arduino 1.6.5 27 | Hardware Platform: Arduino Uno 28 | SX1509 Breakout Version: v2.0 29 | 30 | This code is beerware; if you see me (or any other SparkFun 31 | employee) at the local, and you've found our code helpful, 32 | please buy us a round! 33 | 34 | Distributed as-is; no warranty is given. 35 | *************************************************************/ 36 | 37 | #include // Include the I2C library (required) 38 | #include // Include SX1509 library 39 | 40 | // SX1509 I2C address (set by ADDR1 and ADDR0 (00 by default): 41 | const byte SX1509_ADDRESS = 0x3E; // SX1509 I2C address 42 | SX1509 io; // Create an SX1509 object to be used throughout 43 | 44 | // SX1509 Pins: 45 | const byte SX1509_BUTTON_PIN = 0; // IO 0 connected to button 46 | 47 | // Arduino Pins (not SX1509!) 48 | const byte ARDUINO_INT_PIN = 2; // SX1509 int output to D2 49 | 50 | // Global variables: 51 | bool buttonPressed = false; // Track button press in ISR 52 | 53 | void setup() 54 | { 55 | // Serial is used in this example to display the input 56 | // value of the SX1509_INPUT_PIN input: 57 | Serial.begin(9600); 58 | // Call io.begin(
) to initialize the SX1509. If 59 | // it successfully communicates, it'll return 1. 60 | if (!io.begin(SX1509_ADDRESS)) 61 | { 62 | Serial.println("Failed to communicate."); 63 | while (1) ; 64 | } 65 | 66 | // Use io.pinMode(, ) to set our button to an 67 | // input with internal pullup resistor activated: 68 | io.pinMode(SX1509_BUTTON_PIN, INPUT_PULLUP); 69 | 70 | // Use io.enableInterrupt(, ) to enable an 71 | // interrupt on a pin. The variable can be either 72 | // FALLING, RISING, or CHANGE. Set it to falling, which will 73 | // mean the button was pressed: 74 | io.enableInterrupt(SX1509_BUTTON_PIN, FALLING); 75 | 76 | // The SX1509 has built-in debounce features, so a single 77 | // button-press doesn't accidentally create multiple ints. 78 | // Use io.debounceTime() to set the GLOBAL SX1509 79 | // debounce time. 80 | // can be either 0, 1, 2, 4, 8, 16, 32, or 64 ms. 81 | io.debounceTime(32); // Set debounce time to 32 ms. 82 | 83 | // After configuring the debounce time, use 84 | // debouncePin() to enable debounce on an input pin. 85 | io.debouncePin(SX1509_BUTTON_PIN); // Enable debounce 86 | 87 | // Don't forget to configure your Arduino pins! Set the 88 | // Arduino's interrupt input to INPUT_PULLUP. The SX1509's 89 | // interrupt output is active-low. 90 | pinMode(ARDUINO_INT_PIN, INPUT_PULLUP); 91 | 92 | // Attach an Arduino interrupt to the interrupt pin. Call 93 | // the button function, whenever the pin goes from HIGH to 94 | // LOW. 95 | attachInterrupt(digitalPinToInterrupt(ARDUINO_INT_PIN), 96 | button, FALLING); 97 | } 98 | 99 | void loop() 100 | { 101 | if (buttonPressed) // If the button() ISR was executed 102 | { 103 | // read io.interruptSource() find out which pin generated 104 | // an interrupt and clear the SX1509's interrupt output. 105 | unsigned int intStatus = io.interruptSource(); 106 | // For debugging handiness, print the intStatus variable. 107 | // Each bit in intStatus represents a single SX1509 IO. 108 | Serial.println("intStatus = " + String(intStatus, BIN)); 109 | 110 | // If the bit corresponding to our button IO generated 111 | // the input: 112 | if (intStatus & (1< // Include the I2C library (required) 35 | #include // Include SX1509 library 36 | 37 | // SX1509 I2C address (set by ADDR1 and ADDR0 (00 by default): 38 | const byte SX1509_ADDRESS = 0x3E; // SX1509 I2C address 39 | SX1509 io; // Create an SX1509 object to be used throughout 40 | 41 | // SX1509 pin definitions: 42 | const byte SX1509_LED_PIN = 15; // LED connected to pin 15 43 | 44 | void setup() 45 | { 46 | // Call io.begin(
) to initialize the SX1509. If it 47 | // successfully communicates, it'll return 1. 48 | if (!io.begin(SX1509_ADDRESS)) 49 | { 50 | while (1) ; // If we fail to communicate, loop forever. 51 | } 52 | 53 | // Call io.pinMode(, ) to set an SX1509 pin as 54 | // an output: 55 | io.pinMode(SX1509_LED_PIN, OUTPUT); 56 | } 57 | 58 | void loop() 59 | { 60 | // It's blinken time! 61 | // Call io.digitalWrite(, ) to set a SX1509 62 | // output pin as either 3.3V or 0V. 63 | io.digitalWrite(SX1509_LED_PIN, HIGH); 64 | delay(500); // Delay half-a-second 65 | io.digitalWrite(SX1509_LED_PIN, LOW); // Set the I/O low 66 | delay(500); // Delay half-a-second 67 | } 68 | -------------------------------------------------------------------------------- /Arduino/libraries/SparkFun_SX1509_Arduino_Library/examples/keypad/keypad.ino: -------------------------------------------------------------------------------- 1 | /************************************************************* 2 | keypad.ino 3 | SparkFun SX1509 I/O Expander Example: keypad matrix 4 | Jim Lindblom @ SparkFun Electronics 5 | Original Creation Date: September 21, 2015 6 | https://github.com/sparkfun/SparkFun_SX1509_Arduino_Library 7 | 8 | This example demonstrates how to use the SX1509's keypad engine to monitor a 9 | matrix of button inputs. 10 | 11 | For this example, we'll wire the SX1509 up to a 12-pad keypad 12 | (https://www.sparkfun.com/products/8653). 13 | 14 | After uploading the sketch, open your serial monitor and set it to 9600 baud. 15 | 16 | Hardware Hookup: 17 | SX1509 Breakout ------ Arduino -------- Keypad Pin 18 | GND -------------- GND 19 | 3V3 -------------- 3.3V 20 | SDA ------------ SDA (A4) 21 | SCL ------------ SCL (A5) 22 | 0 ---------------------------------- 2 (row 1) 23 | 1 ---------------------------------- 7 (row 2) 24 | 2 ---------------------------------- 6 (row 3) 25 | 3 ---------------------------------- 4 (row 4) 26 | 8 ---------------------------------- 3 (col 1) 27 | 9 ---------------------------------- 1 (col 2) 28 | 10 --------------------------------- 5 (col 3) 29 | 30 | Development environment specifics: 31 | IDE: Arduino 1.6.5 32 | Hardware Platform: Arduino Uno 33 | SX1509 Breakout Version: v2.0 34 | 35 | This code is beerware; if you see me (or any other SparkFun 36 | employee) at the local, and you've found our code helpful, 37 | please buy us a round! 38 | 39 | Distributed as-is; no warranty is given. 40 | *************************************************************/ 41 | 42 | #include // Include the I2C library (required) 43 | #include // Include SX1509 library 44 | 45 | // SX1509 I2C address (set by ADDR1 and ADDR0 (00 by default): 46 | const byte SX1509_ADDRESS = 0x3E; // SX1509 I2C address 47 | SX1509 io; // Create an SX1509 object to be used throughout 48 | 49 | #define KEY_ROWS 4 // Number of rows in the keypad matrix 50 | #define KEY_COLS 3 // Number of columns in the keypad matrix 51 | 52 | // keyMap maps row/column combinations to characters: 53 | char keyMap[KEY_ROWS][KEY_COLS] = { 54 | { '1', '2', '3'}, 55 | { '4', '5', '6'}, 56 | { '7', '8', '9'}, 57 | { '*', '0', '#'}}; 58 | 59 | void setup() 60 | { 61 | // Serial is used to display the keypad button pressed: 62 | Serial.begin(9600); 63 | // Call io.begin(
) to initialize the SX1509. If it 64 | // successfully communicates, it'll return 1. 65 | if (!io.begin(SX1509_ADDRESS)) 66 | { 67 | Serial.println("Failed to communicate."); 68 | while (1) ; // If we fail to communicate, loop forever. 69 | } 70 | 71 | // To initialize the keypad, call io.keypad(, ) 72 | // You can also define the duration of inactivity before the 73 | // keypad engine sleeps, time spent scanning each row, and 74 | // the debounce time per button. 75 | 76 | // After a set number of milliseconds, the keypad engine 77 | // will go into a low-current sleep mode. 78 | // Sleep time range: 128 ms - 8192 ms (powers of 2) 0=OFF 79 | unsigned int sleepTime = 256; 80 | // Scan time defines the number of milliseconds devoted to 81 | // each row in the matrix. 82 | // Scan time range: 1-128 ms, powers of 2 83 | byte scanTime = 2; // Scan time per row, in ms 84 | // Debounce sets the minimum amount of time that must pass 85 | // before a button can be pressed again. 86 | // Debounce time range: 0.5 - 64 ms (powers of 2) 87 | byte debounceTime = 1; // Debounce time 88 | // Note: Scan time must be greater than debounce time! 89 | // Take all of those values to set up the keypad engine: 90 | io.keypad(KEY_ROWS, KEY_COLS, sleepTime, scanTime, debounceTime); 91 | 92 | // Note: we don't get to pick which pins the SX1509 connects 93 | // to each row/column. They go up sequetially on pins 0-7 94 | // (rows), and 8-15 (cols). 95 | } 96 | 97 | void loop() 98 | { 99 | // Use io.readKeypad() to check if any keys have been pressed: 100 | unsigned int keyData = io.readKeypad(); 101 | // If keyData is 0, then nothing has been pressed. Otherwise 102 | // at least two bits in the 16-bit value will be set, each 103 | // corresponding to either a row or a column. 104 | if (keyData != 0) // If a key was pressed: 105 | { 106 | // Use io.getRow() and io.getCol() 107 | // to find the active row and columns: 108 | byte row = io.getRow(keyData); 109 | byte col = io.getCol(keyData); 110 | 111 | // Once you've found out the active row/col, put them in 112 | // keyMap to get the character pressed. 113 | char key = keyMap[row][col]; 114 | Serial.println("Row: " + String(row)); 115 | Serial.println("Col: " + String(col)); 116 | Serial.print("Key: "); 117 | Serial.println(key); 118 | } 119 | } 120 | -------------------------------------------------------------------------------- /Arduino/libraries/SparkFun_SX1509_Arduino_Library/examples/keypadInterrupt/keypadInterrupt.ino: -------------------------------------------------------------------------------- 1 | /************************************************************* 2 | keypadInterrupt.ino 3 | SparkFun SX1509 I/O Expander Example: keypad matrix with int 4 | Jim Lindblom @ SparkFun Electronics 5 | Original Creation Date: September 21, 2015 6 | https://github.com/sparkfun/SparkFun_SX1509_Arduino_Library 7 | 8 | This example demonstrates how to use the SX1509's keypad 9 | engine to monitor a matrix of button inputs. The SX1509's 10 | interrupt output is monitored to check for button presses. 11 | 12 | For this example, we use the 12-button keypad 13 | (https://www.sparkfun.com/products/8653). 14 | 15 | After uploading the sketch, open your serial monitor and 16 | set it to 9600 baud. 17 | 18 | Hardware Hookup: 19 | SX1509 Breakout ------ Arduino -------- Keypad Pin 20 | INT --------------- D2 21 | GND -------------- GND 22 | 3V3 -------------- 3.3V 23 | SDA ------------ SDA (A4) 24 | SCL ------------ SCL (A5) 25 | 0 ---------------------------------- 2 (row 1) 26 | 1 ---------------------------------- 7 (row 2) 27 | 2 ---------------------------------- 6 (row 3) 28 | 3 ---------------------------------- 4 (row 4) 29 | 8 ---------------------------------- 3 (col 1) 30 | 9 ---------------------------------- 1 (col 2) 31 | 10 --------------------------------- 5 (col 3) 32 | 33 | Development environment specifics: 34 | IDE: Arduino 1.6.5 35 | Hardware Platform: Arduino Uno 36 | SX1509 Breakout Version: v2.0 37 | 38 | This code is beerware; if you see me (or any other SparkFun 39 | employee) at the local, and you've found our code helpful, 40 | please buy us a round! 41 | 42 | Distributed as-is; no warranty is given. 43 | *************************************************************/ 44 | 45 | #include // Include the I2C library (required) 46 | #include // Include SX1509 library 47 | 48 | // SX1509 I2C address (set by ADDR1 and ADDR0 (00 by default): 49 | const byte SX1509_ADDRESS = 0x3E; // SX1509 I2C address 50 | SX1509 io; // Create an SX1509 object to be used throughout 51 | 52 | #define KEY_ROWS 4 // Number of rows in the keypad matrix 53 | #define KEY_COLS 3 // Number of columns in the keypad matrix 54 | 55 | // keyMap maps row/column combinations to characters: 56 | char keyMap[KEY_ROWS][KEY_COLS] = { 57 | { '1', '2', '3'}, 58 | { '4', '5', '6'}, 59 | { '7', '8', '9'}, 60 | { '*', '0', '#'}}; 61 | 62 | const byte ARDUINO_INTERRUPT_PIN = 2; 63 | 64 | void setup() 65 | { 66 | // Serial is used to display the keypad button pressed: 67 | Serial.begin(9600); 68 | // Call io.begin(
) to initialize the SX1509. If it 69 | // successfully communicates, it'll return 1. 70 | if (!io.begin(SX1509_ADDRESS)) 71 | { 72 | Serial.println("Failed to communicate."); 73 | while (1) ; // If we fail to communicate, loop forever. 74 | } 75 | 76 | // Scan time range: 1-128 ms, powers of 2 77 | byte scanTime = 8; // Scan time per row, in ms 78 | // Debounce time range: 0.5 - 64 ms (powers of 2) 79 | byte debounceTime = 1; // Debounce time 80 | // Sleep time range: 128 ms - 8192 ms (powers of 2) 0=OFF 81 | byte sleepTime = 0; 82 | // Scan time must be greater than debounce time! 83 | io.keypad(KEY_ROWS, KEY_COLS, 84 | sleepTime, scanTime, debounceTime); 85 | 86 | // Set up the Arduino interrupt pin as an input w/ 87 | // internal pull-up. (The SX1509 interrupt is active-low.) 88 | pinMode(ARDUINO_INTERRUPT_PIN, INPUT_PULLUP); 89 | } 90 | 91 | // Compared to the keypad in keypad.ino, this keypad example 92 | // is a bit more advanced. We'll use these varaibles to check 93 | // if a key is being held down, or has been released. Then we 94 | // can kind of emulate the operation of a computer keyboard. 95 | unsigned int previousKeyData = 0; // Stores last key pressed 96 | unsigned int holdCount, releaseCount = 0; // Count durations 97 | const unsigned int holdCountMax = 15; // Key hold limit 98 | const unsigned int releaseCountMax = 100; // Release limit 99 | 100 | void loop() 101 | { 102 | // If the SX1509 INT pin goes low, a keypad button has 103 | // been pressed: 104 | if (digitalRead(ARDUINO_INTERRUPT_PIN) == LOW) 105 | { 106 | // Use io.readKeypad() to get the raw keypad row/column 107 | unsigned int keyData = io.readKeypad(); 108 | // Then use io.getRow() and io.getCol() to parse that 109 | // data into row and column values. 110 | byte row = io.getRow(keyData); 111 | byte col = io.getCol(keyData); 112 | // Then plug row and column into keyMap to get which 113 | // key was pressed. 114 | char key = keyMap[row][col]; 115 | 116 | // If it's a new key pressed 117 | if (keyData != previousKeyData) 118 | { 119 | holdCount = 0; // Reset hold-down count 120 | Serial.println(String(key)); // Print the key 121 | } 122 | else // If the button's beging held down: 123 | { 124 | holdCount++; // Increment holdCount 125 | if (holdCount > holdCountMax) // If it exceeds threshold 126 | Serial.println(key); // Print the key 127 | } 128 | releaseCount = 0; // Clear the releaseCount variable 129 | previousKeyData = keyData; // Update previousKeyData 130 | } 131 | 132 | // If no keys have been pressed we'll continuously increment 133 | // releaseCount. Eventually creating a release, once the 134 | // count hits the max. 135 | releaseCount++; 136 | if (releaseCount >= releaseCountMax) 137 | { 138 | releaseCount = 0; 139 | previousKeyData = 0; 140 | } 141 | delay(1); // Gives releaseCountMax a more intuitive unit 142 | } 143 | 144 | -------------------------------------------------------------------------------- /Arduino/libraries/SparkFun_SX1509_Arduino_Library/extras/sx150x_789.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Arduino/libraries/SparkFun_SX1509_Arduino_Library/extras/sx150x_789.pdf -------------------------------------------------------------------------------- /Arduino/libraries/SparkFun_SX1509_Arduino_Library/keywords.txt: -------------------------------------------------------------------------------- 1 | ####################################### 2 | # Syntax Coloring Map For SX1509 3 | ####################################### 4 | 5 | ####################################### 6 | # Datatypes (KEYWORD1) 7 | ####################################### 8 | 9 | SX1509 KEYWORD1 10 | sx1509Class KEYWORD1 11 | 12 | ####################################### 13 | # Methods and Functions (KEYWORD2) 14 | ####################################### 15 | 16 | init KEYWORD2 17 | begin KEYWORD2 18 | reset KEYWORD2 19 | pinDir KEYWORD2 20 | writePin KEYWORD2 21 | readPin KEYWORD2 22 | ledDriverInit KEYWORD2 23 | pwm KEYWORD2 24 | sync KEYWORD2 25 | blink KEYWORD2 26 | breathe KEYWORD2 27 | setupBlink KEYWORD2 28 | enableInterrupt KEYWORD2 29 | interruptSource KEYWORD2 30 | configClock KEYWORD2 31 | configureClock KEYWORD2 32 | debounceEnable KEYWORD2 33 | debounceConfig KEYWORD2 34 | debounceTime KEYWORD2 35 | debouncePin KEYWORD2 36 | debounceKeypad KEYWORD2 37 | keypad KEYWORD2 38 | readKeypad KEYWORD2 39 | getRow KEYWORD2 40 | getCol KEYWORD2 41 | checkInterrupt KEYWORD2 42 | 43 | ####################################### 44 | # Constants (LITERAL1) 45 | ####################################### 46 | 47 | SparkFunSX1509 LITERAL1 48 | LINEAR LITERAL1 49 | LOGARITHMIC LITERAL1 50 | INTERNAL_CLOCK_2MHZ LITERAL1 51 | SOFTWARE_RESET LITERAL1 52 | HARDWARE_RESET LITERAL1 53 | 54 | ####################################### 55 | # Blue Constants (LITERAL2, constants, RESERVED_WORD_2) 56 | ####################################### 57 | ANALOG_OUTPUT LITERAL2 constants RESERVED_WORD_2 -------------------------------------------------------------------------------- /Arduino/libraries/SparkFun_SX1509_Arduino_Library/library.properties: -------------------------------------------------------------------------------- 1 | name=SX1509 IO Expander 2 | version=2.0.1 3 | author=SparkFun Electronics 4 | maintainer=SparkFun Electronics 5 | sentence=Arduino library and hardware files for the SX1509 IO Expander Breakout board. 6 | paragraph=Arduino library and hardware files for the SX1509 IO Expander Breakout board. 7 | category=Signal Input/Output 8 | url=https://github.com/sparkfun/SX1509_IO-Expander 9 | architectures=* 10 | -------------------------------------------------------------------------------- /Fritzing/Spirit_Proton_Pack.fzz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Fritzing/Spirit_Proton_Pack.fzz -------------------------------------------------------------------------------- /Fritzing/proton_pack_no_bargraph.fzz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Fritzing/proton_pack_no_bargraph.fzz -------------------------------------------------------------------------------- /Fritzing/proton_pack_with_bargraph.fzz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Fritzing/proton_pack_with_bargraph.fzz -------------------------------------------------------------------------------- /Model/83_Percent_Pack/back_brace_pvc_plug.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/back_brace_pvc_plug.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/back_brace_standoff.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/back_brace_standoff.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/back_brace_top.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/back_brace_top.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/base_1.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/base_1.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/base_2.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/base_2.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/base_3.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/base_3.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/booster_1.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/booster_1.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/booster_2.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/booster_2.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/booster_3.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/booster_3.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/booster_4.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/booster_4.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/booster_straight_barb.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/booster_straight_barb.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/bumper_1.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/bumper_1.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/bumper_2.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/bumper_2.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/bumper_3.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/bumper_3.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/bumper_4.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/bumper_4.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/clippard_base.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/clippard_base.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/connectors.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/connectors.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/crankgen_1.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/crankgen_1.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/crankgen_2.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/crankgen_2.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/crankgen_3.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/crankgen_3.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/cyclotron_1_closed.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/cyclotron_1_closed.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/cyclotron_1_open.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/cyclotron_1_open.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/cyclotron_2.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/cyclotron_2.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/cyclotron_3.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/cyclotron_3.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/cyclotron_light_covers.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/cyclotron_light_covers.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/cyclotron_light_holder_neopixel.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/cyclotron_light_holder_neopixel.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/dale.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/dale.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/gunbracket_1.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/gunbracket_1.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/gunbracket_2.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/gunbracket_2.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/gunmount_1.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/gunmount_1.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/gunmount_2.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/gunmount_2.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/gunmount_3.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/gunmount_3.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/hga.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/hga.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/individual_neopixel_holder.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/individual_neopixel_holder.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/ion_1.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/ion_1.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/ion_2.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/ion_2.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/ion_arm_90_barb.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/ion_arm_90_barb.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/ion_arm_90_female.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/ion_arm_90_female.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/ion_rod_short.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/ion_rod_short.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/knob.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/knob.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/ladder.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/ladder.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/mb_mount.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/mb_mount.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/motherboard_standoff_long.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/motherboard_standoff_long.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/nfilter_venting_neopixel_holder.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/nfilter_venting_neopixel_holder.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/plating_1.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/plating_1.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/plating_2.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/plating_2.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/plating_3.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/plating_3.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/plating_4.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/plating_4.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/powercell_1.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/powercell_1.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/powercell_2.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/powercell_2.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/powercell_3.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/powercell_3.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/powercell_neopixel_mount.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/powercell_neopixel_mount.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/ribbon_cable_mount.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/ribbon_cable_mount.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/syncgen_1.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/syncgen_1.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/syncgen_2.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/syncgen_2.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/syncgen_3.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/syncgen_3.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/syncgen_4.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/syncgen_4.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/syncgen_5.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/syncgen_5.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/syncgen_6.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/syncgen_6.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/syncgen_7.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/syncgen_7.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/syncgen_loom_mount.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/syncgen_loom_mount.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/tab.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/tab.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack/top_90_barb.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack/top_90_barb.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/back_brace_standoff.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/back_brace_standoff.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/base_1.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/base_1.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/base_2.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/base_2.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/base_3.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/base_3.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/booster_1.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/booster_1.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/booster_2.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/booster_2.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/booster_3.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/booster_3.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/booster_4.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/booster_4.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/booster_straight_barb.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/booster_straight_barb.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/bumper_1.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/bumper_1.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/bumper_2.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/bumper_2.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/bumper_3.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/bumper_3.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/bumper_4.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/bumper_4.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/clippard_base.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/clippard_base.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/connectors.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/connectors.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/crankgen_1.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/crankgen_1.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/crankgen_2.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/crankgen_2.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/crankgen_3.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/crankgen_3.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/cyclotron_1_closed.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/cyclotron_1_closed.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/cyclotron_1_open.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/cyclotron_1_open.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/cyclotron_2.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/cyclotron_2.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/cyclotron_3.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/cyclotron_3.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/cyclotron_light_covers.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/cyclotron_light_covers.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/cyclotron_light_holder_neopixel.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/cyclotron_light_holder_neopixel.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/dale.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/dale.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/gunbracket_1.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/gunbracket_1.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/gunbracket_2.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/gunbracket_2.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/gunmount_1.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/gunmount_1.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/gunmount_3.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/gunmount_3.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/hga.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/hga.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/individual_neopixel_holder.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/individual_neopixel_holder.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/ion_1.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/ion_1.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/ion_2.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/ion_2.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/ion_3.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/ion_3.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/ion_arm_90_barb.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/ion_arm_90_barb.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/ion_arm_90_female.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/ion_arm_90_female.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/ion_rod_long.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/ion_rod_long.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/ion_rod_short.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/ion_rod_short.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/knob.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/knob.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/ladder.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/ladder.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/mb_mount.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/mb_mount.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/motherboard_standoff_long.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/motherboard_standoff_long.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/nfilter_venting_neopixel_holder.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/nfilter_venting_neopixel_holder.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/plating_1.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/plating_1.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/plating_2.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/plating_2.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/plating_3.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/plating_3.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/plating_4.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/plating_4.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/powercell_1.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/powercell_1.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/powercell_2.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/powercell_2.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/powercell_3.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/powercell_3.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/powercell_4.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/powercell_4.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/powercell_neopixel_mount.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/powercell_neopixel_mount.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/ribbon_cable_mount.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/ribbon_cable_mount.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/syncgen_1.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/syncgen_1.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/syncgen_2.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/syncgen_2.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/syncgen_3.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/syncgen_3.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/syncgen_4.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/syncgen_4.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/syncgen_5.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/syncgen_5.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/syncgen_6.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/syncgen_6.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/syncgen_7.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/syncgen_7.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/syncgen_loom_mount.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/syncgen_loom_mount.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/tab.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/tab.stl -------------------------------------------------------------------------------- /Model/83_Percent_Pack_Lefty/top_90_barb.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Pack_Lefty/top_90_barb.stl -------------------------------------------------------------------------------- /Model/83_Percent_Proton_Wand/clippard.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Proton_Wand/clippard.stl -------------------------------------------------------------------------------- /Model/83_Percent_Proton_Wand/front_green_tube_barbs.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Proton_Wand/front_green_tube_barbs.stl -------------------------------------------------------------------------------- /Model/83_Percent_Proton_Wand/front_handle_clear_tube_adapter.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Proton_Wand/front_handle_clear_tube_adapter.stl -------------------------------------------------------------------------------- /Model/83_Percent_Proton_Wand/front_handle_end_piece.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Proton_Wand/front_handle_end_piece.stl -------------------------------------------------------------------------------- /Model/83_Percent_Proton_Wand/front_handle_finger_guard.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Proton_Wand/front_handle_finger_guard.stl -------------------------------------------------------------------------------- /Model/83_Percent_Proton_Wand/front_handle_hose_mount.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Proton_Wand/front_handle_hose_mount.stl -------------------------------------------------------------------------------- /Model/83_Percent_Proton_Wand/front_handle_mount.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Proton_Wand/front_handle_mount.stl -------------------------------------------------------------------------------- /Model/83_Percent_Proton_Wand/front_handle_wing.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Proton_Wand/front_handle_wing.stl -------------------------------------------------------------------------------- /Model/83_Percent_Proton_Wand/front_nose_spacer.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Proton_Wand/front_nose_spacer.stl -------------------------------------------------------------------------------- /Model/83_Percent_Proton_Wand/gunbox_back_handle_valve.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Proton_Wand/gunbox_back_handle_valve.stl -------------------------------------------------------------------------------- /Model/83_Percent_Proton_Wand/gunbox_back_panel_knob.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Proton_Wand/gunbox_back_panel_knob.stl -------------------------------------------------------------------------------- /Model/83_Percent_Proton_Wand/gunbox_base.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Proton_Wand/gunbox_base.stl -------------------------------------------------------------------------------- /Model/83_Percent_Proton_Wand/gunbox_baseplate_combined.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Proton_Wand/gunbox_baseplate_combined.stl -------------------------------------------------------------------------------- /Model/83_Percent_Proton_Wand/gunbox_front.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Proton_Wand/gunbox_front.stl -------------------------------------------------------------------------------- /Model/83_Percent_Proton_Wand/gunbox_front_cover.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Proton_Wand/gunbox_front_cover.stl -------------------------------------------------------------------------------- /Model/83_Percent_Proton_Wand/gunbox_front_panel_side_connector.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Proton_Wand/gunbox_front_panel_side_connector.stl -------------------------------------------------------------------------------- /Model/83_Percent_Proton_Wand/gunbox_front_trigger_box.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Proton_Wand/gunbox_front_trigger_box.stl -------------------------------------------------------------------------------- /Model/83_Percent_Proton_Wand/gunbox_front_valve.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Proton_Wand/gunbox_front_valve.stl -------------------------------------------------------------------------------- /Model/83_Percent_Proton_Wand/gunbox_grip.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Proton_Wand/gunbox_grip.stl -------------------------------------------------------------------------------- /Model/83_Percent_Proton_Wand/gunbox_heatsink.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Proton_Wand/gunbox_heatsink.stl -------------------------------------------------------------------------------- /Model/83_Percent_Proton_Wand/gunbox_main_side_large_knob.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Proton_Wand/gunbox_main_side_large_knob.stl -------------------------------------------------------------------------------- /Model/83_Percent_Proton_Wand/gunbox_main_side_small_knob.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Proton_Wand/gunbox_main_side_small_knob.stl -------------------------------------------------------------------------------- /Model/83_Percent_Proton_Wand/gunbox_side_knob.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Proton_Wand/gunbox_side_knob.stl -------------------------------------------------------------------------------- /Model/83_Percent_Proton_Wand/gunbox_top_knob.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Proton_Wand/gunbox_top_knob.stl -------------------------------------------------------------------------------- /Model/83_Percent_Proton_Wand/gunbox_vent_light_mount.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Proton_Wand/gunbox_vent_light_mount.stl -------------------------------------------------------------------------------- /Model/83_Percent_Proton_Wand/individual_neopixel_holder.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/83_Percent_Proton_Wand/individual_neopixel_holder.stl -------------------------------------------------------------------------------- /Model/SpiritHalloweenProtonPackMods/cyclotron_individual_neopixel.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/SpiritHalloweenProtonPackMods/cyclotron_individual_neopixel.stl -------------------------------------------------------------------------------- /Model/SpiritHalloweenProtonPackMods/front_handle_clear_tube_adapter.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/SpiritHalloweenProtonPackMods/front_handle_clear_tube_adapter.stl -------------------------------------------------------------------------------- /Model/SpiritHalloweenProtonPackMods/gunbracket_base.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/SpiritHalloweenProtonPackMods/gunbracket_base.stl -------------------------------------------------------------------------------- /Model/SpiritHalloweenProtonPackMods/gunbracket_female.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/SpiritHalloweenProtonPackMods/gunbracket_female.stl -------------------------------------------------------------------------------- /Model/SpiritHalloweenProtonPackMods/gunbracket_male.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/SpiritHalloweenProtonPackMods/gunbracket_male.stl -------------------------------------------------------------------------------- /Model/SpiritHalloweenProtonPackMods/guntrack_spirit.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/SpiritHalloweenProtonPackMods/guntrack_spirit.stl -------------------------------------------------------------------------------- /Model/SpiritHalloweenProtonPackMods/powercell_neopixel_mount.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Model/SpiritHalloweenProtonPackMods/powercell_neopixel_mount.stl -------------------------------------------------------------------------------- /Proton Pack Circuit Diagram - No Bargraph.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Proton Pack Circuit Diagram - No Bargraph.png -------------------------------------------------------------------------------- /Proton Pack Circuit Diagram - With Bargraph.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Proton Pack Circuit Diagram - With Bargraph.png -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Arduino Based Ghostbusters Proton Pack 2 | Arduino Code for a Ghostbusters Neutrino Wand and Proton Pack 3 | 4 | I'm in the process of building a proton pack for my son and this is the progress I have made so far. I have included the models for 3d printing, all sounds but the ghostbusters theme song, and the arduino code to control all of this. The models for 3d printing are scaled to 83%. The proton pack models are also mirrored for a left handed users pack. Once I have some time I'll post non-mirrored files. 5 | 6 | The models are based off the following things on thingiverse: 7 | * Main base model for the pack: https://www.thingiverse.com/thing:2479141 8 | * Base model for the proton wand: https://www.thingiverse.com/thing:1128019 9 | * Full scale proton wand the 83% one is based on: https://www.thingiverse.com/thing:2334883 10 | * And a clippard valve with text: https://www.thingiverse.com/thing:2286284 11 | 12 | This pack utilizes many off the shelf products for the electronics to make the build as easy as possible. Total cost is around $80 for the parts if sourced from amazon. You can find cheaper on ebay 13 | 14 | * 1 arduino nano. You get 3 for $11.86: https://www.amazon.com/gp/product/B0713XK923 15 | * 2 power converters to adjust the 11.1v lipo to 5v. You get 6 for $9.69: https://www.amazon.com/gp/product/B01MQGMOKI 16 | * 1 Adafruit Audio FX Sound Board. It's the most expensive part at $23.80 but is awesome to work with: https://www.amazon.com/gp/product/B00Q3U42DM 17 | * Audio amp $6.01 each: https://www.amazon.com/gp/product/B00PY2YSI4 18 | * small speaker for my 83% scale build. You get 2 for $8.05. https://www.amazon.com/gp/product/B00NQ0LHNA 19 | * 4 neopixel jewels for the cyclotron @ 5.49 each: https://www.amazon.com/gp/product/B0105VMT4S 20 | * 1 neopixel jewels for the end of the wand @ 5.49 each: https://www.amazon.com/gp/product/B0105VMT4S 21 | * two 8 neopixel light stick for the powercell @9.99 each: https://www.amazon.com/Adafruit-NeoPixel-Arduino-Integrated-Drivers/dp/B00IEDH26K 22 | * Individual neopixels for venting, wand lights, and for the cyclotron if doing the spirit version. 100 for $16: https://www.amazon.com/Kuman-WS2812B-Addressable-Arduino-littlergb/dp/B01M5BEO1C 23 | * 4 toggle switches:https://www.amazon.com/gp/product/B00HGAKDIQ 24 | * 1 button: https://www.amazon.com/gp/product/B01IU898QA 25 | * 11.1v lipo to power the whole thing: https://www.amazon.com/Gens-ace-Battery-2200mAh-Airplane/dp/B00WJN4LG0 26 | 27 | I bought the light covers from digikey 28 | 29 | https://www.digikey.com/product-detail/en/visual-communications-company-vcc/CLF_280_ATP/CLF_280_ATP-ND/4515437 - light near the clippard 30 | https://www.digikey.com/product-detail/en/visual-communications-company-vcc/SMB_200_RTP/SMB_200_RTP-ND/4515614 - sloblo 31 | https://www.digikey.com/product-detail/en/visual-communications-company-vcc/SML_190_CTP/SML_190_CTP-ND/4515623 - Vent light front 32 | https://www.digikey.com/product-detail/en/visual-communications-company-vcc/CMC_321_YTP/CMC_321_YTP-ND/4515456 - Vent light rear (no led tied to this one) 33 | 34 | For the optional bargraph we are using the SparkFun SX1509 expander board and some resitor networks/bargraphs from digikey. If you want to use the bargraph you need to move the code from the test file into the main file and overwrite the stub functions. Since I won't be using it in my son's pack I removed it from the main file 35 | https://learn.sparkfun.com/tutorials/sx1509-io-expander-breakout-hookup-guide 36 | 37 | * https://www.digikey.com/product-detail/en/sparkfun-electronics/BOB-13601/1568-1186-ND/5673772 38 | * https://www.digikey.com/product-detail/en/bourns-inc/4611X-101-331LF/4611X-101-331LF-ND/3787988 39 | * https://www.digikey.com/product-detail/en/bourns-inc/4606X-101-331LF/4606X-1-331LF-ND/1088983 40 | * https://www.digikey.com/product-detail/en/sunled/XGUYX10D/1497-1086-5-ND/4745985 41 | * https://www.digikey.com/product-detail/en/sunled/XGUYX5D/1497-1087-5-ND/4745584 42 | 43 | Here's a video of the whole shebang put together 44 | 45 | [![IMAGE ALT TEXT](http://img.youtube.com/vi/shoYI2D1AxI/0.jpg)](https://www.youtube.com/watch?v=shoYI2D1AxI "Ghostbusters Arduino Proton Pack Update") 46 | -------------------------------------------------------------------------------- /Sounds/T00.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Sounds/T00.wav -------------------------------------------------------------------------------- /Sounds/T01.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Sounds/T01.wav -------------------------------------------------------------------------------- /Sounds/T02.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Sounds/T02.wav -------------------------------------------------------------------------------- /Sounds/T03.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Sounds/T03.wav -------------------------------------------------------------------------------- /Sounds/T03_short.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Sounds/T03_short.wav -------------------------------------------------------------------------------- /Sounds/T04.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Sounds/T04.wav -------------------------------------------------------------------------------- /Sounds/T05.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Sounds/T05.wav -------------------------------------------------------------------------------- /Sounds/T06.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Sounds/T06.wav -------------------------------------------------------------------------------- /Sounds/T07.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Sounds/T07.wav -------------------------------------------------------------------------------- /Sounds/T08.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Sounds/T08.wav -------------------------------------------------------------------------------- /Sounds/T09.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Sounds/T09.wav -------------------------------------------------------------------------------- /Sounds/T10.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Sounds/T10.wav -------------------------------------------------------------------------------- /Sounds/T11.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Sounds/T11.wav -------------------------------------------------------------------------------- /Sounds/T12.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Sounds/T12.wav -------------------------------------------------------------------------------- /Sounds/T13.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Sounds/T13.wav -------------------------------------------------------------------------------- /Sounds/T14.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Sounds/T14.wav -------------------------------------------------------------------------------- /Sounds/T15.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Sounds/T15.wav -------------------------------------------------------------------------------- /Spirit Halloween Proton Pack - Alternate Pack Light Circuit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Spirit Halloween Proton Pack - Alternate Pack Light Circuit.png -------------------------------------------------------------------------------- /Spirit Halloween Proton Pack - Pack Light Circuit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/Spirit Halloween Proton Pack - Pack Light Circuit.png -------------------------------------------------------------------------------- /bargraph_front.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/bargraph_front.jpg -------------------------------------------------------------------------------- /bargraph_rear.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/bargraph_rear.jpg -------------------------------------------------------------------------------- /eagle_proton_pack_neopixel_driver.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/eagle_proton_pack_neopixel_driver.png -------------------------------------------------------------------------------- /eagle_proton_pack_neopixel_driver_wiring_example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/eagle_proton_pack_neopixel_driver_wiring_example.png -------------------------------------------------------------------------------- /eagle_wand_io.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/eagle_wand_io.png -------------------------------------------------------------------------------- /eagle_wand_io_internal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CountDeMonet/ArduinoProtonPack/3989337d1500fd4d66eefd46a3933040df0f4c5c/eagle_wand_io_internal.png --------------------------------------------------------------------------------