ciao a tutti,
dopo mesi che non mi dedicavo ad aurduino (nozioni very low level) ho vouluto cimentarmi in questo progetto:
comunicare con una classica gettoniera da distributore automatico.
la mia è questa
http://www.comesterogroup.it/pr-gett-gene-evolution.asp
e qui sotto il suo manuale
http://www.comesterogroup.it/pdf/prodotti/01getto/elettronica/rm5-evol/rm5-00/manuale/man-rm5-ita.pdf
io l'ho programmata con relativo sw come validatore (capitolo 8.1 del manuale)
in breve,
ad ogni canale / pin viene viene associato un valore di moneta letto,
e questo pin passa da un livello alto ad uno basso e ci resta per il tempo preimpostato dal sw (mio caso 50ms)
leggendo questo stato basso sul relativo canale si puo determinare il n di monete lette per ogni valore.
a tal proposito ho cercato di sviluppare uno sketch di base solo per la lettura delle monete.
il mio problema è sebbene a grandi linee funzioni fa comunque diversi errori di conteggio
ho provato a fare un sacco di modifiche per migliorare l'accuratezza ma al momento questo qui sotto è quello che mi ha dato migliori risultati:
utilizzato**Arduino 2009
//contamonete
// gettoniera impostata come validatore: per ogni moneta accettata (chX) invia un livello basso per x millisecondi, impostati in gett
niera 50 ms
int ch1 = 7;
int ch2 = 8;
int ch3 = 9;
int ch4 = 10;
int ch5 = 3;
int ch6 = 4;
int cm = 0;
int cm1 = 0;
int cm2 = 0;
int cm3 = 0;
int cm4 = 0;
int cm5 = 0;
float val1;
float val2;
float val3;
int val4;
int val5;
float somma;
unsigned long test1;
unsigned long test2;
unsigned long test3;
unsigned long test4;
unsigned long test5;
long previousMillis1 = 0; // w
long previousMillis2 = 0;
long previousMillis3 = 0;
long previousMillis4 = 0;
long previousMillis5 = 0;
long interval = 40; //
void setup()
{
pinMode(ch1, INPUT);//0,1
pinMode(ch2, INPUT);//0,2
pinMode(ch3, INPUT);//0,5
pinMode(ch4, INPUT);//1,0
pinMode(ch5, INPUT);//2,0
val1 = 0;
val2 = 0;
val3 = 0;
val4 = 0;
val5 = 0;
somma = 0;
// pinMode(ch6, INPUT);
Serial.begin(9600); // opens serial port, sets data rate to 9600 bps
}
void loop()
{
unsigned long currentMillis = millis();
test1 = digitalRead(ch1); // controllo che il canale dei 10 cent va 0
if( currentMillis - previousMillis1 > interval) { //temporizzazione per evitare false letture
if ( test1== 0 ){
//delay (50);
val1 = val1 + 0.1; //somma i vaolri delle monete
cm1 = cm1++; //conta il numero di monete per ogni canale
previousMillis1 = currentMillis;
}
}
test2 = digitalRead(ch2);
if(currentMillis - previousMillis2 > interval) {
if ( test2== 0 ){
//delay (40);
val2 = val2 + 0.2;
cm2= cm2++;
previousMillis2 = currentMillis;
}
}
test3 = digitalRead(ch3);
if(currentMillis - previousMillis3 > interval) {
if ( test3== 0 ){
//delay (40);
val3 = val3 + 0.5;
cm3= cm3++;
previousMillis3 = currentMillis;
}
}
test4 = digitalRead(ch4);
if(currentMillis - previousMillis4 > interval) {
if ( test4== 0 ){
//delay (40);
val4 = val4 + 1;
cm4= cm4++;
previousMillis4 = currentMillis;
}
}
test5 = digitalRead(ch5);
if(currentMillis - previousMillis5 > interval) {
if ( test5== 0 ){
//delay (40);
val5 = val5 + 2;
cm5= cm5++;
previousMillis5 = currentMillis;
}
}
somma = (val1 + val2 + val3 + val4 + val5);
Serial.println ("somma");
Serial.println (somma);
Serial.println ("Valore per moneta");
Serial.println (val1);
Serial.println (val2);
Serial.println (val3);
Serial.println (val4);
Serial.println (val5);
Serial.println ("n monete per tipo");
Serial.println (cm1);
Serial.println (cm2);
Serial.println (cm3);
Serial.println (cm4);
Serial.println (cm5);
}
nella mia inesperienza penso di aver abusato di variabili.
qualchuno potrebbe aiutarmi ad aumentare l'affidabilitè della lettura?
inizialmente volevo interfacciarla via seriale (ho i protocolli rs232, basta chiederli) ma sebbene da terminale fossi riuscito a comunicare con la gettoniera, con arduino non sono riuscito a gestire la seconda seiriale NewsoftwareSerial e allora ho abbandoanto il progetto.
considerato il il costo contenuto (20 30 euro usata su ebay) ritengo che lo sviluppo di un progetto arduino per questa gettoniera potrebbe tornare utile a molti.
spero vivamente che qualcuno possa aiutarmi
grazie
andrea