Генератор випадкових чисел без програмування і навіть комп'ютера: чим здивувати юного програміста?

Зараз, коли Arduino продовжує тріумфальний хід по планеті, навряд чи когось здивуєш схемами на макетній платі. Білі беспаечные макетні плати вже стали обов'язковим елементом наборів для гиків. І все-таки я вирішила спробувати зацікавити юних програмістів з літньої школи GoToCamp: провести для них майстер-клас з основ цифрової схемотехніки, закінчується складанням цікавого пристрою – генератора випадкових чисел.

При натисканні на кнопку, на індикаторі висвічується випадкове число. В чому ж тут випадковість, звідки вона береться? Відразу розкрию секрет. Цифри генеруються по порядку: 0, потім 1, 2, і так далі. Хитрість ось у чому: дуже висока частота імпульсів. Вони видаються так швидко, що цифри зливаються в одну на індикаторі. І абсолютно неможливо вгадати цифру!
Далі ви прочитаєте про те, як влаштований такий генератор, і як зібрати його самостійно.

Передісторія
Я працюю методистом у Центрі інноваційних освітніх технологій (ЦИОТ) МФТІ, а більш конкретноуявляю напрямок підтримки розвитку технічної творчості. А також беру участь у розробці продуктів компанії «Киберфизика».

На даний момент у нас активно розвиваються два курси: основи електроніки та програмування на Arduino. По кожному курсу ми робимо відеоматеріали, пишемо методичні рекомендації, збираємо готові набори. Курс за Arduino вже досить добре опрацьований: за нього готовий чудовий онлайн-курс, який нещодавно отримав нагороду EdCrunch OOC Award в номінації «Природничі та технічні науки».

Але напрямок з основ електроніки має великі перспективи: воно не настільки відоме і популярне, як Arduino, а значить, є великий простір для методичної роботи. У дружній нам школі GoToCamp, наприклад, Arduino є вже давно, а ось «чистої» електронікою ніхто не займався. Мене запросили провести у хлопців-старшокласників невеликий майстер-клас. Варто відзначити, що хлопці вже до того моменту займалися Arduino, а отже, розраховувати на вау-ефект від миготливого світлодіода не коштувало. Тому я як слід продумала програму майстер-класу, про результат напишу далі.


Фото про сам табір і моє захід опублікований на сайті «Цікава робототехніка», а в цьому матеріалі хотілося б трохи розкрити технічні подробиці.
Збирали схеми з привезених мною з собою наборів «Киберфизики»:

Як влаштований «залізний» генератор випадкових чисел
Ось схема генератора випадкових чисел, яку я запропонувала зібрати (кликабельно):

Виглядає складно? Насправді, вона близька серцю будь-якого програміста. Адже вона зроблена з чотирьох окремих елементів – як програма з чотирьох функцій. Далі компоненти просто стикуються між собою: вихід одного елемента перенаправляється на вхід наступного.


Хто любить програмувати в Linux, напевно пригадає концепцію pipe – таких «труб», які позначаються рискою «|» і дозволяють з багатьох маленьких програм (навіть написаних на різних мовах програмування) швидко скласти працює скрипт. Особисто я ці «труби» просто обожнюю і часто використовую. Відчуваєш себе водопровідником Mario
Тепер розглянемо докладніше елементи цієї схеми

Генератор імпульсів
В якості генератора імпульсів виступає популярний таймер 555. На виході таймер видає серію імпульсів, яка буде «підштовхувати» лічильник і змушувати його додавати значення.
Внутрішнє пристрій мікросхеми таймера не дуже просто пояснити новачкові. Але зате цю мікросхему дуже зручно використовувати так, як люблять програмісти – в режимі «чорного ящика». Висновки таймера 555:

На цьому малюнку висновки живлення позначені червоним, входи – зеленим, виходи – синім. Мені сподобався такий спосіб зображення цокольовка мікросхем, я взяла його з англомовної Вікіпедії.
А ось як ця мікросхема використовується в конкретно нашій схемі. Нічого складного – абсолютно стандартним чином, за типовою схемою
Режим роботи таймера визначається трьома елементами: резисторами R1 і R2 і конденсатором C1.


Просто підставивши в цю формулу значення (або скориставшись онлайн-калькулятором, якщо лінь рахувати), отримуємо частоту 40 Гц – тобто 40 коливань в секунду. Відповідно, період буде 25 мілісекунд, і таку часту зміну цифри на індикаторі людське око ніколи не помітить.
Четвертий висновок відповідає за скидання і працює в інверсному режимі: щоб відбулося скидання, потрібно замкнути його на «мінус». Тому через підтягуючий резистор він з'єднаний з «плюсом» харчування, а через кнопку з «мінусом». Поки що утримуємо кнопку «скидання», таймер стоїть на місці і не видає нічого – в цей час можна помилуватися на цифру на індикаторі.

Лічильник
Лічильник – це дуже проста штука, практично як змінна i в програмуванні. Лічильник накопичує в собі число, от і все. А інкремент лічильника відбувається за зовнішнім імпульсу. Можна зробити по натисненню кнопки, а можна, як в нашому випадку, від таймера.
Мікросхема лічильника влаштована так:

  • Цифра виводиться як двійкове число на виходах Q1...Q4
  • За сигналом на 15-му виведенні («Тактовий сигнал») лічильник додає одиницю
  • У десятковому режимі після цифри 9 лічильник скидається і починає знову з 0
У нашій схемі лічильник теж під'єднується досить просто:
  • Вхід U/D (напрям рахунку) підключений до «плюса» харчування, щоб рахунок йшов по висхідній.
  • Висновки PE (дозвіл предустановки), J1...J4 (входи даних для налаштування лічильника), B/D (двійковий режим рахунку), CI і CO (вхід і вихід переносу) всі підключені до «землі», так як їх функціонал в даній схемі нам не потрібен
Дешифратор
Якщо проводити знову аналогію з програмуванням, то дешифратор – це бібліотечна функція, яка двійковому числу ставить у відповідність набір світяться сегментів на об'єкті типу «стандартний семисегментний індикатор». Бувають деякі гіки, які самі це все прописують через мікроконтролер – я бачила приклади і на Arduino, і на «чистих» ATMega. Не робіть так! Є ж спеціальна зручна мікросхема для цього!



Тут найважливіше – це входи для двійкового числа (A, B, C, D) і виходи («a»… «f»), які безпосередньо підключаються до відповідних сегментах, які точно так само промарковані літерами.Службові входи:
  • вхід для тестування індикатора (LT) і для його гасіння (Bl) заведені на «плюс»
  • вхід для «заморожування» цифри (LE) – на «мінус».
Семисегментний індикатор
Тут все зовсім просто. Використовується семисегментний індикатор з загальним катодом. Кожен з світлодіодів підключається через струмообмежуючий резистор. Буває, що деякі намагаються заощадити на резисторах і підключити семисегментник через лише один резистор – на цей випадок у документації на індикатор є спеціальна картинка:
Зліва – «підключення здорової людини». Кожен світлодіод через резистор. Праворуч – «підключення курця», тільки один резистор на всіх. Недотримання цього правила призводить до того, що деякі світлодіоди забирають собі більше струму, ніж інші, і з-за цього сегменти світяться нерівномірно.

Монтажна схема генератора випадкових чисел
От і все! Тепер, для тих, хто хоче сам зібрати таку схему:



І список компонентів до неї:
  1. Мікросхема таймера NE555
  2. Мікросхема лічильника CD 4029
  3. Мікросхема дешифратора CD 4511
  4. Тактова кнопка
  5. Семисегментний індикатор з загальним катодом (наприклад, Kingbright SC56-11SRWA)
  6. Електролітичний конденсатор 10 мкФ, робочою напругою не менше 25
  7. Резистор 1,2 кОм: 3 шт.
  8. Резистор 560 Ом: 7 шт
  9. Перемички
  10. Беспаечная макетна плата
  11. Батарейка (в нашому випадку, 9 вольт, але схема працює і в більш широкому діапазоні — від 5 до 12 вольт, потрібно лише підкоригувати номінали резисторів)
  12. Роз'єм для підключення батареї
Схема в зібраному вигляді (фото кликабельно):



Навіщо це потрібно?
Багато хто може запитати: а навіщо взагалі потрібен «залізний» генератор випадкових чисел? Чи Не простіше взяти мікроконтролер, запрограмувати його… Адже генератор випадкових чисел — це вже давно відоме всім готове рішення!

Тут мені пригадалася історія про те, як я в групі товаришів брала участь у технічному оснащенні польовий рольової гри «Чужі під землею» (природно, за мотивами відомого фільму). Важливим елементом гри був ліхтарики, які повинні були через деякий час після включення «барахлити» і вимикатися на час — щоб створювати страшну і безвихідну атмосферу. Для маленьких ліхтариків була розлучена крихітна плата з мікроконтролером, настільки дрібним, що стандартна бібліотека генератора випадкових чисел разом з програмою в нього не влазила! Часу оптимізувати не було, замінювати мікроконтролер теж ні в якому разі не можна було.

У підсумку, я стала серйозно дивитися в бік альтернативного варіанту — брати значення з вільно «висячого» входи мікроконтролера, з АЦП. Навіть протестувала його, і пам'ятаю, що результат виявився цілком випадковим (деякі значення систематично зустрічалися частіше інших), але для потреб гри цілком підходив. Забавно, що створювати псевдовипадкове число з надр мікроконтролера чисто математичним способом виявилося складніше, ніж брати невизначеність безпосередньо з навколишнього світу…

Про апаратні генератори випадкових чисел є хороша статья у Вікіпедії.

Підсумки
Майстер-клас, проведений мною в GoToCamp, показав, що таку схему підлітки-старшокласники цілком можуть зібрати і зрозуміти, якщо їм докладно пояснити всі кроки і дати попередній «загруз» у вигляді 10 простіших схем початкового рівня.



Хлопці отримали важливий досвід об'єднання декількох простих схем в одну складну. Ми об'єднали генератор імпульсів, лічильник, дешифратор та семисегментний індикатор в схему — генератор випадкових чисел. Зверніть увагу, як легко це сталося завдяки зрозумілим інтерфейсах між маленькими схемами. Перша схема — генератор імпульсів на виході має меандр, тобто прямокутний сигнал. Частота цього меандру задає швидкість роботи лічильника. Лічильник, у свою чергу, «розмовляє» з дешифратором мовою двійкового коду. А той, у свою чергу, передає дані в зручному для семисегментного індикатора вигляді.


На фото — тестування генераторів на випадковість за допомогою секундоміра в телефоні :)

Простота і логічність цієї схеми зумовлена тим, що мікросхеми в ній підібрані так, щоб вони найбільш легко стикувалися між собою. Звідси висновок на майбутнє як для інженерів, так і для програмістів: намагайтеся добре уявляти собі взаємодію компонентів між собою і підбирайте їх так, щоб вони «спілкувалися» на максимально простому та зрозумілому один одному мовою.

А головне – вивчайте готові рішення та успішні практики! Багато вже придумано до нас. Вивчайте «абетку» цифрової електроніки, навіть якщо ви вже впевнений «ардуинщик» або хардкорний микроконтроллерщик. Ніколи не знаєш, для чого можуть знадобитися ті чи інші кейси.

Схема запозичена з Tronix Book 2 чудового американського популяризатора схемотехніки Гері Гібсона. А розповів нам про цю книжку не менш чудовий випускник МФТІ, інженер, розробник мікропроцесорів Юрій Панчул, за що йому велике спасибі!

Автор – Тетяна Волкова
спеціаліст з навчально-методичної роботиЦИОТ МФТІ (напрям підтримки розвитку технічної творчості),
розробник продуктів «Киберфизики»


Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.