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

Aiuto per gestire output in mame

Messaggio da hashmaker » 07/01/2019, 18:08

buonasera , sto seguendo il vostro forum da svariati giorni e non riesco ancora ad arrivare a capo del mio problema.
Vi spiego brevemente . Ho un cabinato di una slot machine completa di coin hopper e gettoniere e alimentazioni , pero con la scheda del gioco bruciata. Essendo che ho gia in passato costruito un mame cab con un pc e ci ho messo dei giochi arcade, la gettoniera elettronica e quant'altro , mi sn reso conto di avere alcuni giochi di slot-machines . A quel punto ho cominciato a guardare se ci fosse un modo per interfacciare i vari device di una slot e controllarli con mame. Da quel che ho capito , mame + mamehooker + arduino ... dovrebbero risolvere il mio problema. Ok ... ho comprato arduino uno starter kit ( con dentro gia inclusi un modulo rele e un sensore ottico) , successivamente ho settato mamehooker e lanciato il gioco con arduino configurato come ho visto su questo forum in qualche post . Ho sentito i beep e ho modificato il file ini del gioco . Ho dedotto che il led2 era legato al payout e quindi ho impostato che al ricevere di impulsi dal mame del led2 , arduino interpreta e mi apre il rele , collegato a un motorino di un coin hopper senza la scheda logica ( letteralmente smontato e lasciato solo il motorino).Inizialmente come ovvio , lui accendeva e spegneva il rele ad ogni impulso ricevuto e di conseguenza anche il motore si accendeva e spegneva , conseguenza che non eroga il giusto quantitativo di gettoni. al che ho aggiustato un po lo schetch di modo che al ricevere di impulsi da mamehooker attivasse il rele lasciandolo acceso. Successivamente ho aggiunto il sensore ottico e l'ho collegato, e adesso cominciano i miei problemi. Non riesco in nessuna maniera ad effettuare una sorta di countdown su arduino . Mi spiego meglio . Mamehooker da n x impulsi via seriale ad arduino , lui li conta e li tiene in memoria. Successivamente si avvia il rele (motorino) e dovrebbe avvenire il countdown per ogni gettone /impulso che riceve il sensore ottico fino ad arrivare a 0 e fermasi. So che potrebbe andare contro la politica di mame quella del lucro, ma vi posso giurare e garantire che questa macchina sarà usata solo come mobile di arredamento , da un solo utilizzatore (io) , e sopratutto con vecchie lire (per questo ho gia tarato il gioco e la gettoniera ad accettare solo monete da 50 lire). Potreste darmi qualche dritta su come devo compilare lo sketch e eventualmente se ho fatto qualche errore di collegamento dei vari sensori ? Certo della vostra pazienza e esperienza , confido in voi. Allego l'ultimo sketch che ho caricato su arduino e uno che ho usato di debug e una foto dei collegamenti. Ancora grazie

Sketch

#define TIME_OUT 500UL
int pin = 0;
int value = 0;
volatile int credito = 0;
unsigned long myMillis = 0;
bool riscossione = false;
volatile bool ritardo = false;
volatile bool ledONOFF = HIGH;
volatile bool attivaISR = false;

void setup() {
pinMode(3, OUTPUT);
digitalWrite(3, LOW);
pinMode(LED_BUILTIN, OUTPUT);
pinMode(2, INPUT);
digitalWrite(LED_BUILTIN, LOW);
Serial.begin(9600);
}

void loop() {
while (Serial.available() > 0) {
pin = Serial.parseInt();
value = Serial.parseInt();
if (Serial.read() == 'x') {
riscossione = true;
myMillis = millis();
if (value > 0) {
credito ++;
}
}
}
if (riscossione && (millis() - myMillis > TIME_OUT)) {
riscossione = false;
attivaISR = true;
attachInterrupt(digitalPinToInterrupt(2), erogazione, FALLING);
digitalWrite(3, HIGH);
}
if (ritardo) {
digitalWrite(LED_BUILTIN, LOW);
delay(20);
digitalWrite(3, LOW);
ritardo = false;
detachInterrupt (digitalPinToInterrupt(2));
}
}

void erogazione() {
if (attivaISR) {
credito--;
digitalWrite(LED_BUILTIN, ledONOFF);
ledONOFF = !ledONOFF;
if (credito <= 0) {
ritardo = true;
attivaISR = false;
credito = 0;
}
}
}


Questo è lo sketch debug

#define TIME_OUT 500UL
int pin = 1;
int value = 0;
volatile int credito = 0;
unsigned long myMillis = 0;
unsigned long myMillis2 = 0;
bool riscossione = false;
volatile bool ledONOFF = LOW;
bool cambioStato = false;


void setup() {
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, ledONOFF);
Serial.begin(9600);
}

void loop() {
while (Serial.available() > 0) {
//pin = Serial.parseInt();
value = Serial.parseInt();
if (Serial.read() == 'x') {
riscossione = true;
myMillis = millis();
if (value > 0) {
credito ++;
}
}
//Serial.println(pin);
//Serial.print(value);
//Serial.print(" ");
//Serial.println(credito);
}
if (riscossione && (millis() - myMillis > TIME_OUT)) {
if (!cambioStato) {
//Serial.print("erogo ");
//Serial.print(pin);
//Serial.print(" restano ");
//Serial.println(credito-1);
pin++;
cambioStato = true;
myMillis2 = millis();
}
if (millis() - myMillis2 <= TIME_OUT && credito > 0 && cambioStato) {
digitalWrite(LED_BUILTIN, !ledONOFF);
}
else if (millis() - myMillis2 > TIME_OUT && credito > 0 && cambioStato) {
digitalWrite(LED_BUILTIN, ledONOFF);
myMillis = millis();
cambioStato = false;
credito--;
}
if (credito == 0) {
riscossione = false;
//Serial.println("sono qua");
pin = 1;
}
}
}
Non hai i permessi necessari per visualizzare i file allegati in questo messaggio.



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

Re: Aiuto per gestire output in mame

Messaggio da Barito » 07/01/2019, 19:39

Fammela semplicissima: i due componenti (relè e optoswitch) cosa vuoi che facciano?
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 » 07/01/2019, 19:54

il rele attiva un motore 12 volt e l'opto deve tener conto dei gettoni . Spiego meglio , se da mamehooker arduino riceve 10 "impulsi", arduino avvia il rele mentre l'opto conta quanti gettoni passano , tenendo conto sempre del numero di "impulsi" che riceve . In pratica una sorta di conteggio / countdown , e ovviamente quando arriva a 0 deve fermare il rele

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

Re: Aiuto per gestire output in mame

Messaggio da Barito » 07/01/2019, 20:06

Non mi è chiarissima la dinamica (porta pazienza ma io di slot non ne capisco un caiser): tu vorresti che il relè tenga alimentato un motore il tempo necessario di far passare 10 gettoni (motore on - passano gettoni, motore off - blocco flusso gettoni). Il conteggio dei gettoni che passano lo fa l'opto.
Mamehooker che ruolo ha?
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 » 07/01/2019, 20:22

esatto ... io mando da mame il payout , che mamehooker "vede" nel caso di questo gioco come led2
Noto che quando comincia a pagare la slot ( a livello video ) si sentono dei beep , contando i beep e contando i gettoni vinti sono lo stesso numero ( 10 beep 10 gettoni da erogare) . Quindi mamehooker mi legge questa info e la invia a arduino. Con il primo sketch che ho visto dal tuo post il rele passa da stato on /off a intermittenza , ovviamente legato al numero di "impulsi/segnale" che gli arrivano da mamehooker . Poi dovrebbe in teoria occuparsene il sensore a contare e a far fermare il rele . Sempre in base al numero di beep /gettoni /impulsi /segnale che arrivano in principio. Se non e ancora chiaro provo a fare uno schema disegnato

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

Re: Aiuto per gestire output in mame

Messaggio da Barito » 08/01/2019, 6:28

Oggi se trovo un attimo mi guardo lo sketch (anche se dall'uso di interrupts mi sembra di capire che di programmazione ne mastichi)
Dal ciglio della strada osservo sbraitando i lavori in corso nel mondo arcade...

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

Re: Aiuto per gestire output in mame

Messaggio da Barito » 08/01/2019, 9:30

Rileggendo un attimo: la ricezione di input via sertiale è ok e lo sketch conta correttamente il numero di "x" ricevute (una per ogni gettone da rilasciare). Il relè si attiva, quindi possiamo dire che è collegato correttamente.
Il compito dello switch ottico è contare i gettoni erogati, e questi dovranno essere tanti quanti ricevuti precedentemente via seriale (le "x"). Tu non sei ancora sicuro che lo switch ottico sia correttamente funzionante.

Come primo passo io approccerei il problema scrivendo uno sketch minimale solo per testare il funzionamento dello switch ottico. Una volta che sarai sicuro del funzionamento, scriverai uno sketch poco più complesso che conti i gettoni che passano dall'opto.
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 » 08/01/2019, 10:52

esatto , il fatto è che l'opto sembra funzionare , ossia se passo una moneta, come un dito , come qualsiasi cosa il led rosso sul modulo del opto si accende /spegne , e sopratutto è un modulo nuovo appena preso dalla scatola del arduino starter kit . Può essere che non funzioni ? Successivamente in uno sketch che avevo messo , avevo notato che ad ogni passaggio di moneta davanti al sensore , anche il led di arduino si accendeva / spegneva , indicando quindi comunicazione tra il sensore e arduino

Edit. Posso in qualche maniera sostituire il sensore ottico con qualcosa di "homemade" tipo metterci il sensore che sta dentro il mouse? o sto dicendo una bagianata dovuta al risveglio ? [sleep.gif]

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

Re: Aiuto per gestire output in mame

Messaggio da Barito » 08/01/2019, 11:09

Improbabile che non funzioni: sono moduli semplicissimi e praticamente indistruttibili. Inoltre confermi che funziona, quindi... il problema è nel codice.
Io, come dicevo, questo tipo di problema lo affronto "a blocchi": scrivo un codice ridotto per la sola parte che non funziona e poi lo implemento nel main code. Nel caso specifico, potrebbe essere un codice che conti il numero di monete che fai passare.
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 » 08/01/2019, 11:12

e si e come lo faccio ??? in realta è quello il mio piu grande problema , questo codice non l'ho fatto io l'ho preso un po in giro e un po mi sn fatto aiutare da un ragazzo di un forum specifico di arduino , però anche lui sostiene che il modulo non funzioni, cosa che ti sto confermando che no ... perche se con lo sketch di debug , il led arduino si accende spegne sia per gli x ricevuti da mamehooker sia dagli x ricevuti dal sensore , io deduco che funzioni ... correggimi se sbaglio.

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

Re: Aiuto per gestire output in mame

Messaggio da Barito » 08/01/2019, 12:52

Ah, capito. Credevo avessi scritto tutto tu. La cosa è più complicata allora, perchè fare debug senza avere l'hardware è qualcosa che va oltre le mie capacità.
I consigli che posso darti sono due: 1 - verifica che l'opto switch funzioni. Ci sono diversi esempi in rete, tipo >>QUESTO<< (anche se, a dirla tutta, un codice base di pressione pulsante con l'opto al posto del pulsante funzionerebbe benissimo). 2 - apri un topico sul forum arduino, meglio se quello inglese, e vedi se qualcuno che sfoglia codice come fossero le pagine di un buon libro può aiutarti al volo, senza la macchina sotto. Non ti aspettare che ti scrivano il codice che vuoi tu come lo vuoi tu comunque: purtroppo il codice bisogna coccolarlo, pettinarlo e dedicargli molto tempo per farlo fungere bene, e questo lo può fare solo il diretto interessato.
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 » 08/01/2019, 14:10

lo so o meglio immagino. D'altro canto sto cercando man mano di sforzarmi di capire il funzionamento degli sketch e la loro struttura . Cmq grazie ancora per le info che anche se possono sembrare scontate , in realtà mi offrono svariati punti di partenza. Proverò a scrivere come hai detto tu su forum arduino inglese , visto che gia ho scritto su quello italiano , arrivando fino a questo punto :D . Poi non appena riesco , oppure ho qualche altro sviluppo , lo posto qui , cosi potremmo aggiungerlo come tutorial [shake2.gif]

Edit.
ho appena visto il link del debug è ho anche quel tipo di sensore . Posso provare con quello ?

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

Re: Aiuto per gestire output in mame

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

con il debug che mi hai postato posso confermare che il sensore funziona , sia quello che sto utilizzando attualmente , sia l'identico che è nel link

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

Re: Aiuto per gestire output in mame

Messaggio da hashmaker » 08/01/2019, 14:47

dunque ho collegato il sensore del link e ho caricato il seguente codice e ho la situazione che all'erogazione parte il rele però appena passa la prima moneta dall'opto mi si ferma

#define TIME_OUT 500UL
int pin = 0;
int value = 0;
int LED = 13; // Use the onboard Uno LED
int isObstaclePin = 2; // This is our input pin
int isObstacle = HIGH; // HIGH MEANS NO OBSTACLE
volatile int credito = 0;
unsigned long myMillis = 0;
bool riscossione = false;
volatile bool ritardo = false;
volatile bool ledONOFF = HIGH;
volatile bool attivaISR = false;

void setup() {
pinMode(3, OUTPUT);
digitalWrite(3, LOW);
pinMode(LED_BUILTIN, OUTPUT);
pinMode(2, INPUT);
digitalWrite(LED_BUILTIN, LOW);
pinMode(LED, OUTPUT);
pinMode(isObstaclePin, INPUT);
Serial.begin(9600);
}

void loop() {
while (Serial.available() > 0) {
pin = Serial.parseInt();
value = Serial.parseInt();
if (Serial.read() == 'x') {
riscossione = true;
myMillis = millis();
if (value > 0) {
credito ++;
}
}
}
if (riscossione && (millis() - myMillis > TIME_OUT)) {
riscossione = false;
attivaISR = true;
attachInterrupt(digitalPinToInterrupt(2), erogazione, FALLING);
digitalWrite(3, HIGH);
}
if (ritardo) {
digitalWrite(LED_BUILTIN, LOW);
delay(20);
digitalWrite(3, LOW);
ritardo = false;
detachInterrupt (digitalPinToInterrupt(2));
}
}

void erogazione() {
if (attivaISR) {
credito--;
digitalWrite(LED_BUILTIN, ledONOFF);
ledONOFF = !ledONOFF;
if (credito <= 0) {
ritardo = true;
attivaISR = false;
credito = 0;
}
}
isObstacle = digitalRead(isObstaclePin);
if (isObstacle == LOW)
{
Serial.println("OBSTACLE!!, OBSTACLE!!");
digitalWrite(LED, HIGH);
}
else
{
Serial.println("clear");
digitalWrite(LED, LOW);
}
delay(200);
}

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

Re: Aiuto per gestire output in mame

Messaggio da Barito » 08/01/2019, 15:32

Non mi sono spiegato: devi provare l'opto con il codice del link per verificare che funzioni (l'opto).
Verificato che il tuo hardware funziona ed è correttamente collegato, devi ridurre lo sketch al minimo indispensabile per ottenere la funzione che ora non vuole saperne di andare.

La butto li, ripeto non ho tempo ne hardware per provare: prova ad aumentare la costante TIME_OUT 500UL (500UL non so neanche cosa significhi...) e vedi se passa più robba...
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 » 08/01/2019, 16:01

e come ho scritto qualche post su ... l'ho provato con il codice del link e funziona ... dai adesso vedo .. .grazie cmq ti aggiorno

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

Re: Aiuto per gestire output in mame

Messaggio da hashmaker » 09/01/2019, 21:40

a livello informativo , ho caricato uno sketch di un contatore di oggetti , per testare ulteriormente il sensore che a quanto evince il monitor seriale funziona.
Ragion per cui mi sono chiesto se per caso nello sketch che ho , o se per default il sensore quando e su high in realtà mi invia una serie di impulsi, e perciò fa fermare il rele alla prima moneta che passa . In particolar modo mi sono soffermato su questa parte dello sketch

int state=LOW;
int lastState=LOW;
int count=0;

void setup(){

lcd.begin(16, 2);

Serial.begin(9600);
pinMode(8, INPUT);
state=digitalRead(8);
}
void loop(){
if (state==HIGH && lastState==LOW){
count++;
delay (100);
Serial.println(count);
lcd.setCursor(0, 0);
lcd.print("Num. Oggetti: ");
lcd.setCursor(0, 1);
lcd.print(count);

}
lastState=state;
state=digitalRead(8);
}

da come puoi vedere la parte dove dice if (state=HIGH && lastState==LOW) secondo me sarebbe la funzione da integrare allo sketch per far si che il sensore rilevi un impulso per ogni cambio di stato (cioe quando e a low non conta , quando e su high conta 1 , torna su low e non conta , ecc ). E' giusto ? e se si come potrei inserire questa parte di sketch nel mio ?

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

Re: Aiuto per gestire output in mame

Messaggio da Barito » 10/01/2019, 6:38

Il sensore non manda una serie di impulsi, ma un segnale alto o basso in funzione della presenza di un oggetto. Potrebbe essere che quando l'oggetto c'è il segnale sia alto e quando non c'è basso, o viceversa. Ti conviene verificarlo.
La stringa che citi è di cambio stato e serve, in questo caso, a rilevare il passaggio di un oggetto. Un po' come gli interrupts del codice che hai postato all'inizio, quindi userai o l'uno o l'altro (non sono proprio equivalenti, ma l'uso di interrupts richiede qualche accortezza e io lo lascerei stare fossi in te).
Io il consiglio che mi sento di darti e di partire da uno sketch semplice e costruire su quello il tuo codice. Questo che hai postato può essere una buona base di partenza per la fase di countdown (sostituendo tutte le funzioni "lcd" con gli equivalenti "serial" dal momento che tu non hai un modulo lcd collegato ma usi il monitor seriale dell'IDE per il debug).
Lo sketch che vuoi fare è sufficientemente complesso da richiedere che tu sia consapevole del significato di ogni singola riga di codice. Non funzionerà mai altrimenti, anche se lo scrivessi io (che, per inciso, a parte un corso di fortran di 8 ore all'università, sono autodidatta come te).





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

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

Re: Aiuto per gestire output in mame

Messaggio da Barito » 10/01/2019, 9:12

Per dire, il codice di esempio di cui sopra, potresti scriverlo così:

Codice: Seleziona tutto

int optoPin = 8; //questo è il pin a cui è collegato l'optoswitch
bool optoState; //stato dell'opto
bool lastOptoState; //stato precedente dell'opto
int coins = 10;//questo sarà inizializzato nella parte di codice che conta i coin in-game (le "x" insomma). Qui metto "10" per test

void setup(){
Serial.begin(9600);
pinMode(optoPin, INPUT); 
optoState = digitalRead(optoPin); //inizializzazione stato optoPin
}

void loop(){
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 == HIGH && coins > 0){
       coins--;   //decremento gettoni
       Serial.print("numero gettoni:");
       Serial.println(coins);
    }
}
Nel monitor seriale dovresti vedere il conteggio gettoni (variabile "coins") scendere da 10 a zero via via che fai passare un dito di fronte all'opto, bloccando e sbloccando il detector IR.
Di fatto, questo è' il blocco di codice per la gestione del payout (mi pare tu l'abbia chiamato così), senza uso di interrupts (che non è necessariamente un bene eh, anzi, ma è più semplice)

Testalo e fammi sapere
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 » 10/01/2019, 12:36

ho appena testato quello sketch , e sul monitor seriale appena si avvia mi compare

12:35:13.967 -> numero gettoni:9

e se passo un dito davanti al sensore non succede nulla.

Rispondi