IR Distance

Fra Holstebro HTX Wiki
Skift til: navigering, søgning
IR Distance modul

IR distance er et modul, der kan måle afstande mellem 10 cm og 80 cm som en analog spænding.

Afstanden bliver målt, ved at modulet udsender en lille infrarød lysstråle. Når den rammer et objekt, bliver strålen sendt tilbage mod modulet, hvorpå der sidder en fototransistor, der kan måle intensiteten af strålen[1].

Strålens intensitet måles med en AD-konverter (Analog-til-digital konverter). Jo højere AD-målingens værdi er, desto kortere er distancen.

Modulet skal tilsluttes GND og +5V, og det udsender analog spænding som en ikke-lineær i forhold til afstanden, for at kunne behandle dette i Arduinoen foretages en AD-måling af signalet, så det kan konverteres til en afstand.

Modulet er anskaffet i Kina[2] til en pris omkring $4 og er oprindeligt et Sharp produkt[3].


Elektrisk tilslutning

Modulet sluttes til arduinoen via et kabel med 3 ledere. Hver leder har sin egen farve og hører sammen med hver sin funktion:

Farve Funktion Arduino
Sort GND GND
Rød +5V +5V
Gul Signal A0 - A5

Software

Modulet kan testes med eksempelkoden AnalogInOutSerial fra eksempler i Arduinoen.

Der kan forekomme afvigende målinger af den analoge aflæsning - tit med +/- 20-30.

Det anbefales derfor når man arbejde med dette modul, at man definerer en grænseværdi gerne omkring +/- 5 på AD-målingen, samt at man gennemfører en midling af de tal man arbejder med.


En kode som benytter disse anbefalinger ses her:

/*
 Analog input, serial output

 Example from Tom Igoe

 Modified by Bent Arnoldsen
 
 This example code is in the public domain.

 */

// These constants won't change.  They're used to give names
// to the pins used:
const int analogInPin = A0;  // Analog input pin that the potentiometer is attached to

int sensorValue = 0;        // value read from the pot

double sensor;  // Konverterede værdier til afstandsbestemmelse
double dist;

// Variabler til midling
const int antal = 10;
int mean;
int arr [antal];
byte ptr = 0;
// Variabler til fejl-filtrering
byte errCnt = 0;
int maxDev = 5;
// Konstanter til konvertering til cm
const double fact = 10317.0;
const double eksp =-1.142;

void setup() {
  // initialize serial communications at 9600 bps:
  Serial.begin(9600);
}

void loop() {
  // read the analog in value:
  sensorValue = analogRead(analogInPin);

  // Beregn midling af værdierne i arrayet
  mean = 0;
  for (int n = 0; n < antal; n++) {
    mean += arr[n];
  }
  mean /= antal;

  // Filtrer værdier med for stor afvigelse fra
  if ((mean - maxDev) <= sensorValue && (mean + maxDev) >= sensorValue) {
    arr[ptr] = sensorValue;
    ptr++;
    errCnt = 0;
  } else {
    errCnt++;
    // Hvis fejlen fortsætter, så fyld arrayet med nuværende måling
    if (errCnt > 20) {
      for (int n = 0; n < antal; n++) {
        arr[n] = sensorValue;
      }
      errCnt = 0;
    Serial.print(mean);
    Serial.print(" - ");
      Serial.println(sensorValue);
    }
  }
  // Udskriv hver gang midlingsarrayet er fyldt
  if (ptr == antal) {
    ptr = 0;
    // print the results to the serial monitor:
    Serial.print("sensor = ");
    Serial.print(sensorValue);  // Sidste aflæsning
    Serial.print("\tMean = ");
    Serial.print(mean);         // Midlet måleværdi
    // Omregn til cm
    sensor = double(sensorValue);
    dist = fact * exp(eksp*log(sensor));
    Serial.print("\tDist = ");
    Serial.print(dist);         // Afstand i cm
    Serial.println(" cm");
  }
  
  // wait 20 milliseconds before the next loop
  // for the analog-to-digital converter to settle
  // after the last reading:
  delay(20);
}

Sammenhæng AD -> cm

Der opstilles et måle-setup, så der kan registreres stabile AD-målinger i forhold til antal cm. Der registreres følgende sammenhæng:

AD cm
575 3
633 5
544 8
442 10
300 15
234 20
194 25
164 30
144 35
128 40
104 50
92 60
82 70
71 80
64 90
60 100

Det er disse målinger der er plottet i grafen i næste afsnit.

Konvertering mellem AD og cm

Til konvertering fra AD-målingen til cm, kan man benytte følgende graf og funktion, som er blevet testet til at passe efter hensigten.

IR-distance-kurve.PNG

På grafen skal de yderste punkter ikke benyttes.

IR-distance-formel.PNG

Omskrivningen af funktionen foretages for at Arduinoen er kompatible med at regne formlerne.

Referencer