Kazanimlar:
- AI ile Arduino/STM32/ESP32 için register ve donanım bağlamı verilmiş gömülü kod ürettirebilme
- Kesme (interrupt), zamanlayıcı ve non-blocking döngü gibi gömülü desenleri AI çıktısında tanıyıp düzeltebilme
- Üretilen kodu bellek, gerçek zamanlılık ve güvenlik açısından donanıma yüklemeden önce gözden geçirebilme
Mekatronikte fikirlerin fiziksel dünyayla buluştuğu yer mikrodenetleyicidir. Arduino, STM32, ESP32 gibi kartlar; sensörleri okur, aktüatörleri sürer, iletişim kurar ve tüm bunları kısıtlı bellek, kısıtlı işlem gücü ve katı zamanlama gereksinimleri altında yapar. Yapay zeka bu alanda çok kullanışlıdır: bir sensörün datasheet'ine göre register ayarlarını çıkarabilir, bir haberleşme protokolünü kodlayabilir, bir zamanlayıcı kesmesini kurabilir. Ama gömülü sistemler AI'ın en çok "inandırıcı yanlış" ürettiği alanlardan biridir; çünkü register adresleri, bit maskeleri ve zamanlama davranışı karta özgüdür ve bir bit hatası tüm davranışı bozar. Bu ünitede gömülü kodu AI ile nasıl ürettireceğinizi ve donanıma yüklemeden önce nasıl gözden geçireceğinizi işliyoruz.
Gömülü Kodun Saf Yazılımdan Farkı
Bir masaüstü programı bol belleğe, işletim sistemine ve hata ayıklama kolaylığına sahiptir. Gömülü kod ise bunların çoğundan yoksundur:
Boyut
Masaüstü
Gömülü sistem
Bellek
GB seviyesi
KB seviyesi (örn. 2 KB RAM)
Zamanlama
Genelde esnek
Sıkı, gerçek zamanlı
Hata ayıklama
Kolay (debugger, log)
Zor (JTAG, seri, LED)
Hata sonucu
Program çöker
Aktüatör/donanım zarar görebilir
Kaynak erişimi
OS soyutlar
Register'a doğrudan erişim
Bu farklar, AI çıktısını değerlendirme kriterlerinizi belirler: bellek kullanımı, gerçek zamanlılık (bloklamama) ve donanım register doğruluğu her zaman kontrol listenizin başındadır.
Bloklayıcı vs Non-Blocking Kod
Yeni başlayanların ürettiği (ve AI'ın da sık verdiği) en yaygın hata delay() kullanımıdır. delay(1000) işlemciyi 1 saniye boyunca kilitler; bu sürede başka hiçbir sensör okunamaz, hiçbir buton kontrol edilemez. Mekatronikte bu kabul edilemez. Bunun yerine millis() tabanlı non-blocking desen kullanılır.
// KOTU: bloklayici -- islemci 1 sn boyunca baska is yapamazvoid loop() { digitalWrite(LED, HIGH); delay(1000); // her sey durur digitalWrite(LED, LOW); delay(1000); // Bu sirada acil bir buton okunamaz!}// IYI: non-blocking -- loop bloklanmaz, diger gorevler calisirunsigned long oncekiMs = 0;const unsigned long aralik = 1000;bool ledDurum = false;void loop() { unsigned long simdiMs = millis(); if (simdiMs - oncekiMs >= aralik) { oncekiMs = simdiMs; ledDurum = !ledDurum; digitalWrite(LED, ledDurum); } butonKontrolEt(); // her dongude calisabilir sensorOku(); // her dongude calisabilir}
Non-blocking desen, gömülü mekatroniğin temelidir: kontrol döngüsü sürekli akar, hiçbir görev diğerini kilitlemez. AI'a kod yazdırırken "delay kullanma, millis tabanlı non-blocking yaz" demek, çıktının kalitesini doğrudan yükseltir.
İpucu: AI'dan gelen gömülü kodda delay( arayın. Ana kontrol döngüsünde bir delay görüyorsanız, çoğunlukla o kod gerçek zamanlı bir sistem için uygun değildir ve yeniden yazdırılmalıdır.
Kesmeler (Interrupt) ve Zamanlayıcılar
Zamanı kritik olayları (enkoder darbesi, buton, periyodik örnekleme) ana döngüde beklemek yerine kesmelerle yakalarız. Kesme rutini (ISR) kısa ve dikkatli yazılmalıdır: içinde delay, Serial.print veya uzun hesap olmaz; paylaşılan değişkenler volatile işaretlenir.
volatile long enkoderSayaci = 0; // ISR ve loop paylasiyor -> volatile sartvoid enkoderISR() { // Kisa ISR: sadece say, baska is yapma if (digitalRead(ENC_B)) enkoderSayaci++; else enkoderSayaci--;}void setup() { pinMode(ENC_A, INPUT_PULLUP); pinMode(ENC_B, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(ENC_A), enkoderISR, RISING);}void loop() { long sayac; noInterrupts(); // atomik okuma icin kesmeleri kisa sure kapat sayac = enkoderSayaci; interrupts(); // sayac ile guvenle islem yap...}
Bu örnekteki üç kritik nokta AI'ın sık atladığı yerlerdir: (1) paylaşılan enkoderSayaci `volatile` olmalı, yoksa derleyici optimizasyonu güncellemeleri gözden kaçırır; (2) ISR kısa olmalı; (3) çok baytlı bir değişkeni ana döngüde okurken atomik okuma için kesmeler kısa süre kapatılmalı, yoksa okuma sırasında ISR araya girip yarım/bozuk değer okunabilir (race condition). AI kodunda bu üçü var mı, mutlaka kontrol edin.
Register Doğruluğu ve Datasheet
AI, bir sensörün register adresini veya bir MCU'nun konfigürasyon bitini inandırıcı biçimde yanlış verebilir. Örneğin bir MPU6050 IMU'nun güç yönetimi register'ı 0x6B'dir; AI bunu 0x6A diye verirse kod derlenir, çalışır gibi görünür ama sensör uyanmaz. Bu tür hatalar ancak datasheet ile karşılaştırınca yakalanır.
// MPU6050 uyandirma: datasheet'e gore PWR_MGMT_1 = 0x6B, deger 0x00#define MPU_ADDR 0x68#define PWR_MGMT_1 0x6B // <-- datasheet'ten DOGRULAWire.beginTransmission(MPU_ADDR);Wire.write(PWR_MGMT_1);Wire.write(0x00); // uyku modundan cikarWire.endTransmission(true);
Dikkat: AI'ın verdiği her register adresi, bit maskesi ve I2C/SPI adresini datasheet'ten bire bir doğrulayın. Bu değerler karta ve çipe özgüdür; AI'ın "hatırladığı" değer bir başka çip revizyonuna ait olabilir. Yanlış register, sessizce yanlış davranışa yol açar.
Zayıf Prompt / Güçlü Prompt
ZAYIF:"ESP32'de sıcaklık sensörü oku."(Hangi sensör? Hangi protokol? Hangi pin? Jenerik, muhtemelen yanlış kod.)GÜÇLÜ:"ESP32 (Arduino framework) üzerinde bir DS18B20 sıcaklık sensörünü OneWireile GPIO4'ten oku. Non-blocking yaz, 1 saniyede bir örnekle (delay kullanma,millis tabanlı). Okuma hatası (-127 veya 85 sabit değeri) durumunda hatabayrağı set et. Kullandığın her kütüphaneyi ve pin bağlantısını en baştayorumla belirt. Bellek açısından String yerine char buffer kullan."
Güçlü prompt; çipi, framework'ü, sensörü, protokolü, pini, örnekleme desenini, hata durumunu ve bellek kısıtını verir. Böylece çıktı hem doğrulanabilir hem gerçekçi olur.
Gömülü Kod İçin Gözden Geçirme Kontrol Listesi
AI çıktısını yüklemeden önce şu listeden geçirin:
- Bloklama: Ana döngüde delay veya uzun bloklama var mı?
- volatile: ISR ile paylaşılan değişkenler volatile mı?
- Atomik erişim: Çok baytlı paylaşılan değişken güvenli mi okunuyor?
- Register: Adresler ve bit maskeleri datasheet ile uyumlu mu?
- Bellek: String, büyük diziler, rekürsiyon KB seviyesinde taşma yaratır mı?
- Hata yönetimi: Sensör okuma hatası, iletişim zaman aşımı ele alınıyor mu?
- Güvenli başlangıç: Aktüatör çıkışları başlangıçta güvenli (pasif) duruma alınıyor mu?
Mini Vaka
Gömülü sistem mühendisi Baran, bir insansız hava aracı için IMU okuyan kodu AI'a yazdırıyor. Kod derleniyor ve çalışıyor gibi görünüyor ama açı değerleri anlamsız. Baran kontrol listesini uyguluyor: register adreslerini datasheet'le karşılaştırıyor ve AI'ın jiroskop konfigürasyon register'ını yanlış verdiğini buluyor (0x1B yerine 0x1A), bu yüzden hassasiyet ölçeği yanlış. Düzeltince değerler oturuyor. Sonra ana döngüde delay(10) fark ediyor; bunu millis tabanlı yapıya çeviriyor, çünkü uçuş kontrol döngüsünün bloklanması kabul edilemez. Son olarak paylaşılan sayaç değişkeninin volatile olmadığını görüp ekliyor. AI iskeleti hızlı verdi; ama register, bloklama ve volatile olmak üzere üç ayrı hatayı gözden geçirme listesi yakaladı ve donanım hiç risk altına girmedi.
Yaygın Hatalar
- Ana kontrol döngüsünde delay() kullanıp gerçek zamanlı tepkiyi öldürmek.
- ISR ile paylaşılan değişkeni volatile yapmamak ve sessiz veri bozulması yaşamak.
- Çok baytlı paylaşılan değişkeni atomik olmayan biçimde okuyup race condition üretmek.
- AI'ın verdiği register/bit maskelerini datasheet ile doğrulamamak.
- Kısıtlı RAM'de String ve büyük diziler kullanıp bellek taşması yaratmak.
- Aktüatör çıkışlarını başlangıçta güvenli duruma almayı unutmak.
Özetle
- Gömülü kod; kısıtlı bellek, sıkı zamanlama ve doğrudan register erişimiyle çalışır.
- Ana döngüde delay yerine millis tabanlı non-blocking desen kullanılır.
- ISR kısa tutulur; paylaşılan değişkenler volatile ve atomik erişilmelidir.
- Register adresleri ve bit maskeleri daima datasheet ile doğrulanır; AI yanılabilir.
- Bellek, hata yönetimi ve güvenli başlangıç durumu her zaman kontrol edilir.
- Güçlü prompt; çipi, framework'ü, sensörü, protokolü, pini ve kısıtları içerir.
Uygulama görevi
Bir sensör (örneğin DS18B20, MPU6050 veya HC-SR04) ve bir mikrodenetleyici (Arduino/ESP32/STM32) seçin. AI'a bu ünitedeki güçlü prompt şablonuyla non-blocking bir okuma kodu ürettirin. Ardından gözden geçirme kontrol listesinin yedi maddesini tek tek uygulayın: en az bir register/pin değerini datasheet ile karşılaştırın, döngüde delay olup olmadığına bakın, paylaşılan değişkenlerin volatile durumunu kontrol edin. Kaç madde ilk denemede "geçti", kaçı düzeltme gerektirdi? Bulduğunuz her sorunu ve düzeltmesini not edin.