mercoledì 24 agosto 2016

Distanziometro VL6180X

In un precedente post avevo cercato di usare un sensore ultrasonico per misurare una distanza con una approssimazione di 1 mm ma senza grandi risultati

Ho quindi provato il sensore VL6180X della ST montato da Pololu su un breakout, un sistema che e' sostanzialmente un piccolo lidar ad infrarossi molto piccolo ed economico (circa 10 euro) con connessione I2C che calcola il tempo di ritorno di un impulso luminoso. Il sensore ha un raggio di azione massimo di 20 cm ma funziona al meglio entro i 10 cm


Per interfacciarsi con Arduino si puo' usare la comoda libreria

Effettuando 1000 misure e mediando il dato e spostando il bersaglio di circa 1mm (non ho la possibilita' di verificare che gli spostamenti siano effettivamente di 1mm, sono piuttosto interessato a vedere il valore della standard deviation)

Nella seconda riga c'e' un errore sul valore della misura. il valore di St.Dev e' corretto

come si deve il valore della StDev e' circa la meta' di quella ottenuta con il sensore ultrasonico SR-04. Da varie esperienze si puo' dire che un valore di riferimento sulla standard deviation e' di 1.3 mm

Il vantaggio rispetto al SR-04 e' che si tratta di una misura sostanzialmente assoluta perche' e' indipendente dalla riflettanza del bersaglio e non risente dell'illuminazione ambientale perche' ha un altro sensore per la correzione

Di seguito lo sketch utilizzato
-------------------------------------------------------------------
#include <Wire.h>
#include <VL6180X.h>
#include "Statistic.h"


VL6180X sensor;
Statistic myStats;


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

  sensor.init();
  sensor.configureDefault();
  sensor.setTimeout(500);

  myStats.clear();
}

void loop()
{
  for (int t=0;t<1000;t++)
    {
    if (!sensor.timeoutOccurred())
          {
            myStats.add(sensor.readRangeSingleMillimeters());
            }
    }
   
    Serial.print("  Count: ");
    Serial.println(myStats.count());
    Serial.print("  Min: ");
    Serial.println(myStats.minimum(),4);
    Serial.print("  Max: ");
    Serial.println(myStats.maximum(),4);
    Serial.print("  Average: ");
    Serial.println(myStats.average(), 4);
    // uncomment in Statistic.h file to use stdev
    #ifdef STAT_USE_STDEV
    Serial.print("  pop stdev: ");
    Serial.println(myStats.pop_stdev(), 4);
    Serial.print("  unbias stdev: ");
    Serial.println(myStats.unbiased_stdev(), 4);
    #endif
    Serial.println("=====================================");
    myStats.clear();
    delay(10000);
}