Satunnaislukugeneraattorin käyttäminen Arduinossa: Random- ja RandomSeed-funktiot. Arduino-kurssi - Aika ja satunnainen Arduino luo satunnaisen bittisekvenssin

Arduinoa ohjelmoitaessa on aikoja, jolloin sinun on saatava numero, joka ei ole etukäteen tiedossa luonnosta kirjoittavalle ohjelmoijalle tai käyttäjälle, joka käyttää Arduinoa tällaisen ohjelman kanssa. Tässä tapauksessa satunnaislukugeneraattori (tai pikemminkin näennäissatunnainen) tulee apuun.



Aktivoidaksesi tämän generaattorin, käytä random()- tai randomSeed()-funktioita. Tämä materiaali näyttää, kuinka näiden toimintojen kanssa työskennellään sekä kuinka päästä eroon näennäissatunnaisuudesta lukuja luotaessa.


Yleensä pseudosatunnaislukugeneraattori simuloi numeroiden kaoottista tai satunnaista esiintymistä, mutta itse asiassa, jos analysoit sarjaa näitä lukuja riittävän pitkän ajanjakson aikana, voit huomata tietyn kuvion.


Siten näennäissatunnaisten lukujen luomiseen tarkoitetulla satunnaisfunktiolla voi olla enintään kaksi parametria ja se kirjoitetaan satunnaiseksi (max) tai satunnaiseksi (min, max). Tässä max parametri, joka on pakollinen, määrittää näennäissatunnaisten lukujen luomisen alueen ylärajan. Käyttämällä lisäparametri min voit asettaa alueen alarajan. Tämän seurauksena funktio palauttaa jonkin näennäissatunnaisen luvun välillä min ja max-1.


On tärkeää ymmärtää, että käytettäessä random()-funktiota, täsmälleen sama luettelo pseudosatunnaisluvuista luodaan joka kerta. Jos esimerkiksi teet peliautomaatin ja kun painat kahvaa ensimmäisen kerran, se näyttää voittoyhdistelmän, voit olla varma, että jos nollaat Arduinon ja painat kahvaa uudelleen, peliautomaatti näyttää saman voittoyhdistelmän . Ei todellakaan ole helppoa toteuttaa täysin satunnaislukujen generointia käyttävää pelikonetta Arduinoon, kuten esimerkiksi pelikoneissa www.igrovye-apparati-vulcan.com/, mutta voit ratkaista ongelman osittain käyttämällä randomSeediä. ()-toiminto.


Tämä funktio ottaa arvon (kuten kokonaisluvun) ja käyttää numeroa muokatakseen random()-funktion luomaa satunnaisluetteloa. Voit laittaa randomSeed()-asetusfunktioon ja käyttää random()-funktiota äärettömässä. silmukka. Mutta silloinkin saalis on, että vaikka satunnaislukujono on erilainen käytettäessä randomSeed()-funktiota, se on silti sama joka kerta, kun luonnos ajetaan.


Ainoa ratkaisu tässä tapauksessa voi olla käyttää analogisia oheislaitteita (ADC) ja vastaavaa analogRead()-funktiota. Jos analogista tuloa ei ole kytketty mihinkään, eli se jätetään "roikkumaan" ilmaan, tämän linjan kohinan ansiosta voit saada todella satunnaisia ​​​​lukuja. Sitten asetusasetuksiin voit kirjoittaa randomSeed(analogRead(A0)). Edellyttäen, että analogista porttia A0 ei ole kytketty mihinkään.

Satunnaislukugeneraattoreista on kirjoitettu paljon, mutta käytännössä aina, kun on kyse toteutuksesta, vihjataan (tai nimenomaisesti todetaan), että me puhumme noin x86/x64 ja muista "aikuisten" arkkitehtuureista. Samaan aikaan foorumit, jotka on omistettu mikro-ohjainlaitteiden kehittämiseen, ovat täynnä kysymyksiä "miten voin luoda satunnaisluvun kohdassa %controllername%?" Lisäksi vastausvalikoima ulottuu "katso Google/Wikipedia" ja "käytä perustoimintoa". Tätä "vakiotoimintoa" ei aina ole olemassa ja se sopii kehittäjälle kaikilta osin; useammin se on päinvastoin: joskus luvut ovat kaukana satunnaisista, joskus toimintanopeus on liian alhainen tai joskus tuloksena oleva koodi ei ole mahtuu vapaaseen muistiin ollenkaan.
Yritetään selvittää, mitkä ovat satunnaislukujen generointialgoritmit, kuinka valita oikea, ja mikä tärkeintä, mitkä ovat näiden algoritmien toteuttamisen ominaisuudet ohjaimissa.

Arvioi "satunnaisuutta"

RNG:n sovellukset voivat olla hyvin erilaisia, leluista vakavaan kryptografiaan. Näin ollen myös generaattorin vaatimukset vaihtelevat suuresti. Generaattorin laadun (”satunnaisuuden”) arvioimiseksi on olemassa erityisiä testejä. Tässä niistä alkeellisimmat:
  • Taajuustesti. Sisältää nollien ja ykkösten määrän laskemisesta bittisarjassa. Ykköjä ja nollia pitäisi olla suunnilleen yhtä paljon.
  • Testaa identtisten bittien sarja. Haetaan identtisten bittien rivejä, kuten 000...0 tai 111...1. Taajuuksien jakauman, jolla sarja esiintyy, niiden pituudesta riippuen tulisi vastata tätä jakaumaa todella satunnaiselle signaalille.
  • Spektritesti. Diskreetti Fourier-muunnos käytetään alkuperäiseen sekvenssiin. Tuloksena olevalla spektrillä ei pitäisi olla merkittäviä huippuja, jotka osoittaisivat sekvenssin jaksollisten ominaisuuksien olemassaolon.
  • Autokorrelaatiotesti. Toistensa suhteen siirrettyjen sekvenssikopioiden välinen korrelaatioarvo lasketaan. Testin avulla voit löytää toistuvia alueita sarjassa.
On olemassa erityisiä sarjoja, jotka sisältävät kymmeniä samanlaisia ​​testejä:
NIST - käytetään AES-kilpailussa salausalgoritmien arvioimiseen.
DIEHARD on yksi tiukimmista olemassa olevista sarjoista.

PRNG-algoritmit

Mitään tiukasti määritellyn algoritmin mukaan generoitua sekvenssiä ei voida pitää todella satunnaisena, joten puhuessaan algoritmisista generaattoreista he käyttävät termiä näennäissatunnaisuus jatkojakso. Mikä tahansa pseudosatunnaislukugeneraattori (PRNG) menee silmukaan ennemmin tai myöhemmin, toinen asia on, että tämä "myöhäinen" voi tulla muutamassa millisekunnissa tai ehkä muutamassa vuodessa. Jakson pituus riippuu generaattorin N sisäisen tilan koosta (itse asiassa tämä on generaattorin tarvitseman muistin määrä) ja vaihtelee välillä 2 (N/2) - 2 N bittiä.
Valtava valikoima PRNG-algoritmeja on keksitty, mutta kaikki eivät ole käteviä toteutettavaksi mikro-ohjaimilla. Meillä on erittäin rajoitettu nopeus ja käytettävissä oleva muisti; monet ohjaimet eivät tue todellisia aritmeettisia tai edes kertolaskuohjeita. Pidämme nämä rajoitukset mielessä, katsotaanpa joitain tunnettuja algoritmeja.
Lineaarinen kongruenttimenetelmä
Sarjan seuraava jäsen lasketaan kaavalla
X i+1 = (aX i + c) mod m
Määrä m määrittää sekvenssin maksimijakson, kokonaisluvut a Ja c- "maagiset" kertoimet. Määrä m On järkevää valita kahden potenssin suuruinen, jolloin modulomuunnostoiminto rajoittuu merkitsevimpien bittien hylkäämiseen. Maksimiajan saavuttamiseksi seuraavat ehdot on täytettävä:
- c ja m:n on oltava suhteellisen ensisijainen,
- a-1 täytyy olla monikerta s kaikille päätekijöille s numeroita m,
- Jos m on 4:n kerrannainen (ja meidän tapauksessamme se on kerrannainen), niin a-1 täytyy olla 4:n kerrannainen.
On vielä yksi hienous: tulokseksi tulee ottaa vain tilamuuttujan X merkittävimmät bitit, koska alimmilla biteillä tilastolliset satunnaisuuden parametrit ovat paljon huonommat. Lineaarinen kongruenttialgoritmi toteutetaan yleisesti vakiona rand() monissa kirjastoissa.

Plussat:

  • suurin mahdollinen ajanjakso tilamuuttujan tietylle koolle;
  • tarpeeksi nopea;
  • usein jo toteutettu kääntäjäkirjastossa.
Miinukset:
  • vaaditaan kertolasku;
  • kaikki bitit eivät ole yhtä satunnaisia.
Yhteenveto: nopea ja yksinkertainen algoritmi ei kovin vaativiin sovelluksiin.
Fibonacci-menetelmä viiveillä
Tämä algoritmi käyttää relaatiota
X i = X i-a - X i-b ,
missä on tilamuuttuja X- etumerkitön kokonaisluku. Viivearvot a Ja b ei oteta mitä tahansa, vaan tiukasti määriteltyjä; parhaan laadun saavuttamiseksi suositellaan pareja (17,5), (55,24) tai (97,33). Mitä suurempi viive, sitä pidempi jakso ja sitä paremmat sekvenssin spektriominaisuudet. Toisaalta, jotta generaattori toimisi, on tarpeen tallentaa aikaisempien lukujen max(a,b), mikä ei ole aina hyväksyttävää. Lisäksi generaattorin käyttämiseen tarvitaan max(a,b)-lukuja, jotka yleensä saadaan käyttämällä yksinkertaisempaa PRNG:tä.

Plussat:

  • ei vaadi kertolaskutoimia;
  • kaikki satunnaisluvun bitit ovat tilastollisia ominaisuuksia vastaavia.
Miinukset:
  • vaatii paljon muistia;
  • vaatii suuren joukon numeroita suorittaakseen.
Yhteenveto: erittäin laadukas, mutta resurssiintensiivinen algoritmi.
Lineaarinen palautevaihtorekisteri


Tilamuuttuja tallennetaan rekisteriin, jonka pituus on N. Seuraavan tilan luominen tapahtuu kahdessa vaiheessa:
  1. Bitin arvo lasketaan C = X i1 xor X i2 xor… X ik, jossa i1, i2…ik- rekisteröidä bittinumeroita, soitetaan mutkia.
  2. Rekisteriä siirretään 1 bitin oikealle, vasemmanpuoleisin bitti saa arvon KANSSA.
Generaattorin ulostulo on rekisterin oikeanpuoleisin (tai vasen, tai mikä tahansa) bitti, eli näennäissatunnainen sekvenssi generoidaan bitti per iteraatio. Oikein valituilla väliottonumeroilla generaattorin jakso on 2 N - 1. "Miinus yksi", koska rekisterissä on kielletty nollatila. Sivukonttorin numerot N 3 - 168 löytyvät tästä asiakirjasta.
Yllä kuvatun konfiguraation lisäksi, jota muuten kutsutaan Fibonacci-konfiguraatioksi (ei pidä sekoittaa samannimiseen PRNG-menetelmään!), on olemassa ns. Galois-kokoonpano.


Sen sijaan, että käytettäisiin väliottosekvenssin bittien summaa uuden vasemmanpuoleisimman bitin luomiseen, se XOR määrittää jokaisen väliottosekvenssin bitin oikeanpuoleisimman bitin kanssa ja kiertää sitten koko rekisterin oikealle. Tämä kaavio on vaikeampi ymmärtää, mutta helpompi toteuttaa, koska kaikki XOR-operaatiot voidaan suorittaa samanaikaisesti. Jakson pituuden ja näennäissatunnaisten lukujen laadun suhteen Fibonaccin ja Galois'n kaaviot ovat vastaavia.

Plussat:

  • erittäin yksinkertainen toteutus, ei edes vaadi aritmetiikkaa, vain bittioperaatioita ja siirtymiä;
  • erittäin nopea algoritmi (etenkin Galois'n malli);
  • hyvät tilastolliset ominaisuudet.
Miinukset:
  • sinun on tarkistettava epäyhtälön alkuarvo nollaan.
Yhteenveto: erittäin nopea ja melko laadukas algoritmi.
Kryptoturvalliset algoritmit
Salaustekniikassa käytettäväksi PRNG:llä on vielä yksi olennainen vaatimus: peruuttamattomuutta. Kaikilla yllä luetelluilla algoritmeilla ei ole tätä ominaisuutta: kun tiedät useita PRNG:n lähtöarvoja, voit ratkaista algoritmin parametrit (samat "maagiset" vakiot) ratkaisemalla yksinkertaisen yhtälöjärjestelmän a, b, c jne). Ja kun tiedät parametrit, voit toistaa koko pseudosatunnaissekvenssin.
Mitä tahansa riittävän vahvaa lohkosalausta voidaan käyttää kryptografisesti vahvana PRNG-algoritmina. Valitsemalla salaisen avaimen voit saada näennäissatunnaisten lukujen lohkoja soveltamalla algoritmia peräkkäisiin luonnollisiin lukuihin. N-bittisessä lohkosalauksessa jakso on enintään 2 N. Tällaisen järjestelmän turvallisuus riippuu täysin avaimen salaisuudesta.
Kaikki nykyaikaiset kryptografiset algoritmit on testattu käytettäviksi PRNG:inä, eli sertifioitua algoritmia käyttäen ei tarvitse välittää erityisesti lähtövirran tilastollisista ja spektraalisista ominaisuuksista. Sinun tarvitsee vain olla huolissaan kryptoalgoritmien laskennallisesta "ahmattomuudesta". Jos sinun on suoritettava suuri määrä salaustoimintoja, on järkevää valita ohjain, jossa on laitteiston salauslohkoja. Usein tällaisissa ohjaimissa on myös erittäin hyvä kryptonkestävä laitteisto PRNG.

Entropian lähteet

Kuten jo todettiin, vain deterministisiä algoritmeja käyttämällä on mahdotonta luoda todella satunnaislukua. Siksi yleensä käytetään PRNG + ulkoisen yhdistelmää entropian lähde. Entropialähdettä käytetään PRNG:n alkuarvon asettamiseen, ja jälkimmäisen tehtävänä on varmistaa sekvenssin spektraalinen ja tilastollinen puhtaus. Mitä voidaan käyttää entropian lähteenä? Kyllä, melkein mitä tahansa.
Käyttäjien toiminta
Jos laite on millään tavalla vuorovaikutuksessa käyttäjän kanssa, aivan hyvä päätös käyttää käyttäjää itseään entropian lähteenä. Esimerkiksi painikkeen painallusaika mikrosekunnin (tai pikemminkin sen vähiten merkitsevien numeroiden) tarkkuudella mitattuna on täysin arvaamaton. Usein laitteen on kuitenkin toimittava itsenäisesti, mikä tarkoittaa, että olemme vailla tätä upeaa tietokanavaa.
Analogi-digitaali muunnin
Monissa ohjaimissa on sisäänrakennetut ADC:t. Ja monissa ohjaimissa ne ovat erittäin keskinkertaisia, ja ne on tehty vain "olemaan". ADC-tuloksen matalan kertaluvun bitit sisältävät lähes aina merkittävää kohinaa, jopa tasajännitettä mitatessa. Tätä voidaan käyttää: kytke ADC-tulo syöttöjännitteeseen jakajan kautta, tee muutama tusina mittausta, ota vähiten merkitsevät bitit - tässä on hieno satunnaisluku. Jos ADC:ssä on sisäänrakennettu esivahvistin, kytke se päälle, se on myös meluisa.
Asynkroniset generaattorit
Voit käyttää kahden synkronoimattoman kellogeneraattorin jaksojen eroa. Suurin osa ohjaimista sisältää esimerkiksi vahtikoiran ajastimen. Luotettavuuden lisäämiseksi se kellotetaan erillisestä generaattorista, joka ei ole mitenkään yhteydessä pääkellosignaaliin. Riittää, kun lasketaan pääkellosignaalin jaksojen määrä yhden vahtikoiran ajastimen jakson aikana. Jos valitset jaksot niin, että laskuri vuotaa useita kertoja yli mittauksen aikana, voit saada melko satunnaisen luvun. Tämän menetelmän haittana on, että se vie paljon aikaa, jopa useita sekunteja.
Reaaliaikainen kello
Jos kaaviossa on reaaliaikainen kello, voit käyttää niiden nykyisiä lukemia PRNG:n alustamiseen. Esimerkiksi muuntamalla nykyinen päivämäärä/aika Unix-aikamuotoon, saamme heti 32 bittiä, joka ei koskaan ei toistu, ellet ota lukemia useammin kuin kerran sekunnissa. Reaaliaikainen käyttö antaa arvojen ainutlaatuisuutta, mutta ei anna mitään arvaamattomuutta, joten on parempi yhdistää tätä menetelmää muiden kanssa.
RC-piiri
Jos ohjaimella ei ole oheislaitteet, I/O-porttien lisäksi voit tehdä seuraavaa: yksi jaloista on kytketty kondensaattorin kautta maahan ja vastuksen kautta syöttöjännitteeseen. Jos säätimen tuloissa on sisäiset vetovastukset, ulkoista vastusta ei tarvita.

Annamme "0"-signaalin tähän porttiin - kondensaattori on purkautunut. Vaihdamme portin tulotilaan - kondensaattori alkaa latautua. Kun jännite sen yli saavuttaa kynnysarvon, tulo vaihtuu tilasta "0" "1". Latausaika riippuu voimakkaasti monista tekijöistä: syöttöjännite, RC-piirin parametrien poikkeama, kynnyksen epävakaus, lämpötila, vuodot, häiriöt. Mittaamalla se riittävällä tarkkuudella ja ottamalla vähiten merkitsevät bitit, saadaan hyvä satunnaisuus.
Laitteiston melugeneraattori
Moniin vakaviin sovelluksiin (erityisesti kryptografiaan) tarvitaan luotettavampi entropialähde kuin yllä luetellut. Tällaisissa tapauksissa he käyttävät kohinageneraattorin signaalin digitointia lämpö-, laukaus- tai jopa kvanttiefektien perusteella. Kohinaelementti on yleensä erityinen diodi tai zener-diodi, jonka signaali vahvistetaan ja syötetään komparaattoriin, joka muodostaa binääribittivirran.

Sen varmistamiseksi, että vertailijan vastekynnys ei vaikuta vastaanotetun signaalin tilastollisiin ominaisuuksiin, käytetään kahta kohinageneraattoria, jotka toimivat yhdessä vertailussa:

Johtopäätös

Lopuksi kerron sinulle yhden tarinan elämästäni. Se alkoi toisella foorumilla kysytyllä kysymyksellä: "Kuinka voin luoda satunnaisluvun ohjaimessa?" Kysymyksen kirjoittaja selitti, että hän tekee kurssiprojektina laitetta, joka jäljittelee nopan heittoa. Useiden epäonnistuneiden algoritmien ymmärtämisen jälkeen aiheen aloittaja jakoi ratkaisunsa: hän heitti yksinkertaisesti oikean noppaa 1000 kertaa ja täytti ohjaimen koko vapaan muistin tuloksena olevilla numeroilla. Generaattori läpäisi loistavasti kaikki "satunnaisuus" -testit, koska esittelyn aikana se käytti alle kolmanneksen "varastaan".
Siksi tällaisella ratkaisulla on myös oikeus elämään, varsinkin jos lukujen satunnaisuudelle asetetaan erittäin tiukat vaatimukset, mutta niitä ei vaadita liian usein. Muistin hintojen romahtaessa saattaa olla viisasta varustaa laite "kaaosreservillä", joka kestää laitteen koko käyttöiän.
Kiitos huomiostasi!

UPD1: Kuten kommenteissa aivan oikein todettiin, jos RNG:tä vastaan ​​on odotettavissa hyökkäys ja hyökkääjällä on laitteistopääsy laitteeseen, ulkoisia entropialähteitä on käytettävä erittäin varoen, koska signaalin korvaaminen ei ole kovin vaikeaa. ulkoinen lähde. Ulkoisten lähteiden lisäksi tulee käyttää sisäisiä lähteitä.
On myös hyvä idea kerätä entropiaa kaikesta vapaa-aika, ja käytä sitä, kun haluat luoda toisen satunnaisluvun. Yleensä tällaisissa tapauksissa ns Entropia-allas- matriisi, jossa jokin PRNG-toiminnoista suoritetaan ajoittain ja johon entropialähteistä peräisin olevaa dataa sekoitetaan jatkuvasti.

UPD2: Monissa tapauksissa on hyödyllistä tallentaa Entropia-poolin sisältö (anteeksi, en tiedä normaalia venäjänkielistä käännöstä) EEPROMiin, jotta se ei kerää sitä uudelleen laitteen sammuttamisen ja käynnistämisen jälkeen. Tämä koskee ennen kaikkea entropian saamista asynkronisten generaattoreiden menetelmällä: riittävän stabiileissa olosuhteissa voidaan generoida sama sarja jokaisen päällekytkennän jälkeen.
Jos hyökkäystä on odotettavissa, ryhdy varotoimiin EEPROMin peukalointia vastaan. Jos ohjain sallii, estä lukeminen/poistaminen/kirjoitus lukitusbittien avulla, ja kun kytket sen päälle, tarkkaile EEPROMin eheyttä ainakin yksinkertaisilla tarkistussummilla.

Tunnisteet:

  • RNG
  • gpsch
  • mikro-ohjaimet
  • algoritmeja
Lisää tageja

satunnainen siemen (siemen)

Asettaa arvon eli siemenen satunnais()-funktion aloituspisteeksi.

satunnainenSiemen(arvo); // asettaa 'arvon' satunnaisalkuarvoksi

Koska Arduino ei pysty generoimaan todella satunnaislukuja, randomSeed antaa sinun laittaa muuttujan, vakion tai muun funktion satunnaisfunktioon, mikä auttaa luomaan enemmän satunnaislukuja.

"satunnaisia" numeroita. Tässä funktiossa voidaan käyttää monia erilaisia ​​siemeniä tai toimintoja, mukaan lukien millis() tai jopa analogRead() sähköisen kohinan lukemiseen analogisen nastan kautta.

satunnainen (max)

satunnainen (min, max)

Satunnaisfunktion avulla voit palauttaa näennäissatunnaisen luvun minimi- ja maksimiarvojen määrittämän alueen sisällä.

arvo = satunnainen(100, 200); // asettaa 'arvon' satunnaiseksi

// luku väliltä 100-200

Huomautus: Käytä tätä randomSeed()-funktion käytön jälkeen. Seuraava esimerkki luo satunnaisluvun väliltä 0–255 ja tulostaa PWM:n

signaali PWM-lähtöön, joka on yhtä suuri kuin satunnainen arvo:

int randNumber; // muuttuja satunnaisarvon tallentamiseen

int led = 10; // LED, jossa vastus nastassa 10

void setup() () // asennusta ei tarvita

satunnainenSiemen(millis()); // asettaa millis():n alkunumerolla

satunnaisluku = satunnainen(255); // satunnaisluku välillä 0 – 255 analogWrite (led, randNumber); // PWM-signaali

viive (500); // tauko puoli sekuntia

Lähde: Gololobov V. – Mistä robotit alkavat. Tietoja Arduino-projektista koululaisille (ja ei vain) – 2011

Aiheeseen liittyvät julkaisut

Serial.begin (nopeus) Avaa sarjaportin ja asettaa sarjatiedonsiirron nopeuden. Tyypillinen tiedonsiirtonopeus tietokoneviestinnässä on 9600, vaikka muita nopeuksia tuetaan. void setup() (Serial.begin…….

Kaikki muuttujat on ilmoitettava ennen kuin niitä voidaan käyttää. Muuttujan ilmoittaminen tarkoittaa sen arvon tyypin määrittelyä: int, long, float jne., yksilöllisen nimen antamista muuttujalle ja lisäksi…….

Okei, olemme asentaneet tämän ohjelman. Olemme tehneet virheenkorjauksen moduulin kanssa työskentelyn "mekanismista". Ja katsoimme useita esimerkkejä. Mutta haluaisin itsekin luoda jotain hyödyllistä. Kokeillaan. Ensin suljetaan edellinen projekti. Tätä varten…….

Huomio! Kun työskentelet Arduino-moduulin kanssa muissa kehitysympäristöissä, sinun tulee olla varovainen mikro-ohjaimen kokoonpanon (sulakkeet) suhteen. Kunnes tiedät tarkalleen, mihin muutos voi johtaa……

Aika ja satunnaisuus. Reaktio

Tällä kertaa opimme mitä ovat "Satunnaiset" arvot ja opimme myös työskentelemään ajan kanssa.

Tarvitsemme:

  • Tact-painike
  • Squeaker
  • Kytkentäjohdot "MALE-MALE"

Reaktio

Tämän päivän tehtävämme on koota kaavio, jonka avulla voimme selvittää reaktionopeudemme.

Kun napsautat vasen nappi, äänimerkki kuuluu "satunnaisen" ajan kuluttua. Ja kun painat oikeaa painiketta, todetaan kuinka paljon aikaa on kulunut vinkumisesta oikean painikkeen painamiseen.

Taitavat kokeilevat sitä itse, ja katsomme kaaviota.

#define BUZ 8 #define START 9 #define STOP 7 int time; //Synkronoinnin muuttuja void setup() ( Serial. begin(9600); pinMode(START, INPUT_PULLUP); pinMode(STOP, INPUT_PULLUP); pinMode(BUZ, OUTPUT); ) void loop() ( if(digitalRead(START) == 0) // Kun painat START-painiketta.. ( int aloitusaika = millis(); // Muista painalluksen aika time = start_time; // Kirjoita se globaaliin muuttujaan. int Rand = random(0, 4000 ); // Luodaan "satunnainen" viiveaika = aika + Rand; //Lisää viiveaikaviive(Rand); //Odota ääntä (BUZ, 3000, 500); //Piip! ) if(digitalRead( STOP) == 0 && digitalRead( START) == 1) // Kun painat STOP-painiketta... ( int stop_time = millis(); // Muista lopetusaika. aika = stop_time - aika; // Laske aikaero. Serial.println("Aika: "); // Tulostaa aika sarjaan. Serial.println(time); delay(1000); ) ) // Paina START-painiketta uudelleen ennen toista yritystä.

Selitykset

int aika; Muuttujille (ei kaikille) niitä merkittäessä ei tarvitse antaa mitään arvoa. Käytimme tätä muuttujaa kahden if-lausekkeen linkittämiseen.

C++:ssa silmukan sisällä ilmoitetut muuttujat eivät ole käytettävissä muissa silmukoissa, koska ne vaikuttavat vain kyseisessä silmukassa. Tämä tehdään ohjelmointivirheiden estämiseksi. Kun ohjelmakoodi kasvaa, ymmärrät mistä puhun.

Jotta muuttuja olisi useiden lauseiden käytettävissä, sinun on tehtävä siitä globaali. Nuo. ilmoittaa muuttuja funktioiden ulkopuolella.

millis(); Palauttaa millisekuntien määrän, joka on kulunut ohjelman käynnistämisestä.

Tarvitsemme sitä, jotta voimme mitata ajan, joka on kulunut signaalin antamisesta painikkeen painamiseen.

satunnainen (min,max); Tämä on satunnaislukugeneraattori. Ottaa kaksi arvoa. Se luo luvun välillä min - max.

"Satunnaiset" numerot, koska ne ovat tietty arvosarja. Todella pitkä, mutta sama. Erilaisten sekvenssien saamiseksi sinun tulee käyttää SatunnainenSeed();

Tämä toiminto alustaa generaattorin. Ja jos asetamme parametrin satunnaiseksi, saamme tarvitsemamme sekvenssit. Järjestys on sama, jos parametri on kiinteä.

Johtopäätös

Nyt voit harjoitella reaktiota itse tekemälläsi laitteella. Tai voit jatkaa opiskelua.

Luettelo radioelementeistä

Nimitys Tyyppi Nimitys Määrä HuomautusMyymäläOma muistilehtiö
Arduino-levy

Arduino Uno

1 Muistilehtiöön
LeipälautaLeipälauta-puolikas1 Muistilehtiöön
PietsosäteilijäPassiivinen1 Muistilehtiöön
Tact-painikeIlman lukkoa2 Muistilehtiöön
Kytkentäjohdot"Papa-Papa"1



Yläosa