Due to high demand, expect some shipping delays at this time - orders may not ship for up to 2-3 business days.
0

NeoPixel Triggered Drums - Sensitivity Help
Moderators: adafruit_support_bill, adafruit

Please be positive and constructive with your questions and comments.

NeoPixel Triggered Drums - Sensitivity Help

by Tzabi on Wed Dec 29, 2021 2:07 pm

Hi guys!
I need help, yesterday i’v did the project of using gemma to trigger a blink in neopixels inside a drum, and it went well, but, because the trigger happens through a mic, I have some problems with it.
First, the drums trigger each other.
Second, the drums trigger the neopixel way too hard.
I’v tried to change the “sample” section at the code, but at some rate (after 440), not all of the led is triggered.
I only tried to change also number of pixels, didn’t help.
Im new to codes, so I’d really appreciate the help, maybe its something else in the code, maybe I need to change something extra.
The code:

Code: Select all | TOGGLE FULL SIZE
/* LED "Color Organ" for Adafruit Trinket and NeoPixel LEDs.

Hardware requirements:
- Adafruit Trinket or Gemma mini microcontroller (ATTiny85).
- Adafruit Electret Microphone Amplifier (ID: 1063)
- Several Neopixels, you can mix and match
o Adafruit Flora RGB Smart Pixels (ID: 1260)
o Adafruit NeoPixel Digital LED strip (ID: 1138)
o Adafruit Neopixel Ring (ID: 1463)

Software requirements:
- Adafruit NeoPixel library

Connections:
- 5 V to mic amp +
- GND to mic amp -
- Analog pinto microphone output (configurable below)
- Digital pin to LED data input (configurable below)

Written by Adafruit Industries. Distributed under the BSD license.
This paragraph must be included in any redistribution.
*/
#include <Adafruit_NeoPixel.h>

#define N_PIXELS 60 // Number of pixels you are using
#define MIC_PIN A1 // Microphone is attached to Trinket GPIO #2/Gemma D2 (A1)
#define LED_PIN 0 // NeoPixel LED strand is connected to GPIO #0 / D0
#define DC_OFFSET 0 // DC offset in mic signal - if unusure, leave 0
#define NOISE 100 // Noise/hum/interference in mic signal
#define SAMPLES 60 // Length of buffer for dynamic level adjustment
#define TOP (N_PIXELS +1) // Allow dot to go slightly off scale
// Comment out the next line if you do not want brightness control or have a Gemma
#define POT_PIN 3 // if defined, a potentiometer is on GPIO #3 (A3, Trinket only)

byte
peak = 0, // Used for falling dot
dotCount = 0, // Frame counter for delaying dot-falling speed
volCount = 0; // Frame counter for storing past volume data

int
vol[SAMPLES], // Collection of prior volume samples
lvl = 10, // Current "dampened" audio level
minLvlAvg = 0, // For dynamic adjustment of graph low & high
maxLvlAvg = 512;

Adafruit_NeoPixel strip = Adafruit_NeoPixel(N_PIXELS, LED_PIN, NEO_GRB + NEO_KHZ800);

void setup() {
//memset(vol, 0, sizeof(vol));
memset(vol,0,sizeof(int)*SAMPLES);//Thanks Neil!
strip.begin();
}
void loop() {
uint8_t i;
uint16_t minLvl, maxLvl;
int n, height;
n = analogRead(MIC_PIN); // Raw reading from mic
n = abs(n - 512 - DC_OFFSET); // Center on zero
n = (n <= NOISE) ? 0 : (n - NOISE); // Remove noise/hum
lvl = ((lvl * 7) + n) >> 3; // "Dampened" reading (else looks twitchy)

// Calculate bar height based on dynamic min/max levels (fixed point):
height = TOP * (lvl - minLvlAvg) / (long)(maxLvlAvg - minLvlAvg);

if(height < 0L) height = 0; // Clip output
else if(height > TOP) height = TOP;
if(height > peak) peak = height; // Keep 'peak' dot at top

// if POT_PIN is defined, we have a potentiometer on GPIO #3 on a Trinket
// (Gemma doesn't have this pin)
uint8_t bright = 255;
#ifdef POT_PIN
bright = analogRead(POT_PIN); // Read pin (0-255) (adjust potentiometer
// to give 0 to Vcc volts
#endif
strip.setBrightness(bright); // Set LED brightness (if POT_PIN at top
// define commented out, will be full)
// Color pixels based on rainbow gradient
for(i=0; i<N_PIXELS; i++) {
if(i >= height)
strip.setPixelColor(i, 0, 0, 0);
else
strip.setPixelColor(i,Wheel(map(i,0,strip.numPixels()-1,30,150)));
}

strip.show(); // Update strip

vol[volCount] = n; // Save sample for dynamic leveling
if(++volCount >= SAMPLES) volCount = 0; // Advance//roll over sample counter

// Get volume range of prior frames
minLvl = maxLvl = vol[0];
for(i=1; i<SAMPLES; i++) {
if(vol[i] < minLvl) minLvl = vol[i];
else if(vol[i] > maxLvl) maxLvl = vol[i];
}
// minLvl and maxLvl indicate the volume range over prior frames, used
// for vertically scaling the output graph (so it looks interesting
// regardless of volume level). If they're too close together though
// (e.g. at very low volume levels) the graph becomes super coarse
// and 'jumpy'...so keep some minimum distance between them (this
// also lets the graph go to zero when no sound is playing):
if((maxLvl - minLvl) < TOP) maxLvl = minLvl + TOP;
minLvlAvg = (minLvlAvg * 63 + minLvl) >> 6; // Dampen min/max levels
maxLvlAvg = (maxLvlAvg * 63 + maxLvl) >> 6; // (fake rolling average)
}

// Input a value 0 to 255 to get a color value.
// The colors are a transition r - g - b - back to r.
uint32_t Wheel(byte WheelPos) {
if(WheelPos < 85) {
return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
} else if(WheelPos < 170) {
WheelPos -= 85;
return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
} else {
WheelPos -= 170;
return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
}
}
Last edited by adafruit_support_bill on Sat Jan 15, 2022 3:04 pm, edited 1 time in total.
Reason: Please use [code] tags when posting code to the forums.

Tzabi
 
Posts: 14
Joined: Wed Dec 08, 2021 8:31 am

Re: NeoPixel Triggered Drums - Sensitivity Help

by Tzabi on Sat Jan 15, 2022 2:50 pm

*Bump*

Tzabi
 
Posts: 14
Joined: Wed Dec 08, 2021 8:31 am

Re: NeoPixel Triggered Drums - Sensitivity Help

by adafruit_support_bill on Sat Jan 15, 2022 3:09 pm

First, the drums trigger each other.
Second, the drums trigger the neopixel way too hard.

You could add a pot between the mic and the Gemma to adjust the signal level. Connect one of the outer legs to GND and the other outer leg to the mic output. Then connect the center leg to D2.

https://www.adafruit.com/product/356

adafruit_support_bill
 
Posts: 83822
Joined: Sat Feb 07, 2009 10:11 am

Re: NeoPixel Triggered Drums - Sensitivity Help

by Tzabi on Tue Jan 18, 2022 5:02 am

adafruit_support_bill wrote:
First, the drums trigger each other.
Second, the drums trigger the neopixel way too hard.

You could add a pot between the mic and the Gemma to adjust the signal level. Connect one of the outer legs to GND and the other outer leg to the mic output. Then connect the center leg to D2.

https://www.adafruit.com/product/356


Hi!
Thanks for the advice.
But how can a pot help me?
I'm very new to this, but I'v just rad that a pot decreases \ increases the signal.
So can't something be changed in the code to increase the threshold instead of decreasing the signal?
It's sounds the same to me.

Tzabi
 
Posts: 14
Joined: Wed Dec 08, 2021 8:31 am

Re: NeoPixel Triggered Drums - Sensitivity Help

by adafruit_support_bill on Tue Jan 18, 2022 5:49 am

Yes, the pot decreases the signal. You can achieve similar results in software by increasing the NOISE value, but that works only to a limited extent. Increasing the NOISE value decreases the dynamic range so not all of your LEDs get triggered.

Using a POT, you can decrease the actual signal level, so you can keep the NOISE value low. That allows you to lower the sensitivity without decreasing the dynamic range.

adafruit_support_bill
 
Posts: 83822
Joined: Sat Feb 07, 2009 10:11 am

Re: NeoPixel Triggered Drums - Sensitivity Help

by Tzabi on Tue Jan 18, 2022 6:56 am

Ooo alright, Thanks!
I would like to ask another thing, I just tried upload the code again to my Gemma, and this is the error I got:

In file included from /Users/tzabi/Documents/Arduino/Led_Drums_-_Triggered_Version/Led_Drums_-_Triggered_Version.ino:1:
/Users/tzabi/Documents/Arduino/libraries/Adafruit_NeoPixel/rp2040_pio.h:9:10: fatal error: hardware/pio.h: No such file or directory
9 | #include "hardware/pio.h"

I used exactly the same sketch when I uploaded the code to my Gemma a few days ago, and now it gives me this error, do you know what it means?
From minimal understanding, I think it doesn't recognise the file rp2040_pioh, so I updated everything, not working, and tried to put the NeoPixel library inside of the sketch folder, didn't work either.

Tzabi
 
Posts: 14
Joined: Wed Dec 08, 2021 8:31 am

Re: NeoPixel Triggered Drums - Sensitivity Help

by adafruit_support_bill on Tue Jan 18, 2022 7:28 am

It is finding the rp2040_pio.h just fine. But that file includes "hardware/pio.h" which is part of the "Raspberry Pi Pico" board package. That is the one it is having trouble finding.
Code: Select all | TOGGLE FULL SIZE
#include "hardware/pio.h"


Try updating the Raspberry Pi Pico boards package via Tools->Board->Boards Manager.

adafruit_support_bill
 
Posts: 83822
Joined: Sat Feb 07, 2009 10:11 am

Re: NeoPixel Triggered Drums - Sensitivity Help

by Tzabi on Tue Jan 18, 2022 9:02 am

adafruit_support_bill wrote:It is finding the rp2040_pio.h just fine. But that file includes "hardware/pio.h" which is part of the "Raspberry Pi Pico" board package. That is the one it is having trouble finding.
Code: Select all | TOGGLE FULL SIZE
#include "hardware/pio.h"


Try updating the Raspberry Pi Pico boards package via Tools->Board->Boards Manager.


Thanks you! that worked.
Back to the pot,
I'm afraid the mic is clipping so a pot won't help, how can I find that out?
Gemma doesn't return any values so I can't be sure, and by reading the microphone description, I don't get any information about it.
This is the mic:
https://www.adafruit.com/product/1063

Tzabi
 
Posts: 14
Joined: Wed Dec 08, 2021 8:31 am

Re: NeoPixel Triggered Drums - Sensitivity Help

by adafruit_support_bill on Tue Jan 18, 2022 9:15 am

I'm afraid the mic is clipping

The mic has adjustable gain. If it is clipping you can reduce the gain. (The trim-pot on the mic is delicate, so be sure not to force it past the stop when adjusting.)
https://learn.adafruit.com/adafruit-mic ... ep-2047081

Gemma doesn't return any values

You mean that your code doesn't return any values. You can add some println statements to your code to print the values to the serial monitor.
https://www.arduino.cc/reference/en/lan ... l/println/
https://learn.adafruit.com/adafruit-ard ... al-monitor

adafruit_support_bill
 
Posts: 83822
Joined: Sat Feb 07, 2009 10:11 am

Re: NeoPixel Triggered Drums - Sensitivity Help

by Tzabi on Tue Jan 18, 2022 10:03 am

adafruit_support_bill wrote:
I'm afraid the mic is clipping

The mic has adjustable gain. If it is clipping you can reduce the gain. (The trim-pot on the mic is delicate, so be sure not to force it past the stop when adjusting.)
https://learn.adafruit.com/adafruit-mic ... ep-2047081

Gemma doesn't return any values

You mean that your code doesn't return any values. You can add some println statements to your code to print the values to the serial monitor.
https://www.arduino.cc/reference/en/lan ... l/println/
https://learn.adafruit.com/adafruit-ard ... al-monitor


That is great! thank you :)
I thought I rad somewhere that Gemma can't send values back... guess I was wrong :)
I wanted to ask, because I'm printing values back that I'm not sure who matters, what is the unknown that get's a value and decides if to blink the LED or not, and which unknown decides the threshold?

Tzabi
 
Posts: 14
Joined: Wed Dec 08, 2021 8:31 am

Re: NeoPixel Triggered Drums - Sensitivity Help

by adafruit_support_bill on Tue Jan 18, 2022 10:41 am

I thought I rad somewhere that Gemma can't send values back... guess I was wrong :)

The original Gemma did not. The newer Gemma M0 does.

But the RP2040 you are using is not even a Gemma. It is a much more powerful processor and more than capable of serial communication.

adafruit_support_bill
 
Posts: 83822
Joined: Sat Feb 07, 2009 10:11 am

Re: NeoPixel Triggered Drums - Sensitivity Help

by Tzabi on Tue Jan 18, 2022 10:45 am

adafruit_support_bill wrote:
I thought I rad somewhere that Gemma can't send values back... guess I was wrong :)

The original Gemma did not. The newer Gemma M0 does.

But the RP2040 you are using is not even a Gemma. It is a much more powerful processor and more than capable of serial communication.


I'm not using RP2040, Im using Gemma,
Bought everything according to the guide Adafruit posted about drums triggering neopixel, which is a lie for now.

Tzabi
 
Posts: 14
Joined: Wed Dec 08, 2021 8:31 am

Re: NeoPixel Triggered Drums - Sensitivity Help

by adafruit_support_bill on Tue Jan 18, 2022 11:10 am

But you were compiling for the RP2040 in your earlier post:
posting.php?mode=reply&f=8&t=186734#pr907396

If you are using a Gemma (or Gemma M0), you will need to select the appropriate Gemma board in Tools->Boards.

adafruit_support_bill
 
Posts: 83822
Joined: Sat Feb 07, 2009 10:11 am

Re: NeoPixel Triggered Drums - Sensitivity Help

by Tzabi on Tue Jan 18, 2022 11:17 am

adafruit_support_bill wrote:But you were compiling for the RP2040 in your earlier post:
posting.php?mode=reply&f=8&t=186734#pr907396

If you are using a Gemma (or Gemma M0), you will need to select the appropriate Gemma board in Tools->Boards.


I have selected it, and only it, never tried to select anything else.
This is just an error that the software gave me, Idk why.
Can you help me with figuring out this code? which line decides the threshold and which unknown is responsible for the blink?

Tzabi
 
Posts: 14
Joined: Wed Dec 08, 2021 8:31 am

Re: NeoPixel Triggered Drums - Sensitivity Help

by adafruit_support_bill on Tue Jan 18, 2022 11:28 am

The "NOISE" constant on line 29 defines the noise threshold:
Code: Select all | TOGGLE FULL SIZE
    #define NOISE 100 // Noise/hum/interference in mic signal


The "height" variable is used to calculate how many LEDs to light up. This calculation takes place on lines 57-63:
Code: Select all | TOGGLE FULL SIZE
    int n, height;
    n = analogRead(MIC_PIN); // Raw reading from mic
    n = abs(n - 512 - DC_OFFSET); // Center on zero
    n = (n <= NOISE) ? 0 : (n - NOISE); // Remove noise/hum
    lvl = ((lvl * 7) + n) >> 3; // "Dampened" reading (else looks twitchy)

    // Calculate bar height based on dynamic min/max levels (fixed point):
    height = TOP * (lvl - minLvlAvg) / (long)(maxLvlAvg - minLvlAvg);

adafruit_support_bill
 
Posts: 83822
Joined: Sat Feb 07, 2009 10:11 am

Please be positive and constructive with your questions and comments.