Go Down

Topic: Problema con sensore SHARP GP2Y0A21YK (Read 472 times) previous topic - next topic

ENDE

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);
}

uwefed

Non so cosa succede quando con un map() vai fuori range visto che i valori possibili sono da 0 a 1023.
Quote
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

ENDE

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...

pitusso

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.

ENDE

#4
Oct 05, 2012, 12:35 pm Last Edit: Oct 05, 2012, 12:40 pm by ENDE Reason: 1
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           
}

Madwriter

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
"Due cose sono infinite: l'universo e la stupidità umana, ma riguardo l'universo ho ancora dei dubbi..." Albert Einstein

ENDE

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

Go Up