Misurare distanze con lo Sharp GP2Y0A02YK0F

xlarge_irsensorlr-1.jpegEcco una comoda funzione di linearizzazione della curva del sensore Sharp GP2Y0A02YK0F con la conversione dei volt letti (da un ingresso analogico di Xduino) in mm. Come è possibile vedere dal datasheet, il sensore della Sharp ha un campo utile tra i 20cm e i 150cm, ma con un semplice accorgimento possiamo anche rilevare le distanze minori di 20cm. Come?

Semplice: immaginiamo di utilizzarlo su di un piccolo drone in movimento. Se si effettua una misura con il sensore e la si confronta con la successiva si può chiaramente determinare il movimento e a che distanza il drone è dall'ostacolo. Così, se l'ostacolo è a + di 20cm, avvicinandosi la distanza diminuisce, ma se invece la distanza (avanzando) aumenta (se si guarda le specifiche del GP2Y0A02YK0F si capisce cosa voglio dire), allora vuol dire che il sensore rileva un oggetto più vicino di 20cm. Così, con un semplice calcolo, è possibile determinare con discreta precisione anche distanze inferiori estendendo di fatto la portata del sensore (e chiaramente se il sensore viene utilizzato solo in distanze inferiori ai 20cm, sarà sufficiente sottrarre il valore letto, debitamente rapportato, al valore 20cm senza necessità di confronti successivi...). Il codice che segue è adatto all'uso con Arduino e simili:

#define PIN_ST   0	   //ingresso analogico

//variabili per gestione distanza (soppressione rumore)
#define BUFFER_DST   6
float buf_dst[BUFFER_DST];

//--- prototipo funzione
float leggiDistanza( void );

/*lettura distanza
  (cc) 2008-2010 Kokiua (alias L.M.) from Sorbolo (Parma) - Italy
  Creative Commons - http://creativecommons.org/licenses/by-nc-sa/3.0/
*/
float leggiDistanza( void ){
  float dst, media = 0;
  char i;
  dst = (0.5L*((float)analogRead( PIN_ST )))/10; //lettura in volt
  dst = (0.0082712905 + 939.57652 * dst) / (1.0L + -3.3978697 * dst + 17.339222 * dst * dst) * 100; //linearizza e converte in mm
  if(dst > 1500) dst = buf_dst[BUFFER_DST - 1]; //sopprime picchi disturbi vicino a 0 volt
  for( i=0; i < (BUFFER_DST - 1) ; i++){  //aggiorna il buffer calcolo media per soppressione rumore di fondo
    buf_dst[i] = buf_dst[i+1];
    media += buf_dst[i];
  }
  buf_dst[BUFFER_DST - 1] = dst;
  media = (media + dst) / BUFFER_DST;
  return media;
}

 

Tag: