Tools & Supplies
Parts
Prerequisite Guides:
Page last edited March 08, 2024
Text editor powered by tinymce.
Page last edited March 08, 2024
Text editor powered by tinymce.
BMO's box enclosure, cover and limbs looks best printed in teal. A spool of teal colored ABS ranges from $30-50 depending on where you purchase it.
Below is a small list of places to get filament. Make sure your filaments diameter size matches your 3d printer. Most common size is 1.75mm and 3mm.
You can print BMO's buttons in different colored ABS or paint each piece. The buttons are rather small, so you will need to make sure your build plate is clean and nicely leveled. These parts are a bit difficult to print so make a few copies to make a batch of each. You can do this in MakerWare by copying and pasting them.
The tolerances in the holes are optimized for ABS but should work with PLA. You can use an x-acto knife in moderation to lose the tolerances to fit the components.
bmo-box.stl bmo-cover.stl bmo-limbs.stl bmo-green.stl bmo-yellow.stl bmo-blue.stl bmp-green.stl |
ABS 230c/120c No Raft/Support %15 infill 2 shells 0.2 layer height |
Takes around 2-3 hours to print all 10 pieces. |
Page last edited March 08, 2024
Text editor powered by tinymce.
Using the GEMMA in this build allows us to plug in a rechargeable battery directly into the JST port is directly on the board. GEMMA can be powered by USB but will need to have a battery power source for portability.
Page last edited March 08, 2024
Text editor powered by tinymce.
// SPDX-FileCopyrightText: 2014 Phil Burgess for Adafruit Industries // // SPDX-License-Identifier: MIT // // Trinket/Gemma + LED matrix backpack jewelry. Plays animated // sequence on LED matrix. Press reset button to display again, // or add optional momentary button between pin #1 and +V. // THERE IS NO ANIMATION DATA IN THIS SOURCE FILE, you should // rarely need to change anything here. EDIT anim.h INSTEAD. #define BRIGHTNESS 12 // 0=min, 15=max #define I2C_ADDR 0x70 // Edit if backpack A0/A1 jumpers set #include <TinyWireM.h> #include <avr/power.h> #include <avr/sleep.h> #include "bmo.h" // Animation data is located here static const uint8_t PROGMEM reorder[] = { // Column-reordering table 0x00,0x40,0x20,0x60,0x10,0x50,0x30,0x70,0x08,0x48,0x28,0x68,0x18,0x58,0x38,0x78, 0x04,0x44,0x24,0x64,0x14,0x54,0x34,0x74,0x0c,0x4c,0x2c,0x6c,0x1c,0x5c,0x3c,0x7c, 0x02,0x42,0x22,0x62,0x12,0x52,0x32,0x72,0x0a,0x4a,0x2a,0x6a,0x1a,0x5a,0x3a,0x7a, 0x06,0x46,0x26,0x66,0x16,0x56,0x36,0x76,0x0e,0x4e,0x2e,0x6e,0x1e,0x5e,0x3e,0x7e, 0x01,0x41,0x21,0x61,0x11,0x51,0x31,0x71,0x09,0x49,0x29,0x69,0x19,0x59,0x39,0x79, 0x05,0x45,0x25,0x65,0x15,0x55,0x35,0x75,0x0d,0x4d,0x2d,0x6d,0x1d,0x5d,0x3d,0x7d, 0x03,0x43,0x23,0x63,0x13,0x53,0x33,0x73,0x0b,0x4b,0x2b,0x6b,0x1b,0x5b,0x3b,0x7b, 0x07,0x47,0x27,0x67,0x17,0x57,0x37,0x77,0x0f,0x4f,0x2f,0x6f,0x1f,0x5f,0x3f,0x7f, 0x80,0xc0,0xa0,0xe0,0x90,0xd0,0xb0,0xf0,0x88,0xc8,0xa8,0xe8,0x98,0xd8,0xb8,0xf8, 0x84,0xc4,0xa4,0xe4,0x94,0xd4,0xb4,0xf4,0x8c,0xcc,0xac,0xec,0x9c,0xdc,0xbc,0xfc, 0x82,0xc2,0xa2,0xe2,0x92,0xd2,0xb2,0xf2,0x8a,0xca,0xaa,0xea,0x9a,0xda,0xba,0xfa, 0x86,0xc6,0xa6,0xe6,0x96,0xd6,0xb6,0xf6,0x8e,0xce,0xae,0xee,0x9e,0xde,0xbe,0xfe, 0x81,0xc1,0xa1,0xe1,0x91,0xd1,0xb1,0xf1,0x89,0xc9,0xa9,0xe9,0x99,0xd9,0xb9,0xf9, 0x85,0xc5,0xa5,0xe5,0x95,0xd5,0xb5,0xf5,0x8d,0xcd,0xad,0xed,0x9d,0xdd,0xbd,0xfd, 0x83,0xc3,0xa3,0xe3,0x93,0xd3,0xb3,0xf3,0x8b,0xcb,0xab,0xeb,0x9b,0xdb,0xbb,0xfb, 0x87,0xc7,0xa7,0xe7,0x97,0xd7,0xb7,0xf7,0x8f,0xcf,0xaf,0xef,0x9f,0xdf,0xbf,0xff }; void ledCmd(uint8_t x) { // Issue command to LED backback driver TinyWireM.beginTransmission(I2C_ADDR); TinyWireM.write(x); TinyWireM.endTransmission(); } void clear(void) { // Clear display buffer TinyWireM.beginTransmission(I2C_ADDR); for(uint8_t i=0; i<17; i++) TinyWireM.write(0); TinyWireM.endTransmission(); } void setup() { power_timer1_disable(); // Disable unused peripherals power_adc_disable(); // to save power PCMSK |= _BV(PCINT1); // Set change mask for pin 1 TinyWireM.begin(); // I2C init clear(); // Blank display ledCmd(0x21); // Turn on oscillator ledCmd(0xE0 | BRIGHTNESS); // Set brightness ledCmd(0x81); // Display on, no blink } uint8_t rep = REPS; void loop() { for(int i=0; i<sizeof(anim); i) { // For each frame... TinyWireM.beginTransmission(I2C_ADDR); TinyWireM.write(0); // Start address for(uint8_t j=0; j<8; j++) { // 8 rows... TinyWireM.write(pgm_read_byte(&reorder[pgm_read_byte(&anim[i++])])); TinyWireM.write(0); } TinyWireM.endTransmission(); delay(pgm_read_byte(&anim[i++]) * 10); } if(!--rep) { // If last cycle... ledCmd(0x20); // LED matrix in standby mode GIMSK = _BV(PCIE); // Enable pin change interrupt power_all_disable(); // All peripherals off set_sleep_mode(SLEEP_MODE_PWR_DOWN); sleep_enable(); sei(); // Keep interrupts disabled sleep_mode(); // Power down CPU (pin 1 will wake) // Execution resumes here on wake. GIMSK = 0; // Disable pin change interrupt rep = REPS; // Reset animation counter power_timer0_enable(); // Re-enable timer power_usi_enable(); // Re-enable USI TinyWireM.begin(); // Re-init I2C clear(); // Blank display ledCmd(0x21); // Re-enable matrix } } ISR(PCINT0_vect) {} // Button tap
// SPDX-FileCopyrightText: 2014 Phil Burgess for Adafruit Industries // // SPDX-License-Identifier: MIT // // Trinket/Gemma + LED matrix backpack jewelry. Plays animated // sequence on LED matrix. Press reset button to display again, // or add optional momentary button between pin #1 and +V. // THERE IS NO ANIMATION DATA IN THIS SOURCE FILE, you should // rarely need to change anything here. EDIT anim.h INSTEAD. #define BRIGHTNESS 12 // 0=min, 15=max #define I2C_ADDR 0x70 // Edit if backpack A0/A1 jumpers set #include <TinyWireM.h> #include <avr/power.h> #include <avr/sleep.h> #include "bmo.h" // Animation data is located here static const uint8_t PROGMEM reorder[] = { // Column-reordering table 0x00,0x40,0x20,0x60,0x10,0x50,0x30,0x70,0x08,0x48,0x28,0x68,0x18,0x58,0x38,0x78, 0x04,0x44,0x24,0x64,0x14,0x54,0x34,0x74,0x0c,0x4c,0x2c,0x6c,0x1c,0x5c,0x3c,0x7c, 0x02,0x42,0x22,0x62,0x12,0x52,0x32,0x72,0x0a,0x4a,0x2a,0x6a,0x1a,0x5a,0x3a,0x7a, 0x06,0x46,0x26,0x66,0x16,0x56,0x36,0x76,0x0e,0x4e,0x2e,0x6e,0x1e,0x5e,0x3e,0x7e, 0x01,0x41,0x21,0x61,0x11,0x51,0x31,0x71,0x09,0x49,0x29,0x69,0x19,0x59,0x39,0x79, 0x05,0x45,0x25,0x65,0x15,0x55,0x35,0x75,0x0d,0x4d,0x2d,0x6d,0x1d,0x5d,0x3d,0x7d, 0x03,0x43,0x23,0x63,0x13,0x53,0x33,0x73,0x0b,0x4b,0x2b,0x6b,0x1b,0x5b,0x3b,0x7b, 0x07,0x47,0x27,0x67,0x17,0x57,0x37,0x77,0x0f,0x4f,0x2f,0x6f,0x1f,0x5f,0x3f,0x7f, 0x80,0xc0,0xa0,0xe0,0x90,0xd0,0xb0,0xf0,0x88,0xc8,0xa8,0xe8,0x98,0xd8,0xb8,0xf8, 0x84,0xc4,0xa4,0xe4,0x94,0xd4,0xb4,0xf4,0x8c,0xcc,0xac,0xec,0x9c,0xdc,0xbc,0xfc, 0x82,0xc2,0xa2,0xe2,0x92,0xd2,0xb2,0xf2,0x8a,0xca,0xaa,0xea,0x9a,0xda,0xba,0xfa, 0x86,0xc6,0xa6,0xe6,0x96,0xd6,0xb6,0xf6,0x8e,0xce,0xae,0xee,0x9e,0xde,0xbe,0xfe, 0x81,0xc1,0xa1,0xe1,0x91,0xd1,0xb1,0xf1,0x89,0xc9,0xa9,0xe9,0x99,0xd9,0xb9,0xf9, 0x85,0xc5,0xa5,0xe5,0x95,0xd5,0xb5,0xf5,0x8d,0xcd,0xad,0xed,0x9d,0xdd,0xbd,0xfd, 0x83,0xc3,0xa3,0xe3,0x93,0xd3,0xb3,0xf3,0x8b,0xcb,0xab,0xeb,0x9b,0xdb,0xbb,0xfb, 0x87,0xc7,0xa7,0xe7,0x97,0xd7,0xb7,0xf7,0x8f,0xcf,0xaf,0xef,0x9f,0xdf,0xbf,0xff }; void ledCmd(uint8_t x) { // Issue command to LED backback driver TinyWireM.beginTransmission(I2C_ADDR); TinyWireM.write(x); TinyWireM.endTransmission(); } void clear(void) { // Clear display buffer TinyWireM.beginTransmission(I2C_ADDR); for(uint8_t i=0; i<17; i++) TinyWireM.write(0); TinyWireM.endTransmission(); } void setup() { power_timer1_disable(); // Disable unused peripherals power_adc_disable(); // to save power PCMSK |= _BV(PCINT1); // Set change mask for pin 1 TinyWireM.begin(); // I2C init clear(); // Blank display ledCmd(0x21); // Turn on oscillator ledCmd(0xE0 | BRIGHTNESS); // Set brightness ledCmd(0x81); // Display on, no blink } uint8_t rep = REPS; void loop() { for(int i=0; i<sizeof(anim); i) { // For each frame... TinyWireM.beginTransmission(I2C_ADDR); TinyWireM.write(0); // Start address for(uint8_t j=0; j<8; j++) { // 8 rows... TinyWireM.write(pgm_read_byte(&reorder[pgm_read_byte(&anim[i++])])); TinyWireM.write(0); } TinyWireM.endTransmission(); delay(pgm_read_byte(&anim[i++]) * 10); } if(!--rep) { // If last cycle... ledCmd(0x20); // LED matrix in standby mode GIMSK = _BV(PCIE); // Enable pin change interrupt power_all_disable(); // All peripherals off set_sleep_mode(SLEEP_MODE_PWR_DOWN); sleep_enable(); sei(); // Keep interrupts disabled sleep_mode(); // Power down CPU (pin 1 will wake) // Execution resumes here on wake. GIMSK = 0; // Disable pin change interrupt rep = REPS; // Reset animation counter power_timer0_enable(); // Re-enable timer power_usi_enable(); // Re-enable USI TinyWireM.begin(); // Re-init I2C clear(); // Blank display ledCmd(0x21); // Re-enable matrix } } ISR(PCINT0_vect) {} // Button tap
// SPDX-FileCopyrightText: 2014 Phil Burgess for Adafruit Industries // // SPDX-License-Identifier: MIT // // Animation data for Trinket/Gemma + LED matrix backpack jewelry. #define REPS 255 // Number of times to repeat the animation loop (1-255) const uint8_t PROGMEM anim[] = { B11111111, // 1 frame B10011001, B10011001, B11111111, B10000001, B11000011, B11100111, B11111111, 25, // 0.25 second delay B11111111, // 2 frame B10011001, B10011001, B11111111, B10111101, B10111101, B11000011, B11111111, 25, // 0.25 second delay B11111111, // 3 frame B10011001, B10011001, B11111111, B10000001, B11000011, B11100111, B11111111, 25, // 0.25 second delay B11111111, // 4 frame B10011001, B10011001, B11111111, B10111101, B10111101, B11000011, B11111111, 25, // 0.25 second delay B11111111, // 5 frame B10011001, B10011001, B11111111, B11111111, B11111111, B10000001, B11111111, 25, // 0.25 second delay B11111111, // 6 frame B10011001, B10011001, B11111111, B11100111, B11011011, B11100111, B11111111, 25, // 0.25 second delay B11111111, // 7 frame B10111101, B00011000, B10111101, B11100111, B11011011, B11100111, B11111111, 25, // 0.25 second delay B11111111, // 8 frame B11111111, B00011000, B11111111, B11100111, B11011011, B11100111, B11111111, 25, // 0.25 second delay B11111111, // 9 frame B10111101, B00011000, B10111101, B11100111, B11011011, B11100111, B11111111, 25, // 0.25 second delay };
// SPDX-FileCopyrightText: 2014 Phil Burgess for Adafruit Industries // // SPDX-License-Identifier: MIT // // Animation data for Trinket/Gemma + LED matrix backpack jewelry. #define REPS 255 // Number of times to repeat the animation loop (1-255) const uint8_t PROGMEM anim[] = { B11111111, // 1 frame B10011001, B10011001, B11111111, B10000001, B11000011, B11100111, B11111111, 25, // 0.25 second delay B11111111, // 2 frame B10011001, B10011001, B11111111, B10111101, B10111101, B11000011, B11111111, 25, // 0.25 second delay B11111111, // 3 frame B10011001, B10011001, B11111111, B10000001, B11000011, B11100111, B11111111, 25, // 0.25 second delay B11111111, // 4 frame B10011001, B10011001, B11111111, B10111101, B10111101, B11000011, B11111111, 25, // 0.25 second delay B11111111, // 5 frame B10011001, B10011001, B11111111, B11111111, B11111111, B10000001, B11111111, 25, // 0.25 second delay B11111111, // 6 frame B10011001, B10011001, B11111111, B11100111, B11011011, B11100111, B11111111, 25, // 0.25 second delay B11111111, // 7 frame B10111101, B00011000, B10111101, B11100111, B11011011, B11100111, B11111111, 25, // 0.25 second delay B11111111, // 8 frame B11111111, B00011000, B11111111, B11100111, B11011011, B11100111, B11111111, 25, // 0.25 second delay B11111111, // 9 frame B10111101, B00011000, B10111101, B11100111, B11011011, B11100111, B11111111, 25, // 0.25 second delay };
Page last edited March 08, 2024
Text editor powered by tinymce.
GEMMA M0 boards can run CircuitPython — a different approach to programming compared to Arduino sketches. In fact, CircuitPython comes factory pre-loaded on GEMMA M0. If you’ve overwritten it with an Arduino sketch, or just want to learn the basics of setting up and using CircuitPython, this is explained in the Adafruit GEMMA M0 guide.
Below is CircuitPython code that works similarly (though not exactly the same) as the Arduino sketch shown on a prior page. To use this, plug the GEMMA M0 into USB…it should show up on your computer as a small flash drive…then edit the file “code.py” with your text editor of choice. Select and copy the code below and paste it into that file, entirely replacing its contents (don’t mix it in with lingering bits of old code). When you save the file, the code should start running almost immediately (if not, see notes at the bottom of this page).
If GEMMA M0 doesn’t show up as a drive, follow the GEMMA M0 guide link above to prepare the board for CircuitPython.
This code requires two additional libraries be installed:
If you’ve just reloaded the board with CircuitPython, create the “lib” directory and then download the Adafruit CircuitPython Bundle.
# SPDX-FileCopyrightText: 2014 Phil Burgess for Adafruit Industries # SPDX-FileCopyrightText: 2018 Phil Burgess for Adafruit Industries # # SPDX-License-Identifier: MIT # # Trinket/Gemma + LED matrix backpack jewelry. Plays animated # sequence on LED matrix. Press reset button to display again. import time import adafruit_ht16k33.matrix import board import busio as io import touchio touch = touchio.TouchIn(board.D1) i2c = io.I2C(board.SCL, board.SDA) matrix = adafruit_ht16k33.matrix.Matrix8x8(i2c) # pixels initializers x_pix = y_pix = 8 x = y = 0 matrix.fill(0) matrix.show() # seconds to pause between frames frame_delay = [.25, .25, .25, .25, .25, .25, .25, .25, .25, .25] # counter for animation frames frame_count = 0 # repeat entire animation multiple times reps = 255 rep_count = reps # animation bitmaps animation = [ # frame 1 [[1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 0, 1, 1, 0, 0, 1], [1, 0, 0, 1, 1, 0, 0, 1], [1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 0, 0, 0, 0, 0, 1], [1, 1, 0, 0, 0, 0, 1, 1], [1, 1, 1, 0, 0, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1]], # frame 2 [[1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 0, 1, 1, 0, 0, 1], [1, 0, 0, 1, 1, 0, 0, 1], [1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 1, 1, 1, 1, 0, 1], [1, 0, 1, 1, 1, 1, 0, 1], [1, 1, 0, 0, 0, 0, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1]], # frame 3 [[1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 0, 1, 1, 0, 0, 1], [1, 0, 0, 1, 1, 0, 0, 1], [1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 0, 0, 0, 0, 0, 1], [1, 1, 0, 0, 0, 0, 1, 1], [1, 1, 1, 0, 0, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1]], # frame 4 [[1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 0, 1, 1, 0, 0, 1], [1, 0, 0, 1, 1, 0, 0, 1], [1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 1, 1, 1, 1, 0, 1], [1, 0, 1, 1, 1, 1, 0, 1], [1, 1, 0, 0, 0, 0, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1]], # frame 5 [[1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 0, 1, 1, 0, 0, 1], [1, 0, 0, 1, 1, 0, 0, 1], [1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 0, 0, 0, 0, 0, 1], [1, 1, 1, 1, 1, 1, 1, 1]], # frame 6 [[1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 0, 1, 1, 0, 0, 1], [1, 0, 0, 1, 1, 0, 0, 1], [1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 0, 0, 1, 1, 1], [1, 1, 0, 1, 1, 0, 1, 1], [1, 1, 1, 0, 0, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1]], # frame 7 [[1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 1, 1, 1, 1, 0, 1], [0, 0, 0, 1, 1, 0, 0, 0], [1, 0, 1, 1, 1, 1, 0, 1], [1, 1, 1, 0, 0, 1, 1, 1], [1, 1, 0, 1, 1, 0, 1, 1], [1, 1, 1, 0, 0, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1]], # frame 8 [[1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 1, 1, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 0, 0, 1, 1, 1], [1, 1, 0, 1, 1, 0, 1, 1], [1, 1, 1, 0, 0, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1]], # frame 9 [[1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 1, 1, 1, 1, 0, 1], [0, 0, 0, 1, 1, 0, 0, 0], [1, 0, 1, 1, 1, 1, 0, 1], [1, 1, 1, 0, 0, 1, 1, 1], [1, 1, 0, 1, 1, 0, 1, 1], [1, 1, 1, 0, 0, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1]], ] # # run until we are out of animation frames # use Gemma's built-in reset button or switch to restart # # populate matrix while True: if frame_count < len(animation) and rep_count >= 0: for x in range(x_pix): for y in range(y_pix): matrix.pixel(x, y, animation[frame_count][x][y]) # next animation frame frame_count += 1 # show animation matrix.show() # pause for effect time.sleep(frame_delay[frame_count]) else: matrix.fill(0) matrix.show() time.sleep(.1) # track repitions rep_count -= 1 # play it again frame_count = 0 # A0/D1 pin has been touched # reset animation if touch.value: frame_count = 0 rep_count = reps
# SPDX-FileCopyrightText: 2014 Phil Burgess for Adafruit Industries # SPDX-FileCopyrightText: 2018 Phil Burgess for Adafruit Industries # # SPDX-License-Identifier: MIT # # Trinket/Gemma + LED matrix backpack jewelry. Plays animated # sequence on LED matrix. Press reset button to display again. import time import adafruit_ht16k33.matrix import board import busio as io import touchio touch = touchio.TouchIn(board.D1) i2c = io.I2C(board.SCL, board.SDA) matrix = adafruit_ht16k33.matrix.Matrix8x8(i2c) # pixels initializers x_pix = y_pix = 8 x = y = 0 matrix.fill(0) matrix.show() # seconds to pause between frames frame_delay = [.25, .25, .25, .25, .25, .25, .25, .25, .25, .25] # counter for animation frames frame_count = 0 # repeat entire animation multiple times reps = 255 rep_count = reps # animation bitmaps animation = [ # frame 1 [[1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 0, 1, 1, 0, 0, 1], [1, 0, 0, 1, 1, 0, 0, 1], [1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 0, 0, 0, 0, 0, 1], [1, 1, 0, 0, 0, 0, 1, 1], [1, 1, 1, 0, 0, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1]], # frame 2 [[1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 0, 1, 1, 0, 0, 1], [1, 0, 0, 1, 1, 0, 0, 1], [1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 1, 1, 1, 1, 0, 1], [1, 0, 1, 1, 1, 1, 0, 1], [1, 1, 0, 0, 0, 0, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1]], # frame 3 [[1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 0, 1, 1, 0, 0, 1], [1, 0, 0, 1, 1, 0, 0, 1], [1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 0, 0, 0, 0, 0, 1], [1, 1, 0, 0, 0, 0, 1, 1], [1, 1, 1, 0, 0, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1]], # frame 4 [[1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 0, 1, 1, 0, 0, 1], [1, 0, 0, 1, 1, 0, 0, 1], [1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 1, 1, 1, 1, 0, 1], [1, 0, 1, 1, 1, 1, 0, 1], [1, 1, 0, 0, 0, 0, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1]], # frame 5 [[1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 0, 1, 1, 0, 0, 1], [1, 0, 0, 1, 1, 0, 0, 1], [1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 0, 0, 0, 0, 0, 1], [1, 1, 1, 1, 1, 1, 1, 1]], # frame 6 [[1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 0, 1, 1, 0, 0, 1], [1, 0, 0, 1, 1, 0, 0, 1], [1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 0, 0, 1, 1, 1], [1, 1, 0, 1, 1, 0, 1, 1], [1, 1, 1, 0, 0, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1]], # frame 7 [[1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 1, 1, 1, 1, 0, 1], [0, 0, 0, 1, 1, 0, 0, 0], [1, 0, 1, 1, 1, 1, 0, 1], [1, 1, 1, 0, 0, 1, 1, 1], [1, 1, 0, 1, 1, 0, 1, 1], [1, 1, 1, 0, 0, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1]], # frame 8 [[1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 1, 1, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 0, 0, 1, 1, 1], [1, 1, 0, 1, 1, 0, 1, 1], [1, 1, 1, 0, 0, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1]], # frame 9 [[1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 1, 1, 1, 1, 0, 1], [0, 0, 0, 1, 1, 0, 0, 0], [1, 0, 1, 1, 1, 1, 0, 1], [1, 1, 1, 0, 0, 1, 1, 1], [1, 1, 0, 1, 1, 0, 1, 1], [1, 1, 1, 0, 0, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1]], ] # # run until we are out of animation frames # use Gemma's built-in reset button or switch to restart # # populate matrix while True: if frame_count < len(animation) and rep_count >= 0: for x in range(x_pix): for y in range(y_pix): matrix.pixel(x, y, animation[frame_count][x][y]) # next animation frame frame_count += 1 # show animation matrix.show() # pause for effect time.sleep(frame_delay[frame_count]) else: matrix.fill(0) matrix.show() time.sleep(.1) # track repitions rep_count -= 1 # play it again frame_count = 0 # A0/D1 pin has been touched # reset animation if touch.value: frame_count = 0 rep_count = reps
Page last edited March 08, 2024
Text editor powered by tinymce.
Use a third helping hand to assist you. Use each arm to hold onto the JST ports. Use diagonal tweezers to hold the stripped wire with one hand while using your other hand to hold the soldering iron. |
Page last edited March 08, 2024
Text editor powered by tinymce.
Adding Push ButtonGently move the wiring of the LED matrix away from the top clips.Slightly bend one of the pins of the push button inward, so it does not touch any part of the LED Matrix. |
Insert one side of the button into the clips near the top of the box. Align up the push button with the hole in the top middle. Apply pressure to the opposite side of the button while pushing the top of the box inward. This will make a slight bend allowing the push button to snap into place. | |
Add GemmaPlace GEMMA over the back of the box cover with the USB port aligned up to the bottom opening. Lightly press GEMMA down into the cover so it stays put. |
|
Add the JST/Switch adapter to the GEMMA. Make sure two cables are not too long or else it won't fit inside the box! |
Page last edited March 08, 2024
Text editor powered by tinymce.