Простой генератор случайных чисел
|
|
m_w | Дата: Суббота, 15.12.2012, 05:25 | Сообщение # 1 |
 5 Вольт
Группа: Пользователи
Сообщений: 67
Репутация: 2
Статус: Offline
| Простейшим генератором случайных чисел является монетка. Подбросив её никогда не знаешь наверняка какой стороной она упадет. Несложно сделать электронный аналог монетки. Я использовал платку с микроконтроллером ATmega32U4, модуль с кнопочкой и модуль с трехцветным светодиодом.
Мой блог http://justforduino.blogspot.ru/
|
|
| |
m_w | Дата: Суббота, 15.12.2012, 05:29 | Сообщение # 2 |
 5 Вольт
Группа: Пользователи
Сообщений: 67
Репутация: 2
Статус: Offline
|
Ниже приводятся некоторые пояснения о соединении модулей.
ATmega32u4 --- LED RGB module VCC --- V PD2 --- R PD1 --- B PD0 --- G
ATmega32u4 --- BUTTON VCC --- VСС PD7 --- SW1 GND --- GND
Теперь о программе. Источником непредсказуемости в данном случае является человек. Момент когда он решит нажать на кнопку действительно предсказать трудно. В ожидании этого в микроконтроллере тикает таймер. Какой именно таймер использовать значения не имеет. Я задействовал 8 разрядный Timer/Counter0. Timer/Counter0 работает в режиме Normal Mode, то есть он просто считает от 0 до 255. При тактовой частоте микроконтроллера в 16 МГц и без предделителя значение счетного регистра Timer/Counter0 изменяется на 1 за: (1.0 / 16000000.0) * 1000000.0 = 0.625 мкс (us) За секунду младший бит счетного регистра изменится шестнадцать миллионов раз. Предсказать будет он 0 или 1 в момент нажатия кнопки невозможно.
Так как генерирование случайных чисел дело серьезное, то программу я написал на ассемблере в AVR Studio.
http://narod.ru/disk/64501291001.7183de531530edd346e7fe847c67594b/mc_5_1.zip.html
Сразу после включения светодиод будет белым. Когда кнопка будет нажата светодиод станет красным или зеленым. Это зависит от того 0 или 1 в младшем бите счетного регистра таймера. Если кнопку отпустить, то светодиод снова станет белым.
Эта игрушка забавна. Только применений ей много не придумаешь. И тем не менее, как бы странно это не звучало, ранее описанный процесс генерирования случайных чисел можно автоматизировать.
В микроконтроллере ATmega32U4 есть сторожевой таймер (Watchdog Timer). Обычно его используют для ресета микроконтроллера. Однако, это далеко не единственный режим работы сторожевого таймера. Есть у него Interrupt Mode. В этом режиме переполнение сторожевого таймера приводит к вызову прерывания, а перезапуска микроконтроллера не происходит. В обработчике этого прерывания можно посмотреть 0 или 1 в младшем бите счетного регистра Timer/Counter0 и в зависимости от этого сделать что-то.
Но, почему время переполнения сторожевого таймера непредсказуемо? Дело в том, что у сторожевого таймера свой источник тактового сигнала. Это RC цепочка. И этот источник тактового сигнала очень нестабилен в отличии от кварцевого резонатора, который является источником тактового сигнала для Timer/Counter0. Время переполнения сторожевого таймера зависит от температуры, напряжения.
Частота генератора тактового сигнала сторожевого таймера составляет 128 КГц. В зависимости от настроек, сторожевой таймер переполняется, приблизительно, за 16 ms, 32 ms, 64 ms, 0.125 s, 0.25 s, 0.5 s, 1.0 s, 2.0 s, 4.0 s или 8.0 s. Есть из чего выбрать.
Еще было бы полезно генерировать не один бит, а байт. Эта задача так же решаема. Получить случайный байт можно собрав восемь случайных битов. Просто взять байт из счетного регистра Timer/Counter0 нельзя. Источник тактового сигнала сторожевого таймера конечно нестабилен, но не до такой же степени.
Мой блог http://justforduino.blogspot.ru/
|
|
| |
m_w | Дата: Суббота, 15.12.2012, 05:35 | Сообщение # 3 |
 5 Вольт
Группа: Пользователи
Сообщений: 67
Репутация: 2
Статус: Offline
| Новая программа. Она также написана на ассемблере в AVR Studio.
http://narod.ru/disk/64501297001.5bf783e20c442bad8466513525eb641e/mc_5_2.zip.html
Эта программа управляет RGB светодиодом. В зависимости от случайного числа полученного обработчиком прерывания по переполнению сторожевого таймера меняется значение ШИМ на PD0, PD1 и PD2. Светодиод случайно меняет цвет. Светится ярко или тускнеет. ШИМ реализован программно.
Кино.
http://www.youtube.com/watch?v=z4_Roro8T0s
Получилось не очень. Но, когда я снимал лучше? На самом деле, при неярком освещении, эта штука выглядит волшебно.
Это устройство можно положить в непрозрачную вазу (например, из дымчатого стекла). Получится очень красиво.
Мой блог http://justforduino.blogspot.ru/
Сообщение отредактировал m_w - Суббота, 15.12.2012, 05:35 |
|
| |
m_w | Дата: Суббота, 15.12.2012, 05:43 | Сообщение # 4 |
 5 Вольт
Группа: Пользователи
Сообщений: 67
Репутация: 2
Статус: Offline
| Это не все. Можно подключить устройство к компьютеру через USB-USART переходник.
Я уже не раз писал о подключении USB-USART переходника к ATmega32U4. Но, думаю если повторить, то хуже не будет.
ATmega32U4 --- USB-USART VCC --- 5V PD3 --- TxD PD2 --- RxD GND --- GND
Программа. Она тоже написана на ассемблере и в AVR Studio.
http://narod.ru/disk/64504151001.e57d897437688c4628e176e0daadaaa1/mc_5_3.zip.html
Мой блог http://justforduino.blogspot.ru/
Сообщение отредактировал m_w - Суббота, 15.12.2012, 11:55 |
|
| |
m_w | Дата: Суббота, 15.12.2012, 05:45 | Сообщение # 5 |
 5 Вольт
Группа: Пользователи
Сообщений: 67
Репутация: 2
Статус: Offline
| Теперь можно передавать случайные числа в ПК.
Зачем? Можно автоматически генерировать пароли. Я везде использую разные пароли. И с недавних пор стал замечать некоторые закономерности в придуманных мной самим паролях. Появляются "любимые" буквы, цифры и пр. Безусловно, для этих целей можно использовать ресурсы одного компьютера. Но, так намного интересней.
При желании можно придумать немало иных применений генерируемым случайным числам. Например, внесение элемента непредсказуемости в поведение робота и т.д. и т.п.
Мой блог http://justforduino.blogspot.ru/
|
|
| |