Selam Makerlar,
Bu yazımızda, Demudekit ile Led kontrolünün nasıl gerçekleştiğini adım adım anlatacağız.
Gerekli Malzemeler:
Aşamalar
- Proje yapımı hakkında
- Gerekli kütüphaneler
- Pin bağlantıları
- Kod yazım aşaması
- Sonuçlar
Proje Yapımı Hakkında
STM32 mikrodenetleyici üzerinde çeşitli LED’lerin (kırmızı, yeşil, mavi, beyaz, sarı) ve RGB LED’lerin kontrolünü gerçekleştiren, buzzer’ıda belirli zaman dilimlerinde açılıp kapanan bir yapılandırma oluşturulmuştur. Zamanlayıcılar kullanılarak led’lerin ve buzzer’ın durumu belirli aralıklarla değiştirilir.
BUZZER: Genel olarak ses üretici bir elemandır ve elektronik projelerde çeşitli amaçlarla kullanılır. İki temel buzzer türü vardır pasif ve aktif olmak üzere; pasif buzzer bir sinüs dalgası (AC) uygulandığında ses üretir. Aktif buzzer ise dahili bir osilatör içerir, bu yüzden belirli bir frekansta çalışır. Sadece DC voltaj uygulandığında ses üretir.
LED (Light Emitting Diode): Yarı iletken bir malzemeden yapılmış, elektrik akımı geçtiğinde ışık yayan bir cihazdır. LED’ler düşük enerji tüketimi, uzun ömür, hızlı açılma-kapanma süreleri ve küçük boyutları gibi avantajları nedeniyle geniş bir kullanım alanına sahiptir.
RGB LED: Üç ayrı LED içerir: kırmızı (Red), yeşil (Green), ve mavi (Blue). Bu LED’lerin parlaklıklarını ayarlayarak farklı renkler elde edebilirsin. RGB LED’ler genellikle dört bacaklıdır (ortak anot veya ortak katot).
Gerekli Kütüphaneler
DemsayLib kütüphanesi, STM32 mikrodenetleyiciler için geliştirilmiş bir kütüphanedir ve çeşitli periferik bileşenler için driver’lar, zamanlayıcı ve kesme yönetimi, kullanıcı dostu API’ler sağlar. Bu, geliştirme sürecini hızlandırır, verimliliği artırır ve yeni başlayanlara eğitim ve öğrenme desteği sunar. Kütüphanenin sağladığı örnek kodlar ve belgeler, STM32 mikrodenetleyicileri ile uygulama geliştirmeyi daha erişilebilir ve verimli hale getirir.
Proje için indirilmesi gereken kütüphane DemsayLib bu kütüphanenin zip dosyasını indirip projenin olduğu klasör içerisine ayıklayalım. Daha sonrasında CubeIDE programında projeyi yenilediğimizde orada kütüphane gözükecektir. Bu kütüphaneyi sayfa içerisinde akifleştirelim.
Kütüphaneleri aktifleştirmek için projeye sağ tıkla- properties- C/C++ General- Paths and Symbols – GNU C içeriklerini ve kaynak yerlerini ekleyelim:
Pin Bağlantıları
Demedukit kartındaki STM32G030 mikrodenetleyicisindeki konfigürasyona göre pin bağlantılarını oluşturalım.
- İlk olarak led, buzzer ve rgb çıkış pinlerini çıkışa bağlayıp isimlendirelim:
- RCC, STM32 mikrodenetleyicilerde çeşitli çevresel birimlerin saat sinyallerini ve reset durumlarını kontrol eden birimdir. Bu birim, mikrodenetleyicinin çekirdek, bellek ve çevresel birimleri için gerekli olan saat sinyalini sağlar.
Kod Yazım Aşaması
1.İlk olarak ‘main.h’ dosyasına girelim ve burada projemizin işleyiş düzeni farklı zaman aralıklarında olacağı için bir yapı tanımlayalım farklı birkaç zaman aralığını girelim.
/* USER CODE BEGIN Private defines */
typedef struct
{
uint8_t _1msn;
uint8_t _10msn;
uint8_t _50msn;
uint8_t _100msn;
uint8_t _250msn;
uint8_t _500msn;
uint8_t _1000sn;
uint8_t _2000sn;
uint8_t _5000sn;
}SystemClockTimer_t;
SystemClockTimer_t SysClkTim;
/* USER CODE END Private defines */
- SystemClockTimer_t yapısı, çeşitli zaman aralıklarını temsil eden üyeleri içeren bir yapı tanımlar.
- SysClkTim değişkeni, bu yapıyı kullanarak farklı zaman aralıklarını depolayabilir ve yönetebilir.
2. HAL kütüphanesinin zamanlayıcı ile ilgili işlevlerinin düzgün çalışmasını sağlamak için ‘stm32g0xx_it.c’ dosyasına aşağıdaki kodu ekleyelim.
/* USER CODE BEGIN SysTick_IRQn 1 */
HAL_SYSTICK_IRQHandler();
/* USER CODE END SysTick_IRQn 1 */
Not: Geri kalan kodu ana dosyada ‘main.c’ yazalım.
3.Başlık dosyalarını programa dahil edelim. ‘DigitalInputOutputs.h’ bu dosyayı ekleyelim.
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "DigitalInputOutputs.h"
/* Private includes ----------------------------------------------------------*/
4. Belirli zaman aralıklarında ledlerin renklerini değiştirmek için aşağıdaki sayaçlar tanımlanmıştır.
/* USER CODE BEGIN PTD */
uint8_t counter = 0;
uint8_t rgbcounter = 0;
/* USER CODE END PTD */
5. Zamanlayıcı ve sayaç işlemleri için SYSTickTimer’ı tanımlayalım.
/* USER CODE BEGIN PV */
volatile uint64_t SYSTickTimer = 0;
/* USER CODE END PV */
6. Bir dizi led ve buzzer üzerinde belirli bir düzenle ışık ve ses efektleri oluşturan, her adımda RGB led’lerin ve diğer led’lerin durumlarını değiştiren ve buzzer belirli aralıklarla açılır veya kapatılır yapan kodu yazalım.
/* USER CODE BEGIN 2 */
RGB_LED_Control(Active, Passive, Passive);
LED_Control(Active, Passive, Passive, Passive, Passive);
Buzzer_Control(Active);
HAL_Delay(500);
RGB_LED_Control(Passive, Active, Passive);
LED_Control(Active, Active, Passive, Passive, Passive);
Buzzer_Control(Passive);
HAL_Delay(500);
RGB_LED_Control(Passive, Passive, Active);
LED_Control(Active, Active, Active, Passive, Passive);
Buzzer_Control(Active);
HAL_Delay(500);
RGB_LED_Control(Active, Active, Active);
LED_Control(Active, Active, Active, Active, Passive);
Buzzer_Control(Passive);
HAL_Delay(500);
LED_Control(Active, Active, Active, Active, Active);
/* USER CODE END 2 */
7.Çeşitli zaman dilimlerine göre ledlerin durumunu değiştiren döngüyü oluşturalım. Zamanlayıcı tabanlı bir kontrol mekanizması kullanarak LED’leri ve RGB LED’leri dinamik olarak yöneten kodu yazalım.
/* USER CODE BEGIN WHILE */
while (1)
{
if (SysClkTim._1000sn == 1) {
HAL_GPIO_TogglePin(LED1_RED_GPIO_Port, LED1_RED_Pin);
SysClkTim._1000sn = 0;
}
if (SysClkTim._50msn == 1) {
HAL_GPIO_TogglePin(LED2_GREEN_GPIO_Port, LED2_GREEN_Pin);
SysClkTim._50msn = 0;
}
if (SysClkTim._100msn == 1) {
HAL_GPIO_TogglePin(LED3_BLUE_GPIO_Port, LED3_BLUE_Pin);
SysClkTim._100msn = 0;
}
if (SysClkTim._250msn == 1) {
HAL_GPIO_TogglePin(LED4_WHITE_GPIO_Port, LED4_WHITE_Pin);
SysClkTim._250msn = 0;
}
if (SysClkTim._500msn == 1) {
counter++;
if (counter % 2 == 1)
HAL_GPIO_WritePin(LED5_YELLOW_GPIO_Port, LED5_YELLOW_Pin, 1);
else
HAL_GPIO_WritePin(LED5_YELLOW_GPIO_Port, LED5_YELLOW_Pin, 0);
if (counter > 2) {
counter = 0;
}
SysClkTim._500msn = 0;
}
if (SysClkTim._2000sn == 1) {
rgbcounter++;
switch (rgbcounter) {
case 0:
HAL_GPIO_WritePin(RGB_R_GPIO_Port, RGB_R_Pin, 1);
HAL_GPIO_WritePin(RGB_G_GPIO_Port, RGB_G_Pin, 0);
HAL_GPIO_WritePin(RGB_B_GPIO_Port, RGB_B_Pin, 0);
break;
case 1:
HAL_GPIO_WritePin(RGB_R_GPIO_Port, RGB_R_Pin, 0);
HAL_GPIO_WritePin(RGB_G_GPIO_Port, RGB_G_Pin, 1);
HAL_GPIO_WritePin(RGB_B_GPIO_Port, RGB_B_Pin, 0);
break;
case 2:
HAL_GPIO_WritePin(RGB_R_GPIO_Port, RGB_R_Pin, 0);
HAL_GPIO_WritePin(RGB_G_GPIO_Port, RGB_G_Pin, 0);
HAL_GPIO_WritePin(RGB_B_GPIO_Port, RGB_B_Pin, 1);
break;
case 3:
HAL_GPIO_WritePin(RGB_R_GPIO_Port, RGB_R_Pin, 1);
HAL_GPIO_WritePin(RGB_G_GPIO_Port, RGB_G_Pin, 1);
HAL_GPIO_WritePin(RGB_B_GPIO_Port, RGB_B_Pin, 1);
break;
case 4:
HAL_GPIO_WritePin(RGB_R_GPIO_Port, RGB_R_Pin, 0);
HAL_GPIO_WritePin(RGB_G_GPIO_Port, RGB_G_Pin, 0);
HAL_GPIO_WritePin(RGB_B_GPIO_Port, RGB_B_Pin, 0);
break;
}
if (rgbcounter > 4) {
rgbcounter = 0;
}
SysClkTim._2000sn = 0;
}
/* USER CODE END WHILE */
8. Aşağıdaki kod her milisaniye (ms) kesmesinde çağrılan bir fonksiyon olup, belirli zaman aralıklarına göre bayrakları set eder. Bu bayraklar, programın ana döngüsünde belirli zaman dilimlerinde çeşitli işlemleri kontrol etmek için kullanılır. Fonksiyon, her kesme gerçekleştiğinde bir sayacı artırır ve bu sayaç belirli bir değere ulaştığında ilgili zaman bayrağını (SysClkTim yapısındaki bayrağı) 1 olarak ayarlar. Bu, zamanlayıcı tabanlı olayları izlemek ve yönetmek için kullanılır.Bu kod yapısınıda ekleyelim.
/* USER CODE BEGIN 4 */
void HAL_SYSTICK_Callback(void) {
SYSTickTimer++;
if (SYSTickTimer % 1 == 0) {
SysClkTim._1msn = 1;
}
if (SYSTickTimer % 10 == 0) {
SysClkTim._10msn = 1;
}
if (SYSTickTimer % 50 == 0) {
SysClkTim._50msn = 1;
}
if (SYSTickTimer % 100 == 0) {
SysClkTim._100msn = 1;
}
if (SYSTickTimer % 250 == 0) {
SysClkTim._250msn = 1;
}
if (SYSTickTimer % 500 == 0) {
SysClkTim._500msn = 1;
}
if (SYSTickTimer % 1000 == 0) {
SysClkTim._1000sn = 1;
}
if (SYSTickTimer % 2000 == 0) {
SysClkTim._2000sn = 1;
}
if (SYSTickTimer % 5000 == 0) {
SysClkTim._5000sn = 1;
}
}
/* USER CODE END 4 */
9. Bir değişkenin birden fazla dosyada tanımlanmasını kaldırmak için proje sağ tık – properties- C/C++ Build – settings – MCU MPU GCC COMPİLER – Miscellaneous buraya ‘–fcommon’ bayrağını ekleyelim.