Arduino izlases skaitļu ģeneratora izmantošana: Random un RandomSeed funkcijas. Arduino kurss - laiks un nejaušs Arduino, kas ģenerē nejaušu bitu secību

Programmējot Arduino, ir reizes, kad nepieciešams iegūt skaitli, kas iepriekš nebūs zināms ne programmētājam, kurš raksta skici, ne lietotājam, kurš izmantos Arduino ar šādu programmu. Šajā gadījumā palīgā nāk nejaušs (vai drīzāk pseidogadījuma) skaitļu ģenerators.



Lai aktivizētu šo ģeneratoru, vienkārši izmantojiet random() vai randomSeed() funkcijas. Šis materiāls parādīs, kā strādāt ar šīm funkcijām, kā arī kā atbrīvoties no pseidogadījuma, ģenerējot skaitļus.


Kopumā pseidogadījuma skaitļu ģenerators simulē skaitļu haotisku vai nejaušu parādīšanos, bet patiesībā, ja analizējat šo skaitļu virkni pietiekami ilgā laika posmā, varat pamanīt noteiktu modeli.


Tātad nejaušības funkcijai pseidogadījuma skaitļu ģenerēšanai var būt līdz diviem parametriem, un tā tiek rakstīta kā nejaušs (max) vai nejaušs (min, max). Šeit maksimālais parametrs, kas ir obligāts, nosaka pseidogadījuma skaitļu ģenerēšanas diapazona augšējo robežu. Izmantojot papildu parametrs min jūs varat iestatīt diapazona apakšējo robežu. Rezultātā funkcija atgriezīs kādu pseidogadījuma skaitli diapazonā no min līdz max-1.


Ir svarīgi saprast, ka, izmantojot funkciju random(), katru reizi tiks ģenerēts tieši tāds pats pseidogadījuma skaitļu saraksts. Piemēram, ja jūs izveidojat spēļu automātu un pirmo reizi nospiežot rokturi, tas parāda laimesta kombināciju, tad varat būt drošs, ka, atiestatot Arduino un vēlreiz nospiežot rokturi, šis spēļu automāts parādīs to pašu laimestu kombināciju. . Patiešām, nav viegli ieviest spēļu automātu ar pilnīgi nejaušu skaitļu ģenerēšanu uz Arduino, kā tas ir, piemēram, ieviests spēļu automātos www.igrovye-apparati-vulcan.com/, taču jūs varat daļēji atrisināt problēmu, izmantojot randomSeed. () funkcija.


Šī funkcija ņem vērtību (piemēram, veselu skaitli) un izmanto skaitli, lai modificētu izlases sarakstu, ko ģenerē funkcija random(). Varat ievietot randomSeed() iestatīšanas funkcijā un izmantot random() funkciju bezgalīgā skaitā. cilpa. Bet pat tad, āķīga ir tāda, ka, lai gan nejaušo skaitļu secība būs atšķirīga, izmantojot funkciju randomSeed(), tā joprojām būs tāda pati katru reizi, kad tiek izpildīta skice.


Vienīgais risinājums šajā gadījumā var būt analogo perifērijas ierīču (ADC) un atbilstošās analogRead() funkcijas izmantošana. Ja analogā ieeja nav nekam pievienota, tas ir, atstāta “karājoties” gaisā, tad, pateicoties troksnim šajā līnijā, jūs varat iegūt patiesi nejaušus skaitļus. Pēc tam iestatīšanas iestatījumos varat ierakstīt randomSeed(analogRead(A0)). Ar nosacījumu, ka analogais ports A0 nav pievienots nekur.

Daudz ir rakstīts par nejaušo skaitļu ģeneratoriem, bet gandrīz vienmēr, kad runa ir par ieviešanu, tiek netieši norādīts (vai skaidri norādīts), ka mēs runājam par par x86/x64 un citām “pieaugušo” arhitektūrām. Tajā pašā laikā forumi, kas veltīti mikrokontrolleru ierīču izstrādei, ir pilni ar jautājumiem "kā es varu ģenerēt nejaušu skaitu vietnē %controllername%?" Turklāt atbilžu klāsts sniedzas no “skatieties Google/Wikipedia” līdz “izmantojiet standarta funkciju”. Šī "standarta funkcija" ne vienmēr pastāv un ir piemērota izstrādātājam visos aspektos; biežāk tas ir otrādi: dažreiz skaitļi ir tālu no nejaušības, dažreiz darbības ātrums ir pārāk mazs, vai arī iegūtais kods neatbilst. vispār iekļaujas brīvajā atmiņā.
Mēģināsim izdomāt, kas ir nejaušo skaitļu ģenerēšanas algoritmi, kā izvēlēties pareizo un, pats galvenais, kādas ir šo algoritmu ieviešanas iespējas uz kontrolleriem.

"Nejaušības" novērtēšana

RNG lietojumprogrammas var būt ļoti dažādas, sākot no rotaļlietām līdz nopietnai kriptogrāfijai. Attiecīgi arī prasības ģeneratoram ļoti atšķiras. Ir speciāli testi, lai novērtētu ģeneratora kvalitāti ("nejaušības" līmeni). Šeit ir visvienkāršākie no tiem:
  • Frekvences pārbaude. Sastāv no nulles un vieninieku skaitīšanas bitu secībā. Vieniniekiem un nullēm jābūt aptuveni vienādam skaitam.
  • Pārbaudiet identisku bitu secību. Tiek meklētas identisku bitu rindas, piemēram, 000...0 vai 111...1. Frekvenču sadalījumam, ar kādu notiek sērijas, atkarībā no to garuma, jāatbilst šim sadalījumam patiesi nejaušam signālam.
  • Spektrālais tests. Sākotnējai secībai tiek piemērota diskrēta Furjē transformācija. Iegūtajā spektrā nedrīkst būt nozīmīgi maksimumi, kas norādītu uz secības periodisko īpašību klātbūtni.
  • Autokorelācijas tests. Tiek aprēķināta korelācijas vērtība starp secības kopijām, kas nobīdītas viena pret otru. Pārbaude ļauj secīgi atrast atkārtotus reģionus.
Ir īpaši komplekti, kas ietver desmitiem līdzīgu testu:
NIST - izmanto AES konkursā, lai novērtētu šifrēšanas algoritmus.
DIEHARD ir viens no visstingrākajiem komplektiem.

PRNG algoritmi

Jebkura secība, kas ģenerēta pēc stingri noteikta algoritma, nevar tikt uzskatīta par patiesi nejaušu, tāpēc, runājot par algoritmiskajiem ģeneratoriem, viņi lieto terminu pseidogadījuma secība. Jebkurš pseidogadījuma skaitļu ģenerators (PRNG) agrāk vai vēlāk nonāks cilpā, otra lieta ir tāda, ka šis “vēlais” var rasties dažu milisekundēs vai varbūt dažu gadu laikā. Cikla ilgums ir atkarīgs no ģeneratora N iekšējā stāvokļa lieluma (faktiski tas ir ģeneratoram nepieciešamais atmiņas apjoms) un svārstās no 2 (N/2) līdz 2 N bitiem.
Ir izgudrots ļoti daudz dažādu PRNG algoritmu, taču ne visi no tiem ir ērti ieviešanai mikrokontrolleros. Mums ir ļoti ierobežots ātrums un pieejamā atmiņa; daudzi kontrolleri neatbalsta reālas aritmētikas vai pat reizināšanas instrukcijas. Paturot prātā šos ierobežojumus, apskatīsim dažus labi zināmus algoritmus.
Lineārā kongruenta metode
Nākamais secības dalībnieks tiek aprēķināts, izmantojot formulu
X i+1 = (aX i + c) mod m
Numurs m definē maksimālo secības periodu, veselus skaitļus a Un c- "burvju" koeficienti. Numurs m Ir saprātīgi izvēlēties, kas vienāda ar jaudu divi; šajā gadījumā moduļu pārveidošanas darbība tiek samazināta līdz nozīmīgāko bitu izmešanai. Lai iegūtu maksimālo periodu, ir jāievēro šādi nosacījumi:
- c un m ir jābūt relatīvi galvenajam,
- a-1 jābūt daudzkārtējam lpp visiem galvenajiem faktoriem lpp cipariem m,
- Ja m ir 4 reizinājums (un mūsu gadījumā tas būs daudzkārtējs), tad a-1 jābūt skaitļa 4 reizinājumam.
Ir vēl viens smalkums: par rezultātu ir jāņem tikai nozīmīgākie stāvokļa mainīgā X biti, jo zemākajiem bitiem nejaušības statistiskie parametri ir daudz sliktāki. Lineārais kongruentais algoritms daudzās bibliotēkās parasti tiek ieviests kā standarta rand ().

Plusi:

  • maksimālais iespējamais periods noteiktam stāvokļa mainīgā lielumam;
  • pietiekami ātri;
  • bieži jau ir ieviests kompilatora bibliotēkā.
Mīnusi:
  • nepieciešama reizināšanas darbība;
  • ne visi biti ir vienādi nejauši.
Kopsavilkums:ātrs un vienkāršs algoritms ne pārāk prasīgām lietojumprogrammām.
Fibonači metode ar lagām
Šis algoritms izmanto attiecību
X i = X i-a - X i-b ,
kur ir stāvokļa mainīgais X- neparakstīts vesels skaitlis. Aizkaves vērtības a Un b tiek ņemti ne visi, bet stingri noteikti, lai sasniegtu maksimālu kvalitāti, ieteicami pāri (17,5), (55,24) vai (97,33). Jo lielāka aizkave, jo ilgāks periods un labākas secības spektrālās īpašības. No otras puses, lai ģenerators darbotos, ir jāsaglabā iepriekšējie skaitļi max(a,b), kas ne vienmēr ir pieņemami. Tāpat, lai palaistu ģeneratoru, nepieciešami max(a,b) skaitļi, kurus parasti iegūst, izmantojot vienkāršāku PRNG.

Plusi:

  • nav nepieciešamas reizināšanas darbības;
  • visi nejaušā skaitļa biti ir līdzvērtīgi statistiskajās īpašībās.
Mīnusi:
  • nepieciešams liels atmiņas apjoms;
  • lai palaistu, ir nepieciešams liels skaitļu masīvs.
Kopsavilkums:ļoti kvalitatīvs, bet resursietilpīgs algoritms.
Lineārās atsauksmes maiņas reģistrs


Stāvokļa mainīgais tiek saglabāts reģistrā, kura garums ir N. Nākamā stāvokļa ģenerēšana ietver divas darbības:
  1. Bita vērtību aprēķina C = X i1 xor X i2 xor… X ik, kur i1, i2…ik- reģistrēt bitu numurus, zvanīt līkumi.
  2. Reģistrs tiek nobīdīts par 1 bitu pa labi, bet kreisais galējais bits iegūst vērtību AR.
Ģeneratora izvade ir reģistra galējais (vai galējais kreisais, vai kāds cits) bits, tas ir, pseidogadījuma secība tiek ģenerēta viens bits katrā iterācijā. Ar pareizi izvēlētiem krāna numuriem ģeneratora periods būs 2 N - 1. “Mīnus viens”, jo ir aizliegts reģistra nulles stāvoklis. Filiāles numuri priekš N no 3 līdz 168 var atrast šajā dokumentā.
Papildus iepriekš aprakstītajai konfigurācijai, kuru, starp citu, sauc par Fibonači konfigurāciju (nejaukt ar tāda paša nosaukuma PRNG metodi!), pastāv t.s. Galois konfigurācija.


Tā vietā, lai izmantotu pieskāriena secības bitu summu, lai ģenerētu jaunu vistālāk pa kreisi esošo bitu, tas katru pieskāriena secības bitu XOR veic ar vistālāk labējo bitu, pēc tam pagriež visu reģistru pa labi. Šo shēmu ir grūtāk saprast, bet vieglāk īstenot, jo visas XOR darbības var veikt vienlaikus. Perioda garuma un pseidogadījuma skaitļu kvalitātes ziņā Fibonači un Galuā shēmas ir līdzvērtīgas.

Plusi:

  • ļoti vienkārša ieviešana, pat nav nepieciešama aritmētika, tikai bitu darbības un nobīdes;
  • ļoti ātrs algoritms (īpaši Galois shēma);
  • labas statistiskās īpašības.
Mīnusi:
  • jums ir jāpārbauda sākotnējā vērtība, lai nevienlīdzība būtu nulle.
Kopsavilkums:ļoti ātrs un diezgan kvalitatīvs algoritms.
Kriptoizturīgi algoritmi
Lai izmantotu kriptogrāfijā, PRNG ir vēl viena būtiska prasība: neatgriezeniskums. Visiem iepriekš uzskaitītajiem algoritmiem nav šīs īpašības: zinot vairākas PRNG izvades vērtības, jūs varat, risinot vienkāršu vienādojumu sistēmu, atrast algoritma parametrus (tās pašas "maģiskās" konstantes a, b, c utt). Un, zinot parametrus, jūs varat reproducēt visu pseidogadījuma secību.
Jebkuru pietiekami spēcīgu bloka šifru var izmantot kā kriptogrāfiski spēcīgu PRNG algoritmu. Izvēloties slepeno atslēgu, jūs varat iegūt pseidogadījuma skaitļu blokus, piemērojot algoritmu secīgiem naturāliem skaitļiem. N-bitu bloka šifram periods būs ne vairāk kā 2 N. Šādas shēmas drošība ir pilnībā atkarīga no atslēgas noslēpuma.
Visi mūsdienu kriptogrāfijas algoritmi tiek pārbaudīti lietošanai kā PRNG, tas ir, izmantojot sertificētu algoritmu, nav īpaši jārūpējas par izvades straumes statistiskajām un spektrālajām īpašībām. Jums tikai jāuztraucas par kriptovalūtu algoritmu skaitļošanas “rijību”. Ja nepieciešams veikt lielu skaitu šifrēšanas darbību, ir lietderīgi izvēlēties kontrolieri ar aparatūras kriptogrāfijas blokiem. Bieži vien šādiem kontrolieriem ir arī ļoti laba kriptoizturīga aparatūra PRNG.

Entropijas avoti

Kā jau minēts, izmantojot tikai deterministiskus algoritmus, nav iespējams ģenerēt patiesi nejaušu skaitli. Tāpēc parasti tiek izmantota PRNG + ārējā kombinācija entropijas avots. Entropijas avots tiek izmantots, lai iestatītu PRNG sākotnējo vērtību, un tā uzdevums ir nodrošināt secības spektrālo un statistisko tīrību. Ko var izmantot kā entropijas avotu? Jā, gandrīz jebko.
Lietotāja darbība
Ja ierīce kaut kādā veidā mijiedarbojas ar lietotāju, diezgan labs risinājums būtu izmantot pašu lietotāju kā entropijas avotu. Piemēram, pogas nospiešanas laiks, ko mēra ar mikrosekundes precizitāti (vai drīzāk, tās vismazāk nozīmīgākajiem cipariem), ir pilnīgi neparedzams. Tomēr bieži vien ierīcei jādarbojas autonomi, kas nozīmē, ka mums ir liegts šis brīnišķīgais informācijas kanāls.
Analogo-digitālo pārveidotājs
Daudziem kontrolieriem ir iebūvēti ADC. Un daudzos kontrolleros tiem ir ļoti viduvēja kvalitāte, un tie ir izveidoti, lai tie būtu. ADC rezultāta zemās kārtas biti gandrīz vienmēr satur ievērojamu troksni, pat mērot līdzstrāvas spriegumu. To var izmantot: pievienojiet ADC ieeju barošanas spriegumam caur dalītāju, veiciet dažus desmitus mērījumu, veiciet vismazākos bitus - šeit jums ir lielisks nejaušs skaitlis. Ja ADC ir iebūvēts priekšpastiprinātājs, ieslēdziet to, tas ir arī trokšņains.
Asinhronie ģeneratori
Varat izmantot divu nesinhronizētu pulksteņu ģeneratoru periodu atšķirību. Lielākajā daļā kontrolieru ir, piemēram, sargsuņa taimeris. Lai palielinātu uzticamību, tas tiek iestatīts no atsevišķa ģeneratora, kas nekādā veidā nav savienots ar galveno pulksteņa signālu. Pietiek saskaitīt galvenā pulksteņa signāla ciklu skaitu vienā sargsuņa taimera periodā. Ja izvēlaties periodus tā, lai mērīšanas laikā skaitītājs daudzkārt pārplūstu, jūs varat iegūt diezgan nejaušu skaitli. Šīs metodes trūkums ir tas, ka tas aizņem daudz laika, līdz pat vairākām sekundēm.
Reālā laika pulkstenis
Ja diagrammā ir reālā laika pulkstenis, varat izmantot to pašreizējos rādījumus, lai inicializētu PRNG. Piemēram, konvertējot pašreizējo datumu/laiku uz Unix laika formātu, mēs uzreiz iegūstam 32 bitus, kas nekad neatkārtosies, ja vien nenolasīsit rādījumus vairāk nekā vienu reizi sekundē. Reāllaika izmantošana dod vērtību unikalitāti, bet nesniedz nekādu neparedzamību, tāpēc labāk kombinēt šī metode ar citiem.
RC ķēde
Ja kontrolierim nav perifērijas ierīces, papildus I/O portiem varat veikt šādas darbības: viena no kājām ir savienota caur kondensatoru ar zemi un caur rezistoru ar barošanas spriegumu. Ja kontrollera ieejām ir iekšējie uzvilkšanas rezistori, ārējais rezistors nav nepieciešams.

Mēs izvadām “0” signālu uz šo portu - kondensators ir izlādējies. Mēs pārslēdzam portu uz ievades režīmu - kondensators sāk uzlādēt. Kad spriegums pāri tai sasniedz slieksni, ieeja pārslēgsies no stāvokļa “0” uz “1”. Uzlādes laiks ir ļoti atkarīgs no daudziem faktoriem: barošanas sprieguma, RC ķēdes parametru novirzes, sliekšņa nestabilitātes, temperatūras, noplūdēm, traucējumiem. Mērot to ar pietiekamu precizitāti un ņemot vismazākos bitus, jūs varat iegūt labu nejaušību.
Aparatūras trokšņu ģenerators
Daudzām nopietnām lietojumprogrammām (jo īpaši kriptogrāfijai) ir nepieciešams uzticamāks entropijas avots nekā iepriekš uzskaitītie. Šādos gadījumos viņi izmanto signāla digitalizāciju no trokšņa ģeneratora, pamatojoties uz termiskiem, šāvienu vai pat kvantu efektiem. Trokšņa elements parasti ir īpaša diode vai zenera diode, no kuras signāls tiek pastiprināts un tiek padots uz komparatoru, kas ģenerē bināro bitu plūsmu.

Lai nodrošinātu, ka salīdzinājuma reakcijas slieksnis neietekmē saņemtā signāla statistiskās īpašības, tiek izmantoti divi trokšņu ģeneratori, kas darbojas vienā komparatorā:

Secinājums

Visbeidzot, es jums pastāstīšu vienu stāstu no savas dzīves. Tas sākās ar citu forumā uzdoto jautājumu: "Kā es varu ģenerēt nejaušu skaitli kontrolierī?" Jautājuma autors skaidroja, ka kursa projektā izgatavo iekārtu, kas līdzinās kauliņu mešanai. Pēc vairākiem neveiksmīgiem mēģinājumiem izprast algoritmus, tēmas iesācējs dalījās ar savu risinājumu: viņš vienkārši uzmeta īstu kauli 1000 reižu un aizpildīja visu kontroliera brīvo atmiņu ar iegūtajiem skaitļiem. Ģenerators lieliski izturēja visus “nejaušības” testus, ņemot vērā, ka demonstrācijas laikā tas iztērēja mazāk nekā trešdaļu savas “rezerves”.
Tāpēc arī šādam risinājumam ir tiesības uz dzīvību, it īpaši, ja skaitļu nejaušībai tiek izvirzītas ļoti stingras prasības, taču tās netiek prasītas pārāk bieži. Tā kā atmiņas cenas strauji krītas, var būt prātīgi ierīci aprīkot ar "haosa rezervi", kas kalpos visu ierīces kalpošanas laiku.
Paldies par uzmanību!

UPD1: Kā pareizi tika atzīmēts komentāros, ja ir gaidāms uzbrukums RNG un uzbrucējam ir aparatūras piekļuve ierīcei, ārējie entropijas avoti ir jāizmanto ļoti piesardzīgi, jo nav ļoti grūti nomainīt signālu no ārējais avots. Papildus ārējiem ir jāizmanto iekšējie avoti.
Ir arī laba ideja uzkrāt visu entropiju Brīvais laiks, un izmantojiet to, ja jums ir jāģenerē cits nejaušs skaitlis. Parasti šādos gadījumos t.s Entropijas baseins- masīvs, kurā periodiski tiek veikta viena no PRNG funkcijām un kurā pastāvīgi tiek sajaukti dati no entropijas avotiem.

UPD2: Daudzos gadījumos ir lietderīgi saglabāt Entropy pool saturu (atvainojiet, es nezinu parasto tulkojumu krievu valodā) EEPROM, lai pēc ierīces izslēgšanas un ieslēgšanas tas vairs neuzkrātos. Tas, pirmkārt, attiecas uz entropijas iegūšanu, izmantojot asinhrono ģeneratoru metodi: pietiekami stabilos apstākļos pēc katras ieslēgšanas var ģenerēt vienu un to pašu secību.
Ja ir gaidāms uzbrukums, veiciet piesardzības pasākumus pret EEPROM iejaukšanos. Ja kontrolieris to atļauj, bloķējiet lasīšanu/dzēšanu/rakstīšanu, izmantojot bloķēšanas bitus, un, to ieslēdzot, uzraugiet EEPROM integritāti, vismaz izmantojot vienkāršas kontrolsummas.

Tagi:

  • RNG
  • gpsch
  • mikrokontrolleri
  • algoritmi
Pievienojiet atzīmes

nejauša sēkla (sēkla)

Iestata vērtību jeb sēklu kā izlases () funkcijas sākumpunktu.

nejaušsSēkla(vērtība); // iestata 'value' kā sākotnējo nejaušības vērtību

Tā kā Arduino nevar ģenerēt patiesi nejaušus skaitļus, randomSeed ļauj nejaušības funkcijā ievietot mainīgo, konstantu vai citu funkciju, kas palīdz ģenerēt vairāk nejaušu skaitļu.

"nejaušie" skaitļi. Šajā funkcijā var izmantot daudzas dažādas sēklas vai funkcijas, tostarp millis() vai pat analogRead(), lai nolasītu elektrisko troksni caur analogo tapu.

nejauši (maks.)

nejauši (min, max)

Nejaušības funkcija ļauj atgriezt pseidogadījuma skaitli diapazonā, ko nosaka minimālās un maksimālās vērtības.

vērtība = nejaušs(100, 200); // iestata 'vērtību' uz nejaušību

// skaitlis no 100 līdz 200

Piezīme: Izmantojiet to pēc funkcijas randomSeed() izmantošanas. Nākamajā piemērā tiek izveidots nejaušs skaitlis no 0 līdz 255 un tiek izvadīts PWM

signāls PWM izejai, kas vienāds ar nejaušu vērtību:

int randNumber; // mainīgais, lai saglabātu nejaušu vērtību

int led = 10; // LED ar rezistoru uz kontakta 10

void setup() () // iestatīšana nav nepieciešama

randomSeed(millis()); // iestata millis() ar sākotnējo skaitli

randNumber = nejaušs(255); // nejaušs skaitlis no 0 līdz 255 analogWrite (led, randNumber); // izvada PWM signālu

kavēšanās (500); // pauze uz pussekundi

Avots: Gololobovs V. – Kur sākas roboti. Par Arduino projektu skolēniem (un ne tikai) – 2011.g

Saistītās ziņas

Serial.begin (rate) Atver seriālo portu un iestata sērijas datu pārsūtīšanas ātrumu. Tipiskais datu pārraides ātrums datora sakariem ir 9600, lai gan tiek atbalstīti citi ātrumi. void setup() (Serial.begin…….

Visi mainīgie ir jādeklarē, pirms tos var izmantot. Mainīgā deklarēšana nozīmē tā vērtības veida definēšanu: int, long, float utt., Unikāla nosaukuma piešķiršanu mainīgajam un papildus…….

Labi, mēs esam instalējuši šo programmu. Mēs esam atkļūdojuši “mehānismu” darbam ar moduli. Un mēs apskatījām vairākus piemērus. Bet es gribētu pats izveidot kaut ko noderīgu. Pamēģināsim. Vispirms slēgsim iepriekšējo projektu. Priekš šī…….

Uzmanību! Strādājot ar Arduino moduli citās izstrādes vidēs, jums jābūt uzmanīgiem attiecībā uz mikrokontrollera konfigurāciju (Drošinātājiem). Kamēr jūs precīzi zināt, pie kā izmaiņas varētu novest pie …….

Laiks un nejaušība. Reakcija

Šoreiz uzzināsim, kas ir “Random” vērtības, kā arī iemācīsimies strādāt ar laiku.

Mums būs nepieciešams:

  • Takts poga
  • Squeaker
  • Savienojošie vadi “MALE-MALE”

Reakcija

Mūsu šodienas uzdevums ir salikt diagrammu, kas ļauj noskaidrot mūsu reakcijas ātrumu.

Nospiežot kreiso pogu, pēc noteikta laika atskan signāls. Un, nospiežot labo pogu, tiek atzīmēts, cik daudz laika ir pagājis no čīkstēšanas līdz labās pogas nospiešanai.

Tie, kas ir prasmīgi, to izmēģina paši, un mēs skatāmies uz diagrammu.

#define BUZ 8 #define START 9 #define STOP 7 int time; //Mainīgais sinhronizācijai void setup() ( Serial. begin(9600); pinMode(START, INPUT_PULLUP); pinMode(STOP, INPUT_PULLUP); pinMode(BUZ, OUTPUT); ) void loop() ( if(digitalRead(START)) == 0) // Nospiežot pogu START ); // ģenerēsim "nejaušu" aizkaves laiku = laiks + Rand; //Pievienojiet aizkaves laika aizkavi (Rand); //Gaidīt signālu (BUZ, 3000, 500); //Pīkstiens! ) if(digitalRead( STOP) == 0 && digitalRead( START) == 1) // Nospiežot pogu STOP... ( int stop_time = millis(); // Atcerieties apstāšanās laiku. laiks = stop_time - laiks; // Aprēķiniet laika starpība. Serial.println("Laiks: "); // Izvadiet laiku uz Serial. Serial.println(time); delay(1000); ) ) // Pirms otrā mēģinājuma vēlreiz nospiediet pogu START.

Paskaidrojumi

starpt laiks; Mainīgajiem (ne visiem), tos apzīmējot, nav jāpiešķir nekāda vērtība. Mēs izmantojām šo mainīgo, lai saistītu divus if paziņojumus.

Programmā C++ cilpas ietvaros deklarētie mainīgie nebūs pieejami citās cilpās, jo tiem ir ietekme tikai šajā cilpā. Tas tiek darīts, lai novērstu programmēšanas kļūdas. Kad programmas kods pieaugs, jūs sapratīsit, par ko es runāju.

Lai mainīgais būtu pieejams vairākiem priekšrakstiem, tas ir jāpadara globāls. Tie. deklarēt mainīgo ārpus funkcijām.

millis(); Atgriež milisekundes, kas pagājušas kopš programmas palaišanas.

Mums tas ir nepieciešams, lai izmērītu laiku, kas pagājis no signāla došanas līdz pogas nospiešanai.

nejauši (min,max);Šis ir nejaušo skaitļu ģenerators. Ņem divas vērtības. Tas ģenerē skaitli diapazonā no min līdz maks.

"Nejauši" skaitļi, jo tie ir noteikta vērtību secība. Ļoti garš, bet tas pats. Lai iegūtu dažādas secības, jums vajadzētu izmantot NejaušiSēkla();

Šī funkcija inicializē ģeneratoru. Un, ja mēs iestatīsim parametru uz nejaušību, mēs iegūsim vajadzīgās secības. Secība būs tāda pati, ja parametrs ir fiksēts.

Secinājums

Tagad jūs varat trenēt savu reakciju, izmantojot ierīci, kuru esat izveidojis pats. Vai arī varat turpināt mācīties tālāk.

Radioelementu saraksts

Apzīmējums Tips Denominācija Daudzums PiezīmeVeikalsMans piezīmju bloks
Arduino dēlis

Arduino Uno

1 Uz piezīmju grāmatiņu
Maizes dēlisMaizes dēlis-puse1 Uz piezīmju grāmatiņu
Pjezo izstarotājsPasīvs1 Uz piezīmju grāmatiņu
Takts pogaBez slēdzenes2 Uz piezīmju grāmatiņu
Savienojošie vadi"Papa-papa"1



Tops