Pi'nin Sonsuzluğundan Arduino Flash'a: Donanımda Gerçek Rastlantı Nasıl Taklit Edilir?
Her projeye başladığımda kafamın bir köşesinde hep o "mükemmel kontrol" takıntısı belirir. Bir yandan da doğanın kaotik güzelliğini, yani gerçekten öngörülemezliği yakalamak isterim. Fizikteki entropiden yazılımdaki bir rand() çağrısına kadar, rastlantının tanımı sürekli değişiyor. Peki, mikrodenetleyici gibi sınırlandırılmış bir ortamda, bilgisayarın ürettiği o kusursuz matematiksel rastgelelikten ziyade, "yaşanmış" bir rastlantıyı nasıl yakalarız?
Bu makale, benim kişisel olarak geçtiğim bir labirentten geçiyor: Dijital dünyada üretilen sayısal rastgelelik ile donanımın sunduğu fiziksel belirsizliği eşleştirmek. Eğer amacınız sadece bir simülasyonda oyunun dengesini bozmaksa, iyi tohumlanmış (seeded) bir algoritma yeterlidir. Ama eğer projelerinizde, örneğin bir sensör dizisi veya gürültü ile beslenen bir karar mekanizması varsa, basit millis() döngüsünüza güvenmek sadece kaosa şişirilmiş bir simülasyondur.
Yazılımsal Tuzaklar: Pseudorandomness vs. True Randomness
Çoğu başlangıç seviyesi projede karşılaşılan en büyük yanılgı budur. Bizim kütüphanelerimizdeki çoğu zaman rand() fonksiyonu, aslında bir sözde rastgele sayı üretecidır (PRNG). Yani, belli bir başlangıç değeri olan ve tamamen deterministik bir matematiksel formülle ilerleyen bir tahmindir. Bu, bilgisayarın hesaplama gücünün sonucudur ve teorik olarak başlangıç noktanızı bilirseniz tüm diziyi yeniden oluşturabilirsiniz.
Bu durum, özellikle kritik bir IoT uygulamasında veya kriptografik olmayan ancak yine de tahmin edilemezlik gerektiren bir durumda büyük bir mimari kusurdur.
Donanımdan Geriye Beslenme: Gerçek Belirsizlik Kaynağı Aramak
Benim yaklaşımım her zaman, eğer bir belirsizlik gerekiyorsa, bu belirsizliği en mümkün olan en düşük seviyede bulmaktır. Mikrodenetleyicinin kendisi, zamanla ve fiziksel olaylarla etkileşime girdiği için doğal bir "gürültü kaynağıdır."
İşte bu noktada devre kartı tasarımı devreye giriyor. Basitçe bir analog okuma yapmak, dijital algoritmanın öngördüğünden çok daha zengin ve "gerçek" bir girdi sağlar.
Pratik Uygulama Adımları (Bir ADC Okuması Üzerinden):
- Giriş Sinyalinin Belirsizliği: Seri bir devre tasarlayın. Örneğin, sıcaklık sensöründen gelen değerin veya potansiyometrenin okumasını yapıyorsunuz. Bu okumayı, sinyalin mükemmel değil, fiziksel gürültüye (termal gürültü, elektromanyetik girişim vb.) maruz kaldığı bir zamanda alın.
- Örnekleme ve Sayısallaştırma: Bu analog gerilimi bir Analogdan Dijitale Çevirici (ADC) ile dijital değere dönüştürün. Bu, o anki fiziksel entropiyi yakalamaktır.
- Filtreleme ve Besleme: Eğer bu ham okumayı doğrudan sonraki karar mekanizmasına beslerseniz, o karar gerçekten donanımın o anki "ruh haline" bağlı olacaktır. Bu ham ADC değeri, sonraki bir PRNG'nin başlangıç tohumu (seed) olarak kullanılabilir veya doğrudan sisteminize girdi sağlayabilir.
Burada yapılan şey, yazılımın rastgelelik üretmesi değil; donanımın fiziksel sınırlarından kaynaklanan doğal gürültüyü, yazılımın anlayabileceği bir sayısal değere zorla dönüştürmesidir.
Bu süreç, bir yazılım mimarisinde sadece kod satırları değil, PCB üzerindeki dirençlerin toleransı ve güç kaynağının kararlılığı gibi fiziksel detayların bile birer "algoritma parametresi" olduğu gerçeğini kabul etmeyi gerektirir. Ve bu, mühendisliğin en tatmin edici kısımlarından biri benim için.