The Nyan earrings were inspired by Nyan Cat the pop tart cat flying across the universe with a rainbow on its tail?

Refer to other NYANCAT earring projects Nyan Board and Nyancat Earrings also using ATTINY85 <3

This board is also using ATTINY85 but we are adding WS2812, will be powered by a rechargeable battery. 

Again, we are using inkscape, the svg2Shenzhen extension and KiCAD.

Inkscape screenshot depicting Solder Mask and EdgeCuts

KiCAD screenshot of a preliminary version of top.

Still working on the design, but here is a draft of the schematics. 

KiCAD schematics

The board size is limited by the battery size which is around 2.5mmx2.5mm, there's a palceholder on bottom. Since I wanted earrings I decided to make the rainbow shorter because I didn't want it to be too big, in the end the size of the board is 56.6mmx29.5mm.

Preliminary version of bottom view.

The idea was to place 3 WS2812 (5050) on bottom reverse mount.

I decided to get the WS2812 3535 package so instead of having 3 LEDs I placed 7 WS2812 mini. I don't care much about power consumption right now but I will be using a rechargeable battery. 

This is a comparison of 2 drafts of the board placement  on the left WS2812b 5050 and on the right WS2812b 3535.

The pads are 2mm long and the lens is clear (out of the little circle) so there is nothing "blocking" the light. 

This is the updated render of the work in progress board n_ñ

I updated the bottom silkscreen. I need to update the LED routing, if everything goes smooth I will finish this week and send the gerbers during the weekend. 


OK,  I received the boards yesterday I left a pad to place a pin because I had some friends who wanted a pin instead of earrings. So I just drilled a hole for the earring hooks. 

I found out I didn't mirror the pads when I was creating the footprint of the WS2812b mini .So it is not possible to reverse mount them, this is the assembly as you can see the WS2812b are placed on bottom but not reverse mount.

But Abraham reworked one board because we just had to know how it would look with the WS2812b reverse mounted.  In this video on the right you can see the reworked board with the WS2812b reverse mount on bottom. On the left, the LEDs are facing up, but we added hot glue to diffuse light.  This is only 10 out of 255 brightness value.

The hot glue makes it look messy :( 

The board has an ISP footprint so is easy to reprogram soldering a header and using the Atmel ICE programmer, in order to place the battery we need to remove the header that's why you see all pics with the battery hanging. We created an Arduino sketch based on Adafruit's rainbow chaser. And set the brightness at 10 (0-255 possible values).

This is how it looks with the battery placed with double side tape and the hot glue.  The weight of the  hot glue makes the board tilt. 

I have been playing with the code and different brightness, this photo has 255 level. 

Showcased earrings during the Jalisco Maker Faire!  Photo by Sabas.uf2.

Brightness level 128 (out of 255). Super bright! I am unsure of the battery capacity, but the earrings last around an hour at 128 brightness level :(


Arduino code

#include <Adafruit_NeoPixel.h>
//#include <avr/sleep.h>    // Sleep Modes

#define PIN 3
#define NUM_PXLS 7
#define BRIGHTS 128
// 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(NUM_PXLS, 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.

// Change these to set speed (lower is faster)

#define ROTATION_RATE  100
// Change these to be whatever color you want
// Use color picker to come up with hex values
#define FLASH_COLOR   0xFF0000
#define SPIN_COLOR    0xFF0000
#define CYLON_COLOR   0xFF0000

int colorIndex;
int startIndex;

// Define 10 colors here.
// Must be 10 entries.
// Use 0x000000 if you want a blank space.
uint32_t RAINBOW_COLORS[7] = {
  strip.Color(255, 0, 0),  //red
  strip.Color(255, 255, 10),  //yellowish
  strip.Color(0, 255, 0),  //green
  strip.Color(0, 30, 255), //blue
  strip.Color(128, 0, 255),  //purple
  strip.Color(0, 0, 0),  
  strip.Color(0, 0, 0)

void setup() {
  ADCSRA &= ~(1<<ADEN); //Disable ADC, saves ~230uA
  strip.begin();; // Initialize all pixels to 'off'

void loop() { 

void rainbowChase()
  colorIndex = startIndex;
  for (int p=0; p<NUM_PXLS; p++)
    strip.setPixelColor(p, RAINBOW_COLORS[colorIndex]);
    //strip.setPixelColor(p, (0,   0, 127));;
    if (colorIndex>NUM_PXLS)
       colorIndex = 0;
      startIndex = 0;