Arduino'da rastgele sayı üretecinin kullanılması: Random ve RandomSeed fonksiyonları. Arduino Kursu - Zaman ve Rastgele Arduino rastgele bir bit dizisi oluşturuyor

Arduino'yu programlarken bazen ne taslağı yazan programcının, ne de Arduino'yu böyle bir programla kullanacak kullanıcının önceden bilmeyeceği bir sayı almanız gerekir. Bu durumda, rastgele (veya daha doğrusu sözde rastgele) bir sayı üreteci kurtarmaya gelir.



Bu oluşturucuyu etkinleştirmek için random() veya randomSeed() işlevlerini kullanmanız yeterlidir. Bu materyal size bu işlevlerle nasıl çalışacağınızı ve sayıları üretirken sözde rastgelelikten nasıl kurtulacağınızı gösterecektir.


Genel olarak, sözde rastgele sayı üreteci, sayıların kaotik veya rastgele görünümünü simüle eder, ancak aslında, bu sayıların bir dizisini yeterince uzun bir süre boyunca analiz ederseniz, belirli bir modeli fark edebilirsiniz.


Yani, sözde rastgele sayılar üretmek için kullanılan rastgele fonksiyon en fazla iki parametreye sahip olabilir ve rastgele(maks) veya rastgele(min, maksimum) olarak yazılır. Burada maksimum parametre Zorunlu olan, sözde rasgele sayılar oluşturmaya yönelik aralığın üst sınırını belirtir. Kullanarak ek parametre min aralığın alt sınırını ayarlayabilirsiniz. Sonuç olarak, fonksiyon minimumdan maksimum-1'e kadar olan aralıkta bazı sözde rastgele sayılar döndürecektir.


Random() işlevini kullanırken, her seferinde tam olarak aynı sözde rastgele sayılar listesinin oluşturulacağını anlamak önemlidir. Örneğin, bir slot makinesi yaparsanız ve tutamağa ilk bastığınızda bir kazanan kombinasyon gösterirseniz, Arduino'yu sıfırlayıp tutamağa tekrar bastığınızda o slot makinesinin aynı kazanan kombinasyonu göstereceğinden emin olabilirsiniz. . Aslında, örneğin www.igrovye-apparati-vulcan.com/ oyun makinelerinde uygulandığı gibi tamamen rastgele sayı üretimine sahip bir oyun makinesini Arduino'da uygulamak kolay değildir, ancak randomSeed kullanarak sorunu kısmen çözebilirsiniz. () işlev.


Bu işlev bir değer alır (tamsayı gibi) ve random() işlevi tarafından oluşturulan rastgele listeyi değiştirmek için bu sayıyı kullanır. RandomSeed() işlevini kurulum işlevine koyabilir ve random() işlevini sonsuz sayıda kullanabilirsiniz. döngü. Ancak o zaman bile, rastgele sayı dizisinin randomSeed() işlevi kullanıldığında farklı olmasına rağmen, çizimin her çalıştırılışında hala aynı olması dikkat çekicidir.


Bu durumda tek çözüm analog çevre birimlerini (ADC) ve karşılık gelen analogRead() işlevini kullanmak olabilir. Analog giriş hiçbir şeye bağlı değilse, yani havada "asılı" bırakılırsa, bu hattaki gürültü sayesinde gerçekten rastgele sayılar elde edebilirsiniz. Daha sonra kurulum ayarında randomSeed(analogRead(A0)) yazabilirsiniz. Analog port A0'ın herhangi bir yere bağlı olmaması şartıyla.

Rastgele sayı üreteçleri hakkında çok şey yazıldı, ancak hemen hemen her zaman uygulama söz konusu olduğunda, şu ima edilir (veya açıkça belirtilir). Hakkında konuşuyoruz x86/x64 ve diğer "yetişkinlere yönelik" mimariler hakkında. Aynı zamanda, mikrodenetleyiciler üzerindeki cihazların geliştirilmesine adanmış forumlar, "%kontrolöradı% üzerinde nasıl rastgele bir sayı oluşturabilirim?" sorularıyla doludur. Üstelik yanıt aralığı "Google/Wikipedia'ya bakın"dan "standart işlevi kullanın"a kadar uzanıyor. Bu "standart işlev" her zaman mevcut değildir ve geliştiriciye her açıdan uygundur; çoğu zaman durum tam tersidir: bazen sayılar rastgele olmaktan uzaktır, bazen işlem hızı çok düşüktür veya bazen ortaya çıkan kod rastgele değildir. boş hafızaya hiç sığmaz.
Rastgele sayı üretme algoritmalarının neler olduğunu, doğru olanın nasıl seçileceğini ve en önemlisi bu algoritmaların denetleyicilere uygulanmasının özelliklerinin neler olduğunu anlamaya çalışalım.

"Rastgeleliğin" değerlendirilmesi

RNG uygulamaları oyuncaklardan ciddi kriptografiye kadar çok farklı olabilir. Buna göre jeneratöre yönelik gereksinimler de büyük ölçüde farklılık göstermektedir. Jeneratörün kalitesini (“rastgelelik düzeyi”) değerlendirmek için özel testler vardır. İşte bunlardan en temelleri:
  • Frekans testi. Bit dizisindeki sıfır ve birlerin sayısını saymaktan oluşur. Yaklaşık olarak eşit sayıda bir ve sıfır bulunmalıdır.
  • Aynı bitlerin bir dizisini test edin. 000...0 veya 111...1 gibi aynı bitlerin satırları aranır. Serilerin meydana geldiği frekansların dağılımı, uzunluklarına bağlı olarak, gerçekten rastgele bir sinyal için bu dağılıma karşılık gelmelidir.
  • Spektral test. Orijinal diziye ayrık bir Fourier dönüşümü uygulanır. Ortaya çıkan spektrum, dizinin periyodik özelliklerinin varlığını gösteren önemli tepe noktalarına sahip olmamalıdır.
  • Otokorelasyon testi. Birbirine göre kaydırılan dizi kopyaları arasındaki korelasyon değeri hesaplanır. Test, bir sırayla tekrar eden bölgeleri bulmanızı sağlar.
Onlarca benzer testi içeren özel kitler bulunmaktadır:
NIST - AES yarışmasında şifreleme algoritmalarını değerlendirmek için kullanılır.
DIEHARD var olan en titiz setlerden biridir.

PRNG Algoritmaları

Kesin olarak tanımlanmış bir algoritmaya göre oluşturulan herhangi bir dizi, gerçekten rastgele olarak kabul edilemez, bu nedenle algoritmik jeneratörler hakkında konuşurken bu terimi kullanırlar. sözde rastgelelik devamı. Herhangi bir sözde rasgele sayı üreteci (PRNG) er ya da geç döngüye girecektir, başka bir şey de bu "geç"in birkaç milisaniye içinde ya da belki birkaç yıl içinde gelebilmesidir. Döngünün uzunluğu, jeneratör N'nin dahili durumunun boyutuna bağlıdır (aslında bu, jeneratörün ihtiyaç duyduğu bellek miktarıdır) ve 2 (N/2) ila 2 N bit arasında değişir.
Çok çeşitli PRNG algoritmaları icat edildi, ancak bunların hepsi mikro denetleyicilerde uygulamaya uygun değil. Hız ve kullanılabilir bellek açısından ciddi şekilde sınırlıyız; birçok kontrol cihazı gerçek aritmetik ve hatta çarpma talimatlarını desteklemiyor. Bu sınırlamaları akılda tutarak, iyi bilinen bazı algoritmalara bakalım.
Doğrusal uyumlu yöntem
Dizinin bir sonraki üyesi aşağıdaki formül kullanılarak hesaplanır
X i+1 = (aX i + c) mod m
Sayı M dizinin maksimum periyodunu tanımlar, tamsayılar A Ve C- “sihirli” katsayılar. Sayı Mİkinin üssüne eşit olanı seçmek mantıklıdır; bu durumda modulo dönüştürme işlemi en önemli bitlerin atılmasına indirgenir. Azami sürenin elde edilebilmesi için aşağıdaki şartların yerine getirilmesi gerekir:
- C ve m göreceli olarak asal olmalıdır,
- a-1 bir kat olmalı P tüm asal faktörler için P sayılar M,
- Eğer M 4'ün katıdır (ve bizim durumumuzda bu bir kat olacaktır), o zaman a-1 4'ün katı olmalıdır.
Bir incelik daha var: Durum değişkeni X'in yalnızca en anlamlı bitleri sonuç olarak alınmalıdır, çünkü en düşük bitler için istatistiksel rastgelelik parametreleri çok daha kötüdür. Doğrusal uyumlu algoritma, birçok kütüphanede genellikle standart Rand() olarak uygulanır.

Artıları:

  • durum değişkeninin belirli bir boyutu için mümkün olan maksimum süre;
  • yeterince hızlı;
  • genellikle derleyici kitaplığında zaten uygulanmıştır.
Eksileri:
  • bir çarpma işlemi gereklidir;
  • tüm bitler eşit derecede rastgele değildir.
Özet:çok zorlu olmayan uygulamalar için hızlı ve basit bir algoritma.
Gecikmeli Fibonacci yöntemi
Bu algoritma ilişkiyi kullanır
X ben = X i-a - X i-b ,
durum değişkeni nerede X- İşaretsiz tam sayı. Gecikme değerleri A Ve B sadece herhangi biri değil, kesin olarak tanımlanmış olanlar alınır; maksimum kaliteye ulaşmak için (17.5), (55.24) veya (97.33) çiftleri önerilir. Gecikme ne kadar büyük olursa, periyot da o kadar uzun olur ve dizinin spektral özellikleri o kadar iyi olur. Öte yandan, jeneratörün çalışması için önceki sayıların maksimum(a,b)'sini depolamak gerekir ki bu her zaman kabul edilebilir değildir. Ayrıca jeneratörü çalıştırmak için genellikle daha basit bir PRNG kullanılarak elde edilen maksimum(a,b) sayılarına ihtiyacınız vardır.

Artıları:

  • çarpma işlemleri gerektirmez;
  • Rastgele bir sayının tüm bitleri istatistiksel özellikler açısından eşdeğerdir.
Eksileri:
  • büyük miktarda bellek gerektirir;
  • çalıştırmak için geniş bir sayı dizisi gerekir.
Özet:çok yüksek kaliteli ancak kaynak yoğun bir algoritma.
Doğrusal Geri Beslemeli Kaydırma Kaydı


Durum değişkeni, N uzunluğundaki bir kayıt defterinde saklanır. Bir sonraki durumun oluşturulması iki adımı içerir:
  1. Bitin değeri hesaplanır C = X i1 xor X i2 xor… Xik, burada i1, i2…ik- çağrılan bit numaralarını kaydedin virajlar.
  2. Kayıt 1 bit sağa kaydırılır, en soldaki bit değeri alır İLE.
Jeneratörün çıktısı, yazmacın en sağdaki (veya en soldaki veya her neyse) bitidir, yani sözde rasgele dizi yineleme başına bir bit üretilir. Doğru seçilen kademe sayılarıyla jeneratörün periyodu 2 N - 1 olacaktır. Kayıtta yasaklanmış bir sıfır durumu olduğundan “eksi bir”. Şube numaraları N Bu belgede 3'ten 168'e kadar bulunabilir.
Bu arada, Fibonacci konfigürasyonu olarak adlandırılan yukarıda açıklanan konfigürasyona ek olarak (aynı adı taşıyan PRNG yöntemiyle karıştırılmamalıdır!), sözde de vardır. Galois konfigürasyonu.


Yeni bir en soldaki biti oluşturmak için kademe dizisindeki bitlerin toplamını kullanmak yerine, kademe dizisindeki her biti en sağdaki bitle XOR'lar, ardından tüm kaydı sağa döndürür. Bu şemanın anlaşılması daha zordur ancak uygulanması daha kolaydır çünkü tüm XOR işlemleri aynı anda gerçekleştirilebilir. Periyot uzunluğu ve sözde rasgele sayıların kalitesi açısından Fibonacci ve Galois şemaları eşdeğerdir.

Artıları:

  • uygulaması çok basit, aritmetik bile gerektirmiyor, yalnızca bit işlemleri ve kaydırmalar gerekiyor;
  • çok hızlı algoritma (özellikle Galois şeması);
  • iyi istatistiksel özellikler.
Eksileri:
  • eşitsizliğin başlangıç ​​değerini sıfıra kontrol etmeniz gerekir.
Özet:çok hızlı ve oldukça kaliteli bir algoritma.
Kripto geçirmez algoritmalar
Kriptografide kullanım için PRNG'lerin bir temel gereksinimi daha vardır: geri dönülmezlik. Yukarıda listelenen tüm algoritmalar bu özelliğe sahip değildir: PRNG'nin birkaç çıkış değerini bilerek, basit bir denklem sistemini çözerek algoritmanın parametrelerini (aynı "sihirli" sabitler) bulabilirsiniz. a, b, c vesaire). Ve parametreleri bilerek, tüm sözde rastgele diziyi yeniden oluşturabilirsiniz.
Yeterince güçlü herhangi bir blok şifre, kriptografik olarak güçlü bir PRNG algoritması olarak kullanılabilir. Gizli bir anahtar seçerek, algoritmayı sıralı doğal sayılara uygulayarak sözde rastgele sayı blokları elde edebilirsiniz. N-bitlik bir blok şifresi için periyot 2 N'den fazla olmayacaktır. Böyle bir planın güvenliği tamamen anahtarın gizliliğine bağlıdır.
Tüm modern şifreleme algoritmaları PRNG'ler olarak kullanılmak üzere test edilmiştir, yani sertifikalı bir algoritma kullanıldığında, çıktı akışının istatistiksel ve spektral özelliklerine özel olarak önem verilmesine gerek yoktur. Kripto algoritmalarının hesaplamaya dayalı "oburluğu" konusunda endişelenmeniz yeterlidir. Çok sayıda şifreleme işlemi gerçekleştirmeniz gerekiyorsa donanım şifreleme bloklarına sahip bir denetleyici seçmek mantıklı olacaktır. Genellikle bu tür denetleyiciler aynı zamanda çok iyi bir kriptoya dayanıklı donanım PRNG'sine sahiptir.

Entropinin kaynakları

Daha önce de belirtildiği gibi, yalnızca deterministik algoritmalar kullanılarak gerçekten rastgele bir sayı üretmek imkansızdır. Bu nedenle genellikle PRNG + harici kombinasyonu kullanılır entropinin kaynağı. Entropi kaynağı PRNG'nin başlangıç ​​değerini ayarlamak için kullanılır ve ikincisinin görevi dizinin spektral ve istatistiksel saflığını sağlamaktır. Entropi kaynağı olarak ne kullanılabilir? Evet, neredeyse her şey.
Kullanıcı etkinliği
Cihaz kullanıcıyla herhangi bir şekilde etkileşime girerse oldukça iyi karar kullanıcının kendisini entropi kaynağı olarak kullanacaktır. Örneğin, bir mikrosaniye hassasiyetiyle (veya daha doğrusu en az önemli rakamlarıyla) ölçülen bir düğmeye basma süresi tamamen tahmin edilemez. Ancak çoğu zaman cihazın bağımsız çalışması gerekir, bu da bu harika bilgi kanalından mahrum kaldığımız anlamına gelir.
Analogtan dijitale dönüştürücü
Çoğu denetleyicide yerleşik ADC'ler bulunur. Ve birçok kontrol cihazında bunlar oldukça vasat kalitededir ve sadece "olmak için" yapılmıştır. ADC sonucunun düşük dereceli bitleri, DC voltajı ölçülürken bile neredeyse her zaman önemli miktarda gürültü içerir. Bu kullanılabilir: ADC girişini bir bölücü aracılığıyla besleme voltajına bağlayın, birkaç düzine ölçüm yapın, en az anlamlı bitleri alın - burada harika bir rastgele sayı elde edersiniz. ADC'de yerleşik bir ön amplifikatör varsa, onu açın, aynı zamanda gürültülüdür.
Asenkron jeneratörler
Senkronize olmayan iki saat üretecinin periyotlarındaki farkı kullanabilirsiniz. Çoğu denetleyici, örneğin bir gözlemci zamanlayıcısı içerir. Güvenilirliği artırmak için, ana saat sinyaline hiçbir şekilde bağlı olmayan ayrı bir jeneratörden saatlenir. Watchdog zamanlayıcısının bir periyodu boyunca ana saat sinyalinin döngü sayısını saymak yeterlidir. Ölçüm sırasında sayacın birçok kez taşmasını sağlayacak periyotları seçerseniz oldukça rastgele bir sayı elde edebilirsiniz. Bu yöntemin dezavantajı, birkaç saniyeye kadar çok zaman almasıdır.
Gerçek zamanlı saat
Diyagram varsa gerçek zamanlı saat PRNG'yi başlatmak için mevcut okumalarını kullanabilirsiniz. Örneğin, geçerli tarih/saati Unix saat biçimine dönüştürerek hemen 32 bit elde ederiz. Asla saniyede bir kereden fazla okuma yapmadığınız sürece bir daha olmayacaktır. Gerçek zamanı kullanmak, değerlerin benzersizliğini sağlar ancak herhangi bir öngörülemezlik sağlamaz, bu nedenle değerlerin birleştirilmesi daha iyidir Bu method diğerleriyle.
Uzaktan kumanda devresi
Denetleyici yoksa çevresel aygıtlar G/Ç bağlantı noktalarına ek olarak aşağıdakileri de yapabilirsiniz: bacaklardan biri bir kapasitör aracılığıyla toprağa ve bir direnç aracılığıyla da besleme voltajına bağlanır. Kontrolör girişlerinde dahili çekme dirençleri varsa, harici bir dirence gerek yoktur.

Bu bağlantı noktasına “0” sinyali veriyoruz - kapasitör boşaldı. Bağlantı noktasını giriş moduna geçiriyoruz - kapasitör şarj olmaya başlıyor. Üzerindeki voltaj eşiğe ulaştığında giriş “0” durumundan “1” durumuna geçecektir. Şarj süresi büyük ölçüde birçok faktöre bağlıdır: besleme voltajı, RC devre parametrelerinin sapması, eşik dengesizliği, sıcaklık, sızıntılar, girişim. Yeterli doğrulukla ölçerek ve en az anlamlı bitleri alarak iyi bir rastgelelik elde edebilirsiniz.
Donanım gürültü üreteci
Pek çok ciddi uygulama için (en önemlisi kriptografi), yukarıda sıralananlardan daha güvenilir bir entropi kaynağı gereklidir. Bu gibi durumlarda, termal, atış ve hatta kuantum etkilerine dayalı olarak bir gürültü üretecinden gelen sinyalin dijitalleştirilmesini kullanırlar. Gürültü elemanı genellikle özel bir diyot veya zener diyottur; buradan gelen sinyal güçlendirilir ve ikili bit akışı üreten bir karşılaştırıcıya beslenir.

Karşılaştırıcı yanıt eşiğinin alınan sinyalin istatistiksel özelliklerini etkilememesini sağlamak için, bir karşılaştırıcı üzerinde çalışan iki gürültü üreteci kullanılır:

Çözüm

Son olarak size hayatımdan bir hikaye anlatacağım. Forumda sorulan başka bir soruyla başladı: "Kontrol cihazında nasıl rastgele bir sayı oluşturabilirim?" Sorunun yazarı bir ders projesi olarak zar atmayı taklit eden bir cihaz yaptığını açıkladı. Algoritmaları anlamaya yönelik birkaç başarısız denemeden sonra, konuyu başlatan kişi çözümünü paylaştı: Gerçek bir zarı 1000 kez attı ve denetleyicinin tüm boş hafızasını elde edilen sayılarla doldurdu. Jeneratör, gösteri sırasında "rezervinin" üçte birinden daha azını kullandığı göz önüne alındığında, tüm "rastgelelik" testlerini zekice geçti.
Bu nedenle, böyle bir çözümün de yaşam hakkı vardır, özellikle de sayıların rastgeleliğine çok katı gereksinimler getiriliyorsa, ancak bunlara çok sık ihtiyaç duyulmuyorsa. Bellek fiyatları hızla düşerken, bir cihazı, cihazın ömrü boyunca yetecek bir "kaos rezervi" ile donatmak akıllıca olabilir.
İlginiz için teşekkür ederim!

GÜNCELLEME1: Yorumlarda haklı olarak belirtildiği gibi, RNG'ye bir saldırı bekleniyorsa ve saldırganın cihaza donanım erişimi varsa, harici entropi kaynakları büyük bir dikkatle kullanılmalıdır, çünkü sinyali başka bir kaynaktan değiştirmek çok zor değildir. dış kaynak. Dış kaynakların yanı sıra iç kaynaklardan da yararlanılmalıdır.
Her şeyin entropisini biriktirmek de iyi bir fikirdir boş zaman ve başka bir rastgele sayı oluşturmanız gerektiğinde bunu kullanın. Genellikle bu gibi durumlarda sözde Entropi havuzu- üzerinde PRNG işlevlerinden birinin periyodik olarak gerçekleştirildiği ve entropi kaynaklarından gelen verilerin sürekli olarak karıştırıldığı bir dizi.

Güncelleme2:Çoğu durumda, Entropi havuzunun içeriğini (üzgünüm, normal Rusça çevirisini bilmiyorum) EEPROM'a kaydetmek faydalıdır, böylece cihazı kapatıp açtıktan sonra tekrar biriktirmez. Bu, her şeyden önce, asenkron jeneratörler yöntemini kullanarak entropinin elde edilmesiyle ilgilidir: yeterince kararlı koşullar altında, her açılıştan sonra aynı sıra üretilebilir.
Bir saldırı bekleniyorsa EEPROM'un kurcalanmasına karşı önlem alın. Denetleyici izin veriyorsa, kilit bitlerini kullanarak okuma/silme/yazmayı engelleyin ve onu açarken, en azından basit sağlama toplamları kullanarak EEPROM'un bütünlüğünü izleyin.

Etiketler:

  • RNG
  • GPSCH
  • mikrodenetleyiciler
  • algoritmalar
Etiket ekle

rastgeleSeed(tohum)

Değeri veya tohumu, random() işlevinin başlangıç ​​noktası olarak ayarlar.

randomSeed(değer); // 'değer'i ilk rastgele değer olarak ayarlıyoruz

Arduino gerçekten rastgele sayılar üretemediğinden, randomSeed, rastgele işleve bir değişken, sabit veya başka bir işlev koymanıza olanak tanır, bu da daha fazla rastgele sayı üretmenize yardımcı olur.

"rastgele numaralar. Bu fonksiyonda kullanılabilecek, millis() ve hatta analog pin aracılığıyla elektriksel gürültüyü okumak için analogRead() dahil olmak üzere birçok farklı tohum veya fonksiyon bulunmaktadır.

rastgele (maks)

rastgele(min,maks)

Rastgele işlevi, minimum ve maksimum değerler tarafından belirtilen aralık dahilinde sözde rastgele bir sayı döndürmenize olanak tanır.

değer = rastgele(100, 200); // 'değer'i rastgele olarak ayarlıyoruz

// 100 ile 200 arasında bir sayı

Not: Bunu randomSeed() işlevini kullandıktan sonra kullanın. Aşağıdaki örnek, 0 ile 255 arasında rastgele bir sayı oluşturur ve PWM'nin çıktısını verir.

PWM çıkışına rastgele bir değere eşit sinyal:

int randNumber; // rastgele bir değeri saklayacak değişken

int led = 10; // Pin 10'da dirençli LED

void setup() () // kuruluma gerek yok

randomSeed(milis()); // millis()'ı ilk sayıyla ayarlar

randNumber = rastgele(255); // 0 – 255 arası rastgele sayı analogWrite (led, randNumber); // PWM sinyali çıkışı

gecikme(500); // yarım saniye duraklat

Kaynak: Gololobov V. – Robotlar nerede başlar? Okul çocukları için Arduino projesi hakkında (sadece değil) – 2011

İlgili Mesajlar

Seri.begin (hız) Seri bağlantı noktasını açar ve seri veri aktarımının hızını ayarlar. Bilgisayar iletişimleri için tipik baud hızı 9600'dür, ancak diğer hızlar da desteklenmektedir. void setup() (Serial.begin…….

Tüm değişkenlerin kullanılmadan önce bildirilmesi gerekir. Bir değişkeni bildirmek, değerinin türünü tanımlamak anlamına gelir: int, long, float vb., değişkene benzersiz bir ad atamak ve ayrıca…….

Tamam, bu programı kurduk. Modülle çalışmanın "mekanizması"ndaki hataları ayıkladık. Ve birkaç örneğe baktık. Ama kendim yararlı bir şey yaratmak istiyorum. Hadi deneyelim. Öncelikle önceki projemizi kapatalım. Bunun için…….

Dikkat! Arduino modülü ile diğer geliştirme ortamlarında çalışırken mikrodenetleyici konfigürasyonuna (Sigortalar) dikkat etmelisiniz. Değişikliğin tam olarak neye yol açabileceğini bilene kadar…….

Zaman ve rastgelelik. Reaksiyon

Bu sefer “Rastgele” değerlerin ne olduğunu öğreneceğiz ve aynı zamanda zamanla nasıl çalışılacağını da öğreneceğiz.

İhtiyacımız olacak:

  • İncelik düğmesi
  • Gıcırdayan
  • Bağlantı kabloları “ERKEK-ERKEK”

Reaksiyon

Bugünkü görevimiz tepkimizin hızını bulmamızı sağlayacak bir diyagram oluşturmaktır.

Tıkladığınızda sol düğme, "rastgele" bir süre sonra bir sinyal duyulur. Ve sağ tuşa bastığınızda gıcırtıdan sağ tuşa basana kadar ne kadar zaman geçtiği not ediliyor.

Becerikli olanlar kendileri dener, biz de şemaya bakarız.

#define BUZ 8 #define START 9 #define STOP 7 int zamanını; //Senkronizasyon için değişken void setup() ( Serial.begin(9600); pinMode(START, INPUT_PULLUP); pinMode(STOP, INPUT_PULLUP); pinMode(BUZ, OUTPUT); ) void loop() ( if(digitalRead(START) == 0) // BAŞLAT butonuna bastığınızda.. ( int start_time = millis(); // Bastığınız zamanı hatırlayın time = start_time; // Bunu global bir değişkene yazın. int Rand = random(0, 4000) ); // "Rastgele" bir gecikme süresi oluşturalım = zaman + Rand; //Gecikme süresini ekleyelim gecikme(Rand); //Ton bekle(BUZ, 3000, 500); //Bip! ) if(digitalRead() STOP) == 0 && digitalRead( START) == 1) // STOP butonuna bastığınızda... ( int stop_time = millis(); // Durma zamanını hatırlayın. time = stop_time - time; // Hesaplayın zaman farkı.Serial.println("Time: "); // Zamanın Serial'e çıktısı.Serial.println(time); gecikme(1000); ) ) // İkinci denemeden önce, BAŞLAT düğmesine tekrar basın.

Açıklamalar

int zaman; Değişkenlere (hepsi değil) belirtilirken herhangi bir değer verilmesine gerek yoktur. Bu değişkeni iki if ifadesini birbirine bağlamak için kullandık.

C++'da, bir döngü içinde bildirilen değişkenlere yalnızca o döngü içinde etkili oldukları için diğer döngülerden erişilemez. Bu programlama hatalarını önlemek için yapılır. Program kodu büyüdüğünde neden bahsettiğimi anlayacaksınız.

Bir değişkenin birden fazla ifadede kullanılabilmesini sağlamak için onu global yapmanız gerekir. Onlar. Fonksiyonların dışında bir değişken bildirin.

milis(); Programın başlatılmasından bu yana geçen milisaniye sayısını döndürür.

Sinyalin verilmesinden basılan düğmeye kadar geçen süreyi ölçmek için buna ihtiyacımız var.

rastgele(dakika,maksimum); Bu bir rastgele sayı üretecidir. İki değer alır. Minimumdan maksimuma kadar bir sayı üretir.

"Rastgele" sayılar, çünkü bunlar belirli bir değer dizisidir. Çok uzun ama aynı. Farklı diziler elde etmek için şunu kullanmalısınız: RastgeleTohum();

Bu fonksiyon jeneratörü başlatır. Ve eğer parametreyi rastgele olarak ayarlarsak, ihtiyacımız olan dizileri elde ederiz. Parametre sabitlenirse sıralama aynı olacaktır.

Çözüm

Artık kendi yaptığınız bir cihazı kullanarak reaksiyonunuzu eğitebilirsiniz. Veya daha fazla çalışmaya devam edebilirsiniz.

Radyo elemanlarının listesi

Tanım Tip Mezhep Miktar NotMağazanot defterim
Arduino kurulu

Arduino Uno

1 Not defterine
Ekmek tahtasıBreadboard-yarım1 Not defterine
Piezo yayıcıPasif1 Not defterine
İncelik düğmesiKilitsiz2 Not defterine
Kabloların bağlanması"Baba-Baba"1



Tepe