Увидеть время

15 август, 2008 - 16:00Андрей Зубинский

захотелось мне что-нибудь интересное смастерить. причём, чтобы и "железячное, и попрограммировать немного, и не повторять готовую конструкцию, а «с нуля» - от идеи до железяки и кода.

и придумались мне весьма специфические часы, которые показывают не условное время (все «шкалы» времени, конечно же, условны), а уникальность текущего момента времени. по-моему, ничего подобного никто не делал.

выглядеть такие часы могут просто – матрица светодиодов размером N x M, на которую «проецируется» битовое слово с числом битов N*M (назову это слово T) по следующему принципу: бит  равен 1 - соответствующий светодиод включен, бит равен нулю - выключен.

Увидеть время

такая картинка отображается какой-то короткий промежуток времени, например, несколько секунд. потом она изменяется. задача – сделать так, чтобы картинка никогда не повторялась. и была псевдослучайной. таким образом, за время работы часов каждый момент времени будет действительно отображён неповторимой, уникальной картинкой на светодиодном дисплее.

каюсь, требование к уникальности каждой комбинации поначалу сбило меня с толку и я сдуру было захотел нагородить здоровенный битовый массив, используемый для проверки уникальности сгенерированного каким-то образом T. то есть, T используется как адрес, и по этому адресу проверяется бит в большом массиве оперативной памяти – если бит равен нулю, то его значение изменяется на 1, а слово T считается пригодным к отображению, в противном случае, если бит T уже установлен в единицу (комбинация уже отображалась), просто генерируется новое T и процесс проверки продолжается.

а, оказывается, все просто до невозможности. есть исследования линейных конгруэнтных мультипликативных генераторов математика Деррика Лемера, и есть замечательная рекуррентная формула 1969 года (авторы – Льюис, Гудман, Миллер, в их честь назван генератор псевдослучайных чисел LGM): 

Увидеть время

кстати, Лемер – весьма интересная личность. он был женат на дочери иммигрантов из России, тоже математике, и тоже с мировым именем, Эмме Троцкой. вот первая фраза из книги воспоминаний Эммы Троцкой: «Я родилась в 1906 году в городе с прекрасным названием Самара, на великой реке Волга. Я надеялась посетить свой родной город до тех пор, пока  он не сменил название на ужасное Куйбышев. С тех пор я полностью утратила к нему интерес».

и, кстати, число  Увидеть время  тоже очень интересное. это так называемое простое число Мерсенна (Марен Мерсенн – французский монах, математик, учившийся с Рене Декартом).

ну а уж число 16807 вообще культовое, можно сказать, 37 тысяч страниц, долго расписывать, почему именно.

так вот, последовательность, генерируемая по формуле Льюиса-Гудмана-Миллера, по сути является циклическим списком, состоящим из неповторяющиеся псевдослучайных 31-битовых чисел в диапазоне от 1 до 2,147,483,646. и тот факт, что каждое число из диапазона встречается в последовательности строго один раз – фундаментальная особенность генераторов подобного класса.

так как решаемая задача – сугубо декоративного характера, все прочие свойства псевдослучайной последовательности меня не интересуют. зато простота формулы, приличный период повторения последовательности и неповторимость чисел в пределах одного периода – именно то, что надо.

если время отображения одного слова T принять равным одной секунде, полный период  последовательности будет отображаться примерно 2,147,483,646/(60*60*24*365) или 68 лет при непрерывной работе часов. секунда даже многовато, но это уже и не важно, период отображения – величина, задаваемая программно.

по-моему, это отличная штука, можно с cознательного детского возраста наблюдать такие часы всю жизнь, и картинка ни разу не повторится.

итак, в часах будет светодиодная матрица 5*6, отображающая 30-битовое слово. ещё один бит будет использоваться, например, для изменения цвета (как – пока не вопрос, да и это несложно).

если с фундаментальной функциональностью устройства уже всё понятно – это простой 8-битовый микроконтроллер с загруженной программой реализации приведенной выше формулы, 30 светодиодов, каким-то образом подключенные к контроллеру так, чтобы можно было  отображать сгенерированное 31-битовое слово, то в нюансах начинаются всякие забавные вещи.

например, хотелось бы, чтобы визуально картинка менялась не по принципу переключения, а плавно – одни светодиоды гаснут, другие – загораются, картинка удерживается какое-то время, потом цикл повторяется.

пока вижу одну возможность - микроконтроллер со встроенными двумя управляемыми ШИМ-генераторами (широтно-импульносная модуляция – способ удобно непосредственно цифровым способом формировать переменные аналоговые величины) и программно сформировать два сдвинутых по фазе ШИМ-сигнала, описывающих трапецеидальные аналоговые импульсы. каждый светодиод может быть подключен к одному из этих двух генераторов, или ни к чему (что уже означает – для каждого светодиода потребуется трёхпозиционный управляемый ключ). но это, конечно, пока. как-то неизящно.

буду думать ещё.

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

а теги, которые нельзя выбирать персонально - это сущее мучение. я уже думал прицепить тег "Сделки" - всё-таки, что-то сделать хочется, но потом благоразумие победило.