Aiuto per gestire output in mame
Re: Aiuto per gestire output in mame
come da tuo consiglio sto cercado di ridurre all'osso lo skecth e quindi con il seguente , ho questa situazione . Appena lo collego e apro il monitor seriale , ad ogni passaggio di moneta mi conta 1 . Quindi da ignorante presumo che questa deve essere la base per tutto il resto.
int state=LOW;
int lastState=LOW;
int count=0;
void setup(){
Serial.begin(9600);
pinMode(8, INPUT);
state=digitalRead(8);
}
void loop(){
if (state==HIGH && lastState==LOW){
count++;
delay (100);
Serial.println(count);
}
lastState=state;
state=digitalRead(8);
}
questo e il risultato del monitor seriale ad ogni passaggio di moneta
12:39:24.690 -> 1
12:39:37.038 -> 2
12:39:37.297 -> 3
12:39:39.126 -> 4
12:39:40.331 -> 5
12:39:42.106 -> 6
12:39:43.531 -> 7
12:39:44.502 -> 8
12:39:45.395 -> 9
12:39:46.245 -> 10
12:39:46.830 -> 11
12:39:47.090 -> 12
12:39:47.536 -> 13
int state=LOW;
int lastState=LOW;
int count=0;
void setup(){
Serial.begin(9600);
pinMode(8, INPUT);
state=digitalRead(8);
}
void loop(){
if (state==HIGH && lastState==LOW){
count++;
delay (100);
Serial.println(count);
}
lastState=state;
state=digitalRead(8);
}
questo e il risultato del monitor seriale ad ogni passaggio di moneta
12:39:24.690 -> 1
12:39:37.038 -> 2
12:39:37.297 -> 3
12:39:39.126 -> 4
12:39:40.331 -> 5
12:39:42.106 -> 6
12:39:43.531 -> 7
12:39:44.502 -> 8
12:39:45.395 -> 9
12:39:46.245 -> 10
12:39:46.830 -> 11
12:39:47.090 -> 12
12:39:47.536 -> 13
Re: Aiuto per gestire output in mame
Avevo dimenticato di aggiornare lo stato dell'opto
![[on_eek.gif] [on_eek.gif]](./images/smilies/icon_cheesygrin.gif)
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(){
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 == HIGH && coins > 0){
coins--; //decremento gettoni
Serial.print("numero gettoni:");
Serial.println(coins);
}
}
Dal ciglio della strada osservo sbraitando i lavori in corso nel mondo arcade...
Re: Aiuto per gestire output in mame
sei un grande , funziona mi scala da 9 a 0 ... però adesso ? integrarlo con l'ingresso che arriva da seriale ad arduino e far accendere ìl rele , poi quando questo contatore ritorna a 0 farlo fermare no ?
Re: Aiuto per gestire output in mame
Prova questo, ma dubito possa funzionare al primo colpo...
Codice: Seleziona 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) {
pin = Serial.parseInt();
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 == HIGH && coins > 0){
coins--; //decremento gettoni
//Serial.print("numero gettoni:");
//Serial.println(coins);
}
}
}
Dal ciglio della strada osservo sbraitando i lavori in corso nel mondo arcade...
Re: Aiuto per gestire output in mame
gia... non parte il rele
Re: Aiuto per gestire output in mame
È collegato al pin 3?
Dal ciglio della strada osservo sbraitando i lavori in corso nel mondo arcade...
Re: Aiuto per gestire output in mame
certo ho anche controllato
Re: Aiuto per gestire output in mame
Ok. Dobbiamo testare la funzione "releaseTokens". Imposta a 10 la variabile coins e disabilita le altre due funzioni nel loop. Puoi semplicemente cancellarle (solo nel loop, non serve altrove) o mettere prima del call due slash // (cioè le rendi commento). Prova e vedi che fa.
Dal ciglio della strada osservo sbraitando i lavori in corso nel mondo arcade...
Re: Aiuto per gestire output in mame
allora con la variabile coins su 10 appena si avvia si accende anche il rele . Con la variabile a 0 si avvia con il rele spento
Re: Aiuto per gestire output in mame
Ok, adesso abilita anche la funzione tokensCountDown lasciando disabilitata checkForCredits. Imposta 10 coins. Passa il dito di fronte all'opto per scalare crediti fino ad esaurimento e far fermare il relè.
Dal ciglio della strada osservo sbraitando i lavori in corso nel mondo arcade...
Re: Aiuto per gestire output in mame
è da impazzirci non si ferma il rele ... passando 10 monete ... come passandone 100
Re: Aiuto per gestire output in mame
Ma adesso stai ancora testando su breadboard o hai fatto modifiche hardware? Perché prima il count down lo faceva, mentre ora sembra di no dal comportamento del relè...
Dal ciglio della strada osservo sbraitando i lavori in corso nel mondo arcade...
Re: Aiuto per gestire output in mame
sono nudo e crudo su breadboard e nn ho fatto nessuna modifica hardware
Re: Aiuto per gestire output in mame
Fare debug senza hardware è un problema, che ti devo dire.
Fai un ultimo tentativo per stasera: abilita tutte le funzioni e sostituisci coins++ e coins-- rispettivamente con coins=coins+1 e coins=coins-1. Non cambierà un cazzo ma a volte...
Fai un ultimo tentativo per stasera: abilita tutte le funzioni e sostituisci coins++ e coins-- rispettivamente con coins=coins+1 e coins=coins-1. Non cambierà un cazzo ma a volte...
Dal ciglio della strada osservo sbraitando i lavori in corso nel mondo arcade...
Re: Aiuto per gestire output in mame
niente da fare appena provato .se non altro sto anche provando direttamente dal gioco anche e , cosa che ci tengo a farti notare che dal segnale di mamehook adesso c'e sempre comunicazione con arduino (led rx e tx si accendono a intermittenza) pero come ti ho detto non parte il rele. Va beh , magari domani è un giorno migliore
![[shake2.gif] [shake2.gif]](./images/smilies/shake2.gif)
![[throw.gif] [throw.gif]](./images/smilies/throw.gif)
![[shake2.gif] [shake2.gif]](./images/smilies/shake2.gif)
Re: Aiuto per gestire output in mame
Bene ho una grandissima novità .
Con il seguente codice e con l'abbassare dei volt del motorino
(da 24 volt sono sceso a 7.5) ho avuto il giusto compromesso tra velocita di erogazione dei gettoni e lettura da parte del sensore percio posso confermare che funziona. Adesso se riesco a portare la velocità di lettura del sensore a un valore piu alto riusciremo ad avere un erogazione di monete più veloci. E' giusto ? Oppure rischio qualcosa a fornire meno corrente a un motorino ?
#define TIME_OUT 500UL
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);
digitalWrite(LED_BUILTIN, LOW);
pinMode(2, INPUT);
Serial.begin(9600);
}
void loop() {
while (Serial.available() > 0) {
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;
}
}
}
Con il seguente codice e con l'abbassare dei volt del motorino
![[ph34r.GIF.png] [ph34r.GIF.png]](./images/smilies/ph34r.GIF.png)
#define TIME_OUT 500UL
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);
digitalWrite(LED_BUILTIN, LOW);
pinMode(2, INPUT);
Serial.begin(9600);
}
void loop() {
while (Serial.available() > 0) {
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;
}
}
}
Re: Aiuto per gestire output in mame
Il relè andrebbe alimentato alla sua tensione nominale (che nel caso specifico è 5V... c'è pure scritto sopra). Questi modulini sono solitamente molto "di bocca buona" comunque, e per scassarli bisogna andare molto fuori specifica (tipo a 24V
).
Adesso però mi dispiace che il mio codice venga abbandonato al suo destino
![[surprice.gif] [surprice.gif]](./images/smilies/surprice.gif)
Adesso però mi dispiace che il mio codice venga abbandonato al suo destino

Dal ciglio della strada osservo sbraitando i lavori in corso nel mondo arcade...
Re: Aiuto per gestire output in mame
no forse mi son spiegato male. Dico l'alimentazione esterna del motorino , non del rele , era originariamente a 24 volt. Io l'ho portata a 7.5 volt metre dalla parte dell'alimentazione del rele io quella la prendo direttamente da arduino (5v e gnd).
Re: Aiuto per gestire output in mame
Ti sei spiegato bene, sono io che ho inteso male (sempre di corsa...
)
![[whistling.gif] [whistling.gif]](./images/smilies/whistling.gif)
Dal ciglio della strada osservo sbraitando i lavori in corso nel mondo arcade...
Re: Aiuto per gestire output in mame
attualmente, stesso codice , mi eroga sempre un gettone in meno di quelli previsti.
![[2guns.gif] [2guns.gif]](./images/smilies/2guns.gif)
![[censored.gif] [censored.gif]](./images/smilies/censored.gif)
![[censored.gif] [censored.gif]](./images/smilies/censored.gif)
![[2guns.gif] [2guns.gif]](./images/smilies/2guns.gif)
![[2guns.gif] [2guns.gif]](./images/smilies/2guns.gif)