Блок с датойБлок с временемБлок с возрастом сайта
Mr.ALB

    Анатолий Беляев (aka Mr.ALB). Персональный сайт

    Да пребудут с вами Силы СВЕТА!

     

    Ардуино (Arduino). #15

    Генератор случайных чисел

    Однажды сын попросил сделать ему лохотрон, а по научному – генератор случайных чисел (ГСЧ). Так, чтобы был в виде небольшого приборчика. Вначале хотел реализавать такую идею на Ардуино, но недавно ко мне из Китая пришла посылка и в ней Digispark – родственная, для Ардуино, платформа. Захотелось эту штучку освоить и тут как раз – и идея есть, и железо. Что получилось – читайте далее на странице.

    ГСЧ – Лохотрон
    ГСЧ – Лохотрон

    Описание

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

    Так как реализовывать этот проект решил на платформе Digispark, то соответственно был ограничен всего 6-ю ножками ввода/вывода, даже 5-ю, т.к. вывод P5 используется для сброса (reset). Соответственно устройство хотелось сделать автономным – значит питание от аккумулятора и компактным по размерам. Благо сама плата Digispark имеет размеры всего 24 * 18 мм. Вывод числа решил следать на семисегментном одноразрядном индикаторе.

    Digispark построен на микроконтроллере ATtiny85-20U. Чтобы его запрограммировать пришлось настроить программную среду Arduino IDE. Установить соответственные драйверы под Digispark и т.п. Описывать этот процесс не буду, так как в интернете достаточно информации по этой платформе и её программированию. Некоторая поясняющая информация имеется в комментариях скетча. Смотрите внимательнее.

    Digispark на микроконтроллере ATtiny85-20SU
    Pic 1. Digispark на микроконтроллере ATtiny85-20SU

    Можно дополнительно отметить, что питание ГСЧ осуществляется от Li-Ion аккумулятора напрямую. Поэтому важно энергопотребление. Пытаясь снизить энергопотребление – пришлось отпаять стабилизатор V1 78L05 и резистор R4 1кОм, подключающий светодиод питания (PWR LED). Энергопотребление было снижено до 12.2 мА в режиме готовности к выбору (светится точка индикатора). Потом убрал ещё два стабилитрона (D1 и D2) на шине USB у D- и D+ ток потребления снизился до 5,7 мА (светится точка индикатора).

    Digispark. Схема принципиальная
    Pic 2. Digispark. Схема принципиальная

    Схема генератора случайных чисел

    Схема электрическая принципиальная ГСЧ
    Pic 3. Схема электрическая принципиальная ГСЧ

    Для индикации числа используется одноразрядный семисегментный индикатор АЛС324А1 с общим катодом. Управление этим индикатором осуществляется через сдвиговый регистр на микросхеме SN74HC595N. Иначе не получалось – не хватало портов управления.

    Советский индикатор АЛС324А1 можно заменить ему подобными АЛС321А1, АЛС333А1, АЛС334А1.

    Кнопка SB1 осуществляет выбор случайного числа. Кнопка SB2 позволяет установить максимальное число в списке выбора. По нажатию на эту кнопку выводится значение максимального числа начиная с 2 и до 9, так как максимальное число на одном разряде как раз = 9. При последующем нажитии на SB2 происходит смена значений по кругу. При включении устройства устанавливается максимальное число = 9.


    Скетч

    Ниже представлен скетч генератора случайных чисел. Как обычно стараюсь подробно комментровать код, чтобы легко было понять программу. Файл со скетчем можно скачать в подразделе Приложение.

    Стоит обратить внимание, что в функции setup() реализован тест цифр. После включения генератора, на индикаторе высвечиваются все сегменты. После того, как начинает выполнятся функция setup(), в ней происходит последовательный перебор цифр. Когда тест заканчивается, то на индикаторе остаётся светиться точка, что указывает на подключенное питание и является приглашением для выбора числа (кнопкой SB1), или установки максимального числа (кнопкой SB2).

    Чтобы реализовать случайность числа, пришлось вначале использовать функцию randomSeed(). Аргументом для неё служит число микросекунд делёное по модулю два на 9, и с добавлением 1. А далее уже происходит вызов функции random(). Такой подход позволяет из псевдослучайной последовательности создать реальную случайную последовательность.

    При тестировании программы было обнаружено, что при максимальном числе = 7 всегда выпадает число 1. С чем это связано обнаружить не смог, причём на любых других значениях максимального числа всё работает корректно. Пришлось изменить программу под случай, когда происходит выбор от 1 до 7. Сейчас программа работает корректно. Скетч в Приложении обновлён.


    Реализация

    Вначале создаём макет, делаем соединения между всеми компонентами и пишем скетч. Благо, что есть макетные панельки и можно всю схему собрать без пайки практически за несколько минут. А вот потом уже пишется и переписывается неоднократно скетч и ищется оптимальное решение. Хотя бывает и схему приходится изменять. В этом устройстве тоже пришлось менять схему и из-за того, что на порте P1 подключен светодиод, то пришлось кнопку SB2 подключать не как SB1 между портом и GND, а между портом и +5 В (плюсом напряжения аккумулятора).

    Макет устройства
    Pic 4. Макет устройства

    На плате размерами 48 * 35 мм разместил электронные компоненты. Соединения сделаны объёмным монтажом. Индикатор и сдвиговый регистр установлены на панельки 14 и 16 выводные соответственно. Digispark наложен сверху на плату и порты припаяны к плате короткими облуженными проводками.

    Вид сверху
    Pic 5. Вид сверху

    На обороте видно, что сопротивления R1...R8 и конденсатор C1 у меня планарные, что позволяет уменьшить размеры платы.

    Вид снизу
    Pic 6. Вид снизу

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

    Вид снизу + плата заряда аккумулятора
    Pic 7. Вид снизу + плата заряда аккумулятора

    Далее контактную колодку для аккумулятора отпаял, а сам аккумулятор припаял к плате. Отладка и монтаж железа закончен.

    Вид снизу. Плата заряда аккумулятора установлена
    Pic 8. Вид снизу. Плата заряда аккумулятора установлена

    У меня есть плата заряда с разъёмом microUSB, но установил с разъёмом miniUSB, чтобы не путать с разъёмом microUSB Digispark-а. В ходе доработок придётся, может быть, ещё несколько раз программировать Digispark.

    Вид сбоку
    Pic 9. Вид сбоку

    Корпус закончен. Общие размеры устройства: 62 * 39 * 32 мм. Далее небольшой фотоотчёт по конструкции корпуса. В нём три детали: сам корпус из ABS, верхняя боковая крышка из ABS, верхняя крышка из оргстекла. Всё крепится четырьмя винтиками М2 и четырьмя саморезами на 2,5 мм. Для кнопок сделаны два толкателя из пластиковой трубочки диаметром 3,5 мм. В них вплавлены небольшие проволочки для удержания толкателя в корпусе.

    Комплект сборки ГСЧ
    Pic 10. Комплект сборки ГСЧ

    При сборке устройства плата ГСЧ и аккумулятор задвигаются в пазы в основном корпусе.

    Процесс сборки
    Pic 11. Процесс сборки

    Далее боковая стенка закрывается крышкой и она закрепляется винтиками М4.

    Процесс сборки
    Pic 12. Процесс сборки

    Потом устанавливаются толкатели на кнопки и всё закрывается прозрачной крышкой, которая закрепляется саморезами 2,5 мм.

    Устройство собрано
    Pic 13. Устройство собрано

    Далее разные виды готового устройства.

    Вид на micro-USB для программирования
    Pic 14. Вид на micro-USB для программирования
    Вид на mini-USB для зарядки аккумулятора
    Pic 15. Вид на mini-USB для зарядки аккумулятора

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

    Сравнительный вид
    Pic 16. Сравнительный вид

    Разработка и изготовление такого устройства одно из самых быстрых. На всё ушло 4,5 дня. Получилась занятная штучка, надеюсь пригодится в жизни улыбка.

    2020-07-06

    Приложение

    Используемые библиотеки и программы:

    Анатолий Беляев.

    . Mr.ALB
    Предыдущая страница Страница 16 Далее