home | area personale         schemi | tutorial | robotica | pic micro | recensioni         forum | chat irc         faq | contatti         store | Ordina PCB
username
password
cerca

 
FORUM: Pic Micro
Tutto quanto riguarda questi microprocessori... progetti, suggerimenti, aiuti, discussioni...ecc


gettoniera con arduino....aiuto
     
Autore Messaggio opzioni
tatone





postato il:
19.04.2017, alle ore 10:51
palombo:
NB: nel mio intervento di prima avevo inteso la funzione millis() come lettura della corrente....come non detto

Il pin 2 deve avere una res di pullup abilitata meglio se messa esternamente tra il +5 e il pin 2 (una 10k va bene). Questo perchè l'uscita della RM5 è un open collector


ti ringrazio! in questo modo mi hai risolto un problema, gentilissimo.
ma ne uscito un altro, ma questo e un problema della gettoniera cioe':
la gettoniera (se collegata nel suo gioco da bar ) se inserisco 0,50€ mi da 5 impulsi, se inserisco 1€ ne da 10, inserendo 2€ ne da 20. Ogni 5 impulsi da un credito(nel gioco).

MA collegata ad arduino, mi da a volte: con 0,50€ 2 impulsi, a volte 5 a volte 3.
Mi da sballati gli impulsi anche inserendo 1€ oppure 2€.
Vorrei poter (risolvendo una cosa alla volta) che ogni 5 impulsi dia un credito (visto che la gettoniera e tarata in questo modo)
esempio: dopo ogni 5 impulsi accenda un led collegato al pin 4
Parlo di led, perche' proverei con un led, ma in pratica servirebbe per un cabinato arcade a dare un credito. grazie
palombo




una ogni 10 livelli


postato il:
19.04.2017, alle ore 18:28
nel loop principale resetti ogni volta
 static float coinValue = 0;  

quindi è chiaro che per es arrivando un treno di 5 impulsi quando inserisci una moneta da 50 cent ad ogni loop coinValue si resetta quindi non avrai il coinValue=5 al termine del treno di impulsi generato dall'inserimento dei 50 cent.
Invece di resettarlo ad ogni loop lo devi solo controllare e quando diventa >=5 ci sottrai proprio 5 e dai un impulso sul pin 4 come dici tu, che segnala appunto il credito raggiunto di 50cent


Attenzione che quel codice non usa interrupt, quindi se ad arduino ci fai fare anche altre cose troppo lunghe (tipo generare l'impulso che dici tu sul pin 4) è chiaro che poi si potrebbe perdere il credito per strada.



"senza parole"...sennò ci tassano pure quelle!
gironico




una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli


postato il:
19.04.2017, alle ore 19:44
in questo caso, secondo me se non usi l'interrupt qualcosa come dice palombo te la perdi, ti basta un delay da qualche parte per far fare qualcosaltro ad ardu, per non parlare di utilizzare un lcd....

qui secondo me è spiegato bene, nel tuo caso basta semplicemente implementarla.... ed ad occhiaccio puoi lasciar perdere il conteggio con i millis per leggere gli impulsi...

l'interrupt una volta risvegliato dalla gettoniera aggiorna una variabile che poi ti gestirai...

secondo me con interrupt ti giri meno le scatole e sarà più affidabile dei millis, per questo motivo all'inizio ti avevo detto che probabilmente mancava un pezzo legato all'interrrupt



Piano bimbo fai piano. La Vigna è grande e il trattore è sempre quello che è!
gironico




una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli


postato il:
19.04.2017, alle ore 19:45
sorry ... mancava il link per prendere informazioni sull'uso interrupt

http://www.maffucci.it/2012/06/11/appunti-su-arduino-interru…



Piano bimbo fai piano. La Vigna è grande e il trattore è sempre quello che è!
palombo




una ogni 10 livelli


postato il:
20.04.2017, alle ore 13:14
oggi sono in vena di aiuti...
 
const byte coinPin = 2; //collega la gettoniera al DIGPIN 2 
static unsigned long prevCoinMillis = 0; 
static float coinValue = 0; 
static float coinOut = 0; 

void setup() 

Serial.begin(9600); 
pinMode(coinPin, INPUT); //definisce coinPin come un input 


void loop() 



unsigned long prevCoinMillis = millis(); 
if(digitalRead(coinPin) == LOW) 

while (digitalRead(coinPin) == LOW)


if(millis() - prevCoinMillis >= 10) 

coinValue += 0.10; 



if(coinValue>=0.50) 

coinValue -=0.50;  
coinOut +=1; 
Serial.println (coinOut);
coinOut = 0;


}


provato con proteus e funzionante
Certo che un interrupt è esagerato (sarebbe sempre più professionale) per leggere impulsi che durano sui 50-100mS provenienti dalla gettoniera
Se notate ho portato la durata minima del segnale ammessa a 10mS
if(millis() - prevCoinMillis >= 10)
così qualsiasi cosa tu debba aggiungere non deve superare mai i 30mS per evitare di perdersi un campionamento



"senza parole"...sennò ci tassano pure quelle!
tatone





postato il:
21.04.2017, alle ore 13:33
palombo:
oggi sono in vena di aiuti...
 
const byte coinPin = 2; //collega la gettoniera al DIGPIN 2 
static unsigned long prevCoinMillis = 0; 
static float coinValue = 0; 
static float coinOut = 0; 

void setup() 

Serial.begin(9600); 
pinMode(coinPin, INPUT); //definisce coinPin come un input 


void loop() 



unsigned long prevCoinMillis = millis(); 
if(digitalRead(coinPin) == LOW) 

while (digitalRead(coinPin) == LOW)


if(millis() - prevCoinMillis >= 10) 

coinValue += 0.10; 



if(coinValue>=0.50) 

coinValue -=0.50;  
coinOut +=1; 
Serial.println (coinOut);
coinOut = 0;


}


provato con proteus e funzionante
Certo che un interrupt è esagerato (sarebbe sempre più professionale) per leggere impulsi che durano sui 50-100mS provenienti dalla gettoniera
Se notate ho portato la durata minima del segnale ammessa a 10mS
if(millis() - prevCoinMillis >= 10)
così qualsiasi cosa tu debba aggiungere non deve superare mai i 30mS per evitare di perdersi un campionamento


sei veramente molto gentile. come lo provo ti faccio sapere. grazie
picmicro675




una ogni 10 livelli


postato il:
21.04.2017, alle ore 16:40
Palombo sarà il più "gettonato" di Grix
tatone





postato il:
21.04.2017, alle ore 21:36
ho "tarato" (lasciatemi passare questa parola) lo sketch con la mia gettoniera e il risultato e' questo:

const byte coinPin = 2; //collega la gettoniera al DIGPIN 2
static unsigned long prevCoinMillis = 0;
static float coinValue = 0;
static float coinOut = 0;

void setup()
{
Serial.begin(9600);
pinMode(coinPin, INPUT); //definisce coinPin come un input
}

void loop()
{


unsigned long prevCoinMillis = millis();
if(digitalRead(coinPin) == LOW)
{
while (digitalRead(coinPin) == LOW)
{
}
if(millis() - prevCoinMillis >= 10)
{
coinValue += 0.10;
}
}

if(coinValue>=0.10)
{
coinValue -=0.10;
coinOut +=0.10;
Serial.println (coinOut);
coinOut = 0;
}

}


con questi parametri il monitor seriale segna giusti gli impulsi della gettoniera, ma non so come impostare un uscita cioe' dopo tot. di impulsi si accenda un led, ci sto provando a modificare lo sketch ma non ne sono capace
picmicro675




una ogni 10 livelli


postato il:
21.04.2017, alle ore 23:17
Puoi registrare con millis() o con delay. Il secondo è bloccante ed aspetta che il tempo sia trascorso.
if (coinValue >= 0.5) {
    if ((prevCoinMillis + 5000) <=(millis()) {
        // resto delle azioni. Attenzione a non modificare prevCoinMillis in modo da aspettare 5 secondi
    }
}
tatone





postato il:
22.04.2017, alle ore 07:47
picmicro675:
Puoi registrare con millis() o con delay. Il secondo è bloccante ed aspetta che il tempo sia trascorso.
if (coinValue >= 0.5) {
    if ((prevCoinMillis + 5000) <=(millis()) {
        // resto delle azioni. Attenzione a non modificare prevCoinMillis in modo da aspettare 5 secondi
    }
}


non riesco ad aggiungere questo pezzo di sketch perche' mi continua a dare errori
invece per dirgli di accendere il led(dargli un impulso dopo tot di impulsi) e giusto aggiungere questo?

 digitalWrite(Led, HIGH);
delay (100);
digitalWrite(Led, LOW); 


in pratica uscirebbe cosi:

 const byte coinPin = 2; //collega la gettoniera al DIGPIN 2 
const byte Led = 13; //collega il led al DIGPIN 13 
static unsigned long prevCoinMillis = 0;  
static float coinValue = 0;  
static float coinOut = 0;  

void setup()  
{  
Serial.begin(9600);  
pinMode(coinPin, INPUT); //definisce coinPin come un input  
pinMode(Led, OUTPUT); //definisce Led come output
}  

void loop()  
{  


unsigned long prevCoinMillis = millis();  
if(digitalRead(coinPin) == LOW)  
{  
while (digitalRead(coinPin) == LOW) 
{  
}  
if(millis() - prevCoinMillis >= 10)  
{  
if(coinValue >= 0.10)
digitalWrite(Led, HIGH);
delay (100);
digitalWrite(Led, LOW);  
}  
}  

if(coinValue>=0.10)  
{  
coinValue -=0.10;   
coinOut +=0.10;  
Serial.print ("Hai inserito EURO "); 
Serial.println (coinOut); 
coinOut = 0; 
}  

}  


il pezzo tuo invece non so come impostarlo
segui questo thread con grixFC, per questa funzione devi aver installato il software grixFC

torna su
     

Come utente anonimo puoi leggere il contenuto di questo forum ma per aprire una discussione
o per partecipare ad una discussione esistente devi essere registrato ed accedere al sito




 

 
 
indietro | homepage | torna su copyright © 2004/2017 GRIX.IT - La community dell'elettronica Amatoriale