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 ![]()
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 ![]()
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 ![]()
(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? ![]()