Счетчик забитых голов для аэрохоккея и минифутбола

Добрый день, форумчане.
Затеял я собрать аэрохоккей, да не простой, а золотой с автоматическим счетчиком голов.
Суть идеи: в воротах установлены пары лазер-фоторезистор, как в фильмах про шпионов, работает как кнопка, лазер пропал, ардуино считает это нажатием кнопки и засчитывает гол, пробовал собрать такую кнопку а uno, но при быстром проведении через лазер не успевает среагировать ардуинка, а шайба будет залетать быстро, но на случай если не получится с лазером думаю поставить кнопку типа как у шахматистов на часах, гол забил, кнопку нажал. Можно ли ускорить реакцию на обрыв лазера? В проекте будет pro mini, пока собираю на uno потому что она с планкой распаяна и шьется удобнее.
Счетчик и индикатор голов. Есть у меня spi пиксели WS 2812 (вроде такой чип), затея такая. При включении огоньки побегают и всё выключается, при первом голе загорается первый пиксель зеленым, потом второй, но первый остается и т.д, после 10 гола начинается второй круг и первый пиксель при 11 голе загорается желтым и так до 20 голов, после 20 голов (может быть 30 будет, добалю еще цикл с другим цветом) у проигравшего пиксели включаются красным, а у победителя радостно мигают и переходит в ждущий режим до обнуления кнопки которая тоже будет выведена. При всём этом таких индикаторов и лазерных кнопок по 2 штуки, (по 1 для каждого игрока) и ардуино следит за тем в какие ворота гол и начисляет в нужный счет.
Решил начать с простого, и научится включать пиксели нажатием простой кнопки, но воз и ныне там. Подключил библиотеку AdaFruit NeoPixel, помигал пикселями, даже поменял режимы нажатием кнопки, а как реализовать задуманное не пойму пока. Тяжко дается понимание того что в интернетах нахожу. Направьте в нужное место, где можно найти информацию. Ардуиной баловался лет 12 назад, тогда всё получалось, с тех пор делал пару-тройку подходов, но не осилил второй раз.
В радиотехнике не шибко силен, но резистор от транзистора отличаю. Заранее всем спасибо за дельные советы.

Очень много слов. Не понятно на какие как реагировать . Например.

с тех пор делал пару-тройку подходов, но не осилил второй раз.

В принципе после этих слов, наверное можно и не отвечать. Т.к. ничего не получится.

По существу. Попробуйте использовать прерывания для определения прерывания лазера. В простейшем случае почитайте про attachInterrupt и напишите простой тестовый скетч.

Совет - двигаться постепенно. Читайте книжки, решайте примеры. Если что непонятно - спрашивайте на форуме.

Только вопросы надо задавать не так. Программу не описывают словами, а вставляют в сообщение в виде кода. Без этого в вашем сообщении и обсуждать особо нечего.

1 лайк

Точно? Вот это что?

Не исключено, что диод… )))

ТС предлагается выбор между резистором и транзистором, диоды мимо кассы.

Мне тут, на днях, при разборке чего-то, попался зверь в корпусе КТ-13 (как у КТ315). На всякие прозвонки выглядит как сборка из двух конденсаторов (с общим … одним концом :slight_smile: ). Вот и думаю, то ли и впрямь сборка из двух конденсаторов, то ли сборка из двух варикапов. Надо бы проверить “на варикапство”.

Тем, например BAV99, и забавен в корпусе sot23 )))

Не спиться… собрал кнопки на аппаратных прерываниях, спасибо @Upper за подсказку, 1 фоторезистор работает отлично, успевает увидеть “гол”, а второй не хочет работать никак, вот код:

int lazer1 = 2;          // Контакт для 1 лазера, который поддерживает прерывания
int lazer2 = 3;          // Контакт для 2 лазера, который поддерживает прерывания
int diod1 = 9;         // Контакт для 1 светодиода, который будет включаться при разрыве лазера
int diod2 = 13;         // Контакт для 1 светодиода, который будет включаться при разрыве лазера
volatile int stat1 = 0;   // Переменная для хранения состояния 1 кнопки
volatile int stat2 = 0;   // Переменная для хранения состояния 2 кнопки
/* Функция-обработчик прерываний 1 */
void btnInterrupt1() {
    stat1 = digitalRead(lazer1);   // Считываем состояние 1 кнопки
    if (lazer1 == FALLING) {           // Если лазер 1 разомкнут

    digitalWrite(diod1, stat1);
}}
/* Функция-обработчик прерываний 2 */
void btnInterrupt2() {
    stat2 = digitalRead(lazer2);   // Считываем состояние 2 кнопки
    if (lazer2 == FALLING) {           // Если лазер 2 разомкнут
      digitalWrite(diod2, stat2);
}
}
void setup() {
  pinMode(lazer1, INPUT_PULLUP);    // Настройка вывода как вход с подтяжкой
  pinMode(lazer2, INPUT_PULLUP);    // Настройка вывода как вход с подтяжкой
  pinMode(diod1, OUTPUT);          // Настройка вывода как выход
  pinMode(diod2, OUTPUT);          // Настройка вывода как выход
  attachInterrupt(digitalPinToInterrupt(lazer1), btnInterrupt1, CHANGE);  // Установка внешнего прерывания
  attachInterrupt(digitalPinToInterrupt(lazer2), btnInterrupt2, CHANGE);  // Установка внешнего прерывания
}
void loop() {
}

как и писал выше, плата uno, если переназначаю порты местами, то всё равно работает только 2 пин, а 3 никак не хочет, физически менял резисторы местами, оба работают только на 2 пине.

В строках 10 и 17 фигня написана.
lazer1и lazer2 , это у тебя переменные int , которые нигде не меняются и типа номера пинов (константы так то должны быть) и ты их сравниваешь с дефайном FALLING , который очевидно равен 2.
Ну как бы понятно, что 2 равен только lazer1.
По факту тебе нужно сравнивать состояние(ты его считываешь строкой выше, с 0

if (stat2 == LOW)… или HIGH, я уж не знаю.
И для первого аналогично.
Опередили.)

По факту ему вообще ничего не надо сравнивать. Надо просто настроить прерывание на FALLING

Да ему и прерывание то не нужно по факту.
Вряд ли у него шайба будет пролетать быстрее 10-50мс.
А в это время можно уложить нехилую такую логику

По факту, фигня в 10 строчке работает, а в 17 не работает, почему? Переменные вводил, потому что хотел чтобы при размыкании менялось состояние диода, разомкнул включился, разомкнул выключился, сейчас пока разомкнуто он включен, когда замкнуто выключается, из этого кода переменные можно убрать наверное, следующим шагом буду делать чтобы stat1 и stat2 увеличивалось на 1 при размыкании, а диод включался/выключался в зависимости от четности значения stat’ов. Но сначала надо понять что не так с пином 3, и как его заставить работать

Ты вообще читал, что я написал ?
Перечитай, но не по диагонали.

Для большего понимания :
FALLING это “внутренняя константа”, определенная внутри библиотеки Arduino.h.
Определена она директивой препроцессора так:

#define FALLING 2

, это значит, что она имеет значение 2.

А теперь расскажи, что с чем ты сравниваешь в строках 10 и 17, и почему результаты сравнения отличаются .

Если вы начинаете спорить, что у вас “и так работает” - то сразу до свиданья

В ответе @Kakmyc подробно разъяснено, “что не так с пином”

Это не нужно. У него проблемы не с FALLING, а с тем что он путает номер пина и уровень сигнала на пине

Хотя если “все работает” в строке 10, то можешь просто в строке 17 заменить FALLING на RISING. Оно начнет “все работать” так же.
:slight_smile:

1 лайк

Ничего он не путает, “все же работает” ему просто надо что бы второй тоже заработал :slight_smile:

Только после этого пусть валит с форума и больше тут вопросов не задает:)

2 лайка

Когда вы пишите обо мне в третьем лице, мне понятнее о чем вы хотите сказать, попробую вечером исправить, вас больше не потревожу своими глупыми вопросами. Я же не спроста напИсал к вам в “песочницу”, а думал что на форуме сидят люди готовые помочь, а не самоутвердиться.