Moderador

Colider, MT, Brazil
Mestre em Computação. Entusiasta em Programação, adorador da plataforma Arduino e Processing.

quarta-feira, 7 de setembro de 2011

Projeto ScoreBoard

O projeto ScoreBoard (Painel de Pontuação) surgiu da necessidade de controlar o tempo durante as peladas de futebol com a turma da universidade.
Juntamente com o professor André Milhomem, iniciamos então o projeto de construir um scoreboard que pudesse marcar o tempo e os gols, uma vez que as partidas das peladas são disputadas na modalidade 10m ou 2 gols.

A placa foi desenhada utilizando o PCB Design, software livre rodando sob o Linux Ubuntu.

Layout utilizando PCB Layout
Após o desenho utilizou-se o processo manual para transferência do Layout impresso para a Placa de fenolite. Foi adquirido o kit de confecção de PCI SUEKIT CK-10, adquirido no Soldafria. que vem com furador e cortador de placa, percloreto de ferro para corrosão, placa de fenolite, Caneta e vasilhame.

O processo de confeccionar, colocar componentes e soldar é bem demorado, uma vez que são muitos LED's.

Construção da placa com Display de leds difusos
Utilizou-se também um expansor (SHIFT) de porta 74HC595 para cada display. No total, foram utilizados 8 SHIFT's.

Placa em construção
A imagem abaixo simboliza o modo como foram ligados os SHIFT's, o desenho não está bom por causa da pressa, mas eles são ligados em série.

Ligação do Arduino com os SHIFT 74HC595
Utilizou-se uma caixa de MDF por ser mais fácil e barato que o metal para fabricar. Trata-se de uma versão Beta e que tem muito a ser melhorado, principalmente no aspecto físico. Também utilizou-se EVA e uma tampa de acrílico para tentar melhorar o acabamento.

Os vídeos abaixo apresentam o Scoreboard em funcionamento.

a) Parte 1

b) Parte 2
Segue os códigos do Arduino para consulta. Não coloquei referência no código porque pesquisei em muitos lugares métodos que fossem simples, adaptando e alterando até chegar em algo compreensível. Disponibilizo abaixo, deste modo, contribuo com aqueles que também divulgaram e os quais pude utilizar para construí-lo.

Códigos do Arduino
a) TechScore.h

#include "WProgram.h"

const int latchPin = 12; //Pin connected to ST_CP of 74HC595
const int clockPin = 10; //Pin connected to SH_CP of 74HC595
const int dataPin = 8; //Pin connected to DS of 74HC595

const int bt_l = 2;
const int bt_r = 3;

const int TIME_INTERVAL = 1000;
const int FREQ = 1;

const byte Display7SegmCathod[11] = {
  B10001000, //0
  B10111110, //1
  B10010001, //2
  B10010100, //3
  B10100110, //4
  B11000100, //5
  B11000000, //6
  B10011110, //7
  B10000000, //8
  B10000110, //9
  B11111111  // OFF ALL
};
const byte Display7SegmCathod_R[11] = {
  B11000000, //0
  B11110011, //1
  B10100100, //2
  B10100001, //3
  B10010011, //4
  B10001001, //5
  B10001000, //6
  B11100011, //7
  B10000000, //8
  B10000001, //9
  B11111111  // OFF ALL
};
const byte DisplayLed[10] = {
  B01111011, //0
  B01100000, //1
  B00110111, //2
  B01110101, //3
  B01101100, //4
  B01011101, //5
  B01011111, //6
  B01110000, //7
  B01111111, //8
  B01111101  //9
};
const byte DisplayLed_R[10] = {
  B01111011, //0
  B00001010, //1
  B01011101, //2
  B00011111, //3
  B00101110, //4
  B00110111, //5
  B01110111, //6
  B00011010, //7
  B01111111, //8
  B00111111  //9
}; 
 b) TechScore.pde 
 
 
#include "TechScore.h"

int sec_a = 0;
int sec_b = 0;
int min_a = 0;
int min_b = 0;

int point_l1 = 10;
int point_l2 = 10;
int point_r1 = 10;
int point_r2 = 10;

int flag1 = 0;
int flag2 = 0;
int flag3 = 0;
int flag4 = 0;

unsigned long time = 0;
unsigned long time2 = 0;
unsigned long timeago = millis();


void setup() {
  //set pins to output because they are addressed in the main loop
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);

  pinMode(bt_l,INPUT);
  pinMode(bt_r,INPUT);
  Serial.begin(9600);
  limpa();
}

void loop() {

  time = millis();
  
  if(time - timeago > TIME_INTERVAL){
    bt_check();

    timeago = time;
    sec_a++;
    if(sec_a > 9){
      sec_b++;
      sec_a=0;
    }
    if(sec_b > 5){
      min_a++;
      sec_b = 0;
    }
    if(min_a > 9){
      min_b++;
      min_a = 0;
    }
    if(min_b > 9){
      min_b = 0;
    }

    mostra(sec_a,sec_b,min_a,min_b,point_l1,point_l2,point_r1,point_r2);

  }
}

void bt_check(){
  // buttons check    
  if(digitalRead(bt_l) == LOW){

    //flag to on led
    if(flag1 == 0) {
      point_l1 = 0;
      flag1 = 1;
    }

    point_l1++;
    if(point_l1 > 9){
      //flag to on led
      if(flag2 == 0) {
        point_l2 = 0;
        flag2 = 1;
      }

      point_l1 = 0;
      point_l2++;
      if(point_l2 > 1){
        point_l1 = 10;
        point_l2 = 10;
        flag1 = 0;
        flag2 = 0;
      }
    }


  }
  if(digitalRead(bt_r) == LOW){
    //flag to on led
    if(flag3 == 0) {
      point_r1 = 0;
      flag3 = 1;
    }

    point_r1++;
    if(point_r1 > 9){
      //flag to on led
      if(flag4 == 0) {
        point_r2 = 0;
        flag4 = 1;
      }
      point_r1 = 0;
      point_r2++;
      if(point_r2 > 1){
        point_r1 = 10;
        point_r2 = 10;
        flag3 = 0;
        flag4 = 0;
      }
    }

  }
}
void mostra(int _seca, int _secb, int _mina, int _minb,int _btl1,int _btl2, int _btr1, int _btr2){

  send(Display7SegmCathod_R[_btl1]); // first 7 display
  send(Display7SegmCathod_R[_btl2]); //second 7 display
  send(DisplayLed_R[_seca]); // first Led Display
  send(DisplayLed_R[_secb]); // secondf Led Display
  send(Display7SegmCathod[_btr2]); // first 7 display
  send(Display7SegmCathod[_btr1]); //second 7 display
  send(DisplayLed[_minb]); // first Led Display
  send(DisplayLed[_mina]); // secondf Led Display


}

void limpa(){
  send(B11111111); // first 7 display
  send(B11111111); //second 7 display
  send(B00000000); // first Led Display
  send(B00000000); // secondf Led Display
}

void send(byte data){
  //ground latchPin and hold low for as long as you are transmitting
  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, LSBFIRST, data);//MSBFIRST  LSBFIRST
  //return the latch pin high to signal chip that it no longer needs to listen for information
  digitalWrite(latchPin, HIGH);
}

Nenhum comentário:

Postar um comentário