Jump to content
Electronics-Lab.com Community

Fun with IMU, React, and NeoPixels using Xiao nRF52840 Sense


Recommended Posts

Hello tech adventurers! šŸ§‘ā€šŸ”§šŸ‘©ā€šŸ’» If you're here, you're probably itching to light up the world, or at least your room, with some rainbow colors! And how? By combining a motion sensor (IMU), a tiny powerhouse microcontroller, and some shiny NeoPixels. šŸŒˆ Buckle upā€”it's going to be fun and flashy (literally)!

image_i1j6enJrDx.png?auto=compress%2Cfor
Ā 

What You'll Need šŸ› ļø

Let's kick off by grabbing all the cool gear for this project. Make sure your toolbox is stocked with:

1. Seeed Studio Xiao nRF52840 Sense āš”

This tiny microcontroller is a superstar! Itā€™s Bluetooth-capable, runs on a Cortex-M4 processor, and isĀ small enough to get lost in your pocket! Not that you'd want that... šŸ™„

  • Why this one?Ā It's packed with an onboard microphone, IMU (Inertial Measurement Unit), and Bluetooth LE, which means weā€™re going wireless, baby! šŸŽ¤šŸƒā€ā™‚ļø

2. NeoPixel LED Panel šŸ’”

  • These are individually addressable RGB LEDs that can light up in any color your heart desires. Weā€™ll be using these bad boys to visualize our IMU's data. Theyā€™re essentially the party piece of this project! šŸŽ‰
image_1SoSyPfTFD.png?auto=compress%2Cfor
Ā 

3. IMU (Inertial Measurement Unit) šŸ“

  • Already built into the Xiao nRF52840 Sense! This sensor detects motion, so you can do cool stuff like control your NeoPixels based on tilts and shakes. Think of it like aĀ magic wandĀ for LEDs.

4. Jumper Wires, Soldering Kit, and USB-C Cable šŸ§°

  • You know the drill. We need these to hook up everything without too much of a spaghetti mess on your desk.

Get PCBs for Your Projects Manufactured

2_sS1dUXE2bz.PNG?auto=compress%2Cformat&
Ā 

You must check outĀ PCBWAYĀ for ordering PCBs online for cheap!

You get 10 good-quality PCBs manufactured and shipped to your doorstep for cheap. You will also get a discount on shipping on your first order. Upload your Gerber files ontoĀ PCBWAYĀ to get them manufactured with good quality and quick turnaround time. PCBWay now could provide a complete product solution, from design to enclosure production. Check out their online Gerber viewer function. With reward points, you can get free stuff from their gift shop. Also, check out this useful blog on PCBWay Plugin for KiCad fromĀ here.Ā Using this plugin, you can directly order PCBs in just one click after completing your design in KiCad.

Step 1: Flashing the Xiao nRF52840 Sense šŸš€

Getting it Talking!

Start by setting up your development environment. Youā€™ll want to upload the code to your Xiao, but first, you need toĀ flash the microcontrollerĀ with the right firmware.

Install the necessary tools:Ā Head toĀ Seeed StudioĀ and grab their official setup guide for the Xiao nRF52840 Sense. Youā€™ll needĀ Arduino IDEĀ and Xiao's board libraries. Piece of cake, right? šŸ°

Pro Tip: When uploading code, if your microcontroller throws a tantrum and doesnā€™t show up on your PC, double-tap the reset button to enter bootloader mode. Itā€™s like giving it a calming tea break. šŸ«–

Step 2: Wiring it up šŸ§‘ā€šŸ”§

Time to bring these components together like a superhero team-up! šŸ¦øā€ā™‚ļø

Connect the NeoPixel to the Xiao:

  • Power:Ā Connect theĀ VCCĀ pin of the NeoPixel to theĀ 3.3VĀ pin of the Xiao.
  • Ground:Ā GND to GND (itā€™s like their secret handshake šŸ¤).
  • Data:Ā Hook theĀ DINĀ (data in) pin from the NeoPixel toĀ Pin D6Ā on the Xiao.

VoilĆ , youā€™ve wired up your light show! Now, donā€™t plug it in just yet. Patience, young padawan. šŸ§˜ā€ā™‚ļø

Step 3: Code Time! āŒØļøšŸ‘¾

Weā€™re diving into the fun partā€”the code! This is where the Xiao's IMU will tell the NeoPixels how to light up depending on the motion.

Setting Up Libraries:

Make sure you have these libraries installed in your Arduino IDE:

  • Adafruit NeoPixelĀ (to control those flashy lights) šŸŒˆ
  • Wire.hĀ (for I2C communication)
  • Seeed nRF52Ā board libraries (to work with Xiao)
  • Adafruit SensorĀ for handling IMU data.
#include <Adafruit_NeoPixel.h>
#include <LSM6DS3.h>
#include <Wire.h>

#define PIN 0
#define NUMPIXELS 64

Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
LSM6DS3 myIMU(I2C_MODE, 0x6A);    // I2C device address 0x6A

float aX, aY, aZ, gX, gY, gZ;
const float accelerationThreshold = 2.5; // threshold of significant in G's
const int numSamples = 119;
int samplesRead = numSamples;

void setup() {
  Serial.begin(9600);
  while (!Serial);

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

  // Call .begin() to configure the IMU
  if (myIMU.begin() != 0) {
    Serial.println("Device error");
  } else {
    Serial.println("aX,aY,aZ,gX,gY,gZ");
  }
}

void loop() {
  // wait for significant motion
  while (samplesRead == numSamples) {
    // read the acceleration data
    aX = myIMU.readFloatAccelX();
    aY = myIMU.readFloatAccelY();
    aZ = myIMU.readFloatAccelZ();

    // sum up the absolutes
    float aSum = fabs(aX) + fabs(aY) + fabs(aZ);

    // check if it's above the threshold
    if (aSum >= accelerationThreshold) {
      // reset the sample read count
      samplesRead = 0;
      break;
    }
  }

  // check if all the required samples have been read since
  // the last time the significant motion was detected
  while (samplesRead < numSamples) {
    // read the acceleration and gyroscope data
    aX = myIMU.readFloatAccelX();
    aY = myIMU.readFloatAccelY();
    aZ = myIMU.readFloatAccelZ();
    gX = myIMU.readFloatGyroX();
    gY = myIMU.readFloatGyroY();
    gZ = myIMU.readFloatGyroZ();

    samplesRead++;

    // print the data in CSV format
    Serial.print(aX, 3);
    Serial.print(',');
    Serial.print(aY, 3);
    Serial.print(',');
    Serial.print(aZ, 3);
    Serial.print(',');
    Serial.print(gX, 3);
    Serial.print(',');
    Serial.print(gY, 3);
    Serial.print(',');
    Serial.print(gZ, 3);
    Serial.println();

    // Visualize the IMU data on the NeoPixel matrix
    visualizeIMU(aX, aY, aZ, gX, gY, gZ);

    if (samplesRead == numSamples) {
      // add an empty line if it's the last sample
      Serial.println();
    }
  }
}

void visualizeIMU(float aX, float aY, float aZ, float gX, float gY, float gZ) {
  // Map the acceleration and gyroscope data to colors
  uint8_t red = map(fabs(aX) * 100, 0, 250, 0, 255);
  uint8_t green = map(fabs(aY) * 100, 0, 250, 0, 255);
  uint8_t blue = map(fabs(aZ) * 100, 0, 250, 0, 255);

  // Set all pixels to the mapped color
  for (int i = 0; i < NUMPIXELS; i++) {
    pixels.setPixelColor(i, pixels.Color(red, green, blue));
  }
  pixels. Show();
}




Ā 

What's Happening in the Code? šŸ¤”

  • The IMU is your sensor. Weā€™re reading acceleration data on all three axes: X, Y, and Z.
  • The NeoPixels are the output. We map the motion detected by the IMU into a color value (RGB).
  • Mapping Motion to Color: We sum up the absolute values of the accelerations to determine how hard you shake or tilt the Xiao. More movement = crazier colors! šŸŽØ
image_Otlutsmvof.png?auto=compress%2Cfor
Ā 

Step 4: Test, Shake, and Dance! šŸ•ŗ

Once your code is uploaded, unplug the USB and plug it back in (just to give your Xiao a little reset!). Now the magic begins. šŸ¤¹ā€ā™‚ļø

Testing the Tilt:

  • Pick up your Xiao nRF52840 and gently tilt it. Youā€™ll see the NeoPixels lighting up in different colors.
  • Shake it a bit moreā€”see the color change? Now youā€™re in charge of the show!

If everything worked out, congrats, youā€™re now officially aĀ NeoPixel DJ! šŸŽ§šŸŽ¶ Want to sync it with music and start a rave? Go ahead! The only limit is your creativity (and the brightness tolerance of your neighbors... šŸ˜…).

Step 5: Going Wireless with Bluetooth! šŸ“”

Now letā€™s take it one step further. What if you could control this with your phone? Hereā€™s where theĀ BluetoothĀ capability of the Xiao nRF52840 Sense comes into play.

UsingĀ Bluetooth Low Energy (BLE), you can send motion data directly from your Xiao to an app on your phoneā€”or even control the colors remotely! The Xiao makes it super easy to set up BLE communication, and you can find libraries in Arduino to help with this.

Conclusion: Welcome to the Sparkle Party! šŸŽ†šŸŽ‰

Ā 

Now that you've brought your NeoPixels to life with motion-sensing IMU data, it's time to celebrate! This project opens up a world of possibilitiesā€”from creating interactive lighting for your room, and costumes, or even building motion-reactive wearables.

The only thing left is to challenge yourselfā€”can you use this setup to control music lights at a party? Sync with game controllers? Make a dancing robot? The worldā€™s your oyster, and the lights are your magic wand! šŸ§™ā€ā™‚ļøāœØ

Happy making, and may your LEDs forever shine bright!

Link to comment
Share on other sites


Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
  • Create New...