Hello:
I am a novice. How would I begin to structure a PB project that uses the accelerometer to switch between 4 patterns in an array?
Thanks,
Hello:
I am a novice. How would I begin to structure a PB project that uses the accelerometer to switch between 4 patterns in an array?
Thanks,
Hey! Good to see you again.
Here’s the steps I’d go through to do this:
beforeRender()
check the current accelerometer values in accelerometer[0..2]
and select which mode or sub-pattern you want to use.Thanks. Good to see you again as well.
My plan is to:
1: Scale the accelerometer values so that they are close to 1
2: Take the absolute value
3: Change to the next pattern in the array if the accelerator value is > 1
4: Reset the counter after reaching the last pattern in the array
Am I missing anything?
That sounds good. Could work quite well.
Note the example code on that Sensor Board page, “Shake to switch patterns” - it might be very close to what you’re looking for. In beforeRender()
:
debounce = clamp(debounce + delta, 0, 2000) // Prevent overflow
// Cycle mode if sensor board is shaken, no more than 1x / sec
if (debounce > 1000 && totalAcceleration > 0.03) {
mode = (mode + 1) % 3
debounce = 0
}
It uses the remainder operator (%
) to roll back to the first pattern after making its way through them all. That’s an alternative to counting mode changes and resetting the counter.
Second is the debouncing. If you don’t debounce, IE, wait a bit after each detected change in acceleration before allowing it to change again, it will cycle patterns so quickly that it will feel random to the user. This accumulates delta
milliseconds and doesn’t allow another mode change unless at least a second has passed since the last mode change.
I found the Shake to Switch Modes code on the [Sensor Expansion Board] page). It didn’t occur to me to check there. Cheers!
// Shake to switch modes
export var accelerometer // Enable the accelerometer
mode = debounce = 0
export function beforeRender(delta) {
// 3D vector sum of x, y, and z acceleration
totalAcceleration = sqrt(
accelerometer[0] * accelerometer[0] +
accelerometer[1] * accelerometer[1] +
accelerometer[2] * accelerometer[2]
)
debounce = clamp(debounce + delta, 0, 2000) // Prevent overflow
// Cycle mode if sensor board is shaken, no more than 1x / sec
if (debounce > 1000 && totalAcceleration > 0.03) {
mode = (mode + 1) % 3
debounce = 0
}
}
h = s = v = 1
modes = array(3)
modes[0] = (index) => { h = 1 - index / pixelCount / 4; v = 1 }
modes[1] = (index) => { h = 0.5; v = index % 2 }
modes[2] = (index) => { h = wave((index+wave(time(0.04))*5)/pixelCount)*6; v = 0.1+random(wave(time(0.03))) }
export function render(index) {
modes[mode](index)
hsv(h, s, v)
}
@ Jeff. Thanks for the debounce explanation. I was struggling to understand its function.