3000 TL üzeri ücretsiz kargoGüvenli ödeme · Kredi kartına 9 taksit0850 304 9125Sipariş Takibi
Özel Proje Siparişi
Teknik Makaleler

STM32 ile HC-SR04 Ultrasonik Mesafe Sensörü Kullanımı

YazarProje Hocam 5 dk okuma
STM32 ile HC-SR04 Ultrasonik Mesafe Sensörü Kullanımı
İçindekiler
  1. 1. HC-SR04 ultrasonik mesafe sensörü nedir?
  2. 2. HC-SR04 çalışma prensibi
  3. 3. HC-SR04 teknik özellikleri
  4. 4. HC-SR04 ve STM32 bağlantıları
  5. 5. STM32CubeMX zamanlayıcı ayarları
  6. 6. STM32 HAL ile mikro saniye gecikme fonksiyonu
  7. 7. Input Capture ile ECHO sinyalini ölçme
  8. 8. HC-SR04 ölçüm fonksiyonu
  9. 11. Sık karşılaşılan sorunlar
  10. Sonuç

Mikrodenetleyici projelerinde mesafe ölçümü, engel algılama ve otomatik kontrol sistemleri oldukça yaygın uygulamalardır. Bu projede, uygun fiyatlı ve kolay temin edilebilen HC-SR04 ultrasonik mesafe sensörünü STM32 mikrodenetleyicisi ile birlikte kullanacağız.

Arduino projelerinde sıkça karşılaştığımız HC-SR04 sensörü, STM32'nin gelişmiş zamanlayıcı (Timer) özelliklerinden yararlanılarak da kullanılabilir.

Bu uygulamada STM32CubeMX üzerinden gerekli pin ve zamanlayıcı ayarlarını yapacak, STM32 HAL kütüphanesi ile sensörden gelen sinyali okuyarak mesafeyi santimetre cinsinden hesaplayacağız.

Projenin sonunda ölçülen mesafeyi LCD ekran gibi farklı görüntüleme birimlerinde kullanabilecek bir altyapı oluşturacağız.

1. HC-SR04 ultrasonik mesafe sensörü nedir?

STM32 ile HC-SR04 Ultrasonik Mesafe Sensörü Kullanımı

HC-SR04, çevresindeki nesnelerin uzaklığını ultrasonik ses dalgaları kullanarak ölçen bir sensör modülüdür.

Sensör üzerinde iki adet yuvarlak dönüştürücü bulunur. Bunlardan biri ses dalgasını gönderirken diğeri geri dönen ses dalgasını algılar.

Sensörün çalışma prensibi, gönderilen ses dalgasının bir cisme çarpıp geri dönmesi için geçen sürenin ölçülmesine dayanır.

Başlıca kullanım alanları:

  1. Robotlarda engel algılama sistemleri
  2. Otonom araç ve robot projeleri
  3. Akıllı çöp kutuları
  4. Depo ve tanklarda sıvı seviye ölçümü
  5. Otomatik kapı sistemleri
  6. Park sensörü uygulamaları
  7. Mesafe kontrollü otomasyon sistemleri

2. HC-SR04 çalışma prensibi

HC-SR04 sensörü yaklaşık 40 kHz frekansında ultrasonik ses dalgaları üretir.

Ölçüm işlemi aşağıdaki aşamalardan oluşur:

  1. STM32, sensörün TRIG girişine en az 10 mikrosaniye süreyle HIGH sinyali gönderir.
  2. Sensör, 40 kHz frekansında 8 darbeli ultrasonik sinyal üretir.
  3. Ses dalgası bir nesneye çarparak sensöre geri döner.
  4. Sensörün ECHO çıkışı, sesin gidip gelme süresi boyunca HIGH seviyesinde kalır.
  5. STM32, ECHO sinyalinin HIGH süresini ölçerek mesafeyi hesaplar.

Mesafe hesaplama formülü:

\[ Mesafe = \frac{Süre \times Ses\ Hızı}{2} \]

Santimetre cinsinden kullanılan pratik formül:

\[ Mesafe(cm) = \frac{ECHO\ Süresi(\mu s)}{58} \]

Burada 2'ye bölme işleminin nedeni, ses dalgasının hedefe gidip tekrar sensöre dönmesidir.

3. HC-SR04 teknik özellikleri

ÖzellikDeğer
Çalışma gerilimi5V DC
Çalışma frekansı40 kHz
Ölçüm aralığı2–400 cm
HassasiyetYaklaşık ±3 mm
TRIG sinyaliEn az 10 µs
Çıkış sinyali5V TTL
Bağlantı tipi4 pin

4. HC-SR04 ve STM32 bağlantıları

STM32 ile HC-SR04 Ultrasonik Mesafe Sensörü Kullanımı

Bu örnekte STM32F103C8T6 geliştirme kartı kullanılacaktır.

HC-SR04STM32F103C8T6Açıklama
VCC5VSensör beslemesi
GNDGNDOrtak toprak
TRIGPA9Tetikleme çıkışı
ECHOPA8 (TIM1_CH1)Yankı sinyali girişi

Önemli: Gerilim uyumluluğu

HC-SR04 sensörünün ECHO çıkışı 5V seviyesindedir. STM32F103C8T6 ise 3.3V lojik seviyesinde çalışır.

Bu nedenle ECHO çıkışını doğrudan mikrodenetleyiciye bağlamak yerine gerilim bölücü kullanılması önerilir.

Örneğin:

  1. ECHO ile PA8 arasına 1 kΩ direnç
  2. PA8 ile GND arasına 2 kΩ direnç

Bu bağlantı, ECHO sinyalini yaklaşık 3.3V seviyesine düşürür.

5. STM32CubeMX zamanlayıcı ayarları

Bu projede ECHO sinyalinin HIGH kalma süresini ölçmek için STM32'nin Timer Input Capture özelliğini kullanacağız.

Input Capture yöntemi, sinyalin yükselen ve düşen kenarlarının zamanlayıcı tarafından algılanmasını sağlar. Böylece işlemci sürekli olarak GPIO pinini kontrol etmek zorunda kalmaz.

STM32 ile HC-SR04 Ultrasonik Mesafe Sensörü Kullanımı

STM32CubeMX üzerinde şu ayarları yapalım:

Timer 1 (TIM1) ayarları

ParametreDeğer
Channel 1Input Capture
Prescaler71
Counter Period (ARR)65535
Capture PolarityRising Edge
Capture PrescalerDIV1
Input Filter0

Bu örnekte Timer giriş frekansının 72 MHz olduğu varsayılmıştır. Prescaler 71 olarak ayarlandığında sayaç 1 MHz hızında çalışır.

Böylece her sayaç artışı 1 mikrosaniyeye karşılık gelir.

GPIO ayarları

  1. PA8: TIM1 Channel 1 Input Capture
  2. PA9: GPIO Output

Ayrıca TIM1 Capture Compare kesmesini etkinleştirmeyi unutmayın.

Not: Timer saat frekansı kullanılan STM32 modeline ve saat ağacına göre değişebilir. Prescaler değerini kendi projenizin gerçek timer saatine göre hesaplamalısınız.

6. STM32 HAL ile mikro saniye gecikme fonksiyonu

Sensörü çalıştırmak için TRIG pinine 10 mikrosaniyelik bir darbe göndermemiz gerekiyor.

Timer sayacını kullanarak mikro saniye hassasiyetinde gecikme oluşturabiliriz.

void delay_us(uint16_t us)
{
    __HAL_TIM_SET_COUNTER(&htim1, 0);

    while (__HAL_TIM_GET_COUNTER(&htim1) < us);
}

Bu fonksiyon, TIM1 sayacını sıfırlar ve istenen mikrosaniye değerine ulaşılana kadar bekler.

Timer 1 MHz frekansta çalıştığı için sayaçtaki her artış 1 µs anlamına gelir.

7. Input Capture ile ECHO sinyalini ölçme

Şimdi sensörden gelen ECHO sinyalinin yükselen ve düşen kenarlarını yakalayacağız.

Önce gerekli değişkenleri tanımlayalım:

volatile uint8_t capture_state = 0;

volatile uint16_t capture_start = 0;
volatile uint16_t capture_end = 0;

volatile uint32_t echo_time = 0;
volatile float distance_cm = 0;

Ardından HAL kütüphanesinin Input Capture kesme fonksiyonunu oluşturalım:

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
    if (htim->Instance == TIM1 &&
        htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
    {
        if (capture_state == 0)
        {
            capture_start = HAL_TIM_ReadCapturedValue(
                htim, TIM_CHANNEL_1
            );

            capture_state = 1;

            __HAL_TIM_SET_CAPTUREPOLARITY(
                htim,
                TIM_CHANNEL_1,
                TIM_INPUTCHANNELPOLARITY_FALLING
            );
        }
        else
        {
            capture_end = HAL_TIM_ReadCapturedValue(
                htim, TIM_CHANNEL_1
            );

            if (capture_end >= capture_start)
            {
                echo_time = capture_end - capture_start;
            }
            else
            {
                echo_time = (65536UL - capture_start)
                            + capture_end;
            }

            distance_cm = echo_time / 58.0f;

            capture_state = 0;

            __HAL_TIM_SET_CAPTUREPOLARITY(
                htim,
                TIM_CHANNEL_1,
                TIM_INPUTCHANNELPOLARITY_RISING
            );
        }
    }
}

Kodun çalışma mantığı:

  1. İlk yükselen kenar algılandığında başlangıç zamanı kaydedilir.
  2. Timer, düşen kenarı algılayacak şekilde değiştirilir.
  3. ECHO sinyali LOW olduğunda bitiş zamanı kaydedilir.
  4. İki zaman arasındaki fark hesaplanır.
  5. Sayaç taşması (overflow) oluşmuşsa gerekli düzeltme yapılır.
  6. Ölçülen süre santimetreye çevrilir.
  7. Timer tekrar yükselen kenarı algılamaya hazırlanır.

Bu yöntem sayesinde ECHO sinyalinin HIGH kalma süresi mikro saniye hassasiyetinde ölçülebilir.

8. HC-SR04 ölçüm fonksiyonu

Sensörden yeni bir ölçüm almak için TRIG pinine 10 mikrosaniyelik tetikleme sinyali göndermeliyiz.

void HCSR04_Trigger(void)
{
    HAL_GPIO_WritePin(
        GPIOA,
        GPIO_PIN_9,
        GPIO_PIN_SET
    );

    delay_us(10);

    HAL_GPIO_WritePin(
        GPIOA,
        GPIO_PIN_9,
        GPIO_PIN_RESET
    );
}

Bu fonksiyon çağrıldığında HC-SR04 yeni bir mesafe ölçümü başlatır.

Ölçümün tamamlanmasıyla Input Capture kesmesi üzerinden mesafe değeri güncellenir.

Ana program içerisinde kullanımı:

int main(void)
{
    HAL_Init();
    SystemClock_Config();

    MX_GPIO_Init();
    MX_TIM1_Init();

    HAL_TIM_IC_Start_IT(&htim1, TIM_CHANNEL_1);

    while (1)
    {
        HCSR04_Trigger();

        HAL_Delay(100);
    }
}

Burada ölçümler arasında 100 milisaniye beklenmektedir. Sensörün güvenilir çalışması için ölçümler arasında en az yaklaşık 60 ms bırakılması önerilir.


11. Sık karşılaşılan sorunlar

STM32 sürekli 0 cm gösteriyor.

  1. ECHO ve TRIG bağlantılarını kontrol edin.
  2. Sensörün 5V ile beslendiğinden emin olun.
  3. Timer Input Capture kanalının doğru seçildiğini kontrol edin.
  4. Kesme ayarlarının etkin olduğunu doğrulayın.

Ölçüm değerleri sürekli değişiyor.

  1. Sensörün sabit durduğundan emin olun.
  2. Ölçümler arasında yeterli süre bırakın.
  3. Düzgün olmayan veya sesi iyi yansıtmayan yüzeylerden kaynaklanan hataları kontrol edin.
  4. Birden fazla ölçümün ortalamasını almayı deneyin.

STM32 sensörü algılamıyor.

  1. Ortak GND bağlantısını kontrol edin.
  2. ECHO sinyalinin doğru lojik seviyede olduğunu ölçün.
  3. Timer saat frekansını ve Prescaler değerini kontrol edin.

Sonuç

Bu projede HC-SR04 ultrasonik mesafe sensörünü STM32F103C8T6 mikrodenetleyicisi ile kullanmayı öğrendik. STM32CubeMX üzerinden Timer Input Capture ayarlarını gerçekleştirdik ve HAL kütüphanesi ile ECHO sinyalinin süresini ölçerek mesafe hesapladık.

Timer tabanlı ölçüm yöntemi, mikrodenetleyicinin diğer işlemleri yürütürken hassas zaman ölçümü yapabilmesine olanak tanır.

Bu uygulama; robotik, otomasyon, akıllı cihazlar ve gömülü sistem projeleri geliştirmek isteyenler için iyi bir başlangıç noktasıdır.

Paylaş
YazarProje Hocam

2012’den beri robotik, elektronik, yazılım ve makine alanlarında butik Ar-Ge projeleri geliştiriyor; projelerimizi açık kaynak olarak paylaşıp maker kültürünü destekliyoruz.

Projenizi birlikte yapalım

İlginizi çekebilecek yazılar

Projeniz için yardım mı lazım?Mühendis ekibimiz malzeme seçiminden kodlamaya kadar yanınızda.