Introduction: Moon Rock

This project was inspired by the different colors of moon light through out the night. This can be used as a light night, indicating the time with color. I used 96 NeoPixel ring to create this effect, it is also programable with usb.

Step 1: Molding & Casting

Screen Shot 2014-10-18 at 11.45.37 PMScreen Shot 2014-10-19 at 12.14.01 AM

After I did the Random vertex displacement, I saved the model as .stl, then open it in SolidWorks to cut a rounded hole in the middle.

Screen Shot 2014-10-21 at 12.58.57 PMScreen Shot 2014-10-21 at 12.54.22 PM

ShopBot-ing

I used the ShopBot to cut my piece. Since the foam depth might not be deep enough, I spread glue 2 pieces of foam together just incase. At 13000 RPM, the rounded end mill was able to cut smoothly without any trouble. The 1/4 inch end mill however did not leave enough resolution for me, but it cuts much faster.

IMG_9766

After about 45 minutes, this is the end result.IMG_9779

Molding & Casting

I mixed a large batch of OOMOO at 1 to 1 ratio evenly to make my negative mold. I end up using 1.5 sets of OOMOO to create the negative mold .

IMG_9783

1.5 hours later, OOMOO becomes pretty hard. In order to get my negative mold out, I used the air gun to break the edge first, then break the mold apart from the side and the bottom. Since my mold is made up if 2 pieces of foam, I can just break them apart fairly easily.

IMG_9800IMG_9802IMG_9801

For casting, I used the laser cutter to cut out the fence, which is 8"X8". It is a clean and fast way to make the reusable walls. I then pour and clamp the mold to position. I was able to make 2 castes in 3 hours using Drystone. 5 Part Drystone Powder and 1 part water.

IMG_9805IMG_9806IMG_9818IMG_9816IMG_9811IMG_9814

Spread Paint

I applied 4 coats of paint, 15 minutes between coats.

IMG_9821IMG_9822IMG_9825

Assembling

I placed a piece of laser etched acrylic in the middle, it has a water ripple texture to it. To make the edge more organic I made the edges uneven using a drum stander.

IMG_9836IMG_9834

Lighting

I was trying to use the ATtiny44 board that I programed last week for the lighting, using PWN to simulate the ocean wave, but it was too big and I broke the ISP port. I end up using the large LEDs in the lab with a 1.5 battery.

IMG_9844IMG_9845

IMG_3558

Step 2: Assembling: Laser Etching + NeoPixel + Microcontroller

I used Adafruit's Neopixle ring to create different color and different lighting angle between the two "moon rock".

I created the moon surface texture with laser etching and use acrylic glue the melt off some of the visible laser "pixel"

I used Adafruit's Trinket to both program and power the NelPixel. It's small enough to fit under the "moon rock"

After all that, I sandwiched all three pieces together with hot glue to create a scriptural piece.

Step 3: Programing

# I sample the moon image color with photoshop and get the RGB value then copy them into the code

# the fade() function would take one RBG value then fade to another RGB value

#include #ifdef __AVR__ #include #endif

#define PIN 4

// 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) Adafruit_NeoPixel strip = Adafruit_NeoPixel(94, 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() {

fade(50, 0, 0, 0, 202, 168, 76); fade(50, 222, 161, 57, 202, 168, 76); fade(50, 202, 168, 76, 156, 153, 140); fade(50, 156, 153, 140, 144, 139, 129); fade(50, 144, 139, 129, 172, 127, 65); fade(50, 172, 127, 65, 191, 108, 22); fade(50, 191, 108, 22, 222, 161, 57); fade(50, 222, 161, 57, 169, 86, 18); fade(50, 169, 86, 18, 169-18, 86-18, 18-18 ); fade(50, 169-18, 86-18, 18-18, 0, 0, 0);

}

void fade(uint16_t duration, int startColorR,int startColorG,int startColorB, int endColorR,int endColorG,int endColorB) {

int16_t redDiff = endColorR - startColorR; int16_t greenDiff = endColorG - startColorG; int16_t blueDiff = endColorB - startColorB;

int16_t delaya = 20; int16_t steps = duration / delaya;

int16_t redValue, greenValue, blueValue;

for (int16_t i = 0 ; i < steps - 1 ; ++i) { redValue = (int16_t)startColorR + (redDiff * i / steps); greenValue = (int16_t)startColorG + (greenDiff * i / steps); blueValue = (int16_t)startColorB + (blueDiff * i / steps);

for(uint16_t i=0; i

strip.show();

} /* light up half circle for(uint16_t i=0; i

} for(uint16_t i=strip.numPixels()/2; i

strip.show();

} */ /* for(uint16_t i=0; i

} * / */ //waitMs(delay); }

//led.shine(endColor); strip.setPixelColor(i, Wheel((i+j) & 255)); }

// Fill the dots one after the other with a color void colorWipe(uint32_t c, uint8_t wait) { for(uint16_t i=0; i

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

for(j=0; j<256; j++) { for(i=0; i

// 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 theaterChasex(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 (int i=0; i < strip.numPixels(); i=i+3) { strip.setPixelColor(i+q, c); //turn every third pixel on } strip.show();

delay(wait);

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

//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 (int i=0; i < strip.numPixels(); i=i+3) { strip.setPixelColor(i+q, c); //turn every third pixel on } strip.show();

delay(wait);

for (int 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 (int 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 (int 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); }