YAZARLIK BAŞVURUSUBize Katılmak istermisiniz?

STM32 ile Mbed OS Kullanarak I2C LCD Ekran ve Ultrasonic Sensör

Merhabalar,

Bu konuda STM32 serisi kartlar ile mbed OS kullanarak basit bir uygulama yapacağız. Bu uygulamada STM32 kartımız bağlayacağımız bir Ultrasonik sensör ile ölçtüğümüz mesafeyi I2c Lcd ekrana aktaracağız. Bu işlemi biraz daha Arduino’ dan farklı olsun bir Mbed OS’ nun kendi thread yapısını kullanarak iki ayrı thread’ de gerçekleştireceğiz. Öncelikle burada bahsettiğim thread’ lerin ne olduğuna bakalım. Türkçe karşılıkları iş parçacığı olan thread’ ler basit olarak yapılacak işi yada işi zamanlama yöntemiyle azar azar yapılmasını sağlarlar.

Yapacağımız örnekten açıklayacak olursam. Ultrasonik sensörden mesafe okuma işlemi uzun mesafelerde (3 – 5 m gibi) 3 sn gibi süreler tutabiliyor. LCD ekran ile ultrasonik  sensörden okuma işlemlerini sıralı olarak yapmam durumunda ekranın yenilenmesi, sensörden gelen verinin okunmasından sonra yani 3 sn sonra olacaktır. Ancak siz bunu thread’ ler ile bölerseniz iki işlem birbirinden bağımsız olarak gerçekleştirilirler. Thread’ ler içerinde yapacağınız gecikmeli işlemler birbirini etkilemezler. Bİr thread beklerken diğerleri o süre çalışmaya devam ederler. Burada dikkat etmeniz gereken en önemli şey fazla sayıda thread’ i çok az zamanlı oluşturmamanız. Bu tür durumlarda sistemin stabil çalışması için bazı ince hesaplara ihtiyaç duyabilirsiniz.

Biz örneğimize geri dönelim.  Daha önceki konularda ultrasonik sensörün ve I2C LCD ekranın kullanımını Arduino ile anlatmıştık. O yüzden onların detaylarına fazla değinmeyeceğim. Bu örnekte Mbed kullanmak için Vscode’ nin platformio eklentisini kullanacağım. Bunu seçmemin sebebi basit uygulamar için Platformio kolay ve hızlı bir çözüm olması. Mbed cli yöntemi biraz daha karmaşık (çok yada büyük kütüphaneli) projeler için ideal çözüm. Daha önce Platformio’ nun nasıl kullanıldığı ile ilgili konu paylaşmıştım. Bağlantıdan ulaşabilirisiniz. Öncelikle gerekli bağlantılarımızı yapalım.

test_bb

Uygulamayı nucleo-f767 kartı ile yapacağım. Ancak fritzing şemasında 64 pin serisi kart bulabildiğimden onu koydum. Aradaki değişiklikleri yeri geldikçe belirtmeye çalışacağım. Mbed kullanacağımız için ortak donanımların kullanımı iki kart için de hemen hemen aynı olacağından yazılımda çok farklılık bulunmamakta. Bağlantı şemamız herhangi bir lojik seviye dönüştürücü işlem kullanmadık. Bunun sebebi Nucleo serisi kartların hemen hemen bütün GPIO pinlerinin 5V tolerans lı olması. Bu sayede giriş den uygulanan 5V ile mikrodenetleyici zarar görmemekte.

Yazılıma gelecek olursak. Basitçe bir ultrasonic sensörün çalışmasına değinelim. Ultrasonic sensörler yaydığı ses dalgasının bir cisimden yansıyıp geri gelme süresini ölçme prensibine göre çalışırlar. Burada kullanacağımız HC-SR04 serisi ultrasonic sensörde TRIG pininden uygulanan 10 – 15 us arası tetik sinyali ile ürettiği 38 kHz’ lik ses işaretinin geri gelme süresini ECHO pininden geri iletir. Sensör tarafından ölçülen mesafe ECHO pinin lojik 1 olma süresi olarak iletilecektir. Yani buradaki süre hesabının çok hızlı ve doğru yapılması gerekir. Bu işlem için Mbed OS içerisindeki timer’ ları kullanacağız. Oldukça kullanışlı hale getirilen timer’ lar Arduino’ ya daki millis yada micros fonksiyonları kadar kolay kullanılır hale gelmişler. Bunun için tanımlayacağımız bir bir interrupt ile echo pini için yükselen kenarı belirleyeceğiz ve timer ile o andan itibaren saymaya başlayacağız. Kullanacağımız LCD I2C lcd olduğu için kullanacağımız kütüphane de bağlantıdaki kütüpahane olacaktır.

Echo pini interrupt, trig ise dijital çıkış olarak tanımlayalım.

Interrupt geldiği zaman ise aşağıdaki gibi bir yapı ile timer’ ı başlatabilirsiniz.

 

Daha sonra kullanacağımız timer’ ları tanımlayalım.

Gördüğünüz gibi timer oluşturmak bu kadar basit. Bunun yanı sıra Mbed OS’ de ticker isimli asenkron ve callback li zamanlayıcılar mevcuttur.  Bu sınıflara bağlantıdan ulaşabilirsiniz. Şimdi sıra geldi thread’ leri oluşturmaya. İki adet thread oluşturacağız. Bunlardan bir tanesi lcd’ yi güncelliyecek diğeri ise ultrasonic sensörden okuma yapacak.

Bu thread’ ların callback’ lerini main fonksiyonu içerisinde aşağıdaki gibi tanımlayabilirsiniz.

Bu kısımda dikkat etmeniz gereken thread’ ler içerisindeki bekleme fonksiyonları. Bu fonksiyonları kullanmak zorundasınız. Aksi taktirde diğer thread’ deki işlemler sağlıklı çalışmayabilir. En az 1ms gecikme vermenizi şiddetle tavsiye ederim. Şimdi LCD’ nin tanımını yapalım.

Lcd tanımlarını yaptıktan sonra ilk ayarlamaları yapalım. Bu ilk ayarlamalar arka ışığı aktif etme, kürsörü devre dışı bırakma gibi ayarlar. Aşağıdaki gibi yapabilirsiniz.

Ayarlama işlemleri bittikten sonra sıra geldi ana döngümüze. Thread’ li yapı kullandığımız için iki ayrı ana döngümüz olacak. İlki ultrasonik sensörün hesaplandığı ana döngümüz. Her hesaplamadan sonra 1 sn bekleyecek şekilde ayarlayacağız. Böylece saniyede 1 ölçüm yapmış alacağız. Ancak ekranı saniyede iki sefer güncelleyeceğiz. Her thread de ayrı ayrı çalışması için iki adet te led oluşturduk ki thread’ lerin çalışmalarını dışardan rahatlıkla gözlemleyebilelim.

Ultrasonik sensör için gerekli hesaplamaları yaptık. Bu aşamadan sonra sıra geldi bunu ekranda görmeye. Ekran için kullandığımız thread fonksiyonu içerisini aşağıdaki gibi oluşturabiliriz.

Yazılım kısmımızda bu kadardı. Nucleo Serisi kartlarda mbed kullanarak ultrasonik sensör ve I2C Lcd çalıştırma örneğimizde bu kadardı. Yazılımın tamamına bağlantıdan ulaşabilirsiniz. 

Yazılımın tamamında led pinleri 

şeklinde tanımlanmış. Siz bunları şematikteki D2 ve D3 pinlerine bağlı olması için aşağıdaki gibi değiştirebilirsiniz.

 

İyi çalışmalar dilerim…

Add a Comment

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir