Хардуерен случаен генератор

~ 9 Dec 2012, 16:09

Задобрявам с електрониката :) Вече като ми текне да си скова нещо, ей така, за кефа, докарвам 6 часа време от-до. Уикенда бях нещо болен и реших да си направя един случаен генератор.

И то не какъв да е, ами яко аркаден. С големи цифри, голям бутон, ярък, мигащ, светещ :) За употреба в игри, които се играят с две зарчета, чиито числа се сумират - като например Заселниците на Катан. Всъщност, генераторът просто "хвърля две зарчета", а какво се прави с резултатите им се настройва с един джъмпер.

Хардуерен рандом генератор

В компютрите обикновено ползват LCPRNG алгоритми (или по-сложни), което води до това, че когато някакво "уж случайно" теглене (например, за лотария) се прави от компютър, никога не можеш да убедиш баба си, че тегленето не е манипулирано :) За щастие, когато човек има по-директен достъп до хардуера, може да направи нещо като това:

	while not keypressed() {
		counter++;
	}
	return (counter MOD 36);


Какво имаме тук? Един брояч се увеличава бясно (хиляди, милиони пъти в секунда). В момента, в който човекът натисне бутон, броячът замръзва на последната си стойност, която се използва за да се определи какво се е "паднало" от "заровете".

Представете си, че се движите с кола по магистралата. И магистралата не е само с табелки на всеки километър - ами е разграфена на метри и сантиметри. На съседните сантиметрова деленийца се изреждат числата 0, 1, 2, ..., 34, 35, 0, 1, ... и така до безкрайБургас. Както си върви колата, хвърляте от нея едно метално топче. На което сантиметрово деление се спре топчето, вземате числото от оттам. Е точно нещо такова прави горният код - числото е практически случайно. Остава само на всяка възможна комбинация от две зарчета да й се даде чисълце от 0 до 35 и така имаме 1:1 съпоставка между генерираните числа и "двойка зарчета".

Дизайн

Пробвах няколко подредби на елементите върху платката. Огромният бутон е от SparkFun - друг не успях да си харесам, макар че този пък идва възголемичък, ама карай.
Image Image

Разработка

Няма как да не се мине през бредборд:
Image

И умалена версия на червения бутон - докато си тествам софтуера:
Image

Платка

Нали се бях заклел - повече никога перфборд! Но за този проект щеше да е overkill печатна платка (макар, че вече се научих горе-долу как стават и чакам едни от Сириус PCB, за едно друго проектче, за което ще пиша скоро). Та тук ползвам stripboard (още известна като Veroboard). Това е монтажна платка, на която има хоризонтални пътечки. Елементите се монтират перпендикулярно на пътечките, което води до една характерна подреденост в дизайна - всички пътища са прави (което е в пълно съзвучие с вътрешната душевност на човек, расъл в Стара Загора или Манхатън!).

Първата работа беше да пробия 4 дупки с новата си придобивка:
Image

Не знам как съм живял преди без дремел :)

После споих малко рейки:
Image Image

Ключова особеност на стрипборда е, че пистите са много дълги, но позволяват лесно да се прекъсват с едно инструментче и така един хоризонтал може да се ползва да свързва няколко отделни групи компоненти. В случая: наложително е да изолираме двете страни на микроконтролера, както и двете - на индикаторите, една от друга:

Image

Като плюсове на стрипборда е: по-малко поене, много по-малко custom свързване, толерантност към грешки. Ако нещо объркате, често не се налага да се разпоява - с "шилото" изолирате дефектната част и си я прекарвате от другаде. Като недостатък: внимателно с поенето, да не някое "мустаче" да свърже две писти. Два такива хардуерни бъга имах и ги търсех сума време...

Нещата взеха да се позапълват с резистори...:
Image

...и елементи:
Image

Please, install software:
Image

Полека-лека заприличва:
Image Image

Реших индикаторите също да са върху рейки. Могат да се запоят и директно, обаче тогава обширното пространство под тях щеше да е неизползваемо.

Довършителни работи


Тестов блинк върху сегментите:
Image

... както и тестови цифри. Всичко е 6:
Image

Ето как си го представях да изглежда финално:
Image

Обаче не се накефих на ключето за включване. Голямо е, и ако исках да го изведа на удобно, щеше да трябва да правя редизайн и да дупча голяма дупка. Но пък ми се намираха едни ЦК ключета...

Включих в действие другата нова играчка:
Image

На вид върти свредлото много мързеливо, ама как я дупчи тая пластмаса - все едно е масло...
Image

Културна работа:
Image Image

Готово

Таймерът е на 6 часа и половина от първата снимка. Ето как изглежда вече опаковано:

Please, press the button:
Image

Here, you're lucky:
Image

И един безсмислен надпис:
Image
нещо като жичкаджийския еквивалент на кода i++; /* увеличаваме i с единица */

Ето го в действие: YouTube

В крайна сметка, исках да си направя рандом генератор, а финалното изделие подозрително прилича на бомба със закъснител (може би по-скоро от вида, който Холивуд ни е формирал като представа за такава бомба). Малко като вица за бабата в соца, дето работила в завод и цял живот правила "бързовари", та като си откраднала малко части да си направи вкъщи един бързовар за себе си, взела, че сглобила Калашник. И така три пъти подред :D

Заключение

Предимства:



Недостатъци:



Сорс-кода на нещото можете да изтеглите оттук.

По празниците предстои доста Катан, нямам търпение да го пробвам :)



Коментари:

#1 от Иван, изпратено на 30 Jan 2013, 08:56


Супер е станало! +++ за огромния бутон - така трябва да се правят аркадните машини :)

Само 2 забележки:
- при теб разпределението на случайни числа има линейна характеристика (random 0-35), а при реално хвърляне се получава bell curve. Това може много лесно да го елиминираш ако просто вземеш 2 случайни числа от 1 до 6 и ги събереш (може би от bouncing-a на бутона)
- ползваш ли динамична индикация за сегментите? Доста ток ще ти спести и батериите ще живеят по-дълго.


#2 от anrieff, изпратено на 31 Jan 2013, 00:26


1) Сбора от две числа 1-6 не е камбанка, а си е тъп триъгълник. Иначе правя точно това - 0-35 интервала го ползвам само за да генерирам две независими случайни числа от 1-6 (x/6 + 1 и x%6 + 1). По-добре е, вместо да разчитам на несигурни неща като шаването на бутона
2) То най-големия консуматор е лампичката в бутона :) Индикацията не е динамична, но съм сложил един MOSFET на катода на индикаторите, с който ШИМ-вам яркостта, като минат 10 секунди неактивност. Реално не е толкова зле. Пък и нали батериите са презареждаеми...


#3 от Бойко, изпратено на 9 May 2014, 20:39


Абе направо ми напиши кои числа ще се паднат от тотото на 5/35 и после ще ти дам половината пари хахахахахх :):):)




Име:
За връзка: (Линк към вашия блог/сайт/e-mail; незадължително)
Вашият коментар:

Сметнете израза: деветдeсeт и сeдем минус ceдемдеcет и дeвет = (въведи с цифри)


<<

Valid XHTML 1.0 Strict