Постановка задачи
Сутки добрые, читатели!
Пару недель назад представитель федерации по кикбоксингу нашего региона поставил мне задачу, сделать то, что позволит сократить время проведения соревнований на 30% методом автоматизации, кибернизации, механизации и прочей «ции». Человек он простой, прямой, и сильный так, что отказать у меня не было возможности. Задача была принята.
Изучив регламент проведения боев, и вспоминая прошлые соревнования было установлено, что 20-30% от соревнований отнимают следующие пункты:
- сбор рефери судейских записок после трех раундов
- передача записок главному судье
- подсчет очков
- подведение итогов боя
В среднем около 3-5 минут
Задача встала в следующем: необходимо оперативно передавать информацию об очках главному судье, то есть «запрограммировать 6 кнопок».
Выбор решения
Для решения задачи были рассмотрены следующие аппаратные варианты:
- Манипуляторы Мышь на каждом судейском столе и передача от них информации
- Некий джойстик на каждом судейском столе и передача информации главному судье
Первый вариант решения технической части задачи был отметен сразу же так как я себе сложно представлял как поведет себя USB мышь на расстоянии 15-20 метров от компьютера главного судьи.
Второй вариант показался мне более реальным.
Центром сбора данных я возложил на контроллер ARDUINO.
Исполнение
Этап 1 Общая схема
На столах боковых судей размещается судейские пульты, которые имеют 2 кнопки: красная и синяя. Информация об нажатиях этих кнопок собирается контроллером Arduino и передается программе установленной на ноутбуке.
Программа анализирует нажатия кнопок и выдает информацию по итогу боя и набранных балах бойцом.
Главный судья на основании результатов боя объявляет победителя.
Этап 2 схема подключения
Со схемой все просто, каждую отдельную кнопку ставлю на отдельный вход микроконтроллера. Резисторы использовал 2.4 кОм. Я не стал использовать сдвиговый регистр так как не умею с ним работать, а под текущую задачу PIN-ов хватает с лихвой.
Изготовление
Этап 3 Изготовление пультов
Состав пульта:
- Коробочка
- Кусок монтажной платы
- Кнопки
- Кусочки проводов
- Красная и синяя изолента
- Коннектор RJ45
Этап 4 Изготовление контроллера
Состав контроллера:
- Коробочка из под отверток
- Arduino
- монтажная плата
- Кусочки проводов
- Изолента
- Пачкорды RJ-45
- USB провод
Программирование
Этап 5 программа для контроллера
В программе для контроллера все взято из примеров. Ждем нажатия кнопок, учитывая дребезжание контактов и шлем все COM-порт:
#include <Bounce.h>
#define BUTTON7 7
#define BUTTON6 6
#define BUTTON5 5
#define BUTTON4 4
#define BUTTON3 3
#define BUTTON2 2
#define LED 13
int state7 = 0;
int prevstate7 = 0;
int state6 = 0;
int prevstate6 = 0;
int state5 = 0;
int prevstate5 = 0;
int state4 = 0;
int prevstate4 = 0;
int state3 = 0;
int prevstate3 = 0;
int state2 = 0;
int prevstate2 = 0;
Bounce bouncer7 = Bounce( BUTTON7,5 );
Bounce bouncer6 = Bounce( BUTTON6,5 );
Bounce bouncer5 = Bounce( BUTTON5,5 );
Bounce bouncer4 = Bounce( BUTTON4,5 );
Bounce bouncer3 = Bounce( BUTTON3,5 );
Bounce bouncer2 = Bounce( BUTTON2,5 );
void setup() {
Serial.begin(115200);
pinMode(BUTTON7,INPUT);
pinMode(BUTTON6,INPUT);
pinMode(LED,OUTPUT);
}
void loop() {
// 7 кнопка начало
bouncer7.update ( );
int value7 = bouncer7.read();
if ( value7 == HIGH) {
digitalWrite(LED, HIGH );
state7 = 1;
} else {
digitalWrite(LED, LOW );
state7 = 0;
}
if(state7 != prevstate7){
if(state7 == 1){
Serial.println("7");
}
}
prevstate7 = state7;
// 7 кнопка конец
// 6 кнопка начало
bouncer6.update ( );
int value6 = bouncer6.read();
if ( value6 == HIGH) {
digitalWrite(LED, HIGH );
state6 = 1;
} else {
digitalWrite(LED, LOW );
state6 = 0;
}
if(state6 != prevstate6){
if(state6 == 1){
Serial.println("6");
}
}
prevstate6 = state6;
// 6 кнопка конец
// 5 кнопка начало
bouncer5.update ( );
int value5 = bouncer5.read();
if ( value5 == HIGH) {
digitalWrite(LED, HIGH );
state5 = 1;
} else {
digitalWrite(LED, LOW );
state5 = 0;
}
if(state5 != prevstate5){
if(state5 == 1){
Serial.println("5");
}
}
prevstate5 = state5;
// 5 кнопка конец
// 4 кнопка начало
bouncer4.update ( );
int value4 = bouncer4.read();
if ( value4 == HIGH) {
digitalWrite(LED, HIGH );
state4 = 1;
} else {
digitalWrite(LED, LOW );
state4 = 0;
}
if(state4 != prevstate4){
if(state4 == 1){
Serial.println("4");
}
}
prevstate4 = state4;
// 4 кнопка конец
// 3 кнопка начало
bouncer3.update ( );
int value3 = bouncer3.read();
if ( value3 == HIGH) {
digitalWrite(LED, HIGH );
state3 = 1;
} else {
digitalWrite(LED, LOW );
state3 = 0;
}
if(state3 != prevstate3){
if(state3 == 1){
Serial.println("3");
}
}
prevstate3 = state3;
// 3 кнопка конец
// 2 кнопка начало
bouncer2.update ( );
int value2 = bouncer2.read();
if ( value2 == HIGH) {
digitalWrite(LED, HIGH );
state2 = 1;
} else {
digitalWrite(LED, LOW );
state2 = 0;
}
if(state2 != prevstate2){
if(state2 == 1){
Serial.println("2");
}
}
prevstate2 = state2;
// 2 кнопка конец
}
Этап 6 программа для контроля ведения боя
Во первых сразу же делюсь кодом Скачать исходный код.
Весь код написан делфи XE3 так как учил его в школе. И небольшая описательная часть:
- Используя компоненту ComPort 4.11 подключаемся к com-порту и слушаем его
- в зависимости от настроек боя слушаем порт и результаты выводим в labelX.caption
- в конце боя выводим итог
Программа писалась за одну ночь, поэтому о красоте не может быть и речи.
Подготовка к соревнованиям
Прокладка кабелей от центрального блока до боковых судей
Работа судьи
О том как работает программа
Итоги соревнований
По итогу двух дневных соревнований был разыгран полный комплект наград проведено более 150 боев.
Благодаря сэкономленному времени спортсмены уехали по своим городам на 4 часа раньше планированного времени
Выводы
- Оборудование отработало на ура, без единого сбоя
- Длина проводов от центрального блока до кнопок составляла 20 метров, при этом тестировал кнопки на 100 метровом кабеле
- В программе нужно переработать интерфейс, чем и занимаюсь к подготовке соревнований по боксу
- Программе необходимы дополнения связанные с выводом на табло и звуковыми эффектами
- Использование стандартного сетевого кабеля для подключения кнопок и разъемы значительно удешевило всю конструкцию в целом
Спасибо за внимание.
Автор: mtop