Электронные игральные кости на Atmega8
- Войдите на сайт для отправки комментариев
Втр, 12/04/2022 - 16:46
Хочу поделиться своим проектом, который завершил пару дней назад - Двойные электронные игральные кости на ATMEGA8A-PU. Изначально хотел сделать на Atmega48, но Китаец прислал мне залоченный МК и только недавно руки дошли сделать доктор Фьюзбит и обнулить Atmega48, но проект уже был готов, да и пришлось бы думать как сжимать код, что бы уместился, поэтому оставил на Atmega8.
При нажатии на кнопку "Reset" МК выходит из глубокого сна (Power-Down) по средствам прерывания,
генерирует случайные независимые рандомные числа для обоих кубиках и выводит значения на панели.
Через 20 секунд (время выставляется на свой вкус) бездействия МК уходит в глубокий сон.
Во время бездействия (в течение этих 20 секунд) можно выбрать одну из трёх настроек нажатием кнопки Setting:
- Откл./Вкл. звука с бузера по X1 нажатию кнопки с сохранением флага в EEPROM;
- Откл./Вкл. синего кубика по X2 нажатию кнопки с сохранением флага в EEPROM;
- Проверка заряда аккумулятора по X3 нажатию кнопки, один горящей LED равен 0,1V:
{14 горящих LED = 4,2V(100%), 1 горящий LED = 2,9V (7%)}.
Можно добавить кучу других функций, так как Flash в МК занято только 64% и ОЗУ 6%.
Светодиоды и резисторы использовал красного и синего цвета SMD1206, бузер использовал пассивный от ПК, так как он на 12V, то звук получается очень тихий и не раздражает, этого вполне достаточно, но можно поставить и на 6V, тогда будет на много громче.
Аккумулятор использовал от электронной сигареты на 550 честных mAh, подключён через платку зарядки "TP4056" с защитой.
Корпус нашёл подходящий от какой-то зарядки, вишенка на торте - самодельная наклейка на дне корпуса в заводское углубление, а большое отверстие от сетевого провода питания заклеил двумя слоями банковской карты, сверху наклеил карбоновую плёнкой, высверлил отверстие и сделал углублённую тактовую кнопку для "Setting".
Рандомные числа получаются непредсказуемыми, результат на практике в настольных играх порадовал!
В коде есть места с использованием прямого обращения к регистрам портов (для более компактного кода), а так же вкладка с расчётом и выводом напряжения питания МК.
Использовал Arduino IDE ver. 1.8.19
Плата: MiniCore (Atmega8)
Clock: 8 MHz internal osc. - внутренний генератор
BOD: 2.7V - (напряжение отсечки по питанию на 2,7V) так как использую Li-ion аккумулятор
EEPROM: Retained - что бы не стирался EEPROM после перепрошивки USBasp'ом
Compiler LTO: LTO Disabled - (оптимизация кода), делает код меньше по объёму, но медленнее, отключаем.
Bootloader: No bootloader - (Откл. загрузчик, он не потребуется, код будет меньше и выполняться чуточку быстрее).
После всех настроек нужно обязательно прошить загрузчик в Arduino IDE через USBasp.
Потребление всей схемы при горящих 12 светодиодах:
- При 4,2V: 73 мА.
Потребление всей схемы в режиме глубокого сна:
- При 4,2V: 16 мкА.
P.S.
Скетч "battery_Atmega8" - проверка напряжения МК (использовал для отладки).
Скетч "Proverka_vsex_LED" - проверка всех LED на корректное включение методом обращения через регистры (использовал для отладки).
Скетч "Double_kosti" - основной исходник для двойных электронных игральных костей на Atmega8.
Печатные платы, схему, скетчи и остальное можно скачать ТУТ!
Зеркало
все бы отлично, если бы скетчи и картинки выложил сюда... А на Яндексдиск сам ходи
Да, вспомнил, что чего-то не хватает, когда уже было поздно и ночь...)
Сейчас исправим :)
Общие фото устройства, для наглядности:
В процессе обнаружил пару мелких косяков на плате, но в печатке уже всё исправлено.
Схема:
Вот так выглядят печатные платы:
Размеры Панелей для LED: 25мм на 23мм. Размер печатки для МК: 39мм на 40 мм.
В архиве более качественные картинки, там есть всё. что нужно.
Антенны на разных портах не лучше ли?
И помехи использовать для настоящего рандома ) Я вот не уловил зачем отдельные функции для красной и синей частей кубика ?
Помехи и так используются с двух каналов для каждого генератора.
Отдельные функции для удобства, были нюансы с задержкой анимации и звука, так же для упрощения Откл./Вкл. синего кубика.
В скетче всё максимально закомментировано и описано что и для чего.
В скетче всё максимально закомментировано и описано что и для чего.
не вижу скетча в ветке....
В скетче всё максимально закомментировано и описано что и для чего.
не вижу скетча в ветке....
Он разбит на вкладки, поэтому не выставил сюда
Вкладки под спойлер. Чего только не сделаешь для людей.)
Ну я не знаю... Зачем эти все навороты с улавливанием электромагнитных колебаний снаружи? На ESP32, у меня довольно хорошо работает стандартная функция random. На дисплее классический цифровой шум.
Картинка на мониторе.
Я понимаю, что одновременно работает библиотека FabGL, формирующая сигнал VGA для монитора. По идее, чтоб делать рандомные генераторы, нужно вычислять ещё нормальное распределение.
Если мне формулы напишут, помнящие высшую математику/Теорию вероятности, я ещё нарисую график рандомности функции random.
Пло́тность вероя́тности — один из способов задания распределения случайной величины. Во многих практических приложениях понятия «плотность вероятности» и «плотность (распределения) случайной величины» или «функция распределения вероятностей» фактически синонимизируются[источник не указан 648 дней] и под ними подразумевается вещественная функция, характеризующая сравнительную вероятность реализации тех или иных значений случайной переменной (переменных).
Именно Плотность вероятности, нужно посчитать у генератора случайных чисел.Это и будет показателем качества/рандомности Генератора случайных чисел.
Имеем массив данных случайных, нужно вычислить Плотность вероятности.
С экранчиками кубики можно бросать почти по настоящему :)