EMPA Workshop’a hoşgeldiniz, bu yazıda SenseShield üzerinde bulunan sensörleri ve entegreleri nasıl kullanılacağı anlatılacaktır. Lütfen önceki yazımızdaki ( EMPA Workshop’a gelmeden önce yapılıcaklar) talimatlarını eksiksiz yaptığınızdan emin olunuz.
Proje Dosyasının İçe Aktarılması ve Gerekli Kütüphanelerin Yüklenmesi
SenseShield üzerinde bulunan sensörler başlatılmak için kendilerine özel yazılmış kütüphanelere ihtiyaç duymaktadır. Bu kütüphaneler proje içerisine eklendikten sonra çeşitli komutlar yardımıyla sensör başlatma ve okuma işlemleri gerçekleştirilecektir.
Öncelikle bu linkten SenseShield için gerekli olan klasörleri indiriniz.
Proje Dosyasının İçe Aktarılması
Öncelikle indirdiğiniz klasörün içerisinde bulunan First Template isimli klasörün içerisinde bulunan WS_DEMO klasörünün içerisine girin. Burada bulunan .project uzantılı dosyaya çift tıklayarak projeyi STM32CubeIDE içerisine aktarın. Örnek bir klasör görünümü aşağıda verilmiştir.
Bu işlemin ardından sizi STM32CubeIDE platformuna yönlendirecek ve projeyi IDE içerisine aktarmış olacaktır. Bunun için örnek görüntü aşağıda verilmiştir.
Ardından WS_DEMO.ioc dosyasına çift tıklayarak proje konfigürasyon sayfasına ilerleyin. Açılan sayfada sol üstte bulunan “Device Configuration Tool Code Generation” butonuna tıklayarak proje dosyalarını güncelleyin.
Kütüphane Dosyalarının Projeye Eklenmesi
Daha önceden indirmiş olduğunuz First Template klasörü içerisinde bulunan Libraries klasörü içerisine girin. İndirilmiş olan kütüphane dosyalarını proje dosyası içerisinde Core>Src ve Core>Inc klasörleri içerisine atıyoruz. İşlem sonucunda proje dosyası aşağıdaki şekilde olacaktır.
Bu aşamadan sonra main.c dosyasının içerisine girerek işlemlerimizi yürüteceğiz.
Öncelikle Sensor library include section start ve Sensor library include section end yorum satırlarının arasına aşağıdaki kod satırını ekleyin. Bu satır sensörler için gerekli olan komutları içeren kütüphanenin proje içerisine aktarılmasını sağlar.
#include "EMPA_Sensor.h"
Ardından sensörler için kullanılacak değişkenleri Sensor private variables section start ve Sensor private variables section end yorum satırlarının arasına yerleştiriyoruz. Bunun için aşağıdaki kod satırları uygun yorum satırları arasına ekleyin.
Bu aşamanın ardından printf komutu ile terminal kontrolünün sağlanması için gerekli fonksiyonun eklenmesi gerekmektedir. Bunun için Uart printf section start ve Uart printf section end yorum satırları arasına aşağıdaki kodu ekleyin.
#ifdef __GNUC__#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)#else#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)#endif
PUTCHAR_PROTOTYPE {
HAL_UART_Transmit(&huart3, (uint8_t*)&ch, 1, HAL_MAX_DELAY);return ch;}
Bu işlemin ardından sensörlerin başlatılması için ayarlanmış olan fonksiyonu yerine ekleyin. Bunun için Sensor init section start ve Sensor init section end yorum satırları arasına aşağıdaki kodu ekleyin.
Bütün bu işlemler tamamlandığı takdirde sensörlerin başlatılması aşamasına geçilebilmektedir.
Sensörlerin Başlatılması
Sensörlerin başlatılması işlemine sıcaklık ve nem sensörü olan SHT40 sensörü ile başlıyoruz. Bunun için EMPA_Sensor.c dosyası içerisine girin. Bu dosya içerisinde bulunan SHT4X Start ve SHT4X end yorum satırları arasına aşağıdaki kodu ekleyin.
uint32_t sht4x_serialnumber;
Ardından EMPA_Sensor_Init fonksiyonu içerisinde bulunan SHT4X Initialization Section Start ve SHT4X Initialization Section End yorum satırları arasına aşağıdaki kodu ekleyin. Bu sayede SHT40 sensör içerisindeki seri numara okunabilmektedir.
Hemen ardından VoC sensörü olan SGP40 sensörünün başlatılması işlemine geçiyoruz. Bunun için EMPA_Sensor.c dosyası içerisinde bulunan SGP4X Start ve SGP4X End yorum satırları arasına aşağıdaki kodu ekleyin.
Ardından EMPA_Sensor_Init fonksiyonu içerisinde bulunan SGP4X Initialization Section Start ve SGP4X Initialization Section End yorum satırları arasına aşağıdaki kodu ekleyin. Bu aşama ile birlikte SGP40 VoC sensörü ölçüm için hazır olacaktır.
Bu işlemin de ardından basınç sensörü olan LPS22 sensörünün başlatılma aşamasına geçiyoruz. Bunun için EMPA_Sensor.c dosyası içerisinde bulunan LPS22 Start ve LPS22 End yorum satırları arasına aşağıdaki kodu ekleyin.
Ardından EMPA_Sensor_Init fonksiyonu içerisinde bulunan LPS22 Initialization Section Start ve LPS22 Initialization Section End yorum satırları arasına aşağıdaki kodu ekleyin.
Bu işlemin ardından ivme sensörü olan ISM330 sensörünün başlatılma işlemini gerçekleştiriyoruz. Bunun için ISM330 Start ve ISM330 End yorum satırları arasına aşağıdaki kodu ekleyin.
Ardından EMPA_Sensor_Init fonksiyonu içerisinde bulunan ISM330 Initialization Section Start ve ISM330 Initialization Section End yorum satırları arasına aşağıdaki kodu ekleyin.
Ardından renk algılama sensörü olan AL8844 sensörü için gerekli işlemlere geçiyoruz. Bunun için AL8844 Start ve AL8844 End yorum satırları arasına aşağıdaki kodu ekleyin.
Bunun sonrasında EMPA_Sensor_Init fonksiyonu içerisinde bulunan AL8844 Initialization Section Start ve AL8844 Initialization Section End yorum satırları arasına aşağıdaki kodu ekleyin.
Bu işlemin ardından kızılötesi sensörü olan STHS34PF80 sensörünü başlatmak için gerekli işlemleri yapıyoruz. Bunun için STHS Start ve STHS End yorum satırları arasına aşağıdaki kod satırını ekleyin.
Ardından EMPA_Sensor_Init fonksiyonu içerisinde bulunan STHS Initialization Section Start ve STHS Initialization Section End yorum satırları arasına aşağıdaki kodu ekleyin.
Son olarak yakınlık sensörü olan VL53L8A1 sensörü için gerekli işlemleri yapıyoruz. Bunun için VL53L8A1 Start ve VL53L8A1 End yorum satırları arasına aşağıdaki kodu ekleyin.
Ardından EMPA_Sensor_Init fonksiyonu içerisinde bulunan VL53 Initialization Section Start ve VL53 Initialization Section End yorum satırları arasına aşağıdaki kodu ekleyin.
Bütün bu işlemlerin ardından sensörlerin tamamı başlatılmıştır. Bu aşamanın ardından sensörlerden nasıl veri alabileceğimizi ve nasıl terminal ekranında gösterebileceğimizi göreceğiz.
Sensörlerden Veri Alınması
Bu aşamada sensörlerden tek tek veri alıp terminal ekranında yazdıracağız. Bunun için EMPA_Sensor.c dosyası içerisine girerek işlemlerimizi gerçekleştireceğiz.
Öncelikle terminal ekranının sürekli temizlenmesi için aşağıdaki kod satırın Process Start yorum satırının altına ekleyin.
printf("\e[1;1H\e[2J");
Ardından main.c dosyası içerisinde bulunan Sensor process section start ve Sensor process section end yorum satırları arasına aşağıdaki kodu ekleyin.
Bütün okuma işlemlerinde alınan veriler ilk aşamalarda tanımladığımız sensors ve tof_result dizilerine kaydedilecektir. Buraya yazdıktan sonra istediğimiz gibi okuma-yazma işlemi yapabileceğiz.
Öncelikle SHT40 sensöründen veri alarak başlıyoruz. Bunun için EMPA_Sensor_Process fonksiyonu içerisinde bulunan SHT4X Process Start ve SHT4X Process End yorum satırları arasına aşağıdaki kodu ekleyin.
Terminal ekranına yazdırma işleminden önce float değerlerin yazdırılabilmesi için proje ayarlarından "Use float with printf from newlib-nano(-u_printf_float) seçeneğini aktif hale getirin. Bunun için Project Explorer sekmesinde bulunan projenize sağ tıkayın ve açılan menüde Properties seçeneğine tıklayın. Ardından açılan pencerede sırasıyla C/C++ Build ve Settings butonlarına tıklayın. Karşınıza çıkan ekranda işaretlemeniz gereken kutucuğu görebilirsiniz. Örnek ekran görüntüsü aşağıda verilmiştir.
Bunun ardından terminal ekranına yazdırma işlemi için EMPA_Sensor_Print fonksiyonu içerisinde bulunan Print Start ve Print End yorumları arasına aşağıdaki kodu ekleyin.
Bu işlemin ardından terminal ekranında sıcaklık ve nem değerlerini görebilirsiniz. Örnek bir ölçüm sonucu aşağıda verilmiştir.
Ardından VoC sensörü olan SGP40 sensöründen veri alınması işlemine geçiyoruz. Bunun için EMPA_Sensor_Process fonksiyonu içerisinde bulunan SGP4X Process Start ve SGP4X Process End yorum satırları arasına aşağıdaki kodu ekleyin.
Bu işlemin ardından terminal ekranına yazdırma işlemi için EMPA_Sensor_Print fonksiyonu içerisinde bulunan Print Start ve Print End yorumları arasında bulunan kodları silin ve aşağıdaki kodu ekleyin.
Bu işlemin ardından terminal ekranında VoC değerlerini görebilirsiniz. Örnek bir ölçüm sonucu aşağıda verilmiştir.
Ardından basınç sensörü olan LPS22 için gerekli veri alma işlemlerine geçiyoruz. Bunun için EMPA_Sensor_Process fonksiyonu içerisinde bulunan LPS22 Process Start ve LPS22 Process End yorum satırları arasına aşağıdaki kodu ekleyin.
Bu işlem ile birlikte terminal ekranına yazdırma işlemi için EMPA_Sensor_Print fonksiyonu içerisinde bulunan Print Start ve Print End yorumları arasında bulunan kodları silin ve aşağıdaki kodu ekleyin.
Bu işlemin ardından terminal ekranında basınç değerlerini görebilirsiniz. Örnek bir ölçüm sonucu aşağıda verilmiştir.
Ardından ivme sensörü olan ISM330DHCX sensöründen veri alınması işlemine geçiyoruz. Bunun için EMPA_Sensor_Process fonksiyonu içerisinde bulunan ISM330 Process Start ve ISM330 Process End yorum satırları arasına aşağıdaki kodu ekleyin.
Ardından terminal ekranına yazdırma işlemi için EMPA_Sensor_Print fonksiyonu içerisinde bulunan Print Start ve Print End yorumları arasında bulunan kodları silin ve aşağıdaki kodu ekleyin.
Bu işlemin ardından terminal ekranında eksen değerlerini görebilirsiniz. Örnek bir ölçüm sonucu aşağıda verilmiştir.
Ardından renk sensörü olan AL8844 sensöründen veri alınması işlemine geçiyoruz. Bunun için EMPA_Sensor_Process fonksiyonu içerisinde bulunan AL8844 Process Start ve AL8844 Process End yorum satırları arasına aşağıdaki kodu ekleyin.
Ardından terminal ekranına yazdırma işlemi için EMPA_Sensor_Print fonksiyonu içerisinde bulunan Print Start ve Print End yorumları arasında bulunan kodları silin ve aşağıdaki kodu ekleyin.
Bu işlemin ardından terminal ekranında renk ve kızılötesi değerlerini görebilirsiniz. Örnek bir ölçüm sonucu aşağıda verilmiştir.
Ardından kızılötesi sensör olan STHS34PF80 sensöründen veri alınması işlemine geçiyoruz. Bunun için EMPA_Sensor_Process fonksiyonu içerisinde bulunan STHS Process Start ve STHS Process End yorum satırları arasına aşağıdaki kodu ekleyin.
Ardından terminal ekranına yazdırma işlemi için EMPA_Sensor_Print fonksiyonu içerisinde bulunan Print Start ve Print End yorumları arasında bulunan kodları silin ve aşağıdaki kodu ekleyin.
Bu işlemin ardından terminal ekranında varlık değerini görebilirsiniz. Örnek bir ölçüm sonucu aşağıda verilmiştir.
Ardından yakınlık sensörü olan VL53L8A1 sensöründen veri alınması işlemine geçiyoruz. Bunun için EMPA_Sensor_Process fonksiyonu içerisinde bulunan VL53 Process Start ve VL53 Process End yorum satırları arasına aşağıdaki kodu ekleyin.
if(VL53_Drv->GetDistance(VL53_CompObj[VL53L8A1_DEV_CENTER], &VL53_Result)<0){memset(EMPA_TOF_Result, 0, 64);}else{for(int i =0; i <64; i++){
EMPA_TOF_Result[i]= VL53_Result.ZoneResult[i].Distance[0];}}
Ardından terminal ekranına yazdırma işlemi için EMPA_Sensor_Print fonksiyonu içerisinde bulunan Print Start ve Print End yorumları arasında bulunan kodları silin ve aşağıdaki kodu ekleyin.
for(int i =0; i <8; i++){for(int j =0; j <8; j++){printf("%d:%ld ", i + j, EMPA_TOF_Result[i + j]);}printf("\r\n");}
Bu işlemin ardından terminal ekranında yakınlık değerlerini görebilirsiniz. Örnek bir ölçüm sonucu aşağıda verilmiştir.
Bütün bu işlemler ile birlikte sıfırdan projeyi oluşturulmuş, sensörler başlatılmış ve veri okuma işlemleri gerçekleştirilmiştir.
VL53L8A1 Ekstra Projeleri
Bu aşamada ise VL53L8A1 sensörü temel alınarak oluşturulmuş projelere yer verilecektir. Bu noktada ilk aşamalarda indirdiğiniz Python Projects isimli klasöre girin. Ardından EMPA_VL_DEMO klasörü içerisine girin. Bu aşamadan sonra .project uzantılı dosyaya çift tıklayarak projeyi STM32CubeIDE platformu içerisine aktarın. Ardından projeyi derleyerek kartınıza aktarın.
Bu aşamayla birlikte iki adet örnek projeyi çalıştırabilecek durumdasınızdır. Bunlardan ilki VL53L8A1 yakınlık sensörü ile bir odaya giren çıkan insan sayısını sayan VL53_Counter.py projesidir. Bunun için VL53_Counter.py dosyasını açın. Ardından aşağıda verilen fonksiyonun içerisinde olan seri port ismini kendi port isminize göre değiştirin. Burada örnek olarak /dev/ttyACM0 verilmiştir.
Bu işlemin ardından projeyi çalıştırdığınızda karşınıza aşağıdaki gibi bir ekran gelecektir ve oda içerisine giren çıkan kişiler tek tek sayılacaktır.
Diğer proje ise VL53L8A1 yakınlık sensörü ile 8x8 ısı haritası oluşturan projedir. Bunun için VL53_Heat.py dosyasını açın. Ardından aşağıda verilen fonksiyonun içerisinde olan seri port ismini kendi port isminize göre değiştirin. Burada örnek olarak /dev/ttyACM0 verilmiştir.
Bu işlemin ardından projeyi çalıştırdığınızda karşınıza aşağıdaki gibi bir ekran gelecektir ve ısı haritası şeklinde sensör verilerini görebileceksiniz.
ISM330DHCX Machine Learning Core
Bu Bölümde ISM330DHCX'in Machine learning Core ile denemeler yapılacaktır. Öncelikle indirdiğiniz dosyalarda "Machine Learning Core" klasörünün içerisindeki .project dosyasına çift tıklayarak örnek projeyi stmcubeide'ye aktarınız.
Main dosyasının içerisinde includeların altında commentlenmis #define'lar görüceksiniz.
/* * Uncomment one of them at a time * * */#define ism_six_d_example//#define ism_motion_intensity_example//#define ism_vehicle_stationary_detection_example//#define ism_vibration_monitoring_example
Bu commentleri tek tek açarak istediğiniz modelleri seçebilirsiniz.
6D position recognition
Bu örnek, akselerometre verilerinin farklı eksenlerindeki Ortalama özellikleri (işaretli/İşaretsiz) kullanarak gerçekleştirilen 6D konum tanıma örneğini sunmaktadır.
Bu örnekte, akselerometre verilerini analiz ederek tanımlanan konumları içermektedir. Tanınan konumlar şunlardır: Hiçbiri, X-ekseni yukarı yönlü, X-ekseni aşağı yönlü, Y-ekseni yukarı yönlü, Y-ekseni aşağı yönlü, Z-ekseni yukarı yönlü, Z-ekseni aşağı yönlü
0 = None
1 = X-axis pointing up
2 = X-axis pointing down
3 = Y-axis pointing up
4 = Y-axis pointing down
5 = Z-axis pointing up
6 = Z-axis pointing down
Motion intensity
İvmeölçer normu üzerinde varyans özelliği kullanılarak gerçekleştirilen hareket şiddeti tespiti basit bir örneği. Bu örnekte tanımlanan sınıflar, 0 ile 7 arasında değişen sekiz farklı şiddet seviyesidir.
0 = Intensity_0
1 = Intensity_1
2 = Intensity_2
3 = Intensity_3
4 = Intensity_4
5 = Intensity_5
6 = Intensity_6
7 = Intensity_7
Vehicle stationary detection
Bu örnekte açıklanan sabitlik tespit algoritması, tüm bu amaçlar için toplanan veri günlüklerinin cihazın bir aracın içinde bulunduğu durumlardan elde edilmiş olması nedeniyle araç uygulamaları için tasarlanmıştır.
Bu örnekte tanımlanan sınıflar şunlardır: Hareket ve Sabitlik.
0 = Motion
4 = Stationary
Vibration monitoring
Bu örnekte, basit bir titreşim izleme algoritması sunulmaktadır.
NFC Tag yazma ve okuma işlemlerinde ST firmasının geliştirmiş olduğu ST Tap programı kullanılmaktadır. Bu uygulama sayesinde kart üzerinde bulunan entegre hakkında bilgilere ulaşabilir ve çeşitli verileri NFC Tag üzerine kayıt edebilir veya üzerinden okuma yapabiliriz. Uygulamanın kurulumu için aşağıdaki QR kodu taratın.
Bu aşamada ise sensörlerden ölçülen verilerden eksen verileri ve sıcaklık nem verileri NFC Tag üzerine kayıt edilecektir. Bu sayede NFC özelliğine sahip bir cihaz ile kaydedilen veriler okunabilecektir.
Kayıt işlemlerinden önce NFC kütüphanelerinde yapılması gereken değişiklikler bulunmaktadır.
1 - "NFC7->Target" klasöründe bulunan "lib_NDEF_config" dosyasını kontrol ediniz. Wrapper fonksiyonları aşağıdaki gibi olmalıdır:
int32_tNDEF_Wrapper_ReadData(uint8_t* pData, uint32_t offset, uint32_t length )
{
/* USER CODE BEGIN NDEF_Wrapper_ReadData */if(CUSTOM_NFCTAG_ReadData(CUSTOM_NFCTAG_INSTANCE, pData, offset, length ) != NFCTAG_OK)
return NDEF_ERROR;
return NDEF_OK;
/* USER CODE END NDEF_Wrapper_ReadData */return NDEF_OK;
}
int32_tNDEF_Wrapper_WriteData(constuint8_t* pData, uint32_t offset, uint32_t length )
{
/* USER CODE BEGIN NDEF_Wrapper_WriteData */if(CUSTOM_NFCTAG_WriteData(CUSTOM_NFCTAG_INSTANCE, pData, offset, length ) != NFCTAG_OK)
return NDEF_ERROR;
/* USER CODE END NDEF_Wrapper_WriteData */return NDEF_OK;
}
uint32_tNDEF_Wrapper_GetMemorySize(void)
{
/* USER CODE BEGIN NDEF_Wrapper_GetMemorySize */return CUSTOM_NFCTAG_GetByteSize(CUSTOM_NFCTAG_INSTANCE);
/* USER CODE END NDEF_Wrapper_GetMemorySize */return NDEF_OK;
}
2 - NDEF maximum text'i ayarlamak için "Middlewares\ST\lib_nfc7\lib_NDEF\Core\inc" klasoründe bulunan "lib_NDEF_Text.h" dosyasının içerisindeki aşağıdaki satırı değiştiriniz
/** @brief NDEF Text buffer length. */#define NDEF_TEXT_MAX_LENGTH 256
Öncelikle Sensor library include section start ve Sensor library include section end yorum satırları arasındaki kodu silin ve aşağıdaki kodu ekleyin.
Ardından main.c dosyası içerisinde bulunan NFC init section start ve NFC init section end yorum satırları arasına aşağıdaki kodu ekleyin.
while(EMPA_NFC_Init()!= EMPA_OK);
Bu işlem ile birlikte NFC konfigürasyonları yapılmış olup kaydetme ve okuma işlemleri için hazır konuma getirilmiştir.
Ardından verilerin her 5 ölçümden sonra NFC Tag üzerine kayıt edilmesi için main.c dosyası içerisinde bulunan Sensor process section start ve Sensor process section end yorum satırları arasında kalan kodları silin ve ardından aşağıdaki kodu ekleyin.
Bu işlemlerin ardından her 5 ölçümde bir olacak şekilde NFC Tag üzerine sensör verileri kaydedilmiştir.ST Tap uygulamasını kullanarak NFC Tag üzerindeki verileri okuyabilirsiniz.
WiFi ve NFC Uygulaması
NFC Kayıt işlemiyle birlikte son olarak NFC üzerinden WiFi Provisioning ve hemen ardından Cloud Provisioning işlemleri yapılacaktır. Bu uygulamada ilk olarak NFC üzerine kayıt edilen WiFi ve cihaz bilgileri okunulacaktır. Ardından bu bilgiler ile EmpaCloud sistemine cihaz kaydı yapılacak ve sensör verileri bu EmpaCloud bulut sistemine iletilecektir.
Bu aşamada WiFi ve NFC Provisioning işlemleri için Empa Elektronik tarafından geliştirilen EmpaCloud Connect uygulaması kullanılacaktır. Bu uygulama sayesinde hem provisioning işlemleri yapılacak olup, bu işlemlerin ardından sensör verilerini incelenebilmektedir. Uygulamayı IOS veya Android seçeneği ile indirmek için aşağıdaki QR kodu taratın.
Bu işlemler için öncelikle değişkenleri tanımlıyoruz. Bunun için main.c dosyası içerisinde bulunan Provision private variables section start ve Provision private variables section end yorum satırları arasına aşağıdaki kodu yapıştırın ve hemen ardından kullanmak istediğiniz cihaz ismini DEV_ID değişkenine yerleştirin.
Bu işlem ile birlikte WiFi bilgileri NFC Tag üzerine kaydedilmiştir. Ardından bu WiFi bilgilerini kullanarak EmpaCloud'a bağlanabilmek için gerekli işlemleri yapıyoruz. Bunun için Provision section start ve Provision section end yorum satırları arasına aşağıdaki kodu ekleyin.
Bu işlemin ardından SenseShield kartımız EmpaCloud sistemine bağlanmaya çalışacaktır. Bu ortalama bir süre içerisinde gerçekleşecektir. Bu işlemin ardından verilerin bulut sistemine aktarılması için Sensor process section start ve Sensor process section end yorum satırları arasındaki kodları silin ve aşağıdaki kodları ekleyin.
Bu işlemlerin ardından son adımda stm32h5xx_it.c dosyası içerisinde bulunan USER CODE BEGIN PV ve USER CODE END PV yorum satırları arasına aşağıdaki kodu ekleyin.
Provisioning işlemleri sırasında iki adet kullanıcı LEDi yanıp sönmektedir. Bunlardan ilki NFC üzerinden WiFi bilgilerinin alındığını kontrol ederken diğer LED ise WiFi ve EmpaCloud bağlantınızı kontrol etmektedir. İlk aşamada yanıp sönme hareketi yaparken olumlu sonuçlanan her aşamada sabit bir şekilde yanmaktadır.
Bütün bu işlemlerin ardından sensörlerden veriler ölçülüp bu ölçülen değerler EmpaCloud bulut sistemine aktarılmıştır. EmpaCloud Connect uygulaması kullanarak sensör verilerinizi görebilirsiniz.