Pull to refresh

6 кнопок

Reading time 4 min
Views 77K


Постановка задачи



Сутки добрые, Хабраюзеры!

Пару недель назад представитель федерации по кикбоксингу нашего региона поставил мне задачу, сделать то, что позволит сократить время проведения соревнований на 30% методом автоматизации, кибернизации, механизации и прочей «ции». Человек он простой, прямой, и сильный так, что отказать у меня не было возможности. Задача была принята.



Изучив регламент проведения боев, и вспоминая прошлые соревнования было установлено, что 20-30% от соревнований отнимают следующие пункты:
  1. сбор рефери судейских записок после трех раундов
  2. передача записок главному судье
  3. подсчет очков
  4. подведение итогов боя

В среднем около 3-5 минут

Задача встала в следующем: необходимо оперативно передавать информацию об очках главному судье, то есть «запрограммировать 6 кнопок».

Выбор решения


Для решения задачи были рассмотрены следующие аппаратные варианты:
  1. Манипуляторы Мышь на каждом судейском столе и передача от них информации
  2. Некий джойстик на каждом судейском столе и передача информации главному судье


Первый вариант решения технической части задачи был отметен сразу же так как я себе сложно представлял как поведет себя USB мышь на расстоянии 15-20 метров от компьютера главного судьи.

Второй вариант показался мне более реальным.
Центром сбора данных я возложил на контроллер ARDUINO.

Исполнение


Этап 1 Общая схема




На столах боковых судей размещается судейские пульты, которые имеют 2 кнопки: красная и синяя. Информация об нажатиях этих кнопок собирается контроллером Arduino и передается программе установленной на ноутбуке.
Программа анализирует нажатия кнопок и выдает информацию по итогу боя и набранных баллах бойцом.
Главный судья на основании результатов боя объявляет победителя.

Этап 2 схема подключения




Со схемой все просто, каждую отдельную кнопку ставлю на отдельный вход микроконтроллера. Резисторы использовал 2.4 кОм. Я не стал использовать сдвиговый регистр так как не умею с ним работать, а под текущую задачу PIN-ов хватает с лихвой.

Изготовление


Этап 3 Изготовление пультов



Состав пульта:
  1. Коробочка
  2. Кусок монтажной платы
  3. Кнопки
  4. Кусочки проводов
  5. Красная и синяя изолента
  6. Коннектор RJ45









Этап 4 Изготовление контроллера


Состав контроллера:
  1. Коробочка из под отверток
  2. Arduino
  3. монтажная плата
  4. Кусочки проводов
  5. Изолента
  6. Пачкорды RJ-45
  7. 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 так как учил его в школе. И небольшая описательная часть:
  1. Используя компоненту ComPort 4.11 подключаемся к com-порту и слушаем его
  2. в зависимости от настроек боя слушаем порт и результаты выводим в labelX.caption
  3. в конце боя выводим итог

Программа писалась за одну ночь, поэтому о красоте не может быть и речи.

Подготовка к соревнованиям



Прокладка кабелей от центрального блока до боковых судей






Работа судьи


О том как работает программа





Итоги соревнований


По итогу двух дневных соревнований был разыгран полный комплект наград проведено более 150 боев.
Благодаря сэкономленному времени спортсмены уехали по своим городам на 4 часа раньше планированного времени


Выводы


  1. Оборудование отработало на ура, без единого сбоя
  2. Длина проводов от центрального блока до кнопок составляла 20 метров, при этом тестировал кнопки на 100 метровом кабеле
  3. В программе нужно переработать интерфейс, чем и занимаюсь к подготовке соревнований по боксу
  4. Программе необходимы дополнения связанные с выводом на табло и звуковыми эффектами
  5. Использование стандартного сетевого кабеля для подключения кнопок и разъемы значительно удешевило всю конструкцию в целом


Спасибо за внимание.

UPD-1 : По кнопкам.
специально выбрал такие кнопки по следующим причинам:
1. обратная связь тактильная. щелчек при нажатии
2. кнопки не имеют свободного хода
3. у кнопок со свободным ходом есть не приятность они срабатывают раньше чем чувствуется щелчок
4. пользователи системы люди с мышцами, а не любители няшных кнопок
5. обратная связь светодиодом бесполезна ибо взор судьи направлен на ринг, а не на руки

UPD-2: бюджет данной сборки вряд ли перевалил 3000 руб

UPD-3 По просьбам исходники на github
Tags:
Hubs:
If this publication inspired you and you want to support the author, do not hesitate to click on the button
+125
Comments 113
Comments Comments 113

Articles