Czujnik ultradźwiękowy HC-SR04 jest tanim czujnikiem odległości zdolnym do bezdotykowego pomiaru odległości w zakresie 20 - 400cm z dokładnością do 3mm. Czujnik składa się z nadajnika i odbiornika o częstotliwości pracy około 40kHz. Wykorzystuje on zasadę echa do pomiaru odległości poprzez emisję fali ultradźwiękowej o częstotliwości 40kHz.
Jeśli na jej drodze znajdzie się jakiś obiekt, emitowana fala zostaje odbita, a odbity sygnał jest odbierany przez odbiornik. Czas, jaki upłynął pomiędzy nadaniem sygnału a odbiorem echa jest wykorzystywany do określenia odległości pomiędzy czujnikiem a obiektem znajdującym się na jego drodze.
Czujnik posiada cztery piny, VCC, GND, Trig i Echo z trig i echo reprezentujących piny nadajnika i odbiornika, odpowiednio.
Nietóre parametry czujnika:
- Zasilanie: +5V DC
- Prąd spoczynkowy: <2mA
- Prąd roboczy: 15mA
- Kąt skuteczny: <15°
- Zakres odległości: 2cm…400 cm/1″…13ft
- Rozdzielczość: 0,3 cm
- Kąt pomiaru: 30 stopni
- Szerokość wyzwalającego impulsu wejściowego: 10uS
- Wymiary: 45mm × 20mm × 15mm
Celem tego projektu będzie zmierzenie odległości za pomocą czujnika ultradźwiękowego i wyświetlenie jej zarówno na monitorze szeregowym jak i na wyświetlaczu LCD telefonu Nokia 5110.
Połącz komponenty tak jak pokazano na poniższym schemacie.
Aby ułatwić śledzenie schematów poniżej opisano mapy pinów pokazujące jak poszczególne komponenty łączą się z innymi. Połączenie wyświetlacza LCD N0kia 5110 z Arduino można łatwo wykonać przy pomocy map pinów. Czujnik ultradźwiękowy jest bardzo łatwym komponentem do pracy, ma tylko cztery piny i wszystkie na tym samym poziomie napięcia/logiki, na którym działa Arduino, co czyni go prawie plug and play.
Sprawdź jeszcze raz połączenia, aby upewnić się, że wszystko jest tak, jak powinno być.
Kod
Istnieją dwa kody do tego projektu, pierwszy jest dla osób, które nie posiadają wyświetlacza LCD Nokii5110 i wygodnie jest im oglądać dane na monitorze szeregowym, drugi integruje wyświetlacz LCD i pozwala na wyświetlanie wartości na LCD.
Działanie kodu można lepiej zrozumieć przechodząc przez opis działania HC-SR04 zamieszczony powyżej. Celem kodu jest, najprościej mówiąc, wysłanie sygnału przez pin wyzwalający czujnika ultradźwiękowego i obliczenie czasu potrzebnego na odebranie sygnału z powrotem przez pin echa czujnika. Przeliczenie tego czasu na odległość i wyświetlenie go albo na monitorze szeregowym (przykładowy kod 1) albo na wyświetlaczu LCD Nokii 511o (przykładowy kod 2). Oba kody, jak zwykle, są dołączone do pliku zip w sekcji download.
Kod dla miernika odległości bez wyświetlacza
Pierwszą rzeczą, którą zrobimy jest zadeklarowanie pinów Arduino, do których podłączone są piny czujnika ultradźwiękowego.
//Written by Nick Koumaris
//info@educ8s.tv
//educ8s.tv
#define echoPin 6 // Echo Pin
#define trigPin 7 // Trigger Pin
Następnie inicjalizujemy zmienne, które będą używane do przechowywania niektórych informacji, z którymi będziemy pracować.
int maximumRange = 250; // Maximum range needed
int minimumRange = 1; // Minimum range needed
long duration, distance; // Duration used to calculate distance
Mając to już za sobą, przechodzimy do funkcji void setup(). Ponieważ będziemy głównie używać monitora szeregowego do wyświetlania odległości, musimy go zainicjalizować, z szybkością transmisji 9600, po czym ustawimy tryb pinów czujnika, ustawiając pin wyzwalający jako wyjściowy, a pin echa jako wejściowy.
void setup() {
Serial.begin (9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
}
Następnie piszemy funkcję void loop().
Aby uprościć sprawę, funkcja została użyta do uzyskania odległości od czujnika ultradźwiękowego, a następnie wyświetlenia jej w pętli void. Pierwszą rzeczą, którą robimy jest wywołanie funkcji, aby odczytać odległość, następnie używamy instrukcji if, aby sprawdzić, czy odległość odczytana przez czujnik, jest w zakresie czujnika, aby zredukować błąd, który występuje, gdy limit czujnika zostanie przekroczony.
Jeśli czujnik jest w zasięgu, to jest on drukowany, w przeciwnym razie wyświetlany jest komunikat out of range.
void loop() {
readDistance();
if(distance>minimumRange && distance < maximumRange)
{
Serial.println(distance);
}else
{
Serial.println("Out of range...");
}
delay(50);
}
Obliczanie odległości odbywa się za pomocą funkcji readdistance(). Funkcja ta określa odległość wysyłając sygnał impulsowy przez pin trig, ustawiając go w stan niski i wysoki z opóźnieniem, a echo jest odbierane przez pin echo za pomocą wbudowanej w Arduino funkcji pulsein. Zgodnie z danymi zawartymi w arkuszu danych, czas jest dzielony przez 58.2, aby uzyskać odległość w cm.
int readDistance()
{
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = duration/58.2;
}
Pełny kod jest dostępny poniżej.
//Written by Nick Koumaris
//info@educ8s.tv
//educ8s.tv
#define echoPin 6 // Echo Pin
#define trigPin 7 // Trigger Pin
int maximumRange = 250; // Maximum range needed
int minimumRange = 1; // Minimum range needed
long duration, distance; // Duration used to calculate distance
void setup() {
Serial.begin (9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
}
void loop() {
readDistance();
if(distance>minimumRange && distance < maximumRange)
{
Serial.println(distance);
}else
{
Serial.println("Out of range...");
}
delay(50);
}
int readDistance()
{
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = duration/58.2;
}
Kod dla miernika odległości z wyświetlaczem
Drugi kod, jak wyjaśniono wcześniej, jest przeznaczony dla tych, którzy mają wyświetlacz LCD w Nokii 5110.
Aby móc w łatwy sposób korzystać z wyświetlacza Nokia 5110 LCD, będziemy używać jego biblioteki, którą można pobrać z tego linku. Aby nadać wyświetlaczowi odpowiedni wygląd stworzyliśmy plik UI, który jest częścią pliku z kodem LCD dołączonego do pliku zip w sekcji download. Jak pracować z wyświetlaczem LCD Nokii 5110 w celu stworzenia własnego UI, własnych grafik itp. zostało omówione tutaj.
Aby rozpocząć pracę z kodem, dołączamy bibliotekę LCD i definiujemy piny, do których podłączone są czujnik ultradźwiękowy i LCD w Arduino.
//Written by Nick Koumaris
//info@educ8s.tv
//educ8s.tv
#include <LCD5110_Graph.h>
#define echoPin 6 // Echo Pin
#define trigPin 7 // Trigger Pin
LCD5110 lcd(8,9,10,12,11);
Następnie deklarujemy czcionkę, która będzie używana dla LCD i pliku UI.
extern unsigned char BigNumbers[];
extern uint8_t ui[];
Następnie ustawiamy minimalny i maksymalny zakres wartości, które rozpoznaje czujnik ultradźwiękowy oraz deklarujemy zmienne, (distance i duration), które będą używane do przechowywania odpowiednich danych w kodzie.
int maximumRange = 250; // Maximum range needed
int minimumRange = 1; // Minimum range needed
long duration, distance; // Duration used to calculate distance
Następnie przechodzimy do funkcji setup(), w której ustawiamy tryby pinów czujnika ultradźwiękowego, po czym inicjalizujemy LCD i instruujemy go, aby używał czcionek, które zadeklarowaliśmy na początku.
void setup() {
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
lcd.InitLCD();
lcd.setFont(BigNumbers);
}
Po wykonaniu tych czynności przechodzimy do sekcji pętli void.
Inicjalizujemy długość ciągu znaków na zero, czyścimy ekran, a następnie rysujemy stworzony przez nas UI, po czym wywołujemy funkcję read distance, obliczamy długość ciągu znaków otrzymanej odległości i wyświetlamy ją na LCD za pomocą funkcji print distance.
void loop() {
int stringLength = 0;
lcd.clrScr();
lcd.drawBitmap(0, 0, ui, 84, 48);
distanceString = readSensor();
stringLength = distanceString.length();
printDistance(stringLength);
lcd.update();
delay(50);
}
Pełny kod dostępny jest poniżej.
//Written by Nick Koumaris
//info@educ8s.tv
//educ8s.tv
#include <LCD5110_Graph.h>
#define echoPin 6 // Echo Pin
#define trigPin 7 // Trigger Pin
LCD5110 lcd(8,9,10,12,11);
extern unsigned char BigNumbers[];
extern uint8_t ui[];
int maximumRange = 250; // Maximum range needed
int minimumRange = 1; // Minimum range needed
long duration, distance; // Duration used to calculate distance
String distanceString = "0";
void setup() {
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
lcd.InitLCD();
lcd.setFont(BigNumbers);
}
void loop() {
int stringLength = 0;
lcd.clrScr();
lcd.drawBitmap(0, 0, ui, 84, 48);
distanceString = readSensor();
stringLength = distanceString.length();
printDistance(stringLength);
lcd.update();
delay(50);
}
void printDistance(int length)
{
switch(length)
{
case 1: lcd.print(distanceString,38,19); break;
case 2: lcd.print(distanceString,24,19); break;
case 3: lcd.print(distanceString,10,19); break;
default: lcd.print(distanceString,0,19); break;
}
}
String readSensor()
{
String distanceS = "0";
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = duration/58.2;
distanceS = String(distance);
if(distance>maximumRange || distance<minimumRange)
{
distanceS = "---";
}
delay(50);
return distanceS;
}
Podłącz płytkę Arduino do komputera, uruchom IDE i wklej do niego kod. Nie zapomnij dodać pliku UI do folderu Arduino sketch dla kodu przed załadowaniem, ponieważ może to spowodować wystąpienie błędów. Plik UI jest częścią plików znajdujących się w pliku zip w sekcji downloads.
Załaduj kod do swojej płytki i powinieneś zobaczyć odległość na swoim wyświetlaczu jak na obrazku powyżej. Jeśli używasz monitora szeregowego jako wyświetlacza, uruchom go również, powinieneś zobaczyć odległość na ekranie, jak na obrazku tytułowym.
działa, prawda? Tak!