Pagina 3 di 5

Re: Aiuto per gestire output in mame

Inviato: 12/01/2019, 17:01
da Barito
Te lo dico solo se ritesti il mio codice...

Re: Aiuto per gestire output in mame

Inviato: 12/01/2019, 18:27
da hashmaker
eccerto che lo ritesto [shake2.gif] ti invio un pm

L'ho appena ricaricato il tuo ultimo sketch, quando vuoi torniamo a provare [Laie_73.gif]

Re: Aiuto per gestire output in mame

Inviato: 12/01/2019, 18:39
da Barito
Basta che modifichi la parte finale mettendo "if credito < 0"


Re: Aiuto per gestire output in mame

Inviato: 12/01/2019, 18:45
da hashmaker
ma questo per quanto riguarda il mio sketch giusto ? mentre per il tuo ? che facciamo ? io sono rimasto alla prova del rele e che non parte , in effetti l'ho ritestato , mi arriva segnale da mamehook pero poi non parte il rele.

Re: Aiuto per gestire output in mame

Inviato: 12/01/2019, 20:40
da Barito
Speravo che avendo risolto la parte hardware anche il mio potesse partire
Si, la modifica è per il tuo: un credito in più

Re: Aiuto per gestire output in mame

Inviato: 12/01/2019, 20:53
da hashmaker
comunque non va , nemmeno con il mio , ma cercando in rete ho trovato questo e lo sto testando a debug con il monitor seriale.

#define SENSOR 2
#define RELAY 3

int pulse=0,count;
char sen,temp;
unsigned long int timer;

void setup()
{
Serial.begin(9600);
pinMode(SENSOR,INPUT_PULLUP);
pinMode(RELAY,OUTPUT);
Serial.println("Coin Hopper ready");
sen=digitalRead(SENSOR);
}

void loop()
{
if(Serial.available())
{
timer=millis();
temp=Serial.read()-'0';
if((temp>0)&(temp<10)) digitalWrite(RELAY,HIGH);
}

sen=(sen<<1)|digitalRead(SENSOR);
sen&=0x03;
if(sen==1)
{
timer=millis();
pulse++;
if(pulse>=temp)
{
digitalWrite(RELAY,LOW);
Serial.println("You get RM"+String(0.5*pulse,2));
pulse=0;
temp=0;
}
}

if((digitalRead(RELAY)==HIGH)&(millis()-timer>2000))
{
digitalWrite(RELAY,LOW);
Serial.println("Out of coin. You get RM"+String(0.5*pulse,2));
pulse=0;
temp=0;
}
}

Dunque con questo e con al posto del sensore un semplice bottone (giusto per test) ho la seguente situazione: appena invio un numero via seriale e do invio il rele si attiva e parte l'erogazione , pero appena premo il bottone una volta si ferma , e a monitor seriale mi da un singolo messaggio , come se fosse passata solo una moneta insomma .
Ora mi chiedo , da questo qui possiamo strutturare per ricevere da mamehook input e aggiustare la parte del conteggio da parte del sensore ? o e troppo sbattimento ?

Re: Aiuto per gestire output in mame

Inviato: 13/01/2019, 9:39
da Barito
Ma come! Avevi detto che il tuo funzionava a parte la questione del gettone in meno! Non ci capisco piu niente
Questo metodo di prendere codici in giro per la rete, verificarne l'ovvio malfunzionamento (dato che nascono per usi diversi) e modificarli non porta da nessuna parte. Ricominci da zero ogni volta così.
Ripeto: se vuoi venirne fuori DEVI comprendere al 100% Il codice, riga per riga, e poi fare le opportune modifiche.

Re: Aiuto per gestire output in mame

Inviato: 13/01/2019, 11:45
da hashmaker
e si . Allora ti spiego bene. Con il mio codice funziona l'erogazione il conteggio e tutto solo che mi eroga sempre e solo una moneta in meno rispetto a quello che deve erogare.
Per esempio mamehook dice di erogare 10 gettoni e me ne eroga 9 cosi via se sono 8 eroga 7. Anche cambiando la variabile che mi hai suggerito.
Inoltre con il mio ho notato anche che di tanto in tanto come se si blocca , ossia dopo n. x di pagamenti non riceve piu comunicazione da mamehook e sono costretto a riavviare il tutto (anche il pc)
Ragion per cui avrei voluto inserire nello skecth una sorta di riavvio di arduino a completamento delle funzioni.
Mentre per quel che riguarda la parte degli sketch presi in giro in rete, è per prima cosa avere un resoconto a monitor seriale , per testare il funzionamento dei singoli componenti (Sensore , rele ecc) successivamente è anche per imparare , ossia la butto li , come mai il mio sketch usa gli interrupt e il tuo no?
Lo so e traviante la cosa , ma io credo anche che il problema 'è davvero una cosa semplice tutto sta a capire dove sta il problema

Re: Aiuto per gestire output in mame

Inviato: 13/01/2019, 12:36
da Barito
Gli interrupts si usano quando si vuole che un evento prioritario non venga perso durante l'esecuzione del loop. Può avere senso usarlo qui, ma onestamente può funzionare anche senza dal momento che il passaggio del gettone ha una durata relativamente lunga.
Appena ho tempo metto un po' di linee per il debug nel codice mio. Non ho tempo ne mmotivazione per studiarmi bene gli altri due, ma tu si!

Re: Aiuto per gestire output in mame

Inviato: 13/01/2019, 13:17
da hashmaker
infatti, sto guardando bene bene il tuo codice e al momento ho questa situazione .

const int optoPin = 8; //questo è il pin a cui è collegato l'optoswitch
const int relePin = 3;
int pin;
int value;
bool optoState; //stato dell'opto
bool lastOptoState; //stato precedente dell'opto
int coins = 8;

void setup(){
pinMode(optoPin, INPUT);
pinMode(relePin, OUTPUT);
optoState = digitalRead(optoPin); //inizializzazione stato optoPin
digitalWrite(relePin, LOW);
Serial.begin(9600); //inizio comunicazione seriale
}

void loop(){
//checkForCredits();
releaseTokens();
tokensCountDown();
}

void checkForCredits(){
while (Serial.available() >= 0) {
pin = Serial.parseInt();
value = Serial.parseInt();
if (Serial.read() == 'x') {
if (value > 0){
coins=coins++;
}
}
}
}

void releaseTokens(){
if(coins > 0){
digitalWrite(relePin, HIGH); //rilascio gettoni
}
else {
digitalWrite(relePin, LOW); //STOP rilascio gettoni
}
}

void tokensCountDown(){
optoState = digitalRead(optoPin); //aggiorniamo lo stato dell'opto
if (optoState != lastOptoState){// se lo stato dell'opto è cambiato (cioè qualcosa sta passando, in entrata o uscita)
lastOptoState = optoState;
delay (100); //debounce "economico" (questo serve perchè nel passaggio di stato possono esserci fluttuazioni che portano a conteggi errati)
if(lastOptoState == LOW && coins > 0){
coins=coins - 1 ; //decremento gettoni
Serial.print("numero gettoni:");
Serial.println(coins);
}
}
}

Questo e il tuo sketch , ho modificato la if (lastoptostate == su LOW perche , con un pulsante al posto del sensore avevo comunque un gettone in meno sulla seriale, impostato su low mi conta i giusti gettoni e fa fermare il rele. A questo punto mancherebbe solo la comunicazione con mamehook e quindi la parte che ho commentato check for credits no?

Re: Aiuto per gestire output in mame

Inviato: 13/01/2019, 13:28
da hashmaker
dunque questo è lo sketch con il check for credits attivato , con al posto del sensore messo il bottone , e quando a monitor seriale invio 1x 1x 1x 1x 1x 1x , comincia l'erogazione e devo premere 6 volte il pulsante per far fermare il rele. Quindi sembra stia funzionando tutto.

const int optoPin = 8; //questo è il pin a cui è collegato l'optoswitch
const int relePin = 3;
int pin;
int value;
bool optoState; //stato dell'opto
bool lastOptoState; //stato precedente dell'opto
int coins = 0;

void setup(){
pinMode(optoPin, INPUT);
pinMode(relePin, OUTPUT);
optoState = digitalRead(optoPin); //inizializzazione stato optoPin
digitalWrite(relePin, LOW);
Serial.begin(9600); //inizio comunicazione seriale
}

void loop(){
checkForCredits();
releaseTokens();
tokensCountDown();
}

void checkForCredits(){
while (Serial.available() > 0) {
value = Serial.parseInt();
if (Serial.read() == 'x') {
if (value > 0){
coins ++;
}
}
}
}

void releaseTokens(){
if(coins > 0){
digitalWrite(relePin, HIGH); //rilascio gettoni
}
else {
digitalWrite(relePin, LOW); //STOP rilascio gettoni
}
}

void tokensCountDown(){
optoState = digitalRead(optoPin); //aggiorniamo lo stato dell'opto
if (optoState != lastOptoState){// se lo stato dell'opto è cambiato (cioè qualcosa sta passando, in entrata o uscita)
lastOptoState = optoState;
delay (100); //debounce "economico" (questo serve perchè nel passaggio di stato possono esserci fluttuazioni che portano a conteggi errati)
if(lastOptoState == LOW && coins > 0){
coins=coins - 1 ; //decremento gettoni
Serial.print("numero gettoni:");
Serial.println(coins);
}
}
}

adesso sostituisco il pulsante con il sensore e faccio sempre la prova a monitor seriale , dopodiche la metto sotto mamehook

Edit. anche con il sensore messo sta funzionando !!!

Re: Aiuto per gestire output in mame

Inviato: 13/01/2019, 13:45
da Barito
Non capisco perché prima non funzionasse, ma sono contento che adesso vada!
Non sarebbe male che mettessi qualche fotina o video di funzionamento così vediamo qualcosa anche noi

Re: Aiuto per gestire output in mame

Inviato: 13/01/2019, 15:16
da hashmaker
faccio subito una foto e un piccolo video e li uppo. Comunque sto facendo 1000 prove , ho notato che quando la ruota dell hopper è vuota , mi da i giusti gettoni, mentre quando gia c'e nel meccanismo di espulsione una moneta , questa il sensore non me la conta , sto provando a modificare il delay , ma senza successo . Come posso fare?

Re: Aiuto per gestire output in mame

Inviato: 13/01/2019, 16:40
da hashmaker
ho trovato il giusto compromesso tra delay e tutto e ora sembra stia funzionando . faccio un paio di milioni di test per vedere se effettivamente va .
L'unica cosa, quando non ci sono piu monete nell'hopper ovviamente questo skecth lo fara girare all'infinito, si puo mettere un temporizzatore che se ad esempio per 10 sec non passano monete dal sensore cmq si spegne il rele.

Re: Aiuto per gestire output in mame

Inviato: 13/01/2019, 18:19
da hashmaker
e che io ho voglia di imparare anche ...
ho provato ad aggiungere questo ma non funziona... dove sto sbagliando ???

void stopifempty() {
if (optoState = lastOptoState) {
optoState = lastOptoState;
delay (5000);
}
else {
digitalWrite(relePin, LOW); //STOP rilascio gettoni
}
}

Re: Aiuto per gestire output in mame

Inviato: 13/01/2019, 19:13
da Barito
Non puoi usare la funzione delay() perché, di fatto, blocca il loop per il tempo che gli imposti. Devi giocare con la funzione millis().

Re: Aiuto per gestire output in mame

Inviato: 13/01/2019, 20:40
da hashmaker
e ho visto e come lo imposto ? Ti prego aiutami manca solo questo e poi ti prometto il video di tutto funzionante .. :D [joint.gif] [joint.gif]

Re: Aiuto per gestire output in mame

Inviato: 13/01/2019, 20:49
da hashmaker
ecco il video

Re: Aiuto per gestire output in mame

Inviato: 13/01/2019, 21:01
da hashmaker
unsigned long int timer;

if((digitalRead(optoPin)==LOW)&(millis()-timer>5000))
{
digitalWrite(relepin ,LOW);

è giusto???

Re: Aiuto per gestire output in mame

Inviato: 13/01/2019, 21:25
da Barito
Lo sai già che non è giusto
Unsigned long, senza int
&&, non solo &
Inoltre devi ri-inizializzare la variabile timer o funzionerà (forse) una sola volta
timer = millis(); ma devi pensare quale condizione imporre (if coins == 0? If optopin == HIGH? Per esempio, ma bisogna pensarci un attimo).
Anche con queste modifiche non funzionerà: non sono al pc e sono di corsaaa