Постановка задачи
Сутки добрые, Хабраюзеры!
Пару недель назад представитель федерации по кикбоксингу нашего региона поставил мне задачу, сделать то, что позволит сократить время проведения соревнований на 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 метровом кабеле
- В программе нужно переработать интерфейс, чем и занимаюсь к подготовке соревнований по боксу
- Программе необходимы дополнения связанные с выводом на табло и звуковыми эффектами
- Использование стандартного сетевого кабеля для подключения кнопок и разъемы значительно удешевило всю конструкцию в целом
Спасибо за внимание.
ссылка на оригинал статьи http://habrahabr.ru/post/178633/
Добавить комментарий