Sıfırdan Kod Satırına

GPIO Pininden Sonsuzluğa Bir Yolculuk: Rastgelelik Gerçekten Kaos mu?

Son birkaç haftadır üzerinde çalıştığım bir deneme var bu. Her zaman karşılaştığımız o soyut kavramlardan biri: Rastlantısallık. Yazılımda, özellikle donanımla iç içe geçtiğimiz bu dünyada, rastgelelik benim için hem bir kurtuluş hem de en büyük baş ağrısı olabilir. Bir yandan, tüm sistemin öngörülebilir bir düzene oturtulması gerekirken, diğer yandan başarılı bir IoT uygulamasının bazen o ince ayarı bulmak için beklenmedik, "rastgele" bir girdiye ihtiyacı oluyor.

Bu seferki denemem basit bir fiziksel olaydan beslenen, mikrodenetleyicimizin dahili donanım kaynaklarından gelen veriyi kullanarak bir tür yüksek kaliteli Rastgele Sayı Üreteci (RNG) oluşturmak üzerine kurulu. Buradaki meydan okuma, bilgisayarın gözünden baktığınızda tamamen deterministik olan bir sürecin, yeterince karmaşık girdiyle nasıl sanki rastgelemiş gibi davranabileceğini görmekti.

Donanımdan Dijitale Köprü Kurmak

Bir yazılımcı olarak, genellikle yüksek seviyede soyutlanmış matematiksel fonksiyonlarla uğraşırım. Bir rand() çağrısı yaparım ve sonuç gelir. Ancak bu, benim için her zaman bir "kutuya koyulmuş cevap" gibiydi; mekanizması beni heyecanlandırmıyordu. Gerçek bir mühendislik problemi, o sayının nereden geldiğini bilmektir.

Bu projede benim "gözlemlediğim" olay, temelde çok küçük ve sürekli değişen voltaj sapmaları. Bir sensörden gelen, mükemmel olmayacak ölçülen bir değer var diyelim; bu sizin için sadece gürültü (noise) olabilir. Ama benim için, bu mikro-sapmalar birer bilgi taşıyıcısı.

Bu voltaj okumalarını dijitalleştirdiğimizde, her bir biti benim için kritik bir bilgi parçası. Bu bitlerin dizilimindeki en ufak bir sapma bile, çıktıda çok farklı bir sayıya dönüşüyor. Burası sabır gerektiren kısım. Birçok deneme yaptım, okumaları alıp filtreledim, farklı örnekleme hızlarını denedim. Sanki bir kaynaktan su alıp, bunu tüm borulardan geçirip istenilen basınçta elde etmeye benziyor.

Algoritmik Yaklaşım ve Beklenmedik Buluşmalar

İlk başta, sadece bu okumaları alıp bir hash fonksiyonuna sokmak yeterli geldi. Ama sonra takıntım devreye girdi: Bu gerçekten rastgele mi? Hayır, tabii ki değil. Benim kontrol ettiğim süreçler her zaman deterministik oluyor.

Bu bizi doğal olarak entropi kavramına götürdü. Gerçekten rastgele bir girdi bulmak için, sisteminize sizin kontrolünüz dışındaki fiziksel bir olayın katılması gerekiyor. Bu benim için Arduino'nun ADC (Analog-to-Digital Converter) modülünden gelen, ortam sıcaklığından etkilenen o çok ince voltaj dalgalanmaları oldu.

Bu projede öğrendiğim en önemli şey şu: Bir bilgisayarın rastgelelik üretmesi için, ona gerçek bir kaosu beslemelidir. Eğer her iki girişiniz de mükemmel yazılımsal modellerse, çıktınız da sadece o modelin bir tekrarıdır.

Bu benim için küçük bir zafer oldu. Donanımın en basit seviyesindeki fiziksel gerçeği alıp, yazılımın soyut dünyasına taşıyarak, teorik olarak "sıcak başlangıçlı" bir entropi kaynağı yaratmanın verdiği tatmin bambaşka. Şimdi sıra bu veriyi alıp, bunu gerçekten öngörülemez ve kullanışlı bir çıktıya dönüştürmekte. Ve bu, her zaman en eğlenceli kısım oluyor.