Pages: [1]   Go Down
Author Topic: Problema con sensore SHARP GP2Y0A21YK  (Read 399 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Jr. Member
**
Karma: 0
Posts: 58
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

BZ (I)
Online Online
Brattain Member
*****
Karma: 251
Posts: 21243
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 58
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

0
Offline Offline
Edison Member
*
Karma: 24
Posts: 2290
Have you mooed today?
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Jr. Member
**
Karma: 0
Posts: 58
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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           
}
« Last Edit: October 05, 2012, 05:40:44 am by ENDE » Logged

Offline Offline
Edison Member
*
Karma: 28
Posts: 2031
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

"Due cose sono infinite: l'universo e la stupidità umana, ma riguardo l'universo ho ancora dei dubbi..." Albert Einstein

Offline Offline
Jr. Member
**
Karma: 0
Posts: 58
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Pages: [1]   Go Up
Jump to: