Serwisy partnerskie:
Close icon
Serwisy partnerskie

Dalmierz Arduino z czujnikiem ultradźwiękowym (HC SR04) i wyświetlaczem LCD Nokia 5110

Article Image
Elmax
Mierzenie odległości jest tak ważne w dzisiejszym świecie, że takie rzeczy jak np. autonomoczne samochody bez kierowcy nie będą możliwe bez tego. Zbudujemy dalmierz przy użyciu Arduino i czujnika ultradźwiękowego HC-SR04.

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.

Czujnik odległości HC-SR04

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.

Zasada działania HC-SR04

Czujnik posiada cztery piny, VCC, GND, Trig i Echo z trig i echo reprezentujących piny nadajnika i odbiornika, odpowiednio.

Miernik odległości

Nietóre parametry czujnika:

  1. Zasilanie: +5V DC
  2. Prąd spoczynkowy: <2mA
  3. Prąd roboczy: 15mA
  4. Kąt skuteczny: <15°
  5. Zakres odległości: 2cm…400 cm/1″…13ft
  6. Rozdzielczość: 0,3 cm
  7. Kąt pomiaru: 30 stopni
  8. Szerokość wyzwalającego impulsu wejściowego: 10uS
  9. 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.

Schemat połączenia Arduino z LCD i czujnikiem odległości

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.

Mapa pinów HC-SR04 do Arduino
Vcc
5v
Trig
D7
Echo
D6
GND
GND
Mapa pinów Nokia 5110 LCD do Arduino
Pin 1(RST)
D12
Pin 2(CE)
D11
Pin 3(DC)
D1
Pin 4(DIN)
D9
Pin 5(CLK)
D8
Pin 6(VCC)
VCC
Pin 7(LIGHT)
GND
Pin 8(GND)
GND

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.

Demonstracja monitora szeregowego jako wyświetlacza

działa, prawda? Tak!

Galeria
Wideo
Do pobrania
Download icon Program dla Arduino - dalmierz

Artykuł ARDUINO DISTANCE METER WITH ULTRASONIC SENSOR (HC SR04) AND NOKIA 5110 LCD DISPLAY opracowano w wersji polskiej na podstawie współpracy z portalem www.electronics-lab.com.

Firma:
AUTOR
Źródło
www.electronics-lab.com
Udostępnij
Zobacz wszystkie quizy
Quiz weekendowy
Edukacja
1/10 Jak działa rezystor LDR?
UK Logo
Elektronika dla Wszystkich
Zapisując się na nasz newsletter możesz otrzymać GRATIS
najnowsze e-wydanie magazynu "Elektronika dla Wszystkich"