Thursday, February 4, 2016

Code Challenges

Next challenge was learning how to optimize code for each individual sensor.

One challenge that I had faced during testing the flex sensors was that there was a lot of inconsistent data being sent.
The data was very sporadic and jumped up and down very quickly causing very rough control within the audio program.

I tried doing some math to get things working but it didn't work out too well.
I kept doing research and eventually came across this arduino page about data Smoothing.

https://www.arduino.cc/en/Tutorial/Smoothing

This is exactly what I needed. Now the data is much smoother and the sensor is much easier to control.

The other problem, as far as code goes, was getting the pressure sensors to register the peak value so that I could use the FSRs as velocity sensitive devices.
I have yet to really improve this but so far I just have a delay after the sensor registers a trigger value simulating when the peak of the tap should be.


 

Heres the code for smoothing:

/*

  Smoothing

  Reads repeatedly from an analog input, calculating a running average
  and printing it to the computer.  Keeps ten readings in an array and
  continually averages them.

  The circuit:
    * Analog sensor (potentiometer will do) attached to analog input 0

  Created 22 April 2007
  By David A. Mellis  <dam@mellis.org>
  modified 9 Apr 2012
  by Tom Igoe
  http://www.arduino.cc/en/Tutorial/Smoothing

  This example code is in the public domain.


*/



// Define the number of samples to keep track of.  The higher the number,
// the more the readings will be smoothed, but the slower the output will
// respond to the input.  Using a constant rather than a normal variable lets
// use this value to determine the size of the readings array.
const int numReadings = 10;

int readings[numReadings];      // the readings from the analog input
int readIndex = 0;              // the index of the current reading
int total = 0;                  // the running total
int average = 0;                // the average

int inputPin = A0;

void setup() {
  // initialize serial communication with computer:
  Serial.begin(9600);
  // initialize all the readings to 0:
  for (int thisReading = 0; thisReading < numReadings; thisReading++) {
    readings[thisReading] = 0;
  }
}

void loop() {
  // subtract the last reading:
  total = total - readings[readIndex];
  // read from the sensor:
  readings[readIndex] = analogRead(inputPin);
  // add the reading to the total:
  total = total + readings[readIndex];
  // advance to the next position in the array:
  readIndex = readIndex + 1;

  // if we're at the end of the array...
  if (readIndex >= numReadings) {
    // ...wrap around to the beginning:
    readIndex = 0;
  }

  // calculate the average:
  average = total / numReadings;
  // send it to the computer as ASCII digits
  Serial.println(average);
  delay(1);        // delay in between reads for stability
}
 

No comments:

Post a Comment