Things used in this project

Hardware components:
pico-Platinchen
×1
NeoPixel NeoPixel Ring - 12 x WS2812
×1
LilyPad Coin Cell Battery Holder - Switched
×1
Software apps and online services:
D94d qxu
Autodesk Fusion 360

Custom parts and enclosures

SENSable Thing aka The Ring
Autodesk Fusion 360
the base .STL
part 1 of the ring
the ring .STL
part 2 of the ring

Code

SENSableC/C++
Requires the Bosch Sensortec NAxisMotion library provided as part of the Arduino IDE 1.0.7 and Adafruit Neopixel library you do need to download from the Adafruit github.
#include "NAxisMotion.h"        //Contains the bridge code between the API and the Arduino Environment
#include <Wire.h>

// NeoPixel Ring simple sketch (c) 2013 Shae Erisson
// released under the GPLv3 license to match the rest of the AdaFruit NeoPixel library
#include <Adafruit_NeoPixel.h>

// Which pin on the Arduino is connected to the NeoPixels?
#define PIN            2

// How many NeoPixels are attached to the Arduino?
#define NUMPIXELS      12

// When we setup the NeoPixel library, we tell it how many pixels, and which pin to use to send signals.
// Note that for older NeoPixel strips you might need to change the third parameter--see the strandtest
// example for more information on possible values.
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);


NAxisMotion mySensor;         //Object that for the sensor 
unsigned long lastStreamTime = 0;     //To store the last streamed time stamp
const int streamPeriod = 20;          //To stream at 50Hz without using additional timers (time period(ms) =1000/frequency(Hz))

int north = 0;
int north_old = 0;
  
void setup() //This code is executed once
{    
  //Peripheral Initialization
  Serial.begin(115200);           //Initialize the Serial Port to view information on the Serial Monitor
  I2C.begin();                    //Initialize I2C communication to the let the library communicate with the sensor.
  //Sensor Initialization
  mySensor.initSensor();          //The I2C Address can be changed here inside this function in the library
  mySensor.setOperationMode(OPERATION_MODE_NDOF);   //Can be configured to other operation modes as desired
  mySensor.setUpdateMode(MANUAL);	//The default is AUTO. Changing to MANUAL requires calling the relevant update functions prior to calling the read functions
  //Setting to MANUAL requires fewer reads to the sensor  
  
//  pixels.begin(); // This initializes the NeoPixel library.

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

  init(50);

}

void loop() //This code is looped forever
{
  if ((millis() - lastStreamTime) >= streamPeriod)
  {
    lastStreamTime = millis();    
    mySensor.updateEuler();        //Update the Euler data into the structure of the object
    mySensor.updateCalibStatus();  //Update the Calibration Status

    Serial.print("Time: ");
    Serial.print(lastStreamTime);
    Serial.print("ms ");

    Serial.print(" H: ");
    Serial.print(mySensor.readEulerHeading()); //Heading data
    Serial.print("deg ");

    Serial.print(" R: ");
    Serial.print(mySensor.readEulerRoll()); //Roll data
    Serial.print("deg");

    Serial.print(" P: ");
    Serial.print(mySensor.readEulerPitch()); //Pitch data
    Serial.print("deg ");
    
    Serial.print(" A: ");
    Serial.print(mySensor.readAccelCalibStatus());  //Accelerometer Calibration Status (0 - 3)
	
    Serial.print(" M: ");
    Serial.print(mySensor.readMagCalibStatus());    //Magnetometer Calibration Status (0 - 3)
	
    Serial.print(" G: ");
    Serial.print(mySensor.readGyroCalibStatus());   //Gyroscope Calibration Status (0 - 3)
	
    Serial.print(" S: ");
    Serial.print(mySensor.readSystemCalibStatus());   //System Calibration Status (0 - 3)

    Serial.println();
    

    north = (360-mySensor.readEulerHeading())/30;
    
    
    if (mySensor.readEulerPitch() > -90) {
   
     
      
    if (north == 0) {strip.setPixelColor(9, 55, 0, 0);strip.show(); delay(100); strip.setPixelColor(9, 0, 0, 0); strip.show();}
    if (north == 1) {strip.setPixelColor(10, 55, 0, 0);strip.show(); delay(100); strip.setPixelColor(10, 0, 0, 0); strip.show();}
    if (north == 2) {strip.setPixelColor(11, 55, 0, 0);strip.show(); delay(100); strip.setPixelColor(11, 0, 0, 0); strip.show();}
    if (north == 3) {strip.setPixelColor(0, 55, 0, 0);strip.show(); delay(100); strip.setPixelColor(0, 0, 0, 0); strip.show();}
    if (north == 4) {strip.setPixelColor(1, 55, 0, 0);strip.show(); delay(100); strip.setPixelColor(1, 0, 0, 0); strip.show();}
    if (north == 5) {strip.setPixelColor(2, 55, 0, 0);strip.show(); delay(100); strip.setPixelColor(2, 0, 0, 0); strip.show();}
    if (north == 6) {strip.setPixelColor(3, 55, 0, 0);strip.show(); delay(100); strip.setPixelColor(3, 0, 0, 0); strip.show();}
    if (north == 7) {strip.setPixelColor(4, 55, 0, 0);strip.show(); delay(100); strip.setPixelColor(4, 0, 0, 0); strip.show();}
    if (north == 8) {strip.setPixelColor(5, 55, 0, 0);strip.show(); delay(100); strip.setPixelColor(5, 0, 0, 0); strip.show();}
    if (north == 9) {strip.setPixelColor(6, 55, 0, 0);strip.show(); delay(100); strip.setPixelColor(6, 0, 0, 0); strip.show();}
    if (north == 10) {strip.setPixelColor(7, 55, 0, 0);strip.show(); delay(100); strip.setPixelColor(7, 0, 0, 0); strip.show();}
    if (north == 11) {strip.setPixelColor(8, 55, 0, 0);strip.show(); delay(100); strip.setPixelColor(8, 0, 0, 0); strip.show();}
    
    
   
      
    
      
    //strip.setPixelColor(north, 255, 0, 0); // Moderately bright green color.
    //strip.show();
    //strip.setPixelColor(north-1, 0, 80, 0); // Moderately bright green color.
    //strip.setPixelColor(north+1, 0, 80, 0); // Moderately bright green color.
    strip.show();
    } else
    {
      strip.setPixelColor(north, 0, 0, 0); // Moderately bright green color.
      strip.show();
    }
   
   
   if (north != north_old)
   {
   delay(10); 
   strip.setPixelColor(north-1, 0, 0, 0); // Moderately bright green color.
   //strip.setPixelColor(north, 0, 0, 0); // Moderately bright green color.
   strip.setPixelColor(north+1, 0, 0, 0); // Moderately bright green color.
   strip.show();
   }
    
    north_old = north;
   
   if (north == 0)
   {
    init(5);
    rainbow(10);
    init(5);
   }
   
    
  }
}



void init(uint8_t wait) {
  uint16_t i;

    for(i=0; i<strip.numPixels(); i++) {
      strip.setPixelColor(i, 0, 0, 255);
      strip.show();
      delay(wait);
    }
    
    for(i=0; i<strip.numPixels(); i++) {
      strip.setPixelColor(i, 0, 0, 0);
      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);
  }
}

// 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);
  } else if(WheelPos < 170) {
    WheelPos -= 85;
   return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  } else {
   WheelPos -= 170;
   return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
  }
}

Credits

Guido web
fab-lab.eu

Maker!

Contact

Replications

Did you replicate this project? Share it!

I made one

Love this project? Think it could be improved? Tell us what you think!

Give feedback

Comments

Similar projects you might like

IOT2020 Energy Monitoring Gateway
Intermediate
  • 3,044
  • 9

Full instructions

Using the IOT2020, I am creating an expandable energy monitoring gateway, with configurable warnings and alarms, covering all the basics.

Creating Motion Study of the Geneva Mechanism in Fusion 360
Intermediate
  • 88
  • 2

Full instructions

The Geneva drive is a gear mechanism that translates a continuous rotation into an intermittent rotary motion.

Light-Up Poker Chip
Intermediate
  • 955
  • 6

Full instructions

This whole circuit is the same size as a regular poker chip, but with an added surprise: lights!

WiDC: Wi-Fi-Controlled FPV Robot
Intermediate
  • 9,632
  • 56

Full instructions

What about using a Wi-Fi remote-controlled robot for exploring your surroundings, reaching inaccessible places, spying and take pictures?

Cube radio
Intermediate
  • 977
  • 63

Full instructions

Minimalist, renewable internet radio.

Open Smart Hub : Home Automation
Intermediate
  • 60,249
  • 267

Work in progress

A smart home solution to all your separated "smart" devices that you can host yourself, customize, and add functionality to.

ProjectsCommunitiesTopicsContestsLiveAppsBetaFree StoreBlogAdd projectSign up / Login