Robotik Kodlama

Robotik Kodlama
Ana Sayfa

İLGİNİZİ ÇEKEBİLECEK LİNKLER :

4 Mayıs 2021 Salı

DS1307 RTC Modülü ile Arduino

 

DS1307 RTC Modülü ile Arduino


Hepimiz projelerimiz için kullandığımız çoğu MCU'nun zamandan bağımsız olduğunu biliyoruz; basitçe çevrelerindeki zamanın farkında değillerdir. Projelerimizin çoğu için sorun değil, ancak arada bir zamanı tutmanın başlıca endişe kaynağı olduğu bir fikirle karşılaştığınızda, DS1307 RTC modülü bir kurtarıcıdır. Veri kaydı, saat oluşturma, zaman damgası, zamanlayıcılar ve alarmlar içeren projeler için mükemmeldir.



DS1307 RTC yongası

Modülün merkezinde Maxim - DS1307'den düşük maliyetli, oldukça hassas bir RTC çipi bulunuyor Tüm zaman işleyişi işlevlerini yönetir ve seçtiğiniz herhangi bir mikro denetleyici ile kolayca arayüzlenebilen basit bir iki kablolu I2C arabirimine sahiptir.

Çip saniye, dakika, saat, gün, tarih, ay ve yıl bilgilerini saklar. Ayın sonundaki tarih, artık yıl düzeltmeleri dahil (2100'e kadar geçerli) 31 günden daha az olan aylar için otomatik olarak ayarlanır. Saat, AM / PM göstergesiyle 24 saat veya 12 saat biçiminde çalışır.

Bu kartın diğer harika özelliği, 1Hz, 4kHz, 8kHz veya 32kHz dört kare dalga frekansından birini veren ve programlı olarak etkinleştirilebilen SQW pini ile birlikte gelir.DS1307, zaman tutmak için harici bir 32kHz kristal ile birlikte gelir. Bu kristallerle ilgili sorun, dış sıcaklığın salınım frekanslarını etkileyebilmesidir. Sıklıktaki bu değişiklik önemsizdir, ancak kesinlikle artar.









Bu bir sorun gibi görünebilir, ama değil. Aslında bu, saatin ayda yaklaşık beş dakika kadar kapalı kalmasıyla sonuçlanır.

Yedek batarya

DS1307, bir pil girişi içerir ve cihazın ana gücü kesildiğinde doğru zaman işleyişi sağlar.

Yerleşik güç algılama devresi, güç kesintilerini tespit etmek için VCC'nin durumunu sürekli olarak izler ve otomatik olarak yedek kaynağa geçer. Dolayısıyla, elektrik kesintileri konusunda endişelenmenize gerek yok, MCU'nuz yine de zamanı takip edebilir.

DS1307 Modülünde CR2032 Pil Tutucu

Kartın alt tarafında 20mm 3V lityum çakmaklar için bir pil tutucu bulunur. Herhangi bir CR2032 pil uygun olabilir.

47mAh kapasiteli tam şarjlı bir CR2032 pil kullanıldığını ve çipin minimum 300nA tükettiğini varsayarsak, pil harici bir 5V güç kaynağı olmadan RTC'nin minimum 17.87 yıl çalışmasını sağlayabilir.

47mAh / 300nA = 156666.67 saat = 6527.78 gün = 17.87 yıl

Yerleşik 24C32 EEPROM

DS1307 RTC modülü, sınırlı okuma-yazma döngülerine sahip Atmel'in 32 baytlık 24C32 EEPROM yongasıyla birlikte gelir. Ayarları veya gerçekten herhangi bir şeyi kaydetmek için kullanılabilir.

DS1307 Modülünde 24C32 EEPROM Çip

24C32 EEPROM, iletişim için I2C arayüzünü kullanır ve DS1307 ile aynı I2C veriyolunu paylaşır.

Yerleşik 24C32 EEPROM, kablolu bir I2C adresine sahiptir ve 0x50 HEX olarak ayarlanmıştır.

Eğitimin sonunda 24C32 EEPROM üzerinde okuma / yazma için kod verilmiştir.



Modülün Gizli Özelliği - DS18B20DS1307 RTC modülümüzde genellikle fark edilmeyen bir hüküm vardır. DS18B20 sıcaklık sensörünü kurmamıza izin verir.Pil tutucunun hemen yanındaki üst köşedeki 3 delik (U1 olarak etiketlenmiştir) DS18B20'nin takılı olduğu yerdir.
DS1307 Modülünde DS18B20 için provizyon

DS18B20'yi kurduğunuzda, DS pininden sıcaklık okumaları alabileceksiniz Bu okumalar ayrıca koddaki sıcaklık temelli zaman kaymasını telafi etmek için kullanılabilir.

DS18B20'yi lehimlemek için ipek ekranı takip edin. Ayrıca VCC ve DS arasında bir 4.7K dirence ihtiyacınız olabilir.

DS1307 RTC Modülü Pinout

DS1307 RTC modülü, kendisini dış dünyaya arayüzleyen toplam 7 pime sahiptir. Bağlantılar aşağıdaki gibidir:

DS1307 RTC Modülü Pinout

SQW pin, 1Hz, 4kHz, 8kHz veya 32kHz dört kare dalga frekansından birini çıkarır ve programlı olarak etkinleştirilebilir.

DS Modülünüzde pil tutucusunun hemen yanında (U1 olarak etiketlenen) bir DS18B20 sıcaklık sensörü takılıysa, pinin çıkış sıcaklığı okumaları olduğu varsayılır.

SCL I2C arayüzü için saat girişidir ve seri arayüzde veri hareketini senkronize etmek için kullanılır.

SDA I2C seri arabirimi için veri girişi / çıkışıdır.

VCCpin, modül için güç sağlar. 3.3V ile 5.5V arasında herhangi bir yerde olabilir.

GND bir toprak pimidir.

BAT cihaza giden ana güç kesildiğinde doğru zaman işleyişi sağlamak için herhangi bir standart 3V lityum hücre veya diğer enerji kaynağı için bir yedek besleme girişidir.

DS1307 RTC modülü

RTC'yi Arduino'ya bağlayalım.

Bağlantılar oldukça basit. VCC pinini Arduino'daki 5V çıkışına bağlayarak başlayın ve GND'yi toprağa bağlayın.

Şimdi I2C iletişimi için kullanılan pinlerde kaldık. Her Arduino Board'un uygun şekilde bağlanması gereken farklı I2C pinlerine sahip olduğunu unutmayın. R3 düzenine sahip Arduino kartlarında, SDA (veri hattı) ve SCL (saat hattı), AREF pinine yakın pin başlıkları üzerindedir. A5 (SCL) ve A4 (SDA) olarak da bilinirler.

Bir Mega'nız varsa, iğneler farklıdır! Dijital 21 (SCL) ve 20 (SDA) kullanmak isteyeceksiniz. Hızlı anlamak için aşağıdaki tabloya bakın.

SCLSDA
Arduino UnoA5A4
Arduino NanoA5A4
Arduino Mega2120
Leonardo / Mikro32

Aşağıdaki şema, her şeyi nasıl bağlayacağınızı gösterir.

Arduino ile kablolama DS1307 RTC modülü
Arduino ile kablolama DS1307 RTC modülü
RTClib kitaplığını yükleme

Bir RTC modülüyle iletişim kurmak bir sürü iştir. Neyse ki, RTClib kitaplığı tüm karmaşıklıkları gizlemek için yazılmıştır, böylece RTC verilerini okumak için basit komutlar verebiliriz.Kitaplığı kurmak için Sketch> Dahil Et> Kitaplıkları Yönet'e gidin… Kitaplık Yöneticisinin kitaplıklar dizinini indirmesini ve kurulu kitaplıkların listesini güncellemesini bekleyin.Arduino Kitaplığı Kurulumu - Arduino IDE'de Kitaplıkları Yönetmeyi Seçme









Aramanızı ' rtclib ' yazarak filtreleyin Birkaç giriş olmalı. Adafruit by RTClib'i arayın. Bu girişe tıklayın ve ardından Yükle'yi seçin.

RTClib Arduino kütüphanesini kurma

Arduino Kodu - Tarih ve Saat Okuma

Aşağıdaki taslak, DS1307 RTC modülünde tarih ve saati nasıl ayarlayacağınız / okuyacağınız konusunda size tam bir anlayış verecektir ve daha pratik deneyler ve projeler için temel oluşturabilir.

#include <Wire.h>
#include "RTClib.h"

RTC_DS1307 rtc;

char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

void setup () 
{
  Serial.begin(9600);
  delay(3000); // wait for console opening

  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }

  if (!rtc.isrunning()) {
    Serial.println("RTC lost power, lets set the time!");
	
	// Comment out below lines once you set the date & time.
    // Following line sets the RTC to the date & time this sketch was compiled
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
	
    // Following line sets the RTC with an explicit date & time
    // for example to set January 27 2017 at 12:56 you would call:
    // rtc.adjust(DateTime(2017, 1, 27, 12, 56, 0));
  }
}

void loop () 
{
    DateTime now = rtc.now();
    
    Serial.println("Current Date & Time: ");
    Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.day(), DEC);
    Serial.print(" (");
    Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
    Serial.print(") ");
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();
    
    Serial.println("Unix Time: ");
    Serial.print("elapsed ");
    Serial.print(now.unixtime());
    Serial.print(" seconds/");
    Serial.print(now.unixtime() / 86400L);
    Serial.println(" days since 1/1/1970");
    
    // calculate a date which is 7 days & 30 seconds into the future
    DateTime future (now + TimeSpan(7,0,0,30));
    
    Serial.println("Future Date & Time (Now + 7days & 30s): ");
    Serial.print(future.year(), DEC);
    Serial.print('/');
    Serial.print(future.month(), DEC);
    Serial.print('/');
    Serial.print(future.day(), DEC);
    Serial.print(' ');
    Serial.print(future.hour(), DEC);
    Serial.print(':');
    Serial.print(future.minute(), DEC);
    Serial.print(':');
    Serial.print(future.second(), DEC);
    Serial.println();
    
    Serial.println();
    delay(1000);
}

Seri monitörde çıkışın nasıl göründüğü aşağıda açıklanmıştır.

Seri Monitörde DS1307 Çıkışı
Seri Monitörde DS1307 Çıkışı

Kod Açıklaması:

Taslak, modülle iletişim kurmak için wire.h & RTClib.h kitaplıklarını dahil ederek başlar. Daha sonra bir RTClib kitaplığı nesnesi oluşturuyoruz ve daysOfTheWeekgün bilgilerini depolamak için 2D karakter dizisi tanımlıyoruz .

Kodun kurulum ve döngü bölümlerinde, RTC modülüyle etkileşim kurmak için aşağıdaki işlevleri kullanırız.

begin () işlevi, RTC modülünün bağlı olmasını sağlar.

isrunning () işlevi, çipin zaman izini kaybedip kaybetmediğini kontrol etmek için DS1307'nin dahili I2C kayıtlarını okur. İşlev yanlış döndürürse, tarih ve saati ayarlayabiliriz.

Adjust () işlevi tarih ve saati ayarlar. Bu aşırı yüklenmiş bir işlevdir.

  • Aşırı yüklenmiş bir yöntem DateTime(F(__DATE__), F(__TIME__)), eskizin derlendiği tarih ve saati ayarlar.
  • İkinci aşırı yüklenmiş yöntem DateTime(YYYY, M, D, H, M, s), RTC'yi kesin bir tarih ve saatle ayarlar. Örneğin, 27 Ocak 2017'yi saat 12: 56'ya ayarlamak için şunları arayabilirsiniz:rtc.adjust(DateTime(2017, 1, 27, 12, 56, 0));

now () işlevi geçerli tarih ve saati döndürür. Dönüş değeri genellikle veri türü DateTime değişkeninde saklanır.

year () işlevi geçerli yılı döndürür.

month () işlevi geçerli ayı döndürür.

day () işlevi geçerli günü döndürür.

dayOfTheWeek () işlevi haftanın geçerli gününü döndürür. Bu işlev genellikle yukarıdaki programda tanımlandığı gibi gün bilgilerini depolayan bir 2D karakter dizisinin dizini olarak kullanılır.daysOfTheWeek

hour () işlevi mevcut saati döndürür.

dakika () işlevi geçerli dakikayı döndürür.

second () işlevi geçerli saniyeyi döndürür.

unixtime () işlevi saniye cinsinden unix zamanını döndürür. Unix zamanı, zamandaki bir noktayı tanımlamak için kullanılan bir sistemdir. 00: 00: 00'dan beri geçen saniye sayısıdır (Koordineli Evrensel Saat olarak bilinir - 1 Ocak 1970 Perşembe).

TimeSpan () işlevi, geçerli saate / zamandan zaman eklemek / çıkarmak için kullanılır. Gün, saat, dakika ve saniye ekleyebilir / çıkarabilirsiniz. Aynı zamanda aşırı yüklenmiş bir işlevdir.

  • now() + TimeSpan(seconds) geçerli saate eklenen saniye ile gelecekteki zamanı döndürür.
  • now() - TimeSpan(days,hours, minutes, seconds) geçmiş zamanı döndürür.

Arduino Kodu - 24C32 EEPROM'da Okuma / Yazma

DS1307 RTC modülü ile bonus olarak 32 bayt Elektrikle Silinebilir ROM elde edersiniz. Cihazın ana gücü kesilse bile içeriği silinmeyecektir.

Aşağıdaki program 24C32 EEPROM'dan bir mesaj yazar ve sonra okur. Bu programı ayarları veya şifreleri veya herhangi bir şeyi kaydetmek için kullanabilirsiniz.

#include <Wire.h>

void setup()
{
    char somedata[] = "lastminuteengineers.com"; // data to write
    Wire.begin(); // initialise the connection
    Serial.begin(9600);
    Serial.println("Writing into memory...");
	
	// write to EEPROM
    i2c_eeprom_write_page(0x57, 0, (byte *)somedata, sizeof(somedata));

    delay(100); //add a small delay
    Serial.println("Memory written");
}

void loop()
{
    Serial.print("Reading memory: ");
    int addr=0; //first address
	
	// access the first address from the memory
    byte b = i2c_eeprom_read_byte(0x57, 0);

    while (b!=0)
    {
        Serial.print((char)b); //print content to serial port
        addr++; //increase address
        b = i2c_eeprom_read_byte(0x57, addr); //access an address from the memory
    }
    Serial.println(" ");
    delay(2000);
}

void i2c_eeprom_write_byte( int deviceaddress, unsigned int eeaddress, byte data ) {
    int rdata = data;
    Wire.beginTransmission(deviceaddress);
    Wire.write((int)(eeaddress >> 8)); // MSB
    Wire.write((int)(eeaddress & 0xFF)); // LSB
    Wire.write(rdata);
    Wire.endTransmission();
}

// WARNING: address is a page address, 6-bit end will wrap around
// also, data can be maximum of about 30 bytes, because the Wire library has a buffer of 32 bytes
void i2c_eeprom_write_page( int deviceaddress, unsigned int eeaddresspage, byte* data, byte length ) {
    Wire.beginTransmission(deviceaddress);
    Wire.write((int)(eeaddresspage >> 8)); // MSB
    Wire.write((int)(eeaddresspage & 0xFF)); // LSB
    byte c;
    for ( c = 0; c < length; c++)
        Wire.write(data[c]);
    Wire.endTransmission();
}

byte i2c_eeprom_read_byte( int deviceaddress, unsigned int eeaddress ) {
    byte rdata = 0xFF;
    Wire.beginTransmission(deviceaddress);
    Wire.write((int)(eeaddress >> 8)); // MSB
    Wire.write((int)(eeaddress & 0xFF)); // LSB
    Wire.endTransmission();
    Wire.requestFrom(deviceaddress,1);
    if (Wire.available()) rdata = Wire.read();
    return rdata;
}

// maybe let's not read more than 30 or 32 bytes at a time!
void i2c_eeprom_read_buffer( int deviceaddress, unsigned int eeaddress, byte *buffer, int length ) {
    Wire.beginTransmission(deviceaddress);
    Wire.write((int)(eeaddress >> 8)); // MSB
    Wire.write((int)(eeaddress & 0xFF)); // LSB
    Wire.endTransmission();
    Wire.requestFrom(deviceaddress,length);
    int c = 0;
    for ( c = 0; c < length; c++ )
        if (Wire.available()) buffer[c] = Wire.read();
}

Seri monitörde çıkışın nasıl göründüğü aşağıda açıklanmıştır.

Seri Monitörde 24C32 EEPROM Çıkışı

ANA SAYFAYA DÖN

Bahadır ÖZGEN
Electronic Robotic Coding Research and Development 1975 - ∞
Learn Forever
If you want, let's learn together...
https://roboticcode2020.blogspot.com/
bahadirozgen1975@gmail.com
facebook    robotic.code
instagram    @roboticcode


Sayfalarımı ziyaret ettiğiniz için teşekkür ederim.Bu sitede mevcut olan içerikler kendi oluşturduğum projeler yazı,resim ve videolardan oluşmaktadır.İçerik oluşturmak çok uzun sürdüğü için bazı projelerde yurtdışı kaynaklardan faydalandım.Buradaki amacım ticari değildir.Kaynağı belli olan ve bizim kaynağına ulaşabildiğimiz materyal (yazı, fotoğraf, resim, video v.b.) için ilgili konularda fotoğraflarda logo varsa v.b. not olarak gösterilecektir.Sitemizde yayınlanan tüm içerik, bizim tarafımızdan ve internet üzerinden youtube, facebook ve blog gibi paylaşıma sunulmuş kaynak sitelerden alındığı için, sitemiz yasal yükümlülüğe tabi tutulamaz. Sitemizde telif haklarının size ait olduğu bir içerik varsa ve bunu kaldırmamızı isterseniz, iletişim sayfamızdan bizimle iletişime geçtiğiniz takdirde içerik yayından kaldırılacaktır.Bu konu ve modüller ile uğraşarak, ileride çok güzel makine ve elektronik aletler yapabilirsiniz.





HC-SR04 Ultrasonik Sensör Nasıl Çalışır ve Arduino

 

HC-SR04 Ultrasonik Sensör Nasıl Çalışır ve Arduino

Bir sonraki Arduino projenize, 13 fit (1fit = 0,3048metre) uzaklığa kadar olan nesnelerin menzilini bildirebilen bir HC-SR04 Ultrasonik Mesafe Sensörü ile bat güçleri verin. Robotunuzun duvara çarpmasını önlemeye çalışıyorsanız, bu gerçekten iyi bir bilgidir! Düşük güç tüketirler (pille çalışan cihazlar için uygundurlar), ucuzdurlar, arayüz oluşturmaları kolaydır ve hobiler arasında çılgınca popülerdirler. Ve bir bonus olarak, en son robotik icatınız için bir çift Wall-E Robot gözü gibi havalı görünüyor!

Ultrason nedir?

Ultrason, insan işitme duyusunun duyulabilir sınırından daha yüksek frekanslara sahip yüksek perdeli ses dalgalarıdır.

Ultrasonik Frekans Aralığı Spektrumu

İnsan kulakları, saniyede yaklaşık 20 kez (derin bir gürleme sesi) saniyede yaklaşık 20.000 kez (tiz bir ıslık) arasında titreşen ses dalgalarını duyabilir. Bununla birlikte, ultrasonun 20.000 Hz'nin üzerinde bir frekansı vardır ve bu nedenle insanlar tarafından duyulamaz.


HC-SR04 Ultrasonik mesafe sensörü özünde iki ultrasonik dönüştürücüden oluşur Biri, elektrik sinyalini 40 KHz ultrasonik ses darbelerine dönüştüren bir verici görevi görür. Alıcı, iletilen darbeleri dinler. Bunları alırsa, darbenin kat ettiği mesafeyi belirlemek için genişliği kullanılabilen bir çıkış darbesi üretir. Turta kadar basit!

Sensör küçüktür, herhangi bir robotik projede kullanımı kolaydır ve 3 mm hassasiyetle 2 cm ila 400 cm (yaklaşık bir inç ila 13 fit) arasında mükemmel temassız mesafe algılama sunar. 5 voltta çalıştığı için, doğrudan bir Arduino ya veya diğer 5V mantık mikrodenetleyicilere bağlanabilir.











Özellikleri : 

Çalışma gerilimiDC 5V
Çalışma Akımı15mA
Çalışma Frekansı40 KHz
Maksimum aralık4 dk.
Min Aralık2cm
Değişen Doğruluk3 mm
Ölçüm Açısı15 derece
Tetik Giriş Sinyali10µS TTL darbesi
Boyut45 x 20 x 15 mm

HC-SR04 Ultrasonik Sensör Pin Çıkışı

Pinout'a bir göz atalım.

HC-SR04 Ultrasonik Mesafe Sensörü Pin Çıkışı

VCC Arduino üzerindeki 5V pinini bağladığımız HC-SR04 Ultrasonik mesafe sensörü için güç kaynağıdır.

Trig (Tetikleyici) pim, ultrasonik ses darbelerini tetiklemek için kullanılır.

Echopim, yansıyan sinyal alındığında bir darbe üretir. Darbenin uzunluğu, iletilen sinyalin tespit edilmesi için geçen süre ile orantılıdır.

GND Arduino'nun zeminine bağlanmalıdır.

HC-SR04 Ultrasonik Mesafe Sensörü Nasıl Çalışır?

Tetik pimine en az 10 µS (10 mikrosaniye) süreli bir darbe uygulandığında her şey başlar. Buna yanıt olarak sensör, 40 KHz'de sekiz darbeli bir ses patlaması iletir. Bu 8 darbeli model, cihazın "ultrasonik imzasını" benzersiz kılarak, alıcının iletilen modeli ortamdaki ultrasonik gürültüden ayırt etmesine olanak tanır.

Sekiz ultrasonik darbe, vericiden uzakta havada ilerler. Bu arada Yankı pimi, yankı geri sinyalinin başlangıcını oluşturmaya başlamak için YÜKSEK olur.Bu darbeler geri yansıtılmazsa, Yankı sinyali 38 mS (38 milisaniye) sonra zaman aşımına uğrayacak ve düşük seviyeye dönecektir. Bu nedenle 38 mS'lik bir darbe, sensörün menzili içinde hiçbir engel olmadığını gösterir.

HC-SR04 Ultrasonik Sensör Çalışıyor - Engel Olmadığında Yankı

Bu darbeler geri yansıtılırsa, sinyal alınır alınmaz Yankı pimi düşer. Bu, sinyalin alınması için geçen süreye bağlı olarak genişliği 150 µS ile 25 mS arasında değişen bir darbe üretir.

HC-SR04 Ultrasonik Sensör Çalışıyor - Yankı Engelden yansıyor

Alınan darbenin genişliği daha sonra yansıtılan nesneye olan mesafeyi hesaplamak için kullanılır. Bu basit mesafe-hız-zaman denklemi kullanılarak çözülebilir, lisede öğrendik. Unutursanız, mesafe, hız ve zaman denklemlerini hatırlamanın kolay bir yolu harfleri bir üçgene koymaktır.

Mesafe Hız Zaman Formül Üçgeni

Daha net hale getirmek için bir örnek alalım. Sensörün önünde bilinmeyen bir mesafede bir nesnemiz olduğunu ve Yankı pini üzerinde 500 µS genişliğinde bir darbe aldığımızı varsayalım. Şimdi nesnenin sensörden ne kadar uzakta olduğunu hesaplayalım. Aşağıdaki denklemi kullanacağız.

Mesafe = Hız x Zaman

Burada Zamanın değeri yani 500 µs var ve hızı biliyoruz. Ne hızımız var? Tabii ki ses hızı! 340 m / s. Mesafeyi hesaplamak için ses hızını cm / µs'ye çevirmeliyiz. "Mikrosaniye başına santimetre cinsinden ses hızı" için hızlı bir Google araması, bunun 0,034 cm / µs olduğunu söyleyecektir. Matematiği yapabilirsin, ama aramak daha kolay. Her neyse, bu bilgilerle mesafeyi hesaplayabiliriz!

Mesafe = 0,034 cm / µs x 500 µs

Ama bu yapılmadı! Nabzın, sinyalin gönderilmesi ve geri yansıtılması için geçen süreyi gösterdiğini unutmayın, böylece mesafeyi elde etmek için sonucunuzu ikiye bölmeniz gerekir.

Mesafe = (0,034 cm / µs x 500 µs) / 2

Mesafe = 8.5 cm

Artık nesnenin sensörden 8,5 santimetre uzakta olduğunu biliyoruz .

Artık HC-SR04 ultrasonik mesafe sensörünün nasıl çalıştığını tam olarak anladığımıza göre, onu Arduino'muza bağlamaya başlayabiliriz!

HC-SR04'ü Arduino'ya bağlamak oldukça kolaydır. Sensörü devre tahtanıza yerleştirerek başlayın. VCC pinini Arduino'daki 5V pinine bağlayın ve GND pinini Arduino'daki Ground pinine bağlayın.İşiniz bittiğinde, aşağıda gösterilen resme benzer bir şeye sahip olmalısınız.

Arduino Kablolaması HC-SR04 Ultrasonik Sensör ile Normal Mod Bağlantılarını Kesiyor
HC-SR04 Ultrasonik Sensörü Arduino UNO'ya Kablolama - Normal Mod

Artık ultrasonik mesafe sensörümüzü bağladığımıza göre, bir kod yazma ve test etme zamanı.

Arduino Kodu - NewPing Kitaplığını Kullanma

Ultrasonik sensörü tetiklemek ve alınan sinyal darbe genişliğini manuel olarak ölçmek yerine özel bir kitaplık kullanacağız. Bunlardan epeyce mevcut, en çok yönlü olanı “ NewPing ” denen olandır .

Önce Bitbucket deposunu ziyaret ederek kitaplığı indirin veya zip dosyasını indirmek için bu düğmeyi tıklayın:

Kurmak için Arduino IDE'yi açın, Sketch> Include Library> Add .ZIP Library'ye gidin ve ardından indirdiğiniz NewPing ZIP dosyasını seçin. Bir kitaplık kurma konusunda daha fazla ayrıntıya ihtiyacınız varsa, bu Arduino Kitaplığı Kurma öğreticisini ziyaret edin.

NewPing kitaplığı oldukça gelişmiştir ve orijinal eskizimizin doğruluğunu önemli ölçüde geliştirmiştir. Aynı anda 15 ultrasonik sensöre kadar destekler ve doğrudan santimetre, inç veya zaman süresi cinsinden çıktı verebilir.

NewPing kitaplığını kullanmak için yeniden yazdığımız eskiz:

// This uses Serial Monitor to display Range Finder distance readings

// Include NewPing Library
#include "NewPing.h"

// Hook up HC-SR04 with Trig to Arduino Pin 9, Echo to Arduino pin 10
#define TRIGGER_PIN 9
#define ECHO_PIN 10

// Maximum distance we want to ping for (in centimeters).
#define MAX_DISTANCE 400	

// NewPing setup of pins and maximum distance.
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
float duration, distance;

void setup() 
{
	Serial.begin(9600);
}

void loop() 
{
	// Send ping, get distance in cm
	distance = sonar.ping_cm();
	
	// Send results to Serial Monitor
	Serial.print("Distance = ");
	
	if (distance >= 400 || distance <= 2) 
	{
		Serial.println("Out of range");
	}
	else 
	{
		Serial.print(distance);
		Serial.println(" cm");
	}
	delay(500);
}
HC-SR04 Ultrasonik Sensör Seri Monitörde Arduino Mesafe Ölçümü Çizim Çıkışı
Seri Monitörde Çıktı


Yukarıdaki taslak basit ve iyi çalışıyor, ancak yalnızca bir santimetreye kadar bir çözünürlüğe sahip. Ondalık sayı değerlerini geri getirmek istiyorsanız, NewPing'i mesafe modu yerine süre modunda kullanabilirsiniz. Bu satırı değiştirmeniz gerekiyor

// Send ping, get distance in cm
distance = sonar.ping_cm();

aşağıdaki çizgilerle

duration = sonar.ping();
distance = (duration / 2) * 0.0343;

HC-SR04'ünüzün doğruluğunu bir sonraki seviyeye çıkarmak için, NewPing kitaplığında “yinelemeler” adı verilen başka bir işlev vardır. Yinelemek, bir şeyi birden fazla kez gözden geçirmek demektir ve yineleme modunun yaptığı da tam olarak budur. Tek bir yerine birçok süre ölçümü alır, geçersiz okumaları atar ve sonra kalanların ortalamasını alır. Varsayılan olarak 5 okuma alır, ancak gerçekte istediğiniz kadarını belirtebilirsiniz.

int iterations = 5;
duration = sonar.ping_median(iterations);

Temassız Mesafe Bulucu

Basit bir ultrasonik sensörün Gelişmiş Temassız Mesafe Bulucuya nasıl dönüştürülebileceğini göstermek için hızlı bir proje oluşturalım Bu projede, nesneye olan mesafeyi alt satırdaki değerle grafik olarak temsil etmek üzere yatay bir çubuk görüntülemek için 16 × 2 Karakter LCD kullanacağız.

Daha sonra, aşağıda gösterildiği gibi LCD'ye bağlantı yapmamız gerekiyor.

HC-SR04 Ultrasonik Sensör ve 16x2 LCD ile Arduino Kablolama Fritzing Bağlantıları
HC-SR04 Ultrasonik Sensör ve 16 × 2 LCD'yi Arduino UNO'ya Kablolama
Kodu yüklemeye ve sensörle oynamaya başlamadan önce, LCDBarGraph adlı kütüphaneyi kurmamız gerekiyor . Bu kitaplık, çubuğun uzunluğunun sağlanan değerlerle orantılı olduğu LCD'de yatay çubuk grafik çizmeye yardımcı olur.

Arduino Playground'u ziyaret ederek önce kitaplığı indirin.

Kitaplığı kurduktan sonra aşağıdaki taslağı deneyin.

// includes the LiquidCrystal Library
#include <LiquidCrystal.h> 

// includes the LcdBarGraph Library
#include <LcdBarGraph.h>

// Maximum distance we want to ping for (in centimeters).
#define max_distance 200

// Creates an LCD object. Parameters: (rs, enable, d4, d5, d6, d7)
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); 

LcdBarGraph lbg(&lcd, 16, 0, 1); // Creates an LCD Bargraph object.

const int trigPin = 9;
const int echoPin = 10;
long duration;
int distance;

void setup() 
{
	lcd.begin(16,2); // Initializes the interface to the LCD screen
	
	pinMode(trigPin, OUTPUT);
	pinMode(echoPin, INPUT);
}

void loop() 
{
	// Write a pulse to the HC-SR04 Trigger Pin
	digitalWrite(trigPin, LOW);
	delayMicroseconds(2);
	digitalWrite(trigPin, HIGH);
	delayMicroseconds(10);
	digitalWrite(trigPin, LOW);
	
	// Measure the response from the HC-SR04 Echo Pin
	duration = pulseIn(echoPin, HIGH);
	
	// Determine distance from duration
	// Use 343 metres per second as speed of sound
	distance= duration*0.034/2;
	
	// Prints "Distance: <value>" on the first line of the LCD
	lcd.setCursor(0,0);
	lcd.print("Distance: "); 
	lcd.print(distance);
	lcd.print(" cm");

	// Draws bargraph on the second line of the LCD
	lcd.setCursor(0,1);
	lbg.drawValue(distance, max_distance);
	delay(500);
}

Çıktı böyle görünüyor.

HC-SR04 Ultrasonik Sensör 16x2 LCD üzerinde Arduino Mesafe Ölçümü Bargraf Çıkışı
16 × 2 Karakter LCD'de Çubuk Grafik Çıkışı

Kod Açıklaması:

Öncelikle LiquidCrystal kitaplığını her zamanki gibi kurmanız gerekir. Bundan sonra, yeni oluşturulmuş LiquidCrystal örneğiyle LcdBarGraph örneği oluşturabilirsiniz. LiquidCrystal'ın referansını LcdBarGraph'ın yapıcısına iletmelisiniz.

LcdBarGraph'ın kurucusu üç parametre daha alır. İkincisi, LCD'deki karakter sütunlarının sayısıdır (Bizim durumumuzda bu 16'dır). Son iki parametre isteğe bağlıdır ve çubuğun özel konumlandırılmasına izin verir.

// creating bargraph instance
LcdBarGraph lbg(&lcd, 16, 0, 1);

Şimdi sensörden mesafeyi hesapladığımızda , bar grafiğini görüntülemek için drawValue (değer, maxValue) fonksiyonunu kullanabiliriz. Bu, 0 ile maxValue arasında bir değere sahip bir çubuk grafik çizer.

//display bargraph
lbg.drawValue(distance, max_distance);

HC-SR04'ü 3 Hatlı Mod ile Arabirim

3-Wire Mode, iki yerine tek bir Arduino dijital I / O pinine tek bir bağlantıya ihtiyaç duyduğunuz bir şeydir. Bilmiyorsanız, harika paralaks ping))) sensör gibi yalnızca 3-Kablolu Modda çalışan birçok ultrasonik sensör vardır .

3-Kablolu modda tek I / O pini hem giriş hem de çıkış olarak kullanılır. Bu mümkündür çünkü hem giriş hem de çıkışın kullanıldığı bir zaman asla yoktur. Bir I / O pin gereksinimini ortadan kaldırarak, Arduino'muza bir bağlantı kaydedebilir ve başka bir şey için kullanabiliriz. Sınırlı sayıda I / O pinine sahip olan ATtiny85 gibi bir yonga kullanıldığında da yararlıdır.HC-SR04 sensörünü 3-Wire modunu kullanarak Arduino'ya nasıl bağlayabileceğiniz aşağıda açıklanmıştır.

HC-SR04 Ultrasonik Sensör ile Arduino Kablolama Fritzing 3 Kablolu Mod Bağlantıları
HC-SR04 Ultrasonik Sensörü Arduino UNO'ya Kablolama - 3 Kablolu Mod

Gördüğünüz gibi tek yapmanız gereken tetik ve ekoyu Arduino pin 9'a bağlamak. Çizimde yapmanız gereken tek farkın hem Tetik hem de Echo pin değerleri için pin 9'u tanımlamak olduğunu unutmayın. Eskizin geri kalanı aynı.

#define TRIGGER_PIN 9 // Trigger and Echo both on pin 9
#define ECHO_PIN 9

Doğruluk ve genel kullanışlılık açısından, HC-SR04 ultrasonik mesafe sensörü, özellikle diğer düşük maliyetli mesafe algılama sensörleriyle karşılaştırıldığında gerçekten harika. Bu, HC-SR04 sensörünün "her şeyi" ölçebildiği anlamına gelmez. Aşağıdaki şemalar, HC-SR04'ün ölçmek için tasarlanmadığı birkaç durumu gösterir:

a) Sensör ile nesne / engel arasındaki mesafe 13 fitten fazla.

HC-SR04 Sınırlama - 13 fitten fazla mesafe ölçülemez

b) Nesnenin yansıtıcı yüzeyi sığ bir açıyla vardır, böylece ses sensöre doğru geri yansımaz.

HC-SR04 Sınırlama - nesneyi sığ bir açıda algılayamaz

c) Nesne, sensöre yeterince ses yansıtamayacak kadar küçük. Ek olarak, HC-SR04 sensörünüz cihazınızın altına monte edilmişse, zeminden yansıyan sesi algılayabilirsiniz.

HC-SR04 Sınırlama - küçük nesneleri algılayamaz

d) Sensörle deney yaparken, yumuşak, düzensiz yüzeylere sahip bazı nesnelerin (doldurulmuş hayvanlar gibi) sesi yansıtmak yerine emdiğini ve bu nedenle HC-SR04 sensörünün algılamasının zor olabileceğini keşfettik.

HC-SR04 Sınırlama - yumuşak düzensiz yüzey nesnesini algılayamaz

Sıcaklığın Mesafe Ölçümüne Etkisi

HC-SR04, izinsiz giriş algılama veya yakınlık alarmları gibi projelerimizin çoğu için makul ölçüde doğru olsa da; Ancak, dışarıda veya alışılmadık derecede sıcak veya soğuk bir ortamda kullanılacak bir cihaz tasarlamak isteyebileceğiniz zamanlar vardır. Durum buysa, havadaki ses hızının sıcaklık, hava basıncı ve neme göre değiştiğini hesaba katmak isteyebilirsiniz.

Ses faktörlerinin hızı HC-SR04 mesafe hesaplamamıza girdiğinden, bu bizim okumalarımızı etkileyebilir. Sıcaklık (° C) ve Nem zaten biliniyorsa, aşağıdaki formülü göz önünde bulundurun:

Ses hızı m / s = 331.4 + (0.606 * Sıcaklık) + (0.0124 * Nem)

ANA SAYFAYA DÖN

Bahadır ÖZGEN
Electronic Robotic Coding Research and Development 1975 - ∞
Learn Forever
If you want, let's learn together...
https://roboticcode2020.blogspot.com/
bahadirozgen1975@gmail.com
facebook    robotic.code
instagram    @roboticcode


Sayfalarımı ziyaret ettiğiniz için teşekkür ederim.Bu sitede mevcut olan içerikler kendi oluşturduğum projeler yazı,resim ve videolardan oluşmaktadır.İçerik oluşturmak çok uzun sürdüğü için bazı projelerde yurtdışı kaynaklardan faydalandım.Buradaki amacım ticari değildir.Kaynağı belli olan ve bizim kaynağına ulaşabildiğimiz materyal (yazı, fotoğraf, resim, video v.b.) için ilgili konularda fotoğraflarda logo varsa v.b. not olarak gösterilecektir.Sitemizde yayınlanan tüm içerik, bizim tarafımızdan ve internet üzerinden youtube, facebook ve blog gibi paylaşıma sunulmuş kaynak sitelerden alındığı için, sitemiz yasal yükümlülüğe tabi tutulamaz. Sitemizde telif haklarının size ait olduğu bir içerik varsa ve bunu kaldırmamızı isterseniz, iletişim sayfamızdan bizimle iletişime geçtiğiniz takdirde içerik yayından kaldırılacaktır.Bu konu ve modüller ile uğraşarak, ileride çok güzel makine ve elektronik aletler yapabilirsiniz.