İçindekiler
- 1. HC-SR04 ultrasonik mesafe sensörü nedir?
- 2. HC-SR04 çalışma prensibi
- 3. HC-SR04 teknik özellikleri
- 4. HC-SR04 ve STM32 bağlantıları
- 5. STM32CubeMX zamanlayıcı ayarları
- 6. STM32 HAL ile mikro saniye gecikme fonksiyonu
- 7. Input Capture ile ECHO sinyalini ölçme
- 8. HC-SR04 ölçüm fonksiyonu
- 11. Sık karşılaşılan sorunlar
- 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?

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ı:
- Robotlarda engel algılama sistemleri
- Otonom araç ve robot projeleri
- Akıllı çöp kutuları
- Depo ve tanklarda sıvı seviye ölçümü
- Otomatik kapı sistemleri
- Park sensörü uygulamaları
- 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:
- STM32, sensörün TRIG girişine en az 10 mikrosaniye süreyle HIGH sinyali gönderir.
- Sensör, 40 kHz frekansında 8 darbeli ultrasonik sinyal üretir.
- Ses dalgası bir nesneye çarparak sensöre geri döner.
- Sensörün ECHO çıkışı, sesin gidip gelme süresi boyunca HIGH seviyesinde kalır.
- 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
| Özellik | Değer |
| Çalışma gerilimi | 5V DC |
| Çalışma frekansı | 40 kHz |
| Ölçüm aralığı | 2–400 cm |
| Hassasiyet | Yaklaşık ±3 mm |
| TRIG sinyali | En az 10 µs |
| Çıkış sinyali | 5V TTL |
| Bağlantı tipi | 4 pin |
4. HC-SR04 ve STM32 bağlantıları

Bu örnekte STM32F103C8T6 geliştirme kartı kullanılacaktır.
| HC-SR04 | STM32F103C8T6 | Açıklama |
| VCC | 5V | Sensör beslemesi |
| GND | GND | Ortak toprak |
| TRIG | PA9 | Tetikleme çıkışı |
| ECHO | PA8 (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:
- ECHO ile PA8 arasına 1 kΩ direnç
- 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.

STM32CubeMX üzerinde şu ayarları yapalım:
Timer 1 (TIM1) ayarları
| Parametre | Değer |
| Channel 1 | Input Capture |
| Prescaler | 71 |
| Counter Period (ARR) | 65535 |
| Capture Polarity | Rising Edge |
| Capture Prescaler | DIV1 |
| Input Filter | 0 |
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ı
- PA8: TIM1 Channel 1 Input Capture
- 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ığı:
- İlk yükselen kenar algılandığında başlangıç zamanı kaydedilir.
- Timer, düşen kenarı algılayacak şekilde değiştirilir.
- ECHO sinyali LOW olduğunda bitiş zamanı kaydedilir.
- İki zaman arasındaki fark hesaplanır.
- Sayaç taşması (overflow) oluşmuşsa gerekli düzeltme yapılır.
- Ölçülen süre santimetreye çevrilir.
- 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.
- ECHO ve TRIG bağlantılarını kontrol edin.
- Sensörün 5V ile beslendiğinden emin olun.
- Timer Input Capture kanalının doğru seçildiğini kontrol edin.
- Kesme ayarlarının etkin olduğunu doğrulayın.
Ölçüm değerleri sürekli değişiyor.
- Sensörün sabit durduğundan emin olun.
- Ölçümler arasında yeterli süre bırakın.
- Düzgün olmayan veya sesi iyi yansıtmayan yüzeylerden kaynaklanan hataları kontrol edin.
- Birden fazla ölçümün ortalamasını almayı deneyin.
STM32 sensörü algılamıyor.
- Ortak GND bağlantısını kontrol edin.
- ECHO sinyalinin doğru lojik seviyede olduğunu ölçün.
- 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.




















































































