Donanımdan Yazılıma Rastgelelik Tohumlarını Aktarmak: Gerçek Bir Uygulama Örneği
Selamlar herkese. Eğer bu köşeyi okuyorsanız, muhtemelen siz de benim gibi bir noktada bulunuyorsunuzdur: Her şeyin bir sebebi var ya da yoksa, bu sebep/yokluk ilişkisini kodla kurma çabası. Son zamanlarda üzerinde çalıştığım bir proje var ve bu projeyi anlatmak için en uygun kavram, "rastgelelik" üzerine kurulan bir köprü.
Biz yazılımcılar olarak mükemmeliyetçi eğilimimizle, her şeyi kontrol altına almak isteriz. Giriş/çıkışlar net olmalı, algoritmalar deterministik (belirlenimci) olmalı. Ancak bazen, en ilginç ve yaşayan sistemler tam da bu kontrol edilemezlikten doğuyor. İşte benim son projem de öyle oldu: Fiziksel bir gürültü kaynağını alıp, bunu tamamen kontrollü ve yeniden üretilebilir (eğer isterseniz) bir yazılım girdisine dönüştürmek.
Fiziksel Gürültüyü Dijital Vuruşa Çevirmek
Bu deneyin kalbinde, bir Arduino Uno ve Raspberry Pi arasındaki iletişim var. Arduino tarafında görevimiz basitti: Analog-Dijital Dönüştürücü (ADC) kullanarak potansiyometre veya bir ses sensöründen gelen sürekli, kaotik bir voltaj sinyali okumak. Bu sinyal bizim "gerçek dünya gürültümüz".
Bu analog değeri alıp, sayısallaştırmak kritik bir adımdı. Eğer bunu sadece belirli bir eşik değerine göre ikili (binary) çıkış olarak alırsak, elimizde sadece bir ON/OFF durumu olur. Oysa amacımız o sinyalin niyetini yakalamaktı.
Bu yüzden, okuduğumuz voltaj değer aralığını (örneğin 0V ile 5V arası) bilgisayarın anlayacağı maksimum kesirli sayılarla eşleştirdim. Arduino'dan gelen bu sürekli seri veriyi, bilgisayardaki Python scriptimiz bir tampon görevi görerek alıyordu.
Veri Akışının Anatomisi: Filtreleme ve Örnekleme
Buradaki sabır sınavı devreye giriyor. Ham ADC verisi çok gürültülüdür; küçük kaymalar bile büyük dalgalanmalara neden oluyor. Bu ham gürültüyü direkt olarak bir modüle veya ekranda görmek, gerçekten "kaosu" gözlemlemek demek.
Bizim yaptığımız şey ise bu ham gürültüye bir tür örnekleme hızı (sampling rate) uygulamak oldu.
İşte adım adım süreç:
- Giriş (Arduino): Sensör verisi alınır, belirli bir kararlılık için basit bir ortalama alma (moving average) uygulanarak ani sıçramalar yumuşatılır.
- İletim (Seri Haberleşme): Veriler, seri port üzerinden bilgisayara gönderilir.
- İşleme (Raspberry Pi/Python): Gelen akış sürekli olarak okunur. Belirli bir zaman dilimi içinde gelen $N$ adet okuma değeri alınır. Bu $N$ değerinin tamamı, bizim bir sonraki "rastgele olayımız" için girdi haline gelir.
- Sonuçlandırma: Bu $N$ değerinin ortalaması alınır ve bu ortalama değeri, yazılımımızın bir sonraki karar mekanizmasını tetikleyecek olan merkezi rastgele sayı üreticimiz için seed (tohum) olarak kullanılır.
Bu döngü tamamlandığında, mikrodenetleyiciden gelen fiziksel bir gürültü paterni, bilgisayar yazılımımızdaki tamamen yeni ve benzersiz bir rastgelelik serisine dönüşmüş oluyor.
Bu beni her zaman tatmin ediyor çünkü devre tahtasındaki o küçük dirençler, fiziksel dünyanın entropisini yakalıyor ve biz onu saf bir dijital algoritmaya besliyoruz. Kontrol edebileceğiniz en kaotik parçayı bile, doğru bir protokol ile yapılandırılmış bilgiye dönüştürmenin verdiği o dingin tatmin hissi var bu işte. Eğer denemek isterseniz, bir sonraki yazımda bu gürültü modunu alın ve onu ses frekansına nasıl dönüştürdüğümü anlatırım.