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


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.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 .


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.



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.



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();; // 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;

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

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

} */ /* 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)); }; 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 };


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 };


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 };


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); }


MooCowandPinkie (author)2015-12-21

Excellent tutorial. Unfortunately, too complicated for my brain:) Do you sell these? Thanks.

zaikami (author)2015-12-21

Your instructable is the automatic version of this manuel process

ndrex (author)2015-12-20

i think my other half could handle the programming end but i am a bit stymied by the supplies - haven't heard of most - the equipment & products used - could you point me to the type of place to get them?

Dan Chen (author)ndrex2015-12-20

Most of the materials such as OOMOO and plaster you can get it from amazon. NeoPixel and micro controller can purchased from

You can find a FabLab near you at they should have a milling machine.

You can also carve OOMOO or plaster to your desired shape . You can also head over to home depot or hardware supply store to find objects that you can cast for interesting shape and texture. You can even 3D print the parts and paint over them or cast them. Sometimes, the key is to improvise, you get more interesting result and character out of the material.

Tannerx007 (author)2015-12-20

Very unique, awesome work and great write-up!

About This Instructable




More by Dan Chen:High Precision Cardboard CNC Drawing Machine Wearable Loading Wheel - Motion Deactivated Programable Motion Sensing Night Light
Add instructable to: