Работы Льва на основе набора «Матрешка Z». Проект 3

22 августа 2016
Игра «Перетягивание каната»

Я уже заканчиваю проекты из брошюры к набору. В этой статье я опишу последний, один из самых интересных проектов – игру «Перетягивание каната». Она простая: два человека очень часто нажимают на кнопки (каждый на свою), а побеждает тот, кто сумеет нажать на 20 раз больше, чем соперник.

Это схема. Вроде построена правильно.

В моей модели 10 светодиодов в одном корпусе. В симуляторе такого нет, а 10 светодиодов на «мою» макетку не помещаются. Пришлось в симуляторе брать полноразмерную.

Теперь о составе схемы. 10 светодиодов – всё понятно. Конденсаторы, резисторы, и чип нужны для того, чтобы сигнал с кнопки стал чётким, без «дребезга». Ну и пищалка – сигналы старта и победы.

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

Мои фотографии.

Скетч

   #define BUZZER_PIN  0
#define FIRST_BAR_PIN 4
#define BAR_COUNT10
#define MAX_SCORE20
// глобальные переменные, используемые в прерываниях (см. далее)
// должны быть отмечены как нестабильные (англ. volatile)
volatile int score = 0;
void setup()
{
for (int i = 0; i pinMode(i + FIRST_BAR_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
// Прерывание (англ. interrupt) приостанавливает основную
// программу, выполняет заданную функцию, а затем возобновляет
// основную программу. Нам нужно прерывание на нажатие кнопки,
// т.е. при смене сигнала с высокого на низкий, т.е. на
// нисходящем (англ. falling) фронте
attachInterrupt(INT1, pushP1, FALLING); // INT1 — это 3-й пин
attachInterrupt(INT0, pushP2, FALLING); // INT0 — это 2-й пин
}
void pushP1() { ++score; } // функция-прерывание 1-го игрока
void pushP2() { --score; } // функция-прерывание 2-го игрока
void loop()
{
tone(BUZZER_PIN, 2000, 1000); // даём сигнал к старту.
// пока никто из игроков не выиграл, обновляем «канат»
while (abs(score) int bound = map(score, -MAX_SCORE, MAX_SCORE, 0, BAR_COUNT);
int left = min(bound, BAR_COUNT / 2 - 1);
int right = max(bound, BAR_COUNT / 2);
for (int i = 0; i digitalWrite(i + FIRST_BAR_PIN, i >= left && i }
tone(BUZZER_PIN, 4000, 1000); // даём сигнал победы
while (true) {} // «подвешиваем» плату до перезагрузки
}

Схема трудная, но интересная.

Ждите новых постов. Удачи!

Комментарии

(0) Добавить комментарий