Palmari con ardunio standalone ed RS485

Ciao a tutti,
volevo condividere un mio progetto in fase evolutiva da fare per novembre.

Io tiro con l'arco e una cosa bella sono i punteggi in quasi tempo reale.

Per chi non lo sapesse una gara di tiro con l'arco si svolge così:

  • tira il primo gruppo
  • tira il secondo gruppo
  • si vanno a raccogiere le frecce tutti assieme segnando su 2 score i punteggi dei 4 membri del paglione
  • si torna dietro la linea di tiro

questo periodo viene chiamato volèe.

Io nel momento in cui si segnano le frecce vorrei fare uno score di carta (obbligatorio per regolamento) e lo score di controllo (secondo score) farlo con un piccolo terminale.

Questo permetterebbe i punteggi in tempo reale.

Ho subito pensato ad arduino ed a quanto è azzeccato come prodotto ma mettere un arduino in ogni palmare è costoso quindi via di standalone :wink:

Ora sono nella fase di prototipazione su breadboard.

Il palmare una volta completato l'inserimento dei punteggi deve inviare a un pc (sono 13 terminale ed 1 pc) la serie di dati raccolti che il pc utilizza per fare una classifica generale.
Come protocollo uso RS485, convertito da dei MAX488, LCD16x4 (su breadboard è un 16x2 intanto) controllato da un PCF8574 via I2C per risparmiare pin, come pulsanti non uso dei veri e propri pulsanti ma ho deciso di usare capsense e una seconda basetta che tenga i pulsanti.

Non ho domande, volevo solo rendervi partecipi, il codice è in sviluppo e da come lo sviluppo direte che sono pazzo e poco ottimizzato ma a chiunque serva lo posto :wink:

Allego anche schema, domani se ho il tempo vedo di mettere una foto della breadboard (sto ancora collegando i fili maniacalmente).

Ditemi che ne pensate :wink:

(il codice è ancora da ottimizzare per capsense, ho messo un joystick tipo della play con il pulsante centrale e dei potenziometri che leggono l'inclinazione ma avendo usato una semplice funzione è modificabile facilmente, la parte riguardante la comunicazione è completamente da rivedere ma credo terrò l'idea di usare un'interrupt)

virtus_palmari.pde (il main insomma)

#include<String.h>
#include <stdlib.h>

/*
 * LCD RS pin to digital pin 12
 * LCD Enable pin to digital pin 11
 * LCD D4 pin to digital pin 5
 * LCD D5 pin to digital pin 4
 * LCD D6 pin to digital pin 3
 * LCD D7 pin to digital pin 2
 * 10K resistor:
 * ends to +5V and ground
 * wiper to LCD VO pin (pin 3)
 */
 
int posizione = 0;

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x20,16,2);

void setup() {
  Serial.begin(115200);
  // set up the LCD's number of columns and rows: 
  lcd.init();
  // Print a message to the LCD.
  lcd.print(" Arcieri Virtus");
  crchar();
 // settings();
}

void loop() {
  lcd.noCursor();
  principale();
}

char.pde

byte a[8] = {
  B10001,
  B01110,
  B01110,
  B01110,
  B00000,
  B01110,
  B01110,
};
byte b[8] = {
  B00001,
  B01110,
  B01110,
  B00001,
  B01110,
  B01110,
  B00001,
};
byte c[8] = {
  B10001,
  B01110,
  B01111,
  B01111,
  B01111,
  B01110,
  B10001,
};
byte d[8] = {
  B00011,
  B01101,
  B01110,
  B01110,
  B01110,
  B01101,
  B00011,
};

void crchar() {
  lcd.createChar(0, a);
  lcd.createChar(1, b);
  lcd.createChar(2, c);
  lcd.createChar(3, d);
}

database.pde

int palmare=1;
String paglione = "1";

int lcdpos;
int complete = 0;
String nome[4] = {"alberto", "gianni", "elisabetta", "lorenzo"};
int freccia[4][3] = {{10, 10, 10}, {10, 10, 10}, {10, 10, 10}, {10, 10, 10}};
int totali[4] = {0, 0, 0, 0};
int volee = 1;
int selected = 1;
int fcsel = 1;
String lettera[5] = {"0", "A", "B", "C", "D"};
//int posizione = 0;
int readin=0;
int pot1pin=A0;
int pot2pin=A1;
int swpin=A3;
int pot1=0;
int pot2=0;
int sw=0;
int visual[2] = {1,2};
int colresp[4] = {2, 5, 8, 8};
int change[2] = {0, 0};
int line = 0;
String lineprincnot[4] = {"1A "+nome[0], "1B "+nome[1], "1C "+nome[2], "1D "+nome[3]};
String lineprincsel[4] = {palmare + "  " + nome[0], palmare + "  " + nome[1], palmare + "  " + nome[2], palmare + "  " + nome[3]};
String data ;
int lastbut = 2;
String risp[4] = {"A", "B", "C", "D"};
byte inByte;

include.pde

void principale() {
  lcdpos = 1;
  lcd.noCursor();
  fcsel = 1;
  posizione = 0;
  delay(200);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print(palmare);
  lcd.print("  05/006");
  while(posizione != 1) {
/*    if((nome[selected-1] == "") && (posizione==3)){
      while((nome[selected-1] == "") || (selected == 1)) selected--; 
      if(nome[selected-1] == "") {
        selected--;
      }  
    }
    if((nome[selected-1] == "") && (posizione==2)){
      while((nome[selected-1] == "") || (selected == 5)){
        selected++;
      }
      if(nome[selected-1] == "") {
        selected++;
      }
    } */
    posizione = 0;
    posizionesw();
    if(change[0] = 1) {
      lcd.setCursor(0,1);
      lcd.print(risp[selected-1]);
      lcd.print(lineprincsel[selected-1]);
      lcd.print("        ");
      lcd.setCursor(15,1);
      lcd.print(volee);
      lcd.setCursor(10, 0);
      lcd.print(freccia[selected-1][0]+freccia[selected-1][1]+freccia[selected-1][2]);
      change[0] = 0;
    }
    switch(posizione) {
    case 1: 
      // premuto
      arciere(selected);
      change[1] = 1;
      break;
    case 2:
      // su
      if(selected != 1) selected--;
      change[0] = 1;
      break;
    case 3:
      // giù
      if(selected != 4) {
        selected++;
      }
      change[0] = 1;
      break;
    }
    delay(200);
  }
  change[1] = 1;
  posizione = 0;
}
void arciere(int number) {
  int lcdpos=2;
  if(nome[number-1] == "") {
    arciere(number+1);
  }
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print(palmare + lettera[number] + " " + nome[number-1]);
  delay(200);
  posizione = 0;
  while(posizione != 1) {
    if(change[1] = 1) {
      lcd.setCursor(14, 0);
      lcd.print(freccia[selected-1][0]+freccia[selected-1][1]+freccia[selected-1][2]);
      if((freccia[selected-1][0]+freccia[selected-1][1]+freccia[selected-1][2]) < 10) {
        lcd.setCursor(15, 0);
        lcd.print(" ");
      }
      for(int i=0; i<=2; i++) {
        lcd.setCursor(colresp[i], 1);
        if(freccia[number-1][i] == 0) { 
          lcd.print("M"); 
        }
        else { 
          lcd.print(word(freccia[number-1][i])); 
        }
        if(freccia[number-1][i] != 10) {
          lcd.setCursor(colresp[i]+1, 1);
          lcd.print(" ");
        }
        lcd.setCursor(colresp[fcsel-1], 1);
      }
    }
    change[1] = 0;
    lcd.cursor();
    switch(posizione) {
    case 1:
      // premuto
      principale();
      break;
    case 3:
      // su
      if(freccia[number-1][fcsel-1] != 10) {
        freccia[number-1][fcsel-1]++;
      }
      change[1] = 1;
      break;
    case 2:
      // giù
      if(freccia[number-1][fcsel-1] != 0) {
        freccia[number-1][fcsel-1]--;
      }
      change[1] = 1;
      break;
    case 4:
      // dx
      if(fcsel != 3) {
        fcsel++;
      }
      change[1] = 1;
      break;
    case 5:
      // sx
      if(fcsel != 1) {
        fcsel--;
      }
      change[1] = 1;
      break;
    }
    posizionesw();
    delay(180);
    posizionesw();
  }
  principale();
  fcsel = 1;
}
void posizionesw() {
  pot1 = analogRead(pot1pin);
  pot2 = analogRead(pot2pin);
  sw = analogRead(swpin);
  if(sw > 1000) {
    // premuto
    posizione = 1;
  }

  else if(pot1 > 1000) {
    // giù
    posizione = 3;
  }
  else if(pot1 < 100) {
    // su
    posizione = 2;
  }

  else if(pot2 > 1000) {
    // dx
    posizione = 4;
  }
  else if(pot2 < 100) {
    // sx
    posizione = 5;
  }
  else {
    posizione = 0;
  }
}

void settings() {
  crchar();
  Serial.write("Entro in settings");
  lcd.setCursor(0,1);
  lcd.print(" Setting  up... ");
  delay(50);
}

void interrupt() {
  if(Serial.available()) {
    inByte = Serial.read();
    if(inByte == 49){
      Serial.print(freccia[0][0] + freccia[0][1] + freccia[0][2]);
      Serial.print(",");
      Serial.print(freccia[1][0] + freccia[1][1] + freccia[1][2]);
      Serial.print(",");
      Serial.print(freccia[2][0] + freccia[2][1] + freccia[2][2]);
      Serial.print(",");
      Serial.println(freccia[3][0] + freccia[3][1] + freccia[3][2]);
      totali[0] += (freccia[0][0] + freccia[0][1] + freccia[0][2]);
      totali[1] += (freccia[1][0] + freccia[1][1] + freccia[1][2]);
      totali[2] += (freccia[2][0] + freccia[2][1] + freccia[2][2]);
      totali[3] += (freccia[3][0] + freccia[3][1] + freccia[3][2]);
      for(int i=0; i=3; i++) {
        for(int g=0; g=2; g++) {
          freccia[i][g] = 10;
        }
      }
    }
  }
}

Come detto è solo un primo abbozzo completamente da rivedere e ottimizzare.
http://img51.imageshack.us/img51/7158/schemacompleto.png

che ne dite? :wink: