Sıfırdan Kod Satırına

Gerçek Rastgeleliğin Peşinde: Arduino ile Donanımdan Dijital Gürültü Yakalamak

Merhaba arkadaşlar. Bu köşede genellikle teorik derinliklere dalıyoruz; bir yandan yazılım mimarilerini kurarken, diğer yandan da o mimariye hayat veren fiziksel katmana iniyoruz. Son zamanlarda beni gerçekten meşgul eden bir konu vardı: bilgisayarların ürettiği "rastgele" sayılarla, doğanın sunduğu gerçek rastgelelik arasındaki uçurum. Bir yazılımcı olarak, her şeyi matematiksel bir determinizm çatısı altında görmek doğal geliyor. Ama mikrodenetleyicilerle çalışmaya başladığımda, bu deterministik mükemmeliyetin bazen steril geldiğini fark ettim.

Bir sistemden alınan gerçekten öngörülemez bir girdiyle, o matematiksel kaygı benim için yerini heyecana bıraktı. Ve bunu en basit haliyle, analog bir sinyalin dijital ortama aktarımıyla denedim.

Analog Gürültüyü Dijitale Çevirmek

Buradaki hedefimiz, bir mikrodenetleyicinin (bu örnekte basit bir Arduino Uno) dijital olmayan, yani gürültü içeren bir kaynaktan veri alarak bu girdiyi mümkün olduğunca saf rastgele sayı olarak kullanması. Teorik olarak bilgisayarların ürettiği LCG (Linear Congruential Generator) gibi algoritmalar hep bir tahmine açık olsa da, fiziksel dünyadan gelen gürültü ise tamamen farklı bir oyun.

Bu projede kullandığım şey, harici bir ses kaynağından gelen düşük seviyeli elektriksel gürültüyü yakalamak oldu. Bu ses, herhangi birlıkla benim için önemli değil; arkaplan uğultusu, sürücü kartımdaki en ufak bir ses bile olabilir.

İşte süreç:

  1. Alma Hattı: Gürültü kaynağını, bir kondansatör ve direnç ağı üzerinden Arduino'nun analog giriş pinine bağladım. Buradaki filtreleme çok kritik; amacımız sinyali güçlendirmek değil, varlığını hissettirmek.
  2. Örnekleme: Arduino’nun ADC (Analogdan Dijitale Çevirici) modülünü kullanarak bu sürekli değişen voltaj seviyesini belirli aralıklarla örnekledim. Bu, analog dalgalanmanın dijital bir eşleşmeye zorlanması demek.
  3. Veri Filtrelemesi: Gelen okumalar her zaman kesikli ve benim için anlamsız bir dizi sayıydı. Bu ham veriye, yazılımsal olarak hafif bir hareket eklemek yerine, bu serinin kendisini "çekirdek" alarak onu kullanmaya karar verdim. Her okuma, sistemin o anki gürültü seviyesinin bir mikro kaydıydı.

Determinizmden Kurtulmak

Bu projeyi neden yaptım? Çünkü bir yazılımın gerçekten "rastgele" olabileceği algısını kırmak istiyordum. Bir algoritmanın çıktısı, yine girdiye bağlıysa o kadar da özgür değildir. Ancak bu analog gürültü girdisini aldığınızda, girdi fiziksel olarak o anki ortam koşuluna bağlıdır; bu da onu o anda benzersiz kılar.

Elde ettiğim ham değerler, benim için mükemmel bir "Tohum" (Seed) görevi görüyordu. Bu Tohum bilgisini kullanarak, sonraki bir hesaplama döngüsünü başlatıyorduk. Yani, fiziksel dünyanın kaotik dansını alıp, onunla kodumun matematiksel dansını eşleştiriyordum.

Eğer bu gürültüyü bir sayaç olarak kullanırsanız, her çalıştırmanız benzersiz olacaktır. Bu da bizi, gerçekten anlamlı bir noktaya getiriyor: En sofistike yazılım mimarileri bile, bazen en basit, göz ardı edilmiş fiziksel detaylarla beslendiğinde bütün bir dönüşüm geçiriyor.

Siz de projelerinizde böyle "gereksiz" görünen bir detayı yakaladıysanız, o detayın hikayesi benim için her zaman en iyi kod yorumu oluyor. Deneyin, kulağınızı kapatın ve arka plan uğultunuzun ne anlatmaya çalıştığını dinleyin.