Problema con sensore SHARP GP2Y0A21YK

Ciao Ragazzi, sto usando un sensore SHARP GP2Y0A21YK per accendere un canale dei tre RGB della mia striscia led.

Il problema che sto incontrando è che il sensore sembra non essere affatto preciso, cerco di spiegarmi meglio :

il sensore ha un range di 10-80 cm, quando la mano è vicina sembra non esserci problemi, ma quando allontano la mano fino ad arrivare agli estremi 80cm le luci cominciano a "sfarfallare".

qualcuno sa dirmi se in effetti il sensore non è preciso o se il problema è un altro ? se fosse la precisione del sensore, posso correggerla in qualche modo ??

grazie

P.S. - posto lo sketch che sto usando

int ledPin = 9; // LED connected to digital pin 9
int sensorPin = 2; // value read from the sensor
int outputValue = 0; // value output to the PWM (analog out)

void setup() {
Serial.begin(9600);
}

void loop() {

// read the analog input
int analogValue = analogRead(sensorPin);

// NOTE: you should modify following script in according with your project goals, resistors and used sensors.

// Sensors return values from 0 until 1023 but I mapped them from 60 to 900 to get a better visual result.
// The map() method will return us a value from 0 to 255, good PWM values to turn on my LED
outputValue = map(analogValue, 60, 900, 0, 255);

// Some sensors, when their value is near to zero, return a variable value between 2 and 3, creating a loop
// that could generate bad visual effects. To avoid this issue I always turn off the LEd when sensor value is < 5
if (outputValue<5)
analogWrite(ledPin, 0);
else
analogWrite(ledPin, outputValue);

// print the result to the serial monitor
Serial.print(analogValue);
Serial.print(" : ");
Serial.print(outputValue);
Serial.println("----");

// wait 10 milliseconds for the analog-to-digital converter
delay(10);
}

Non so cosa succede quando con un map() vai fuori range visto che i valori possibili sono da 0 a 1023.

outputValue = map(analogValue, 60, 900, 0, 255);

Non so se il range di uscita continua sopra i 255 o rimane il limite 255 come numero piú grande possibile.

Per essere sicuro fatti stampare sia il valore analogico letto che i valore mappato attraverso la seriale sul terminale. Cosí scorpi cosa ti fa questi scherzetti. Visto che lo hai giá previsto che valori Ti vengono stampati?

Ciao Uwe

Ciao Uwe, i valori del sensore quando davanti non c'è niente è saltella tra 39 e 63, dando come valori di uscita tra 0 e 4...

apparentemente dai valori sul seriale il sensore ha un range che va da 0 a 660 , però se io lo setto a 900 funziona meglio quando mi avvicino...

Ciao,
ti conviene effettuare una serie di letture, e mediarle.
Questo ti evita tale comportamento, perchè i valori così ottenuti avranno fluttuazioni molto minori.
Se ti guardi l'esempio smoothing delll'IDE ti fai un'idea.

Ciao Pitusso, ho applicato il range del valore AVERAGE dello sketch smoothing, però non vedo nessuna differenza da prima...

dove sto sbagliando ??

grazie

sketch smoothing con modifica:

const int numReadings = 10;
int ledPin = 9;
int readings[numReadings]; // the readings from the analog input
int index = 0; // the index of the current reading
int total = 0; // the running total
int average = 0;
int outPut = 0;// the average

int inputPin = 0;

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[index];
// read from the sensor:
readings[index] = analogRead(inputPin);
// add the reading to the total:
total= total + readings[index];
// advance to the next position in the array:
index = index + 1;

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

// calculate the average:
average = total / numReadings;
// send it to the computer as ASCII digits
outPut = map(average, 70, 900, 0, 255);
if (outPut<5)
analogWrite(ledPin, 0);
else
analogWrite(ledPin, outPut);

Serial.println(average);
delay(0); // delay in between reads for stability
}

questo progetto usa il tuo sensore,fa un calibramento particolare ed è estremamente preciso prendine il codice e modificalo in base alle tue esigenze:
http://makeprojects.com/Project/Laser-Harp/690/1

Ciao Madwriter, è tutto il giorno che provo a capire e modificare il codice che mi hai indicato, però, data la mia conoscenza basica del linguaggio, ho delle serie difficoltà nel comprendere..

se non è chiedere troppo mi puoi dare delle indicazioni che mi possono aiutare ??

grazie