Настольные игры, несомненно, довольно неудобны из-за укатывания и потери кубиков. Отличное решение - электронные игральные кубики.
Нам понадобится
Компоненты
- Плата Arduino
- Макетная плата
- Перемычки
- Семисегментный светодиодный индикатор
- Выходной сдвиговый регистр 74НС595
- Тактовая четырехконтактная кнопка
- 8 резисторов с сопротивлением 220 Ом

Нам понадобится
Принцип работы
В этом проекте мы создадим электронные игральные кубики с использованием семисегментного светодиодного индикатора. При нажатии кнопки импульс посылается на плату Arduino, а дисплей вспыхивает и отображает случайную цифру в диапазоне от 1 до 6.
В этом проекте используется выходной сдвиговый регистр 74НС595 — небольшая интегральная схема с последовательным логическим счетчиком, который позволяет увеличить количество выходов микроконтроллера Arduino путем «сдвига» и хранения данных. Сдвиговый регистр имеет 16 контактов; на одном конце регистра вы увидите точку или полукруг, которая отмечает контакт 1 слева. Контакты пронумерованы против часовой стрелки. На рис. 16.1 показана распиновка, а в таблице 16.1 описывается функция каждого контакта.

Рисунок 16.1: Распиновка сдвигового регистра 74НС595
Перемычка от контакта 2 платы Arduino подключается к кнопке, которая при нажатии передает импульс. Чтобы использовать кубики, нажмите кнопку, чтобы сгенерировать и отобразить случайную цифру.
Сборка
1. Установите семисегментный светодиодный индикатор на макетную плату, убедившись, что он перекрывает канавку; в противном случае противоположные контакты будут замыкаться. Подключите контакт 3 к шине заземления и резисторы с сопротивлением 220 Ом к остальным контактам, за исключением вывода 8, который не используется. Резисторы необходимы для предотвращения выгорания светодиодов индикатора.
2. Установите регистр 74НС595 на макетную плату с маркером с левой стороны. Нижним левым выводом должен быть контакт 1. Регистр должен перекрывать канавку макетной платы, как показано на рис. 16.3.

Таблица 16.1: Контакты сдвигового регистра 74НС595

Рисунок 16.3: Сдвиговый регистр 74НС595 должен перекрывать канавку макетной платы
3. Осторожно выполните подключения между светодиодным индикатором и сдвиговым регистром согласно таблице ниже.

* Для этих контактов нужно устанавливать резисторы с сопротивлением 220 Ом между светодиодным индикатором и сдвиговым регистром.
4. Теперь подключите оставшиеся контакты сдвигового регистра (а также кнопки) к плате Arduino, как показано в следующей таблице.

5. Установите кнопку на макетную плату, перекрыв канавку макетной платы, как показано на рис. 16.4. Подключите ножку с одной стороны кнопки к контакту 2 платы Arduino, а с другой — к контакту GND.

Рисунок 16.4: Кнопка также должна находиться по обе стороны от канавки макетной платы
6. Убедитесь, что ваша цепь соответствует схеме, показанной на рис. 16.5 и загрузите в память Arduino код скетча, приведенный в разделе «Скетч» далее в этом проекте.

Рисунок 16.5: Принципиальная схема цепи электронных костей
Скетч
В коде скетча сначала определяются контакты для управления сдвиговым регистром 74НС595, обеспечивающим работу семисегментного светодиодного индикатора. Когда на светодиодный индикатор подается питание, на нем загорается точка. При нажатии кнопки светодиодные сегменты быстро мигают, как будто игральные кубики встряхиваются. Через некоторое время выводится случайное число в диапазоне от 1 до 6. Нажмите кнопку еще раз, чтобы сымитировать следующий бросок кубиков.
const int latchPin = 8; // Контакты, подключенные к 74HC595 const int clockPin = 12; const int dataPin = 11; const int buttonPin = 2; // Вывод, подключенный к проводу переключения с 1 по 6, и DP (десятичная точка) на 7-сегментном дисплее unsigned char lookup_7seg[] = {0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x80}; // Рисунок встряхивания штампа на 7-сегментном дисплее unsigned char shake_dice[] = {0x63, 0x5C}; // Прокатный штамп на 7-сегментном дисплее unsigned char roll_dice[] = {0x1C, 0x58, 0x54, 0x4C}; // Изменяйте продолжительность времени до получения номера штампа int rand_seed; int rand_num = 0; // Сгенерировать случайное число unsigned char shake_toggle = 0; // Для анимации встряхивания кубиков int index = 0; // Для анимации бросания кубиков int shake_speed; // Ускоряет скорость встряхивания кубиков void setup() { pinMode(latchPin, OUTPUT); // Выходные контакты для управления 74HC595 pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); pinMode(buttonPin, INPUT); // Считывание состояния провода переключателя digitalWrite(latchPin, LOW); // Отображение DP на 7-сегментном дисплее при запуске shiftOut(dataPin, clockPin, MSBFIRST, lookup_7seg[6]); digitalWrite(latchPin, HIGH); randomSeed(analogRead(0)); // Генерировать случайное начальное значение } void loop() { if (digitalRead(buttonPin)) { shake_speed = 150; // Сброс скорости встряхивания штампа delay(30); // Генерация числа для случайной скорости и отображение анимации встряхивания while (digitalRead(buttonPin)) { rand_seed++; // Сгенерировать случайное число // Оживляющий трясущийся штамп if (shake_toggle) { AnimateDice(0, shake_dice); shake_toggle = 0; } else { AnimateDice(1, shake_dice); shake_toggle = 1; } delay(80 + shake_speed); // Ускорение скорости анимации if (shake_speed > 0) { shake_speed -= 10; } } // Анимированный прокатный штамп for (int rolls = 0; rolls < (rand_seed % 10 + 14); rolls++) { AnimateDice(index, roll_dice); delay((1 + rolls) * 20); index++; if (index > 3) { index = 0; } } rand_num = random(0, 6); // Генерация числа, выброшенного на кубик DiceNumber(rand_num); } } // Отображение номера штампа на 7-сегментном дисплее void DiceNumber(unsigned char num) { digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, lookup_7seg[num]); digitalWrite(latchPin, HIGH); } // Отображение одного кадра с трясущимися или катящимися кубиками void AnimateDice(int seg, unsigned char *table) { digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, table[seg]); digitalWrite(latchPin, HIGH); }
Теги:
Почему у вас резисторы с сопротивлением 1 кОм, если вы в начале говорили, что надо с сопротивлением 220 Ом