Pull to refresh

Comments 44

Немного не понял почему
randomSeed(analogRead(rand_gen)); // не псевдо радном

Вроде как analogRead читает состояние pin'а rand_gen. Или я что-то путаю?
В целом была мысль сделать непсевдорандом основанный на акселерометре, магнетометре/компасе и барометре. Но так и не придумал практического применения, потому забил.
Дело в том что мы питаемся считать значение на «висящем в воздухе» пине, он работает как антенна в радиоприемнике, включи не настроений радиоприемник и услышишь шум, такой же шум и «слышит» микроконтроллер.

image

На скриншонте показано как микроконтроллер видит белый шум.
Я догадывался, что вы используете pin как антенну, только вот я не очень знаком ATtiny13. На всяких там ARM'ах чтобы нога считалась поднятой, нужно иметь какой-то минимальный уровень, например ~2,8 вольта. Получить такой уровень возмущениями Э/М поля в окружающей среде сложновато, потому GPIO и не дрыгаются когда не попади.
Это analogRead — по факту, используется низкоразрядный АЦП. Измеряет напряжение между пином (не все пины одинаково полезны могут быть аналоговыми) и землей и проецирует его значения от 0 до 5 вольт на целочисленное значение от 0 до 1023.

В реальных генераторах СЧ применяются шумящие диоды или стабилитроны, как источник случайности. В данном случае наводок на пине должно быть достаточно и в их применении вряд ли есть необходимость.
Спасибо, как раз прочел внимательнее описание.
На ATtiny13 порты по умолчанию находятся в высокоимпедансном состоянии, то есть Hi-Z состоянии, это как бы и не логическая 1 и не лог. 0, к тому же порт установлен как вход.
За счёт этого можно ничего не изменяя состояния на порту как говорил один человек «нарубить случайных чисел».
Сообразил я не правильно трактовал значение возвращемое analogRead, думал, что оно возращает текущее состояние PIN т.е. 0 или 1. Сейчас прочел внимательнее описание.
analogRead() использует АЦП, возвращает значение от 0 до 1023.
хм. Не очень похоже на белый шум. Это слишком узкополосный сигнал чтобы его называть белым шумом.
Уж лучше измерять длительность нажатия на кнопку.
Кстати, не удивлюсь если один квадратик сетки по горизонтали это 20мс реального времени.
Амплитуда данного сигнала составляет 40 единиц, а это значит что у вас будет вызван набор не более чем из 40 заранее известных результатов, так не проще ли их было внести в таблицу? Ведь после установки randomSeed последовательность будет всегда повторяться для одного и того же входного числа. А поскольку чисел АЦП может дать не более 1024 то и результатов будет не больше… стоит ли вообще возится со случайными числами в таких случаях? Проще использовать простейший хеш над измеренным числом… и то для того чтобы предотвратить предсказуемость под управлением человека с отличнейшей реакцией. иначе можно просто взять младший бит АЦП и считать его случайным.

ИМХО, вы совершаете того же рода ошибку что люди использующие двойное и тройное шифрование одним и тем же алгоритмом для увеличения стойкости алгоритма к взлому.

Возьмите транзистор вроде ГТ109, соедините базу с коллектором и используйте транзистор как диод — напряжение на нем под действием тока будет больше похоже на белый шум нежели свободно болтающийся вывод микроконтроллера.
И да, его надо будет усилить либо снизить опорное напряжение АЦП для большей чувствительности.транзистор не обязательно всегда держать под током — включить его можно только на время измерения и просуммировать 16 измерений чтобы добавить еще 4 бита к результату.

Да, ваша схема будет более предсказуемой в чистом поле, где будет только медленно меняющаяся электростатическая наводка.
UFO just landed and posted this here
Можно добавить ещё два светодиода для простоты.
UFO just landed and posted this here
Ты бы хоть статью на педивикии прочёл.

ru.wikipedia.org/wiki/Magic_8_ball

Классический шарик имеет 20 ответов в четырёх группах — «положительные», «уклончиво положительные», «нейтральные» и «отрицательные».
Для такого варианта можно oled-экранчик, например, использовать. А для аутентичности «интерфейса» — акселерометр замест кнопки, тогда уж.
UFO just landed and posted this here
Надо было сделать кнопку на питание, а не на сброс.
Тогда бы батарейки хватило на вечно.
Нажал кнопку, микроконтроллер включился, сгенерил случайное число, зажег светодиод на пару сек. потушил и ушел в бесконечный цикл (или даже в стендбай режим, если он там есть). до тех пор пока снова кнопкой не перезапустили программу по питанию.

А еще это добавило бы тактильных ощущений, кнопку пришлось бы жать до получения ответа.
Боюсь что так кнопка быстро выгорит.
У меня микроконтроллер после свечения переходит в спящий режим, в котором микроконтроллер потребляет по даташиту:

image

Всего 0.2 мкА. Чтобы микроконтроллер разрядил батарею нужно наверное тысячи лет, скорей батарейка сама по себе разрядится за такое время.
А с чего бы кнопке выгореть?
В рабочем режиме ток будет порядка десятков миллиампер. Обычная тактовая кнопка выдержит это без проблем.
Ток в работе 1.5-2 мА, но всё же просто «прижимать» пин ресет на землю — думаю в таком случае ток будет проходить через кнопку значительно меньше.
Ток через светодиод будет около 9мА. Плюс ток рабочего режима контроллера.
Через ресет, как у вас, действительно ток меньше, но это неважно.
Я не говорю, что у вас плохое решение, просто сжечь кнопку парой десятков миллиампер нереально.
Мультиметр показывает что схема потребляет 0.75 мА когда горит зелёный светодиод и 1.50 мА когда красный. Может батарейка малость подсела.
Если наводка будет сильной и низкочастотной, то analogRead будет возвращать, в основном, 0 или 1023.
Вдалеке от ЛЭП и гаджетов вполне может возвращать одно и то же значение.
А кстати интересно как будет этот девайс вести себя под ЛЭП. Надо будет на днях катнуть на велике по окрестностям…
Думаю, что вполне нормально будет вести. Ведь момент нажатия на кнопку сам по себе случаен и никак не синхронен с частотой сети.
Дело в том что напряженность электрического поля под ЛЭП будет перегружать АЦП и вместо красивой синусоиды там будет что-то вроде меандра. На установку ГСЧ будут преимущественно идти два крайних значения — 0 и 1023 с незначительными вкраплениями других чисел(если момент нажатия попадет на фронты). Не очень хорошее распределение для такого ГСЧ. Может статься так что эти два крайних значения будут давать один и тот же результат…
Забавно. Я как-то давно также сделал подобное устройство, случайные числа получал следующим образом — читал результат преобразования АЦП, вывод которого тоже в воздухе висел, брал младший бит и так пять раз подряд. А число, представленное этими 5-ю битами и было результатом. Только использовал, ЕМНИП, tiny2313, поскольку девайс был с ЖКИ. Правда, девайс подвисал иногда, да и код был кривой до безобразия… Так где-то и валяется.
У ATTiny2313 нет АЦП, только аналоговый компаратор.
Досадно, что для работы с HD44780 нужно целых шесть ножек контроллера (выбор регистра RS, строб EN, 4 бита данных). У восьминогих AVR можно конечно же отключить RESET и получить как раз шесть ног, но все они будут завязаны на дисплей, и ГСЧ сделать не удастся.

Однако при этом можно использовать любую линию, кроме EN для цифрового обмена с другими устройствами — пока нет сигналов на EN, дисплею безразлично состояние других его выводов.
Значит это была mega8. Точно уже не помню, года два прошло.
Кстати, по поводу дисплея — можно использовать дисплеи с i2c или spi интерфейсами.
Если выводить на индикатор по отпусканию кнопки то можно использовать практически любой вывод его… впрочем, существуют сдвиговые регистры и индикатор можно задействовать используя всего 3 вывода контроллера.
Тогда уж проще взять более ногастый контроллер, чем ставить второй корпус, да еще к нему конденсатор.
Да и скорость обмена сядет в 8 раз, хоть это и не принципиально.
А как же принцип «что есть под рукой»? Конечно, можно еще для этих целей задействовать STM32F4xx, там уж точно выводов хватит.
UPD по совету одного человека, я добавил в функцию system_sleep() отключение аналогового компаратора для ещё большей экономии заряда батарейки. Файлы в низу статьи перезалито.
Таблица 11 на странице 27 даташита утверждает, что в используемом вами режиме Power Down АЦП и так будет остановлен, без дополнительных команд.
Странно? Но почему тогда микроконтроллер потреблял около 400 мкА в режиме сна до момента пока руками не прописал отключение?
Атмел такой Атмел — любят они в даташитах путаницу.
Ответ нашелся на странице 28:
If enabled, the ADC will be enabled in all sleep modes. To save power, the ADC should
be disabled before entering any sleep mode. When the ADC is turned off and on again,
the next conversion will be an extended conversion. Refer to “Analog to Digital Con-
verter” on page 77 for details on ADC opera

Если АЦП включен, он будет работать во всех режимах сна

То есть на два абзаца выше они рисуют, что тактирование на АЦП в режиме Power Down не идет, и тут же пишут опровержение!

Такие вот новости, когда на соседних страницах разные утверждения.
Хм… спустя некоторое время батарейка разрядилась, но ведь так не должно было быть, ток потребления в режиме сна замерить обычным мультиметром не возможно… Просто мистика какая-то.
Никакой мистики. Вероятно девайс часто просыпался от помех. Например, от излучения мобилки или ошибки в программе.
Биг сенкс! Вы сделали вчера мой день: я бился над тем, что самым подходящим контроллером была Тинька, но все контакты были заняты и повесить кнопку на прерывание было невозможно… И тут как гром среди ясного неба — натыкаюсь на эту статью!
Правда батарейка через месяц почему-то села… Почему я хз… А так — пожалуйста.
Знаешь, грешу на подтяжку! Знакомые говорят, что через подтягивающий резистор ток не течёт и расхода нет, но иначе ЗАЧЕМ-БЫ ОН ВООБЩЕ БЫЛ НУЖЕН?!

В принципе — мне ок и с потреблением «батарейка-в-неделю-и-вообще-поюзал-вынь!»
Просто чтобы при нерабочем состоянии она расходовалась поменьше!
О, я заметил что у меня нету подтягивающего резистора для ресет, может и потому плата порой что-то потребляла?
На том выводе есть встроенный порядка 100кОм.
Наверное этого оказалось мало и плата время от времени перезагружалась…
Sign up to leave a comment.

Articles