Простой генератор случайных чисел - ФОРУМ ДВ Робот dvrobot.ru
Пятница, 15.12.2017, 08:54
Главная Мой профиль Регистрация Выход
  • НАШ МАГАЗИН
  • Вы вошли как Гость | Группа "Гости"Приветствую Вас, Гость
    [ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
    Страница 1 из 11
    Модератор форума: GRACH, Serg 
    ФОРУМ ДВ Робот dvrobot.ru » DV ROBOT » Библиотека Проектов » Простой генератор случайных чисел (Генерирование случайных чисел на микроконтроллере)
    Простой генератор случайных чисел
    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 нельзя. Источник тактового сигнала сторожевого таймера конечно нестабилен, но не до такой же степени.
    Прикрепления: 0472983.jpg(132Kb)


    Мой блог 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

    Получилось не очень. Но, когда я снимал лучше? На самом деле, при неярком освещении, эта штука выглядит волшебно.

    Это устройство можно положить в непрозрачную вазу (например, из дымчатого стекла). Получится очень красиво.
    Прикрепления: 3520521.jpg(141Kb)


    Мой блог 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
    Прикрепления: 6978021.jpg(119Kb)


    Мой блог http://justforduino.blogspot.ru/

    Сообщение отредактировал m_w - Суббота, 15.12.2012, 11:55
     
    m_wДата: Суббота, 15.12.2012, 05:45 | Сообщение # 5
    5 Вольт
    Группа: Пользователи
    Сообщений: 67
    Репутация: 2
    Статус: Offline
    Теперь можно передавать случайные числа в ПК.



    Зачем? Можно автоматически генерировать пароли. Я везде использую разные пароли. И с недавних пор стал замечать некоторые закономерности в придуманных мной самим паролях. Появляются "любимые" буквы, цифры и пр. Безусловно, для этих целей можно использовать ресурсы одного компьютера. Но, так намного интересней.

    При желании можно придумать немало иных применений генерируемым случайным числам. Например, внесение элемента непредсказуемости в поведение робота и т.д. и т.п.
    Прикрепления: 9293830.png(321Kb)


    Мой блог http://justforduino.blogspot.ru/
     
    ФОРУМ ДВ Робот dvrobot.ru » DV ROBOT » Библиотека Проектов » Простой генератор случайных чисел (Генерирование случайных чисел на микроконтроллере)
    Страница 1 из 11
    Поиск:

    ДВ Робот - Чат