Czujnik ultradźwiękowy z Arduino
Wysyłanie i odbieranie sygnału w czujniku ultradźwiękowym działa na zasadzie echolokacji, czyli emitowania i odbierania sygnału ultradźwiękowego.
Prędkość dźwięku w powietrzu wynosi ok. 343 m/s. (w wodzie prędkość dźwięku jest ponad 4 razy większa)
Większość czujników ultradźwiękowych działa na częstotliwościach od 20 kHz do 70 kHz, najczęściej 40 kHz.
Wyższa częstotliwość oznacza krótsze fale, co daje większą precyzję przy pomiarze, ale zmniejsza zasięg detekcji (podstawowe sensory działają w przedziale od kilku cm do 3m).
Cyklicznie emitowane są krótkie impulsy (sygnały sinusoidalne), które mają określony czas trwania (zawyczaj kilka mikrosekund).
Zasada działania sensora:
Dla czujników pracujących na częstotliwości 40 kHz jeden okres fali wynosi około 25 mikrosekund. W praktyce jednak czujnik nie emituje pojedynczego okresu fali, ale serię kilku do kilkunastu cykli, zwykle od 5 do 10 pełnych cykli fali ultradźwiękowej.
To oznacza, że impulsy mają czas trwania około 200 mikrosekund.
Ustawienie pinu TRIG na stan wysoki przez 10us inicjuje wysłanie 8 cykli.
Po wysłaniu impulsu czujnik musi poczekać na odbicie (echo), zanim wyśle kolejny impuls. Po otrzymaniu fali powrotnej, ECHO ustawiony zostaje na stan wysoki i zaczyna zliczać czas (width), co docelowo przełoży się na odległość.
Prędkość dźwięku = 340m/s = 0.0343 cm/us
odległość = (czas echo * prędkość dźwięku) / 2
Czas oczekiwania zależy od maksymalnej odległości jaką czujnik ma mierzyć.
Dla przykładu, jeśli maksymalna odległość wynosi 4 metry, to czas potrzebny na przebycie tej odległości przez falę dźwiękową w obie strony (tam i z powrotem) to około: 2 x 4m / 343m/s ≈23.3milisekundy
Czujnik musi poczekać co najmniej ten czas, zanim wyśle kolejny impuls, aby uniknąć zakłóceń, w tym przypadu czas ten wynosi 38ms.
W przypadku, gdy fala nie wróci w ciągu 38ms, oznacza to brak przeszkód, co powoduje przełączenie pinu ECHO na stan LOW.
Cały cykl pomiarowy obejmuje czas emisji (impuls), czas oczekiwania na odbicie oraz czas przetworzenia sygnału. Typowe czujniki ultradźwiękowe mają częstotliwość pomiarów rzędu 10-50 Hz, co oznacza, że wykonują 10-50 pomiarów na sekundę. Czas potrzebny na jeden pełny cykl pomiarowy to od 20 do 100 milisekund.
Wynik pomiaru zależy od temperatury i wilgotności powietrza.
Czujnik 3pin
int cm = 0;
long readUltrasonicDistance(int triggerPin, int echoPin){
pinMode(triggerPin, OUTPUT);
digitalWrite(triggerPin, LOW);
delayMicroseconds(2);
digitalWrite(triggerPin, HIGH);
delayMicroseconds(10);
digitalWrite(triggerPin, LOW);
pinMode(echoPin, INPUT);
return pulseIn(echoPin, HIGH);
}
void setup(){
Serial.begin(9600);
}
void loop(){
cm = 0.01723 * readUltrasonicDistance(7, 7);
Serial.print(cm);
Serial.println("cm");
delay(100);
}
Ta sama funkcjonalność z użyciem millis
int interval = 100;
long lastTime = 0;
int cm = 0;
void setup(){
Serial.begin(9600);
}
long readUltrasonicDistance(int triggerPin, int echoPin){
pinMode(triggerPin, OUTPUT);
digitalWrite(triggerPin, LOW);
delayMicroseconds(2);
digitalWrite(triggerPin, HIGH);
delayMicroseconds(10);
digitalWrite(triggerPin, LOW);
pinMode(echoPin, INPUT);
return pulseIn(echoPin, HIGH);
}
void loop() {
long timeElapsed = millis();
if(timeElapsed - interval >= lastTime){
lastTime = timeElapsed;
cm = 0.01723 * readUltrasonicDistance(7, 7);
Serial.print(cm);
Serial.println("cm");
}
}
Czujnik ultradźwiękowy HC-SR04
int interval = 100;
long lastTime = 0;
int trigPin = 9;
int echoPin = 10;
float duration;
float distance;
void setup() {
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
Serial.begin(9600);
}
void readSensor(){
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = (duration * 0.0343)/2;
Serial.print("Distance: ");
Serial.println(distance);
}
void loop() {
long timeElapsed = millis();
if(timeElapsed - interval >= lastTime){
lastTime = timeElapsed;
readSensor();
}
}
Wyświetlenie odległości z biblioteką NewPing
#include <NewPing.h>
#define TRIGGER_PIN_0 8
#define ECHO_PIN_0 8
#define MAX_DISTANCE 400
NewPing sensor0(TRIGGER_PIN_0, ECHO_PIN_0, MAX_DISTANCE);
float distance0;
void setup() {
Serial.begin(9600);
}
void loop() {
distance0 = sensor0.ping_cm();
delay(20);
Serial.print("Distance 0 = ");
if (distance0 >= 400 || distance0 <= 2) {
Serial.println("Out of range");
} else {
Serial.print(distance0);
Serial.println(" cm");
delay(500);
}
delay(500);
}