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
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.
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.
After about 45 minutes, this is the end result.
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 .
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.
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.
Spread Paint
I applied 4 coats of paint, 15 minutes between coats.
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.
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.
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); }