- PVSM.RU - https://www.pvsm.ru -
Сутки добрые, читатели!
Пару недель назад представитель федерации по кикбоксингу нашего региона поставил мне задачу, сделать то, что позволит сократить время проведения соревнований на 30% методом автоматизации, кибернизации, механизации и прочей «ции». Человек он простой, прямой, и сильный так, что отказать у меня не было возможности. Задача была принята.
Изучив регламент проведения боев, и вспоминая прошлые соревнования было установлено, что 20-30% от соревнований отнимают следующие пункты:
В среднем около 3-5 минут
Задача встала в следующем: необходимо оперативно передавать информацию об очках главному судье, то есть «запрограммировать 6 кнопок».
Для решения задачи были рассмотрены следующие аппаратные варианты:
Первый вариант решения технической части задачи был отметен сразу же так как я себе сложно представлял как поведет себя USB мышь на расстоянии 15-20 метров от компьютера главного судьи.
Второй вариант показался мне более реальным.
Центром сбора данных я возложил на контроллер ARDUINO.
На столах боковых судей размещается судейские пульты, которые имеют 2 кнопки: красная и синяя. Информация об нажатиях этих кнопок собирается контроллером Arduino и передается программе установленной на ноутбуке.
Программа анализирует нажатия кнопок и выдает информацию по итогу боя и набранных балах бойцом.
Главный судья на основании результатов боя объявляет победителя.
Со схемой все просто, каждую отдельную кнопку ставлю на отдельный вход микроконтроллера. Резисторы использовал 2.4 кОм. Я не стал использовать сдвиговый регистр так как не умею с ним работать, а под текущую задачу PIN-ов хватает с лихвой.
Состав пульта:
Состав контроллера:
В программе для контроллера все взято из примеров. Ждем нажатия кнопок, учитывая дребезжание контактов и шлем все 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 кнопка конец
}
Во первых сразу же делюсь кодом Скачать исходный код [1].
Весь код написан делфи XE3 так как учил его в школе. И небольшая описательная часть:
Программа писалась за одну ночь, поэтому о красоте не может быть и речи.
Прокладка кабелей от центрального блока до боковых судей
Работа судьи
По итогу двух дневных соревнований был разыгран полный комплект наград проведено более 150 боев.
Благодаря сэкономленному времени спортсмены уехали по своим городам на 4 часа раньше планированного времени
Спасибо за внимание.
Автор: mtop
Источник [2]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/open-source/33621
Ссылки в тексте:
[1] Скачать исходный код: https://docs.google.com/file/d/0B6tCFxCR5IdOTlUxbGlRUUZfaTg/edit?usp=sharing
[2] Источник: http://habrahabr.ru/post/178633/
Нажмите здесь для печати.