STM32 VE NRF24L01 İLE SİSTEMDEKİ AKTİF CİHAZLARIN LİSTELENMESİ

Merhabalar size bu yazımda staj süresince üzerinde çalıştığım projem hakkında bilgiler verip deneyimlerimi paylaşacağım.

İlk olarak NRF24L01 modülünü size tanıtarak başlayayım. 2.4 Ghz bandında çalışan 126 kullanılabilir kanal ve 1-2 Mbps aktarım hızlarına çıkabilen düşük fiyatlı kablosuz haberleşme modülüdür. Bu modülün menzili harici antenli olan versiyon için 900m, smd antenli versiyon için 100 metredir.

Sürekliliğini korunan veri iletişimlerinde performans ,veri paketlerinin küçük tutulması ile sağlanabilmektedir. 

Ben projemde NRF24L01+PA versiyonunu 250 Kbps hızında, 2 adres ve 2 farklı kanal olacak şekilde(Alıcı-Verici)  yapılandırdım.

 Sistemde mikrodenetleyici olarak ST firmasının ARM C0RTEX-M0 tabanlı STM32F091CBT6 modelini kullandım. Bu projede herhangi USART, TIMER ,SPI, RTC arayüzü bulunan bir mikrodenetleyicinin de kullanılması mümkün fakat güç tüketimi ve maliyet düşünülürek tercihte bulunmak projeye en uygun denetleyicileri bulmamız konusunda daha yardımcı olacaktır. 

Projenin genel amacı temel olarak kontrolcü olarak seçilen cihaz ile sistemdeki diğer cihazların tek kanal üzerinden iletişimini kontrol etmek ve aktif cihazların listesinin tutulmasıdır.

Bu süreçte kanala bağlı cihazlar veri olarak kendi ID’lerini iletecek ve bu ID’ler kanalı kontrol eden kontrolcü tarafından listelenip USART ile iletilecektir. Kanala veri gönderecek cihazlar, farklı bir adresten kontrolcü cihazın veri alışverişi için uygun olup olmadığını kontrol etmesi gerekmekte. Bu kontrol işlemi ile sinyal çakışmasının önlenmesi ve cihazların veri gönderme işlemi dışında düşük güç tüketimi ile çalışması amaçlanır.

Düşük Güç tüketimi modundan biraz bahsedecek olursak genel amaçları sistemin belirli dahili etkinlik, zamanlayıcı ve kesici sinyal koşullarından herhangi biri sağlanmadığı sürece fazladan güç tüketiminin engellenmesi üzerine mikrodenetleyicinin çoğu biriminin kapatılması işlemidir. 3 farklı düşük güç modu vardır. Bunlar; Stop ,Standby  ve Sleep modlarıdır. Bu modların her biri farklı özellikler ve amaçları bünyesinde barındırmaktadır. Bu modlar hakkında daha detaylı bilgileri kullandığınız denetleyicilerin dökümanları üzerinden ulaşabilirsiniz. Ben projede standby modu kullandım. Bu mod üzerinden Gerçek Zamanlı Saat (RTC) ile çıkış yapmayı tercih ettim. Bu yöntemin çalışabilmesi için sistemde harici kristal bulunmasına dikkat edilmeli. Aksi takdirde sistem standby modunda çalışırken dahili kristal kullanmanın güç tüketimini arttırmasından ötürü bu özelliği kapatır . Bunun sonucu olarak RTC kendisine tetikleme kaynağı bulamaz ve sistem sürekli bu modda takılı kalır. Harici kristal daha az güç tüketimi ile aynı işlemi gerçekleştirebilmektedir.

Projede 2 farklı kart tasarımı gerçekleştirdim. Bu kartlardan birisi bünyesinde 2 adet NRF24L01+PA bulundurup kanal kontrolcü olarak kullanıldı. 2 modül bulunmasının avantajı sistemin uzun çalışma sürelerinde hızını ve tutarlılığını kaybetmemesidir. Diğer özellikleri aynı olan 2.kartta tek haberleşme modülü bulunmakta. Kartlar 12 Mhz kristallere sahip. Kartların üzerinde programlanabilmesi için ST-LİNK bağlantı yuvaları , verilerin bilgisayar üzerinden okunabilmesi için USART giriş-çıkışları ve boot pin seçim soketi bulunmakta . Pil ile beslenmesi amaçlanan sisteme sabit gerilim değeri vermek için boost devresi ekledim. 

VERİCİ DEVRESİ

 

KANAL KONTROLCÜ DEVRESİ

 

RTC YAPILANDIRMASI

STM32CUBEİDE programı üzerinden Pinout&Configuration>Timers>RTC kısmından görseldeki ayarı yapıyoruz.

 

Peri

Periyot süreleri RTC frekansına göre hesaplanacağı için sistemin clock yapılandırmasında ki RTC çıkış frekansının bilinmesi gerekmekte

Bu aşamadan sonra benim sistemimde uyku süresi 500ms olarak ayarlanacağı için RTC sayıcı hesabını aşağıdaki gibi yaptım.

16/RTC = Bir tetikleme için geçen süre (Kalansız Bölüm)

T/Periyot =İstediğimiz süreye kadar geçen tetiklenme sayısı

T=0.5 RTC=40 KHz 0.5/(16/40000)=1250 hexadicemal=0x4E2

STM32CUBEIDE de kod kısmına geçtiğimizde RTC konfigürasyon kodları arasında wake up fonksiyonunu işlevsiz  hale getirilip ana fonksiyon içine kopyalandı.

Bu şekilde sistemimizi standby moda geçirecek bir koşul sağlandığında RTC 500 milisaniye sonra sistemi uyandıracaktır.

Sistemde RTC dışında kanal kontrolcü kart için TİMER kullandım. Delay yerine timer kullanmamın sebebi sistemin yavaşlamasını engellemektir.

Kontrolcü kartta bulunan NRF24l01 modülleri için iki farklı kütüphane oluşturdum. Bunun sebebi tek kütüphanenin 2 farklı modülde kullanılmaya çalışıldığında fazladan işlem gücü oluşturmasıdır.

VERİCİ KODLARI

Kanal kontrolcü sistem meşgul ise sisteme 1 sinyali yayınlar ve diğer cihazlar bu sinyali görünce uyku moduna geçer ve 500 ms beklerler. Veri gönderilirken ve bağlantı varken iki farklı led ile bu durumlar kart üzerinden gözlemlenebilir. Aynı anda açılan çok sayıda cihaz bu yöntem ile birkaç döngü sonra senkronize haberleşmeye başlar.

Mete ÇİÇEK  Selçuk Üniversitesi Elektrik-Elektronik 4.sınıf

İletişim: mete.cicek@outlook.com