Aiuto per gestire output in mame

Tutto quello che c'è da sapere lo trovate qui.
hashmaker
Gamer
Gamer
Messaggi: 58
Iscritto il: 02/01/2019, 18:57
Reputation: 0

Re: Aiuto per gestire output in mame

Messaggio da hashmaker » 13/01/2019, 22:02

con questo funziona pero una sola volta ^^ però sto per arrivarci non è cosi?

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;
int timer;

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

}

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

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
optoState = digitalRead(optoPin);
}
else {
digitalWrite(relePin, LOW); //STOP rilascio gettoni
}

}
void tokensCountDown() {

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);
}
}
}
void tempo() {

if ((optoState != LOW && millis()-timer>5000)) {
lastOptoState = optoState;
digitalWrite(relePin ,LOW);
}
}



Avatar utente
Barito
Arcade Maniac
Arcade Maniac
Messaggi: 3740
Iscritto il: 08/12/2015, 19:18
Reputation: 843

Re: Aiuto per gestire output in mame

Messaggio da Barito » 13/01/2019, 22:11

Rileggi il mio intervento precedente: devo aver editato finché facevi test
Dal ciglio della strada osservo sbraitando i lavori in corso nel mondo arcade...

hashmaker
Gamer
Gamer
Messaggi: 58
Iscritto il: 02/01/2019, 18:57
Reputation: 0

Re: Aiuto per gestire output in mame

Messaggio da hashmaker » 13/01/2019, 22:58

non ci riesco [throw.gif] [throw.gif] [throw.gif] [throw.gif] aspetto te [help2.gif] [help2.gif]

Avatar utente
Barito
Arcade Maniac
Arcade Maniac
Messaggi: 3740
Iscritto il: 08/12/2015, 19:18
Reputation: 843

Re: Aiuto per gestire output in mame

Messaggio da Barito » 14/01/2019, 9:34

Prova questo:

Codice: Seleziona tutto

#define TIMEOUT 5000

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

void setup(){
pinMode(optoPin, INPUT_PULLUP); //l'opto deve rilevare un segnale...
pinMode(relePin, OUTPUT); //il relè lo riceve.
optoState = digitalRead(optoPin); //inizializzazione stato optoPin
digitalWrite(relePin, LOW);
Serial.begin(9600); //inizio comunicazione seriale
}

void loop(){
checkForCredits(); //ricezione dei crediti da mamehooker
releaseTokens(); //azionamento del relè
tokensCountDown(); //cuntdown del numero di gettoni "fisici" rilasciati
}

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

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 (40); //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
       myTimer = millis(); //"azzero" il timer per timeout
       //Serial.print("numero gettoni:");
       //Serial.println(coins);
    }
}
}

void timeOut(){
  if(coins == 0 && millis() - myTimer > TIMEOUT){
      digitalWrite(relePin ,LOW);
  } 
}

Dal ciglio della strada osservo sbraitando i lavori in corso nel mondo arcade...

hashmaker
Gamer
Gamer
Messaggi: 58
Iscritto il: 02/01/2019, 18:57
Reputation: 0

Re: Aiuto per gestire output in mame

Messaggio da hashmaker » 14/01/2019, 12:40

non succede nulla .

Avatar utente
Barito
Arcade Maniac
Arcade Maniac
Messaggi: 3740
Iscritto il: 08/12/2015, 19:18
Reputation: 843

Re: Aiuto per gestire output in mame

Messaggio da Barito » 14/01/2019, 13:00

Cioè? Si scassa tutto il codice o semplicemente il motore continua ad erogare come in precedenza?
Nota che la funzione timeOut() è da inserire nel loop (perché... Mi sono dimenticato di farlo io )
Dal ciglio della strada osservo sbraitando i lavori in corso nel mondo arcade...

hashmaker
Gamer
Gamer
Messaggi: 58
Iscritto il: 02/01/2019, 18:57
Reputation: 0

Re: Aiuto per gestire output in mame

Messaggio da hashmaker » 14/01/2019, 13:11

ho inserito timeout nel loop ma non succede nulla ( intendo dire che se non passano monete il rele continua su on)

Avatar utente
Barito
Arcade Maniac
Arcade Maniac
Messaggi: 3740
Iscritto il: 08/12/2015, 19:18
Reputation: 843

Re: Aiuto per gestire output in mame

Messaggio da Barito » 14/01/2019, 13:23

L'unico motivo che vedo per cui potrebbe restare attivo è che il numero di coins non vada a zero ...

prova ad inserire una funzione debug semplice, tipo:

Codice: Seleziona tutto

void debug(){
Serial.print("numero gettoni:");
Serial.println(coins);
}
e vedi che dice il monitor seriale nelle varie fasi
Dal ciglio della strada osservo sbraitando i lavori in corso nel mondo arcade...

hashmaker
Gamer
Gamer
Messaggi: 58
Iscritto il: 02/01/2019, 18:57
Reputation: 0

Re: Aiuto per gestire output in mame

Messaggio da hashmaker » 14/01/2019, 13:39

(edit by barito: scusa, ho editato invece di quotare e non so come richiamare quello che avevi scritto)

hashmaker
Gamer
Gamer
Messaggi: 58
Iscritto il: 02/01/2019, 18:57
Reputation: 0

Re: Aiuto per gestire output in mame

Messaggio da hashmaker » 14/01/2019, 13:46

ci sono eccolo è giusto ?????

void timeOut(){
if(coins > 0 && millis() - myTimer > TIMEOUT && digitalRead(relePin) == 1){
digitalWrite(relePin ,LOW);
Serial.print("refill");
coins = 0;
}
}

hashmaker
Gamer
Gamer
Messaggi: 58
Iscritto il: 02/01/2019, 18:57
Reputation: 0

Re: Aiuto per gestire output in mame

Messaggio da hashmaker » 14/01/2019, 13:48

non ancora , me lo fa anche a rele spento :(

Avatar utente
Barito
Arcade Maniac
Arcade Maniac
Messaggi: 3740
Iscritto il: 08/12/2015, 19:18
Reputation: 843

Re: Aiuto per gestire output in mame

Messaggio da Barito » 14/01/2019, 13:55

allora appena aggiunto il debug a monitor esce una sfilza di numero gettoni 0 a loop , ho appena dato 1x 1x 1x per emulare 3 monete e a monitor mi esce a loop numero monete 1
ok, dunque all'inizio il numero di coins è zero (lo impostiamo noi infatti), ma se dai crediti, si ferma a "1" e non va a zero, come sospettavo.

Confermi?
Dal ciglio della strada osservo sbraitando i lavori in corso nel mondo arcade...

hashmaker
Gamer
Gamer
Messaggi: 58
Iscritto il: 02/01/2019, 18:57
Reputation: 0

Re: Aiuto per gestire output in mame

Messaggio da hashmaker » 14/01/2019, 14:10

non so come spiegartelo . Cioe appena lancio mi esce un loop di numero gettoni = 0 . Se incremento il credito comincia l'erogazione e comincia il countdown e dopo 10 secondi si ferma per refill e torna a numero gettoni 0

con queste modifiche attuali

#define TIMEOUT 10000

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

void setup(){
pinMode(optoPin, INPUT_PULLUP); //l'opto deve rilevare un segnale...
pinMode(relePin, OUTPUT); //il relè lo riceve.
optoState = digitalRead(optoPin); //inizializzazione stato optoPin
releState = digitalRead(relePin);
digitalWrite(relePin, LOW);
Serial.begin(9600); //inizio comunicazione seriale
}

void loop(){
checkForCredits(); //ricezione dei crediti da mamehooker
releaseTokens(); //azionamento del relè
tokensCountDown(); //cuntdown del numero di gettoni "fisici" rilasciati
timeOut();
debug();

}

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

void releaseTokens(){
if(coins>0){digitalWrite(relePin, HIGH); //rilascio gettoni
releState = 1 ; }
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 (40); //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
myTimer = millis(); //"azzero" il timer per timeout
//Serial.print("numero gettoni:");
//Serial.println(coins);
}
}
}

void timeOut(){
releState = digitalRead(relePin);
optoState = digitalRead(optoPin);
if(releState == HIGH && coins > 0 && millis() - myTimer > TIMEOUT ) {
digitalWrite(relePin ,LOW);
Serial.print("refill");
coins = 0;
releState = 0;
myTimer = millis();
}
}
void debug(){
Serial.print("numero gettoni:");
Serial.println(coins);
}

hashmaker
Gamer
Gamer
Messaggi: 58
Iscritto il: 02/01/2019, 18:57
Reputation: 0

Re: Aiuto per gestire output in mame

Messaggio da hashmaker » 14/01/2019, 14:13

cioe attualmente questo timer me lo fa anche a rele spento ed e questo che non va bene , dovrebbe farlo solo quando il rele e acceso

Avatar utente
Barito
Arcade Maniac
Arcade Maniac
Messaggi: 3740
Iscritto il: 08/12/2015, 19:18
Reputation: 843

Re: Aiuto per gestire output in mame

Messaggio da Barito » 14/01/2019, 14:18

Tu continui a modificare lo sketch accazzo e poi analizzi l'effetto: non puoi procedere così o non vai da nessuna parte. Il relè è un output: non puoi fare lettura di stato! Puoi solo impostare il suo stato.
Dal ciglio della strada osservo sbraitando i lavori in corso nel mondo arcade...

Avatar utente
Barito
Arcade Maniac
Arcade Maniac
Messaggi: 3740
Iscritto il: 08/12/2015, 19:18
Reputation: 843

Re: Aiuto per gestire output in mame

Messaggio da Barito » 14/01/2019, 14:24

Questo è lo sketch fin qui più "sensato"

Codice: Seleziona tutto

#define TIMEOUT 5000

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

void setup(){
pinMode(optoPin, INPUT_PULLUP); //l'opto deve rilevare un segnale...
pinMode(relePin, OUTPUT); //il relè lo riceve.
optoState = digitalRead(optoPin); //inizializzazione stato optoPin
digitalWrite(relePin, LOW);
Serial.begin(9600); //inizio comunicazione seriale
}

void loop(){
checkForCredits(); //ricezione dei crediti da mamehooker
releaseTokens(); //azionamento del relè
tokensCountDown(); //cuntdown del numero di gettoni "fisici" rilasciati
//timeOut(); //se non passano gettoni da un po', ferma il motore.
//debug();
}

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

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 (40); //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
       myTimer = millis(); //"azzero" il timer per timeout
       //Serial.print("numero gettoni:");
       //Serial.println(coins);
    }
}
}

void timeOut(){
  if(coins == 0 && millis() - myTimer > TIMEOUT){
      digitalWrite(relePin ,LOW);
  } 
}

void debug(){
Serial.print("numero gettoni:");
Serial.println(coins); 
}
La funzione timeOut è disabilitata perchè inutile. Per come è messo ora, timeOut è un hack e complica solo le cose.

Se il motore non si ferma è perchè i gettoni non vanno mai a zero. La funzione releaseTokens() più semplice di così non potrebbe essere: se ci sono zero coins, blocca il rele. Ne cazzi ne mazzi. Controllo che viene eseguito almeno almeno 10 volte al secondo. il relè non si blocca? non hai zeero coins. Il relè si aziona ma il motore non si blocca? Il relè non è adatto al motore.
Dal ciglio della strada osservo sbraitando i lavori in corso nel mondo arcade...

hashmaker
Gamer
Gamer
Messaggi: 58
Iscritto il: 02/01/2019, 18:57
Reputation: 0

Re: Aiuto per gestire output in mame

Messaggio da hashmaker » 14/01/2019, 15:27

e io sono cosi :D :D :D in ogni caso ci sono riuscito ... almeno credo .... ossia ho messo un reset (correggimi se sbaglio ) del timer al passaggio delle monete (quindi quando passano le monete il timer non va mai a 0 ) ... di conseguenza quando il timer va a 0 .... fa fermare il rele con il messaggio a seriale refill

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;
unsigned long startTime;
#define TIMEOUT 10000

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

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) {
// Se il motore è fermo, memorizzo il momento in cui parte.
// In questo modo mi assicuro di impostare la variabile solo al fronte di salita di relePin
if(digitalRead(relePin) == LOW){
startTime = millis();
}
digitalWrite(relePin, HIGH); //rilascio gettoni
optoState = digitalRead(optoPin);
}
else {
digitalWrite(relePin, LOW); //STOP rilascio gettoni
}

// Solo se il motore è ancora acceso, dopo 10 secondi dall'attivazione, resetto l'uscita
if(digitalRead(relePin) == HIGH){
if(millis() - startTime > TIMEOUT ){
digitalWrite(relePin, LOW); //STOP rilascio gettoni
Serial.println("refill");
coins = 0;
delay(100);
}
}

}

void tokensCountDown() {
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
startTime = millis(); //reset timer
Serial.print("numero gettoni:");
Serial.println(coins);
}
}
}

hashmaker
Gamer
Gamer
Messaggi: 58
Iscritto il: 02/01/2019, 18:57
Reputation: 0

Re: Aiuto per gestire output in mame

Messaggio da hashmaker » 14/01/2019, 15:30

Dai non ti arrabbiare .... sta funzionando :D :D :D [flame2.gif] [yahoooooo.gif] [shake2.gif] [clap2.gif] [Laie_73.gif]

e in piu ti autorizzo [spank.gif]

Avatar utente
Barito
Arcade Maniac
Arcade Maniac
Messaggi: 3740
Iscritto il: 08/12/2015, 19:18
Reputation: 843

Re: Aiuto per gestire output in mame

Messaggio da Barito » 14/01/2019, 15:54

Non mi arrabbio, ma manco mi ascolti però [ph34r.GIF.png]

Non ha senso scrivere

Codice: Seleziona tutto

if(digitalRead(relePin) == HIGH)
perchè il relèPin è un'uscita! Sei tu che imponi se sia a stato logico alto o basso. Se ti devi chiedere in che stato sia, significa che non hai compreso il codice, e si torna al (primo?) post che ti ho scritto: devi comprendere il codice, riga per riga, se vuoi venirne fuori. Lo stai riempiendo di hack e non è l'approccio giusto. Ad un certo punto ti ritroverai ad aggiungere hack su hack per ovviare ai problemi introdotti dagli hack precedenti.
Dal ciglio della strada osservo sbraitando i lavori in corso nel mondo arcade...

hashmaker
Gamer
Gamer
Messaggi: 58
Iscritto il: 02/01/2019, 18:57
Reputation: 0

Re: Aiuto per gestire output in mame

Messaggio da hashmaker » 14/01/2019, 17:00

pero per adesso sta funzionando e anche bene . non si blocca ne si impalla ne nulla .
ora sto pensando di integrare un messaggio di windows ( tipo i messaggi di errore) che mi stampa a desktop quando c'e da fare il refill e quante monete deve ancora erogare.

Rispondi