Bir Mikrodenetleyicinin Rastgele Kararları ve Hayatın Algoritmaları
Ankara’nın değişken havası gibi, bazen de bir mikrodenetleyicinin random() fonksiyonunun verdiği kararlar hayatımızın ne kadar öngörülemez olduğunu hatırlatıyor bana. Özellikle de o mükemmel, tekrarlanabilir döngüden sıyrılıp beklenmedik bir çıktı ürettiği anlar... Sanki kaosu düzene sokmaya çalışırken, bazen kaosun kendisi en ilginç veriyi sunuyor.
Geçenlerde üzerinde çalıştığım bir küçük sensör ağı vardı. Görevi, belirli periyotlarla anlık sıcaklık verilerini bir ekrana yansıtmaktı. Her şey çok düzenliydi: sensör okundu, filtre uygulandı, seri porta gönderildi. Tipik bir gömülü sistem çalışması diyebiliriz. Ancak projeye "biraz da spontanlık" katmaya karar verdim. Bu, başlangıçta benim için basit bir yazılım modifikasyonu gibi görünüyordu; sadece sayıcının belirli aralıklarla değişmesi gerekiyordu.
Rastgelelik Tohumunu Bulmak
Burada benim gibi donanım geçmişi olan biri için en kritik nokta, bu "rastgeleliğin" kaynağını doğru belirlemek oluyor. Birçok kişi srand(time(NULL)) ile işi halledeceğini düşünür. Bu, bilgisayarın saatine bağlıdır ve çoğu zaman yeterlidir. Fakat benimle uğraşan sürücüler, sayaç bazlıysa ya da aynı anda birden fazla cihaz aynı tohumu alırsa, elde ettiğimiz sonuçlar birbirinden alakasız değildir; onlar sadece aynı başlangıç noktasından ayrılmaya çalışıyorlardır.
Bu projede, mikrodenetleyicinin dahili bir ADC (Analogdan Dijitale Çevirici) ile gürültülü, çok düşük seviyeli bir voltaj okuması alarak bu kararsızlığı taklit etmeye karar verdim. Bu, teorik olarak çok daha temiz bir "fiziksel rastgele sayı üreteci" (TRNG) elde etme girişimiydi. İlk başta bu ham veriler tamamen kaotik geliyordu; yüksek gürültü, düşük çözünürlüklü okumalar ve sürekli kaymalar.
Veriden Anlama Yolculuğu
Burada sabır gerekiyor. O ham veriyi, bir sonraki komutun ne olacağını belirleyen tekil bir bayt değerine indirgemek benim için saatler sürdü. Bu, sanki karmaşık bir ses kaydını dinleyip, içindeki anlamlı melodiyi ayıklamak gibiydi. Filtreleme algoritmalarını denedim; basit bir hareketli ortalama alırsam, gürültü bastırılır ve karar verme süreci öngörülebilir hale gelir. Bu, sistemin kararlılığını artırır ama benim aradığım o "gürültüden doğan anlık parlama"yı söndürürdü.
Sonuç olarak, projeyi iki modda çalıştırmaya karar verdim: Birincisi, aşırı kararlı ve güvenilir veri akışı; ikincisi ise, bu ADC gürültüsünü kullanarak elde edilen kaotik ve deneysel karar verme mekanizması.
Bu dengeyi kurmak, benim için basitçe bir yazılım sorunu değil; aynı zamanda elektronik bir zorluktu. Donanımın sunduğu en temel seviyedeki kaosu, bilerek ve isteyerek kodun bir parçası haline getirmek. Bu da beni her zaman o mükemmel sınırda tutuyor: En çok şeyin en basit malzemeden, yani sadece bir voltaj farkından doğduğunu görmek. Şimdi bu iki mod arasında geçiş yapıp, elde edilen verilerin ne gibi yeni uygulamalara uyarlanabileceğini düşünmeye başladım.