Build a Cloud Workshop Jan 2018

From LVL1
Jump to: navigation, search

Materials

  • one cardboard box (provided by attendee)
  • one 5 meter strip of Neopixel addressable LEDs - a lot like this one:
https://www.amazon.com/150pixels-programmable-Individually-addressable-Waterproof/dp/B01FQST21I/ref=sr_1_5?ie=UTF8&qid=1517177525&sr=8-5&keywords=5+meter+neopixel+led
  • one Arduino-like Nano microcontroller - a lot like this one:
https://www.amazon.com/Arduino-Elegoo-ATmega328P-without-compatible/dp/B0713XK923/ref=pd_sim_21_3?_encoding=UTF8&pd_rd_i=B0713XK923&pd_rd_r=A4HXBJ9PPQ6CFTJR0SHC&pd_rd_w=FtGfw&pd_rd_wg=vTtRw&psc=1&refRID=A4HXBJ9PPQ6CFTJR0SHC
  • usb power supply with 2 usb jack available; 2.1A @ 5v supply
  • one extension cord
  • sewing pins
  • polyester batting; sheet and fluff types
  • spray adhesive
  • hot glue gun
  • box-cutter

Process

  • Prep your cardboard box by cutting the corners off with a box cutter to shape it into a vaguely cloud-like shape (round?).
  • connect the pre-programmed Nano microcontroller, LED strip, USB power supplies, and extension cord together, and power the system up to ensure they work.
  • Pin the led strip to the box with the sewing pins, through either:
    • only the plastic shield on the LED strip.
    • through the plastic shield and GROUND pad on the LED strip.

Consider the layout of your LEDS around the entire box, you want your cloud to have even coverage on the areas that you will be able to see from where it is going to hang. (maybe the top doesn't need so many LEDs?)

Be sure to place the microcontroller end of the LED system near the center/top of the box.
  • Cut off one or many (maybe up to three?) pieces of the sheet-style batting to initially wrap your cloud, pinning the batting to the box.
Careful not to poke your LED strip!
  • Spray a face of your box with the spray adhesive, then adhere tufts of the fluff-style batting to the sheet-style batting.
consider hot-glue for the bottom of your cloud, where the fluff will have the hardest time hanging on.
  • Repeat the spraying/adhering process until all of the faces of your cloud have been covered with the fluff-style batting.

Additional notes

The LED strip and Nano microcontroller were prepped before the class by soldering together the Nano microcontroller, the connector from the FRONT end of the LED strip, and the 2 usb cables. the electrical connections are as follows:

  • Ground cable (white) from LED strip to Ground pin (GND) on Nano
  • Data cable (green) from LED strip to Digital pin 2 (2) on Nano
  • First USB cable into the USB jack on the Nano
  • Ground cable from 2nd USB jack (black) to Ground pin (GND) on Nano
  • VCC/5v from 2nd USB cable (red) to VCC/5v cable (red) on LED strip

The Adafruit Example script that is meant to test Neopixel LEDs called "strandtest" was modified and uploaded to your Nano before the workshops also. The Adafruit library that includes strandtest, as well as instructions on how to download it to your own Arduino IDE are available here:

https://learn.adafruit.com/adafruit-neopixel-uberguide/arduino-library-installation

The strandtest example script has many patterns built-in to run on your LEDs. the function called "rainbow" is the only one I left uncommented on the script I uploaded to your Nano. This is copy of the modified version that you began with:

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
  #include <avr/power.h>
#endif

#define PIN 2

// Parameter 1 = number of pixels in strip
// Parameter 2 = Arduino pin number (most are valid)
// Parameter 3 = pixel type flags, add together as needed:
//   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
//   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
//   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel products)
//   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
//   NEO_RGBW    Pixels are wired for RGBW bitstream (NeoPixel RGBW products)
Adafruit_NeoPixel strip = Adafruit_NeoPixel(150, PIN, NEO_GRB + NEO_KHZ800); 

// IMPORTANT: To reduce NeoPixel burnout risk, add 1000 uF capacitor across
// pixel power leads, add 300 - 500 Ohm resistor on first pixel's data input
// and minimize distance between Arduino and first pixel.  Avoid connecting
// on a live circuit...if you must, connect GND first.

void setup() {
  // This is for Trinket 5V 16MHz, you can remove these three lines if you are not using a Trinket
  #if defined (__AVR_ATtiny85__)
    if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
  #endif
  // End of trinket special code 

  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
}

void loop() {
  // Some example procedures showing how to display to the pixels:
  //colorWipe(strip.Color(255, 0, 0), 50); // Red
  //colorWipe(strip.Color(0, 255, 0), 50); // Green
  //colorWipe(strip.Color(0, 0, 255), 50); // Blue
  //colorWipe(strip.Color(0, 0, 0, 255), 50); // White RGBW
  // Send a theater pixel chase in...
  //theaterChase(strip.Color(127, 127, 127), 50); // White
  //theaterChase(strip.Color(127, 0, 0), 50); // Red
  //theaterChase(strip.Color(0, 0, 127), 50); // Blue 

  rainbow(20);
  //rainbowCycle(20);
  //theaterChaseRainbow(50);
}

// Fill the dots one after the other with a color
void colorWipe(uint32_t c, uint8_t wait) {
  for(uint16_t i=0; i<strip.numPixels(); i++) {
    strip.setPixelColor(i, c);
    strip.show();
    delay(wait);
  }
}

void rainbow(uint8_t wait) {
  uint16_t i, j;

  for(j=0; j<256; j++) {
    for(i=0; i<strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel((i+j) & 255));
    }
    strip.show();
    delay(wait);
  }
}

// Slightly different, this makes the rainbow equally distributed throughout
void rainbowCycle(uint8_t wait) {
  uint16_t i, j;

  for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel
    for(i=0; i< strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
    }
    strip.show();
    delay(wait);
  }
}

//Theatre-style crawling lights.
void theaterChase(uint32_t c, uint8_t wait) {
  for (int j=0; j<10; j++) {  //do 10 cycles of chasing
    for (int q=0; q < 3; q++) {
      for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, c);    //turn every third pixel on
      }
      strip.show();

      delay(wait);

      for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, 0);        //turn every third pixel off
      }
    }
  }
}

//Theatre-style crawling lights with rainbow effect
void theaterChaseRainbow(uint8_t wait) {
  for (int j=0; j < 256; j++) {     // cycle all 256 colors in the wheel
    for (int q=0; q < 3; q++) {
      for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, Wheel( (i+j) % 255));    //turn every third pixel on
      }
      strip.show(); 

      delay(wait);

      for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, 0);        //turn every third pixel off
      }
    }
  }
}

// Input a value 0 to 255 to get a color value.
// The colours are a transition r - g - b - back to r.
uint32_t Wheel(byte WheelPos) {
  WheelPos = 255 - WheelPos;
  if(WheelPos < 85) {
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  }
  if(WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
  WheelPos -= 170;
  return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);