IR Distance

Fra HTX Arduino
Spring til navigation Spring til 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

Arduino-Modul-Oversigt
Arduino Generelt: Biblioteker - Board - Driver - Shield - Arduino Analog - Arduino Seriel

Arduino-typer: Arduino UNO - Arduino Nano - Arduino Pro Mini - Arduino MEGA 2560 - LiliyPad Mikrocontroller - Arduino DUE - WeMOS

Input-moduler Trådløse: Bluetooth - Transceiver modul - WiFi Modul - SMS Modul - I2C-RF-modtager - RF Link - GPRS/GSM - GSM_Modul

Sensorer: GPS - Strøm-sensor - I2C Humidity - Lys og Nærhed - Magnetisk Kompas - I2C barometer - Farvegenkendelsesmodul - Alkoholsensor - Accelerometer - I2C Accelerometer - I2C Gyroskop - Vejecelleforstærker - IR Distance - AC Strømsensor - Afstand - XY Joystick - Humidity - Tryksensor - Vindhastighedsmåler
Photo og IR: IR Fjernbetjening - Photo Interrupter - IR Modtager - Bevægelsescensor - Photo Refleks Sensor - VGA Kamera
Power: Power Adapter - Lithium Batteri
Lager: SD Kort
Konvertere: I2C AD-konverter
Funktionsmoduler: RFID-modul - Matrix tastatur - DS1307 RTC - ENC28J60 Ethernet - IO Expander
Touch Display: Touch Display

Output-moduler Trådløse: Bluetooth - RF Link - GPRS/GSM - Transceiver modul - WiFi Modul - SMS Modul

Display: Display Shield - Touch Display - Arduino Display - Nokia 5110 Display - Dot-Matrix - Lys-avis - I2C Display
Funktionsmoduler: Lydgiver - Lydmodul - Relæ modul - Audio Power Forstærker - ENC28J60 Ethernet - Peltier Element - IO Expander
Hukommelse: SD Kort
Motorer: Stepper Motor Driver - Stepper med Accelleration - Servo

I2C-Moduler Funktionsmoduler: DS1307 RTC - I2C-RF-modtager - I2C tastatur

Sensorer: I2C Humidity - Magnetisk Kompas - I2C barometer - I2C Accelerometer - I2C Gyroskop
Konvertere: I2C AD-konverter
Display: I2C Display