IR Distance: Forskelle mellem versioner
htx_>Bar Ingen redigeringsopsummering |
Bar (diskussion | bidrag) m 1 version importeret |
(Ingen forskel)
| |
Versionen fra 22. okt. 2022, 22:35

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.
På grafen skal de yderste punkter ikke benyttes.
Omskrivningen af funktionen foretages for at Arduinoen er kompatible med at regne formlerne.