Arduino-да кездейсоқ сандар генераторын пайдалану: Random және RandomSeed функциялары. Arduino курсы - Кездейсоқ бит тізбегін генерациялайтын уақыт және кездейсоқ Arduino

Arduino-ны бағдарламалау кезінде эскизді жазатын бағдарламашыға да, Arduino-ны осындай бағдарламамен қолданатын пайдаланушыға да алдын ала белгілі болмайтын санды алу қажет болатын жағдайлар болады. Бұл жағдайда кездейсоқ (дәлірек айтқанда псевдокездейсоқ) сандар генераторы көмекке келеді.



Бұл генераторды белсендіру үшін random() немесе randomSeed() функцияларын пайдаланыңыз. Бұл материал сізге осы функциялармен қалай жұмыс істеу керектігін, сондай-ақ сандарды генерациялау кезінде жалған кездейсоқтықтан қалай арылуға болатынын көрсетеді.


Жалпы, жалған кездейсоқ сандар генераторы сандардың ретсіз немесе кездейсоқ көрінісін имитациялайды, бірақ шын мәнінде, егер сіз осы сандардың қатарын жеткілікті ұзақ уақыт бойы талдасаңыз, белгілі бір заңдылықты байқай аласыз.


Сонымен, псевдокездейсоқ сандарды құруға арналған кездейсоқ функция екі параметрге дейін болуы мүмкін және кездейсоқ (макс) немесе кездейсоқ (min, max) түрінде жазылады. Мұнда міндетті болып табылатын max параметрі жалған кездейсоқ сандарды генерациялау ауқымының жоғарғы шегін белгілейді. Көмегімен қосымша параметрмин диапазонның төменгі шегін орнатуға болады. Нәтижесінде, функция min мен max-1 аралығындағы кейбір псевдокездейсоқ санды қайтарады.


Random() функциясын пайдаланған кезде псевдокездейсоқ сандардың дәл сол тізімі әр жолы құрылатынын түсіну маңызды. Мысалы, егер сіз ойын автоматын жасасаңыз және тұтқаны бірінші рет басқан болсаңыз, ол ұтымды комбинацияны көрсетеді, содан кейін Arduino-ны қалпына келтіріп, тұтқаны қайтадан бассаңыз, бұл ойын автоматы бірдей ұтыстың комбинациясын көрсететініне сенімді бола аласыз. . Шынында да, Arduino-да толық кездейсоқ сандар генерациясы бар ойын машинасын енгізу оңай емес, мысалы, www.igrovye-apparati-vulcan.com/ ойын машиналарында енгізілген, бірақ сіз randomSeed көмегімен мәселені ішінара шеше аласыз. () функциясы.


Бұл функция мәнді (бүтін сан сияқты) қабылдайды және санды random() функциясы арқылы жасалған кездейсоқ тізімді өзгерту үшін пайдаланады.Орнату функциясына randomSeed() қоюға болады және random() функциясын шексіздікте пайдалануға болады. цикл. Бірақ сонда да, кездейсоқ сандар тізбегі randomSeed() функциясын пайдаланған кезде әртүрлі болса да, эскиз іске қосылған сайын бірдей болады.


Бұл жағдайда жалғыз шешім аналогтық перифериялық құрылғыларды (ADC) және сәйкес analogRead() функциясын пайдалану болуы мүмкін. Егер аналогтық кіріс ештеңеге қосылмаған болса, яғни ауада «ілулі» қалса, онда осы желідегі шудың арқасында сіз шынымен кездейсоқ сандарды ала аласыз. Содан кейін орнату параметрінде randomSeed(analogRead(A0)) жазуға болады. Аналогтық A0 порты еш жерде қосылмаған жағдайда.

Кездейсоқ сандар генераторлары туралы көп жазылған, бірақ іске асыруға келгенде әрдайым дерлік бұл болжанады (немесе анық айтылған) туралы айтып отырмыз x86/x64 және басқа «ересек» архитектуралар туралы. Сонымен қатар, микроконтроллерлерде құрылғыларды жасауға арналған форумдар «%controllername% бойынша кездейсоқ санды қалай жасауға болады?» Деген сұрақтарға толы. Сонымен қатар, жауаптар ауқымы «Google/Уикипедияға қараудан» «стандартты функцияны пайдалануға» дейін созылады. Бұл «стандартты функция» әрқашан бола бермейді және әзірлеушіге барлық жағынан сәйкес келеді; көбінесе бұл керісінше: кейде сандар кездейсоқ емес, кейде жұмыс жылдамдығы тым төмен немесе кейде алынған код сәйкес келмейді. мүлдем бос жадқа.
Кездейсоқ сандарды генерациялау алгоритмдері деген не екенін, дұрысын қалай таңдауға болатынын және ең бастысы осы алгоритмдерді контроллерлерде енгізудің қандай ерекшеліктері бар екенін анықтауға тырысайық.

«кездейсоқтықты» бағалау

RNG қолданбалары ойыншықтардан маңызды криптографияға дейін өте әртүрлі болуы мүмкін. Сәйкесінше, генераторға қойылатын талаптар да айтарлықтай өзгереді. Генератордың сапасын («кездейсоқтық» деңгейі) бағалау үшін арнайы сынақтар бар. Міне, олардың ең негізгілері:
  • Жиілік сынағы. Биттер тізбегіндегі нөлдер мен бірліктердің санын санаудан тұрады. Бірліктер мен нөлдердің шамамен бірдей сандары болуы керек.
  • Бірдей биттердің тізбегін сынау. 000...0 немесе 111...1 сияқты бірдей биттердің жолдары ізделеді. Қатар пайда болатын жиіліктердің таралуы олардың ұзындығына байланысты шын кездейсоқ сигнал үшін осы үлестірімге сәйкес келуі керек.
  • Спектрлік сынақ. Дискретті Фурье түрлендіруі бастапқы реттілікке қолданылады. Алынған спектрде дәйектіліктің периодтық қасиеттерінің болуын көрсететін маңызды шыңдар болмауы керек.
  • Автокорреляция тесті. Бір-біріне қатысты жылжытылған дәйекті көшірмелер арасындағы корреляция мәні есептеледі. Тест қайталанатын аймақтарды ретімен табуға мүмкіндік береді.
Ондаған ұқсас сынақтарды қамтитын арнайы жинақтар бар:
NIST – шифрлау алгоритмдерін бағалау үшін AES конкурсында қолданылады.
DIEHARD - өмірдегі ең қатаң жинақтардың бірі.

PRNG алгоритмдері

Қатаң анықталған алгоритм бойынша жасалған кез келген тізбекті шын мәнінде кездейсоқ деп санауға болмайды, сондықтан алгоритмдік генераторлар туралы айтқанда, олар терминді пайдаланады. жалған кездейсоқкейінгі реттілік. Кез келген псевдокездейсоқ сандар генераторы (PRNG) ерте ме, кеш пе циклге кіреді, басқа нәрсе - бұл «кеш» бірнеше миллисекундта немесе бірнеше жылдан кейін келуі мүмкін. Циклдің ұзақтығы генератордың N ішкі күйінің өлшеміне байланысты (шын мәнінде бұл генераторға қажет жад көлемі) және 2 (N/2) мен 2 Н бит аралығында болады.
PRNG алгоритмдерінің алуан түрлілігі ойлап табылды, бірақ олардың барлығы микроконтроллерлерде іске асыруға ыңғайлы емес. Бізде жылдамдық пен қолжетімді жад өте шектеулі; көптеген контроллерлер нақты арифметикалық немесе тіпті көбейту нұсқауларын қолдамайды. Осы шектеулерді есте сақтай отырып, кейбір белгілі алгоритмдерді қарастырайық.
Сызықтық конгруенттік әдіс
Формула арқылы тізбектің келесі мүшесі есептеледі
X i+1 = (aX i + c) мод m
Сан мқатардың максималды периодын, бүтін сандарды анықтайды аЖәне в- «сиқырлы» коэффициенттер. Сан мЕкінің дәрежесіне тең таңдау орынды; бұл жағдайда модульді түрлендіру операциясы ең маңызды биттерді алып тастауға дейін азаяды. Максималды мерзімді алу үшін келесі шарттарды орындау қажет:
- вжәне m салыстырмалы жай болуы керек,
- a-1еселік болуы керек ббарлық негізгі факторлар үшін бсандар м,
- Егер м 4-ке еселік (және біздің жағдайда ол еселік болады), онда a-1 4-ке еселік болуы керек.
Тағы бір нәзіктік бар: нәтиже ретінде X күйінің айнымалысының ең маңызды биттерін ғана алу керек, өйткені ең төменгі биттер үшін кездейсоқтықтың статистикалық параметрлері әлдеқайда нашар. Сызықтық конгруенттік алгоритм әдетте көптеген кітапханаларда стандартты rand() ретінде жүзеге асырылады.

Артықшылықтары:

  • күй айнымалысының берілген өлшемі үшін мүмкін болатын максималды кезең;
  • жеткілікті жылдам;
  • жиі компиляторлар кітапханасында енгізілген.
Минустары:
  • көбейту операциясы қажет;
  • барлық бит бірдей кездейсоқ емес.
Түйіндеме:аса қажет емес қолданбаларға арналған жылдам және қарапайым алгоритм.
Фибоначчи лагтары бар әдіс
Бұл алгоритм қатынасты пайдаланады
X i = X i-a - X i-b ,
күй айнымалысы қайда X- таңбасыз бүтін сан. Кешіктіру мәндері аЖәне бкез келгені ғана емес, қатаң анықталғандары алынады, максималды сапаға жету үшін (17,5), (55,24) немесе (97,33) жұптары ұсынылады. Кідіріс неғұрлым көп болса, соғұрлым период ұзағырақ және тізбектің спектрлік қасиеттері жақсырақ болады. Екінші жағынан, генератордың жұмыс істеуі үшін алдыңғы сандардың max(a,b) мәнін сақтау қажет, бұл әрқашан қолайлы емес. Сондай-ақ, генераторды іске қосу үшін сізге әдетте қарапайым PRNG көмегімен алынатын max(a,b) сандар қажет.

Артықшылықтары:

  • көбейту амалдарын қажет етпейді;
  • Кездейсоқ санның барлық биттері статистикалық қасиеттері бойынша эквивалентті.
Минустары:
  • жадтың үлкен көлемін қажет етеді;
  • іске қосу үшін сандардың үлкен массивін қажет етеді.
Түйіндеме:өте жоғары сапалы, бірақ ресурстарды көп қажет ететін алгоритм.
Сызықтық кері байланысты ауыстыру тіркелімі


Күй айнымалысы ұзындығы N регистрінде сақталады. Келесі күйді құру екі қадамды қамтиды:
  1. Бит мәні есептеледі C = X i1 xor X i2 xor… X ik, мұндағы i1, i2…ik- регистрлік бит сандары, шақырылады майыстырады.
  2. Регистр 1 бит оңға жылжиды, ең сол жақ бит мәнді қабылдайды МЕН.
Генератордың шығысы регистрдің ең оң жақ (немесе сол жағындағы немесе кез келген) биті болып табылады, яғни жалған кездейсоқ реттілік әр итерацияда бір бит жасалады. Дұрыс таңдалған кран нөмірлерімен генератордың периоды 2 N - 1 болады. «Минус бір», өйткені регистрдің тыйым салынған нөлдік күйі бар. үшін филиал нөмірлері НБұл құжатта 3-тен 168-ге дейін табуға болады.
Айтпақшы, Фибоначчи конфигурациясы деп аталатын жоғарыда сипатталған конфигурациядан басқа (бір аттас PRNG әдісімен шатастырмау керек!), деп аталатындар бар. Галуа конфигурациясы.


Жаңа сол жақ бит жасау үшін түрту тізбегіндегі биттердің қосындысын пайдаланудың орнына, ол ең оң жақ битпен түрту тізбегіндегі әрбір битті XOR жасайды, содан кейін бүкіл регистрді оңға бұрады. Бұл схеманы түсіну қиынырақ, бірақ орындау оңай, өйткені барлық XOR операцияларын бір уақытта орындауға болады. Период ұзақтығы мен жалған кездейсоқ сандардың сапасы бойынша Фибоначчи және Галуа схемалары баламалы.

Артықшылықтары:

  • өте қарапайым іске асыру, тіпті арифметиканы қажет етпейді, тек разрядтық операциялар мен жылжулар;
  • өте жылдам алгоритм (әсіресе Галуа схемасы);
  • жақсы статистикалық қасиеттер.
Минустары:
  • нөлге теңсіздік үшін бастапқы мәнді тексеру керек.
Түйіндеме:өте жылдам және өте жоғары сапалы алгоритм.
Криптоқорғау алгоритмдері
Криптографияда пайдалану үшін PRNGs тағы бір маңызды талапқа ие: қайтымсыздық. Жоғарыда аталған алгоритмдердің барлығында мұндай қасиет жоқ: PRNG бірнеше шығыс мәндерін біле отырып, қарапайым теңдеулер жүйесін шешу арқылы алгоритмнің параметрлерін таба аласыз (бірдей «сиқырлы» тұрақтылар a, b, cжәне т.б). Параметрлерді біле отырып, сіз псевдокездейсоқ тізбектің барлығын ойната аласыз.
Кез келген жеткілікті күшті блоктық шифр криптографиялық күшті PRNG алгоритмі ретінде пайдаланылуы мүмкін. Құпия кілтті таңдау арқылы алгоритмді реттік натурал сандарға қолдану арқылы жалған кездейсоқ сандар блоктарын алуға болады. N-биттік блоктық шифр үшін период 2 Н-ден аспайды. Мұндай схеманың қауіпсіздігі толығымен кілттің құпиялылығына байланысты.
Барлық заманауи криптографиялық алгоритмдер PRNG ретінде пайдалану үшін сыналған, яғни сертификатталған алгоритмді пайдалана отырып, шығыс ағынының статистикалық және спектрлік қасиеттеріне ерекше көңіл бөлудің қажеті жоқ. Сізге тек криптографиялық алгоритмдердің есептеу «ашкөздігі» туралы алаңдау керек. Егер сізге шифрлау операцияларының үлкен санын орындау қажет болса, аппараттық криптографиялық блоктары бар контроллерді таңдау мағынасы бар. Көбінесе мұндай контроллерлерде өте жақсы крипто-төзімді аппараттық PRNG бар.

Энтропияның қайнар көздері

Жоғарыда айтылғандай, тек детерминирленген алгоритмдерді қолдана отырып, шынымен кездейсоқ санды құру мүмкін емес. Сондықтан әдетте PRNG + сыртқы комбинациясы қолданылады энтропияның көзі. Энтропия көзі PRNG үшін бастапқы мәнді орнату үшін пайдаланылады, ал соңғысының міндеті - тізбектің спектрлік және статистикалық тазалығын қамтамасыз ету. Энтропияның көзі ретінде нені қолдануға болады? Иә, барлығы дерлік.
Пайдаланушы әрекеті
Егер құрылғы пайдаланушымен қандай да бір жолмен әрекеттессе, пайдаланушының өзін энтропия көзі ретінде пайдалану өте жақсы шешім болар еді. Мысалы, микросекундтық дәлдікпен өлшенетін түймені басу уақыты (дәлірек айтқанда, оның ең аз маңызды сандары) мүлдем болжау мүмкін емес. Дегенмен, көбінесе құрылғы автономды түрде жұмыс істеуі керек, бұл біз осы тамаша ақпарат арнасынан айырылғанымызды білдіреді.
Аналогты-сандық түрлендіргіш
Көптеген контроллерлерде кірістірілген ADC бар. Көптеген контроллерлерде олар өте орташа сапаға ие, «болу үшін» жасалған. ADC нәтижесінің төменгі ретті биттері тұрақты кернеуді өлшегенде де әрқашан дерлік маңызды шуды қамтиды. Мұны қолдануға болады: ADC кірісін бөлгіш арқылы қоректендіру кернеуіне қосыңыз, бірнеше ондаған өлшемдерді алыңыз, ең аз маңызды биттерді алыңыз - мұнда сізде керемет кездейсоқ сан бар. Егер ADC кірістірілген алдын ала күшейткіш болса, оны қосыңыз, ол да шулы.
Асинхронды генераторлар
Синхрондалмаған екі сағат генераторының кезеңдерінің айырмашылығын пайдалануға болады. Көптеген контроллерлерде, мысалы, күзетші таймері бар. Сенімділікті жоғарылату үшін ол негізгі тактілік сигналмен ешқандай байланысы жоқ жеке генератордан тактіленеді. Бақылау таймерінің бір кезеңінде негізгі тактілік сигналдың цикл санын санау жеткілікті. Өлшеу кезінде санауыш бірнеше рет толып кететіндей кезеңдерді таңдасаңыз, жеткілікті кездейсоқ санды алуға болады. Бұл әдістің кемшілігі - бұл көп уақытты алады, бірнеше секундқа дейін.
Нақты уақыт сағаты
Егер диаграмма бар болса нақты уақыт сағаты, PRNG баптандыру үшін олардың ағымдағы көрсеткіштерін пайдалануға болады. Мысалы, ағымдағы күнді/уақытты Unix уақыт пішіміне түрлендіру арқылы біз бірден 32 бит аламыз, ол ешқашансекундына бір реттен артық көрсеткіштерді алмасаңыз, қайталанбайды. Нақты уақытты пайдалану құндылықтардың бірегейлігін береді, бірақ ешқандай болжауды қамтамасыз етпейді, сондықтан біріктіру жақсы бұл әдісбасқалармен.
RC тізбегі
Егер контроллерде жоқ болса перифериялық құрылғылар, енгізу/шығару порттарынан басқа келесі әрекеттерді орындауға болады: аяқтардың бірі конденсатор арқылы жерге, ал резистор арқылы қоректену кернеуіне қосылады. Контроллердің кірістерінде ішкі тартылатын резисторлар болса, сыртқы резистор қажет емес.

Біз бұл портқа «0» сигналын шығарамыз - конденсатор разрядталады. Біз портты кіріс режиміне ауыстырамыз - конденсатор зарядтала бастайды. Ондағы кернеу шекті мәнге жеткенде кіріс «0» күйінен «1» күйіне ауысады. Зарядтау уақыты көптеген факторларға қатты байланысты: қоректену кернеуі, RC тізбегінің параметрлерінің дрейфі, шекті тұрақсыздық, температура, ағып кету, кедергі. Оны жеткілікті дәлдікпен өлшеу және ең аз маңызды биттерді алу арқылы сіз жақсы кездейсоқтыққа қол жеткізе аласыз.
Аппараттық шу генераторы
Көптеген маңызды қолданбалар үшін (ең алдымен криптография) жоғарыда аталғандардан гөрі сенімдірек энтропия көзі қажет. Мұндай жағдайларда олар термиялық, ату немесе тіпті кванттық әсерлерге негізделген шу генераторынан сигналды цифрлауды пайдаланады. Шу элементі әдетте арнайы диод немесе стабилитрон болып табылады, одан сигнал күшейтіледі және екілік разрядты генерациялайтын компараторға беріледі.

Салыстырғыштың жауап табалдырығы қабылданған сигналдың статистикалық қасиеттеріне әсер етпеуін қамтамасыз ету үшін бір компараторда жұмыс істейтін екі шу генераторы қолданылады:

Қорытынды

Соңында мен өз өмірімнен бір оқиғаны айтып берейін. Бұл форумда қойылған тағы бір сұрақтан басталды: «контроллерде кездейсоқ санды қалай жасауға болады?» Сұрақ авторы курстық жоба ретінде сүйек лақтыруды эмуляциялайтын құрылғы жасап жатқанын түсіндірді. Алгоритмдерді түсінуге бірнеше сәтсіз әрекеттерден кейін тақырыпты бастаушы өз шешімімен бөлісті: ол жай ғана нақты матрицаны 1000 рет айналдырып, контроллердің барлық бос жадын алынған сандармен толтырды. Демонстрация кезінде ол өзінің «резервінің» үштен бірінен азын пайдаланғанын ескере отырып, генератор барлық «кездейсоқтық» сынақтарынан керемет өтті.
Сондықтан мұндай шешімнің өмір сүруге құқығы бар, әсіресе сандардың кездейсоқтығына өте қатаң талаптар қойылса, бірақ олар жиі талап етілмейді. Жад бағасының күрт төмендеуі кезінде құрылғыны құрылғының бүкіл қызмет ету мерзіміне созылатын «хаос резервімен» жабдықтау ақылды болуы мүмкін.
Назар аударғаныңызға рақмет!

UPD1:Түсініктемелерде дұрыс айтылғандай, егер RNG-ге шабуыл күтілсе және шабуылдаушы құрылғыға аппараттық қол жетімділікке ие болса, энтропияның сыртқы көздерін өте сақтықпен пайдалану керек, өйткені сигналды ауыстыру өте қиын емес. сыртқы көз. Сыртқы көздерден басқа, ішкі көздерді пайдалану керек.
Сондай-ақ барлық энтропияны жинақтау жақсы идея бос уақыт, және оны басқа кездейсоқ санды жасау қажет болғанда пайдаланыңыз. Әдетте мұндай жағдайларда деп аталады Энтропия пулы- PRNG функцияларының бірі мезгіл-мезгіл орындалатын және энтропия көздерінен алынған деректер үнемі араласатын массив.

UPD2:Көптеген жағдайларда құрылғыны өшіріп, қосқаннан кейін ол қайтадан жиналмауы үшін Энтропия пулының мазмұнын (кешіріңіз, мен қалыпты орысша аудармасын білмеймін) EEPROM-да сақтау пайдалы. Бұл, ең алдымен, асинхронды генераторлар әдісін қолдану арқылы энтропияны алуға қатысты: жеткілікті тұрақты жағдайларда әрбір қосылғаннан кейін бірдей реттілік тудырылуы мүмкін.
Егер шабуыл күтілсе, EEPROM-ды бұзуға қарсы сақтық шараларын қолданыңыз. Егер контроллер рұқсат етсе, құлыптау биттерін пайдаланып оқуды/өшіруді/жазуды блоктаңыз және оны қосқан кезде, кем дегенде қарапайым бақылау сомасын пайдаланып, EEPROM тұтастығын бақылаңыз.

Тегтер:

  • RNG
  • gpsch
  • микроконтроллерлер
  • алгоритмдер
Тегтерді қосыңыз

кездейсоқ тұқым (тұқым)

random() функциясының бастапқы нүктесі ретінде мәнді немесе тұқымды орнатады.

randomSeed(мән); // бастапқы кездейсоқ мән ретінде «мәнді» орнатады

Arduino шынымен кездейсоқ сандарды жасай алмайтындықтан, randomSeed кездейсоқ функцияға айнымалы, тұрақты немесе басқа функцияны қоюға мүмкіндік береді, бұл көбірек кездейсоқ сандарды жасауға көмектеседі.

«кездейсоқ» сандар. Бұл функцияда қолдануға болатын көптеген әртүрлі тұқымдар немесе функциялар бар, соның ішінде millis() немесе тіпті аналогтық түйреуіш арқылы электрлік шуды оқу үшін analogRead().

кездейсоқ (макс)

кездейсоқ (мин, макс)

Кездейсоқ функция min және max мәндерімен көрсетілген диапазондағы жалған кездейсоқ санды қайтаруға мүмкіндік береді.

мән = кездейсоқ (100, 200); // 'мәнді' кездейсоқ мәнге орнатады

// 100 мен 200 арасындағы сан

Ескерту:Мұны randomSeed() функциясын пайдаланғаннан кейін пайдаланыңыз. Келесі мысал 0 мен 255 арасындағы кездейсоқ санды жасайды және PWM шығарады

кездейсоқ мәнге тең PWM шығысына сигнал:

int randNumber; // кездейсоқ мәнді сақтау үшін айнымалы

int led = 10; // 10 істікшеде резисторы бар жарық диоды

void setup() () // орнату қажет емес

randomSeed(millis()); // бастапқы санмен millis() орнатады

randNumber = кездейсоқ(255); // кездейсоқ сан 0 – 255 analogWrite (led, randNumber); // шығыс PWM сигналы

кешіктіру(500); // жарты секундқа үзіліс

Дереккөз: Гололобов В. – Роботтар неден басталады. Мектеп оқушыларына арналған Arduino жобасы туралы (тек қана емес) – 2011 ж

Қатысты хабарламалар

Serial.begin (rate) Сериялық портты ашады және деректерді сериялық тасымалдау жылдамдығын орнатады. Басқа жылдамдықтарға қолдау көрсетілгенімен, компьютерлік байланыс үшін әдеттегі жіберу жылдамдығы 9600 құрайды. void setup() (Serial.begin…….

Барлық айнымалылар пайдаланбас бұрын жариялануы керек. Айнымалыны жариялау оның мәнінің түрін анықтауды білдіреді: int, long, float және т.б., айнымалыға бірегей атау беру және қосымша …….

Жарайды, біз бұл бағдарламаны орнаттық. Біз модульмен жұмыс істеу «механизмін» түзеттік. Және біз бірнеше мысалдарды қарастырдық. Бірақ мен өзіме пайдалы нәрсе жасағым келеді. Тырысып көрейік. Алдымен алдыңғы жобаны жабамыз. Осыған…….

Назар аударыңыз! Arduino модулімен басқа әзірлеу орталарында жұмыс істегенде, микроконтроллердің конфигурациясына (Сақтандырғыштар) абай болу керек. Өзгерістің неге әкелуі мүмкін екенін нақты білмейінше……

Уақыт және кездейсоқтық. Реакция

Бұл жолы біз «кездейсоқ» құндылықтардың не екенін, сонымен қатар уақытпен жұмыс істеуді үйренеміз.

Бізге қажет болады:

  • Әдептілік түймесі
  • Шықырғыш
  • «MALE-MALE» сымдарын қосу

Реакция

Біздің бүгінгі міндетіміз - реакция жылдамдығын білуге ​​мүмкіндік беретін диаграмманы құрастыру.

Сол жақ түймені басқан кезде сигнал «кездейсоқ» уақыттан кейін естіледі. Ал оң жақ түймені басқан кезде сықырлаудан оң жақ түймені басқанға дейін қанша уақыт өткені белгіленеді.

Біліктілер өздері сынап көреді, біз диаграммаға қараймыз.

#define BUZ 8 #define START 9 #STOP 7 инт уақытын анықтау; //Синхрондау үшін айнымалы void setup() ( Serial. begin(9600); pinMode(START, INPUT_PULLUP); pinMode(STOP, INPUT_PULLUP); pinMode(BUZ, OUTPUT); ) void loop() ( if(digitalRead(START)) == 0) // START түймесін басқан кезде.. ( int start_time = millis(); // Басу уақытын есте сақтаңыз time = start_time; // Оны ғаламдық айнымалыға жазыңыз. int Rand = random(0, 4000) ); // "кездейсоқ" кідіріс уақытын жасайық = уақыт + Rand; //Кідіріс уақытының кідірісін қосыңыз(Rand); //Тонды күтіңіз(BUZ, 3000, 500); //Бип! ) if(digitalRead() STOP) == 0 && digitalRead( START) == 1) // ТОҚТАТУ түймесін басқан кезде... ( int stop_time = millis(); // Тоқтау уақытын есте сақтаңыз. time = stop_time - time; // Есептеңіз уақыт айырмашылығы. Serial.println("Уақыт: "); // Уақытты серияға шығарыңыз. Serial.println(time); delay(1000); ) ) // Екінші әрекеттен бұрын START түймесін қайта басыңыз.

Түсініктемелер

int уақыт; Айнымалыларға (барлығы емес), оларды белгілегенде ешқандай мән берудің қажеті жоқ. Біз бұл айнымалыны екі if операторын байланыстыру үшін қолдандық.

C++ тілінде цикл ішінде жарияланған айнымалылар басқа циклдерде қол жетімді болмайды, өйткені олар тек осы цикл ішінде әсер етеді. Бұл бағдарламалау қателерін болдырмау үшін жасалады. Бағдарлама коды өскенде, сіз менің не туралы айтып тұрғанымды түсінесіз.

Айнымалы мәнді бірнеше мәлімдемелер үшін қолжетімді ету үшін оны жаһандық ету керек. Анау. функциялардан тыс айнымалыны жариялау.

millis();Бағдарлама іске қосылғаннан бері өткен миллисекундтар санын қайтарады.

Бұл бізге берілген сигналдан басылған түймеге дейін өткен уақытты өлшеу үшін қажет.

кездейсоқ(мин,макс);Бұл кездейсоқ сандар генераторы. Екі мәнді қабылдайды. Ол мин мен максимум аралығындағы санды жасайды.

«Кездейсоқ» сандар, өйткені олар мәндердің белгілі бір тізбегі. Өте ұзақ, бірақ бірдей. Әртүрлі реттіліктерді алу үшін пайдалану керек КездейсоқSeed();

Бұл функция генераторды инициализациялайды. Ал егер біз параметрді кездейсоқ деп қойсақ, онда біз қажетті реттіліктерді аламыз. Параметр бекітілген болса, реттілік бірдей болады.

Қорытынды

Енді сіз өзіңіз жасаған құрылғы арқылы реакцияңызды жаттықтыра аласыз. Немесе одан әрі оқуды жалғастыра аласыз.

Радиоэлементтердің тізімі

Белгі Түр Номиналы Саны ЕскертуДүкенМенің блокнотым
Arduino тақтасы

Arduino Uno

1 Блокнотқа
Нан тақтасыНан тақтасы - жартысы1 Блокнотқа
Пьезо эмитентПассивті1 Блокнотқа
Әдептілік түймесіҚұлыпсыз2 Блокнотқа
Жалғау сымдары«Папа-папа»1



Жоғарғы