DOMINATOR - это устройство - секундомер для таких видов спорта, как страйкбол, пейнтбол, которые позволяют измерять время нахождения точки с разрешением до секунд. Секундомер оснащен символьным ЖК-дисплеем 16x2 / 20x4. После включения устройства можно переключаться между пунктами меню на дисплее с помощью поворотного энкодера - KY-040. С помощью предметов можно запустить игровой режим DOMINATOR, который реагирует на пользовательские кнопки (вводы), или можно установить время пребывания команды перед игрой в настраиваемом режиме. Этот параметр представляет собой требуемую продолжительность удерживания кнопки до тех пор, пока команда не займет точку. Этот настраиваемый параметр реализуется для количества секунд. Второй настраиваемый параметр - это автоматическое завершение игры для достижения определенного количества часов секундомера с опцией UNLIMITED - когда секундомер ведет счет до бесконечности или после максимального времени отображения на дисплее - 99 часов, 59 минут, 59 секунд. В секундомере используется управляющий микроконтроллер Arduino (Arduino Uno / Nano) или отдельный чип (Atmel) ATmega328P, который контролирует всю системную логику. В игре 2 команды - RED команда a GRE команда, которые играют друг против друга и занимают воображаемую точку, образованную этим устройством - ДОМИНАТОР. В начале игры на дисплее отображается время 00 часов, 00 минут, 00 секунд для RED команда, GRE команда.
Кнопка ДОМИНАТОР использует ввод кнопки для действия по занятию точки членом команды, а также для ввода объекта судьи. Таким образом, всего используются 2 кнопки для 3 сущностей системы, кнопки переключения, подключенные в режиме INPUT_PULLUP. Нажатие кнопки подает сигнал GND на цифровой входной терминал Arduino (сигнал переключения Active-LOW). Используются кнопки переключения, а не кнопки переключения (они не будут реагировать на системную логику, все программное обеспечение всегда будет «нажато»). Настраиваемый DOMINATOR реагирует на длину нажатия, которая устанавливается в меню конфигурации с помощью кодировщика. Требуется удерживать кнопку заданное время. Система не реагирует на короткие нажатия. В расширенной версии также можно установить точку нейтрализации (остановка времени активной команды в точке, если член другой команды удерживает кнопку хотя бы 50% необходимого времени) Время отображается на символьном ЖК-дисплее размером 16x2 или 20x4, который связывается с управляющим микроконтроллером через шину I2C. Если член команды RED команды занимает точку, нажав кнопку, срабатывает зуммер, который сообщает об изменении точки коротким звуковым сигналом. Затем загорится светодиод RED команды на этой станции, и на дисплее начнется добавление времени для этой команды.
Если точка занята командой GRE и член команды нажимает соответствующую кнопку, снова раздается звуковой сигнал, загорается светодиодный индикатор команды GRE, время RED цвета приостанавливается и вычисляется время команды GRE, занявшей точку. Судья должен остановить обе кнопки одновременно, чтобы остановить оба раза. Время останавливается до тех пор, пока точка не будет повторно занята некоторыми командами в системе. Таким образом, этот тип ввода подходит для начала перерыва, но он также может завершить игру для ее оценки. В случае режима игры COUNTDOWN комбинация обеих кнопок предназначена для остановки обратного отсчета времени! Новая игра реализована путем сброса всей платы Arduino с помощью кнопки RST или путем отключения и повторного подключения источника питания. В меню также есть возможность настроить активность / неактивность зуммера, который также можно включить в игру. В игровом режиме DOMINATOR используется зуммер, чтобы объявить о текущем занятии точки. Ластик не существует в DOMINATOR этого типа. В системе может быть реализована вторая игра - обратный отсчет, которая позволяет установить минутный обратный отсчет, пока он должен быть остановлен. Игрок останавливает обратный отсчет, удерживая обе кнопки в течение определенного времени (в зависимости от меню настройки продолжительности нажатия на DOMINATOR).
Arduino Uno / Nano (ATmega328P) | Конвертер I2C для ЖК-дисплея |
GND | GND |
5V | Vcc |
A4 | SDA |
A5 | SCL |
Arduino Uno / Nano (ATmega328P) | Поворотный энкодер - KY-040 |
GND | GND |
5V | + |
D3 | CLK |
D4 | DT |
D5 | SW |
Arduino Uno / Nano (ATmega328P) | LED диоды |
GND | GND |
D6 | IN (RED) |
D7 | IN (GREEN) | Arduino Uno / Nano (ATmega328P) | Кнопки (INPUT_PULLUP) |
GND | GND |
D8 | IN (RED) |
D9 | IN (GRE) | Arduino Uno / Nano (ATmega328P) | Зуммер |
D10 | IO |
GND | GND |
Для проекта Configurable DOMINATOR доступна условно-бесплатная версия (.hex). Версия позволяет отмерить максимум 60 секунд для каждой команды. По достижении этого времени секундомер останавливается. Цель версии - проверить совместимость с вашим оборудованием..Машинные коды, основанные на I2C-адресе преобразователя для ЖК-дисплея, доступны в репозитории Github. Наиболее часто используемые адреса - 0x27 и 0x3F. Если вы не знаете адрес вашего преобразователя, используйте встроенный пример в Arduino IDE -> I2C Scanner, который запишет адрес в интерфейс UART (Serial monitor). Машинный код может быть загружен в микроконтроллер Arduino Uno через программное обеспечение AVRDUDE - часть Arduino IDE или с графическим интерфейсом через XLoader - проще в использовании.
Название прошивки (в папке encoder_dominator) | Предназначен для | Скачать |
encoder_0x27.ino.hex | Символьный ЖК-дисплей размером 16x2 или 20x4 с преобразователем I2C, который обменивается данными по адресу 0x27 | Скачать прошивку |
encoder_0x3F.ino.hex | Символьный ЖК-дисплей размером 16x2 или 20x4 с преобразователем I2C, который обменивается данными по адресу 0x3F | Скачать прошивку |
Библиотека Wire встроена в IDE Arduino, установка не требуется. Программа может быть скомпилирована и проверена связь через шину I2C с символьным ЖК-дисплеем. Конвертер I2C должен быть подключен к Arduino к аппаратным клеммам I2C (SCL к A5, SDA к A4) перед загрузкой программы, этого достаточно даже без дисплея. Полученный адрес дисплея должен быть предоставлен для успешной сборки для Arduino вместе с UID карт RFID.
#include <Wire.h> void setup() { Wire.begin(); Serial.begin(9600); while (!Serial); // Leonardo: wait for serial monitor Serial.println("\nI2C Scanner"); } void loop() { byte error, address; int nDevices; Serial.println("Scanning..."); nDevices = 0; for(address = 1; address < 127; address++ ) { // The i2c_scanner uses the return value of // the Write.endTransmisstion to see if // a device did acknowledge to the address. Wire.beginTransmission(address); error = Wire.endTransmission(); if (error == 0) { Serial.print("I2C device found at address 0x"); if (address < 16) Serial.print("0"); Serial.print(address,HEX); Serial.println(" !"); nDevices++; } else if (error==4) { Serial.print("Unknown error at address 0x"); if (address < 16) Serial.print("0"); Serial.println(address,HEX); } } if (nDevices == 0) Serial.println("No I2C devices found\n"); else Serial.println("done\n"); delay(5000); // wait 5 seconds for next scan }