Vorrei realizzare un simulatore di guida, ma mi manca un lampo di genio

Ciao a tutti, sono un titolare di un autoscuola che vorrebbe utilizzare un simulatore di guida con l'arduino... 8)
Vengo e mi spiego meglio :stuck_out_tongue: Un azienda in Italia vende un simualtore a 10.000€ +IVA un simulatore che ho realizzato con soli 2.000.
Ma mi manca la parte elettrica, vedasi deviluci, spia freno a mano e cinture.
La mia idea, non so quanto malsana, era di utilizzare un arduino uno (prima versione in mio possesso), con una scheda a 8 relay (anche questa in mio possesso, precisamente questa: http://www.amazon.com/SainSmart-8-Channel-Relay-Module-Arduino/dp/B0057OC5WK) e una scheda che mi permette di avere 32 bottoni in usb (Precision USB Joystick Controller BU0836). La scheda relay perchè il programma di simulazione guida non permette di lasciare il buttone premuto per aganciare o sganciare per esempio la cintura (presa da uno sfasciacarozze) in modo (scusate in anticipo la mia ignoranza a descivere il problema) "on press - on release", ciò invece deve avvenire con 2 pressioni del pulsante.
In poche parole mi serve programmare l'arduino in modo che se aggancio la cintura manda un impulso attraverso il relè (per simulare la singola pressione del pulsante) e un altro impulso allo sgancio della cintura.
La stessa funzione mi serve per la cintura, per il freno a mano, per gli indicatori di direzione, le luci, ecc.
Ma siccome la mia conoscenza dell'arduino e di programmazione si ferma al copia e incolla XD :blush:, è possile avere una mano?
Ringrazio anticipatamente tutti per l'eventuale collaborazione e ve ne sarò enternamente grati per avermi fatto risparmiare eventuali altri 8.000€ + IVA :slight_smile:

Secondo me fai prima a pagare qualcuno, alla fine i componenti, il case, etc.. costano oltre al tempo di chi ti realizza il tutto..
Paghi qualcuno che lo sa fare che si vuole proporre e hai un lavoro migliore e prima
Se è per qualche consiglio chiedi pure nel forum ma non aspettarti che qualcuno faccia gratis tutta l'interfaccia elettronica e il firmware.. che poi non potrebbe neanche usare perché non avrebbe il simulatore ]:smiley:

L'interfaccia Hardware è già pronta.
A me mancherebbe soltanto la programmazione dell'arduino....o l'esempio di almeno due buttoni, per poi procedere io da solo.
avevo letto la Arduino Playground - Button Library, sarebbe una buona base (secondo me).

Avevo pensato un qualcosa come, lo scrivo a modo mio, scusate :

if button "A" isPressed()
writepin 1 high
delay 500ms
writepin1 low
if button "A" wasPressed()
writepin 1 high
delay 500ms
writepin1 low

if button "B" isPressed()
writepin2 high
delay 500ms
writepin2 low
if button "B" wasPressed()
writepin2 high
delay 500ms
writepin2 low

Non so se sono stato abbastanza chiaro... :blush:
Altra mia idea era il bolean boolean stateChanged()
Ripeto non voglio tutto costruito ma solo un input su come prgrammare l'arduino con almeno 2 esempi di bottoni....
Grazie a tutti

ciao, se ho capito bene il tuo problema questo è il codice che ti serve:

const int button1 = 2;
const int button2 = 3;
const int out1 =  10;
const int out2 =  11;
int stateButton1 = 0;
int stateButton2 = 0;
boolean stateout1 = false;
boolean stateout2 = false;

void setup() {
  pinMode(out1, OUTPUT);
  pinMode(out2, OUTPUT);
  pinMode(button1, INPUT);  
  pinMode(button2, INPUT);  
}

void loop(){
  stateButton1 = digitalRead(button1);
  stateButton2 = digitalRead(button2);
  
  if (stateButton1 == HIGH) {
   if(stateout1 == false) {    
      digitalWrite(out1, HIGH);
      stateout1 = true;  
    } 
    else {
      digitalWrite(out1, LOW); 
      stateout1 = false;
    }
  }
  
  if (stateButton2 == HIGH) {
   if(stateout2 == false) {    
      digitalWrite(out2, HIGH);
      stateout2 = true;  
    } 
    else {
      digitalWrite(out2, LOW); 
      stateout2 = false;
    }
  }
}

sinceramente l'ho scritto al volo e non posso testarlo ma dovrebbe essere corretto (anche se sicuramente qualcuno più bravo di me può riassumerlo un pò), se hai bisogno te lo commento, ma non mi pare difficile :wink: spero di esserti stato di aiuto.
Simone

Provo a spiegarti in modo semplice:

Un pulsante semplicemente chiude un contatto, in genere però si collega l'ingresso di Arduino a VCC (l'alimentazione) e al pulsante collegato a GND (il riferimento 0v) in modo che alla pressione del pulsante la corrente, dovendo scegliere tra andare nell'ingresso o al riferimento, vada al riferimento con la conseguenza che l'ingresso si ritroverà senza corrente (e quindi tensione 0v).

Semplicemente quando leggerai l'ingresso leggerai 1 se il pulsante NON è premuto mentre 0 se E' premuto.

Questa configurazione si chiama pull-up e serve per evitare che interferenze falsino la lettura, se si collegasse l'ingresso direttamente al pulsante collegato a VCC, quando il pulsante non è premuto l'ingresso è scollegato e capta interferenze che potrebbero essere lette come un 1, quindi il programma penserebbe che il pulsante è stato premuto.

Un altra cosa da sapere quando si utilizzano pulsanti è il "deboucing" ovvero quando si preme il pulsante non si ha un passaggio netto dall'1 allo 0 (quindi da VCC a GND) ma qualcosa come questo:

Che quindi va gestito o via hw o via sw, la cosa più semplice è gestirlo via sw con una pausa di 250ms quando si rileva una pressione, per evitare di leggere falsi rilasci del pulsante

Se qualche utente che usa Arduino viene a fare la patente mi raccomando fagli lo sconto
Ciao

PS: al codice di Simoneaudi93 mancano i delay, basta aggiungerli ed è fatta

Grazie a tutti e due...ultima domanda scema:
Il delay dove lo inserisco?

if (stateButton1 == HIGH) {
   if(stateout1 == false) {    
      digitalWrite(out1, HIGH);
      stateout1 = true;  
    } 
    else {
      digitalWrite(out1, LOW); 
      stateout1 = false;
     delay(250);
    }

così?
Grazie di nuovo

Pegasus:
Grazie a tutti e due...ultima domanda scema:
Il delay dove lo inserisco?

if (stateButton1 == HIGH) {

if(stateout1 == false) {    
     digitalWrite(out1, HIGH);
     stateout1 = true;  
   }
   else {
     digitalWrite(out1, LOW);
     stateout1 = false;
    delay(250);
   }




così?
Grazie di nuovo

riguardando il terzo post (quello dove spieghi a "parole tue" quello che deve fare il programma mi sembra che quello che ti hanno postato è un pò differente da quello che vuoi...questo (togliendo il delay che hai messo) accende "out1" quando premi il bottone e lo fa rimanere acceso finche non lo premi di nuovo...se è questo quello che ti serve allora il codice secondo me funziona così com'è (forse da aggiungere un piccolissimo delay proprio prima della fine del loop giusto per non far impazzire il micro andando troppo veloce)
se invece a te serve che dopo aver premuto il pulsante "out1" rimanga acceso per 1 secondo (per esempio) e poi si spenga da solo allora quel programma va modificato un pò in questo modo:

if (stateButton1 == HIGH) {
     digitalWrite(out1, HIGH);
      delay(1000);
      digitalWrite(out1, LOW); 
    }

questo è più simile a quello che avevi accennato nel terzo post.

devo però avvertirti che i delay "bloccano" l'esecuzione del programma...cioè quando il micro incontra un delay fa dei cicli a vuoto per "perdere" tempo fino a che non passa 1 secondo (in questo caso) quindi diciamo puoi fare una cosa alla volta non di più...per esempio non puoi accendere la spia della cintura e quella dell'olio in contemporanea (giusto per dire due spie a caso)

se ti serve invece che il micro faccia più cose contemporaneamente devi guardare questo esempio BlinkWithoutDelay
oppure le 2 librerie di leo72: leOS o looper

ale92:
forse da aggiungere un piccolissimo delay proprio prima della fine del loop giusto per non far impazzire il micro andando troppo veloce

Heeee!! :astonished: :astonished: :astonished:

PaoloP:

ale92:
forse da aggiungere un piccolissimo delay proprio prima della fine del loop giusto per non far impazzire il micro andando troppo veloce

Heeee!! :astonished: :astonished: :astonished:

anche io avrei fatto quella faccia un paio di settimane fa ma visto le rogne che mi ha dato con gli ultimi progetti un delay a fine loop anche di 50 millisecondi ormai ce lo metto sempre...(rileggendo quello che ho scritto nel post prima penso di dover chiarire che parlavo di esecuzione delle istruzioni e non della velocità della macchina nel simulatore, non so se PaoloP avevi capito questo XD )

Rigrazio di nuovo tutti per gli aiuti, scusatemi se non sono chiare le mie domande.
Cerco di spiegarmi meglio, con solo 2 bottoni, che comunque saranno almeno 8:

-Devo agganciare la cintura, ho un pulsante alla cintura che chiude il circuito, l'arduino deve mandare un singolo impulso alla scheda relè, chiudendo e riaprendo un altro circuito collegato, simulando così la premuta di un pulsante sulla scheda usb a 32 bottoni. per esempio il pulsante 24 della scheda usb
-Sgancio la cintura, il pulsante della cintura apre il circuito, l'arduino deve rimandare un singolo impulso alla scheda relè, chiudendo e riaprendo il circuito collegato simulando così la premuta dello stesso pulsante sulla scheda usb a 32 bottoni. sempre il pulsante 24 della scheda usb

-Sgancio il freno a mano, il pulsante del freno apre il circuito, l'arduino deve mandare un singolo impulso alla scheda relè, chiudendo e riaprendo un altro circuito collegato simulando così la premuta di un altro pulsante sulla scheda usb a 32 bottoni. per esempio il pulsante 17 della scheda usb
-Tiro il freno a mano, il pulsante del freno chiude il circuito, l'arduino deve mandare un singolo impulso alla scheda relè, chiudendo e riaprendo un altro circuito collegato simulando così la premuta dello stesso pulsante sulla scheda usb a 32 bottoni. sempre il pulsante 17 della scheda usb

Spero di essere stato chiaro questa volta, scusate di nuovo.
E di nuovo grazie a tutti voi, alll'inventore dell'Arduino e alla comunità che mi ha fatto e farà scoprire tutto un mondo nuovo.

Ovviamente lo sconto ci sarà per gli utenti.... 8)

Ma se è cosi non ti serve il relè, colleghi direttamente i pin di Arduino ai pin digitali della scheda USB.

Non vorrei bruciare la scheda...non so quanta e che tipo di corrente passa.

allora avevo interpretato male la tua richiesta, scusami...comunque il mio codice tutto sommato dovrebbe andar bene, devi solo aggiungere quanto detto da ale92 qualche post fà :wink: buona fortuna
Simone