воскресенье, 13 октября 2019 г.

Игральный кубик на ATtiny85

Игральный кубик на ATtiny85

В сегодняшней статье описание очередной моей поделки для сынишки - игрального кубика на ATtiny85. Это и хороший пример использования микроконтроллера серии tiny, и оригинальный атрибут для настольных игр. Плюс удовольствие от его изготовления. Кому интересно, прошу под кат.

Необходимые компоненты

  • Микроконтроллер ATtiny85.
  • 7 светодиодов диаметром 5мм.
  • 4 резистора номиналом 470Ом или больше.
  • Макетная плата.
  • Датчик тряски.
  • Литиевый аккумулятор.
  • Плата зарядки аккумулятора.
  • Корпус.

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

Схема игрального кубика

Идея кубика проста: датчик реагирует на тряску кубика и микроконтроллер показывает одно из шести возможных значений на светодиодах. Вот только для отображения этих значений нужно 7 светодиодов и для подключения их по схеме с общим катодом (или анодом) требуется 7 выводов. Тогда как на ATtiny85 нам доступно всего 6 выводов, а нужно еще подключить датчик тряски. На самом деле имеющихся шести выводов нам вполне достаточно, посмотрите на схему ниже:

ATtiny85 dice scheme


Светодиоды попарно подключены к выводам микроконтроллера, но при этом в разном направлении. В зависимости от направления, в котором протекает ток через такую пару, будет включаться один либо другой светодиод. Направление тока будем задавать установкой значений на выводах PB1..PB4 и PB0. Последний будет попеременно выступать в роли земли и источника тока. Выдержит ли порт микроконтроллера такую нагрузку? Обратимся к даташиту. В разделе Electrical Characteristics находим, что максимальный ток через пин ввода-вывода составляет 40мА:


Исключением является вывод PB5 (RESET), чей порт значительно слабже и не может быть использован в качестве общей линии для светодиодов. Поэтому я оставлю его для подключения датчика тряски.

Итак, максимально допустимый ток через порт ввода-вывода составляет 40мА, и, поскольку приведенная схема предполагает одновременное свечение четырех светодиодов, ток через каждый из них должен быть менее 10мА. Это требование выполняют резисторы R1..R4, их номинал 470Ом и при использовании аккумулятора 3.7В ток через светодиод составит около 2мА. Этого достаточно для яркого свечения даже с учетом того, что светодиоды горят не постоянно, а переключаются: сначала включаются светодиоды с общим катодом, затем с общим анодом. Переключение происходит очень быстро, за счет чего создается видимость одновременного свечения светодиодов.

В качестве датчика тряски я пробовал использовать SW-520D (с двумя шариками внутри) и SW-18020P  (с пружинкой), но не получил желаемого результата: первый хорошо срабатывает при тряске в определенном направлении - по оси датчика, другой реагирует на удар. Для обнаружения тряски они не подошли, поэтому я сделал такой датчик сам. Он состоит из пружинки с грузом на конце и кольца из проволоки, об которое ударяется груз при тряске.



И, наконец, питание схемы. Минимальное напряжение для ATtiny85 составляет 2.7В, требований по току у нашей схемы можно сказать что нет. Поэтому для питания подойдет любой литиевый аккумулятор. И чтобы не разбирать кубик для подзарядки аккумулятора я рекомендую добавить в него плату заряда.

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

Изготовление корпуса

Для корпуса я взял дощечку толщиной 5мм и напилил из нее стенки будущего кубика размером 5x5см. Затем сточил торцы стенок под углом 45° для их последующей склейки.



В одной из стенок нужно просверлить отверстия для светодиодов. Ее потом удобно использовать при запайке светодиодов в макетную плату.


На другой стенке я сделал отверстие для платы зарядки и вывел индикацию заряда. На фото ниже представлены детали моего кубика:



Конечно, это не самый простой способ изготовления корпуса. Можно, например, высверлить/выпилить полость для установки компонентов в толстой доске, после чего прикрепить верхнюю и нижнюю стенки. В конце концов можно выбрать любой подходящий корпус, не обязательно в форме куба.

Программирование и скетч

Программирование ATtiny85 я осуществлял из среды Ардуино, для этого в нее должна быть добавлена поддержка данного микроконтроллера. О том как это делается можете прочитать в публикации Знакомство с ATtiny85. Для заливки скетчей требуется программатор, если у вас его нет, то в качестве программатора можно использовать плату Ардуино.

Скетч для кубика можно скачать по ссылке. Алгоритм его работы следующий:

  1. При включении питания поочередно выводим все 6 значений после чего переводим микроконтроллер в режим энергосбережения. Пробуждение микроконтроллера возможно по прерыванию от датчика.
  2. После пробуждения необходимо удостовериться, что срабатывание датчика вызвано не случайно. Для этого фиксируем срабатывания датчика в течении некоторого времени.
  3. Убедившись, что срабатывание датчика было не случайным, запускаем бегущий огонь. В противном случае переходим к пункту 5.
  4. По окончании срабатывания датчика, то есть когда кубик перестали трясти, выводим случайное значение от 1 до 6 на несколько секунд.
  5. Переводим микроконтроллер в режим энергосбережения.

Обращаю внимание на то, что кубик использует все 6 выводов микроконтроллера, включая вывод Reset. То есть данный вывод должен быть настроен на использование в качестве обычной линии ввода-вывода. Это осуществляется установкой фьюза RSTDISBL. Запрограммировав данный фьюз мы лишимся вывода Reset и возможности работать с ATtiny85 через ISP программатор. При необходимости фьюз RSTDISBL может быть сброшен, данную процедуру я описывал в публикации Восстановление фьюзов ATtiny85. Я же на время отладки скетча залил в ATtiny85 загрузчик micronucleus. Это позволило использовать все 6 линий ввода-вывода и загружать скетчи как в обычный Digispark, без программатора. Но оставлять загрузчик в готовом кубике я не рекомендую: micronucleus рассчитан на частоту контроллера 16МГц, а для его стабильной работы на такой частоте требуется питание 3.8В или выше. Микроконтроллер может заработать при напряжении питания ниже указанного но стабильность не гарантируется.

Порядок программирования ATtiny85 для игрального кубика следующий:
  1. Подготавливаем программатор и соединяем его с микроконтроллером. Предполагается, что вы уже ознакомились с программированием ATtiny85 по приведенной ранее публикации.
  2. Настраиваем микроконтроллер на тактирование 1МГц от внутреннего RC генератора. Для этого нужно выбрать соответствующее значение в меню Инструменты -> Clock и выполнить команду Записать загрузчик.
  3. Загружаем скетч в микроконтроллер.
  4. Программируем фьюз RSTDISBL. Для этого переходим в каталог Arduino_dir\hardware\tools\avr\bin\, запускаем командную строку и выполняем в ней команду записи значения 0x5F в старший конфигурационный байт. При использовании Ардуино в качестве программатора эта команда выглядит следующим образом:
avrdude -C ../etc/avrdude.conf -c arduino -P com26 -b 19200 -p t85 -U hfuse:w:0x5F:m

Только не забудьте изменить номер com порта на свой.

Я пользуюсь программатором usbasp, для него данная команда выглядит так:

avrdude -C ../etc/avrdude.conf -c usbasp -p t85 -U hfuse:w:0x5F:m

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


3 комментария:

  1. Вот наткнулся - делают подобные штуки, только в виде настольного сувенира с прозрачной платой https://www.youtube.com/watch?v=jvw5OCUHaqc

    ОтветитьУдалить
  2. исходя из огромного размера кубика, мне кажется, что проще добавить 8 разрядный регистр, и тогда только 1 порт использовать, 5 свободных.

    ОтветитьУдалить