Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

"Mega" game controller (40+ tasti) con Arduino

Progetti, interfacciamento, discussioni varie su questa piattaforma.

Moderatori: Foto UtenteMassimoB, Foto UtenteWALTERmwp, Foto Utentexyz

0
voti

[1] "Mega" game controller (40+ tasti) con Arduino

Messaggioda Foto Utenteelegos » 29 dic 2018, 18:40

Ciao a tutti!

Nonostante sia ormai un programmatore veterano e conosca ogni "macro" componente del computer, non sono per niente pratico a livello "micro" hardware, ossia la realizzazione di nuovo hardware come, appunto, un gamepad da oltre 40 tasti.

L'idea di base infatti è quella di realizzare un controller sufficiente per controllare i 40+ comandi "core" di un simulatore spaziale (per chi fosse interessato: Elite Dangerous).

Navigando un po' in rete per farmi un'idea di base, mi sono imbattuto in un progetto basato sulla scheda OPEN-SMART Atmega32u4 Pro Micro (che costa 5$ in USA e 10€ in Italia ?% )



Beh, ho trovato la soluzione! No aspetta... qui non si prende in considerazione il numero limitato di pin a disposizione della scheda!

Ricordandomi quindi ai tempi dell'università un "cosetto" chiamato multiplexer, il diavolo che è in me è tornato a fare fiamme. Il problema è che non so differenti cose:

1. ogni multiplexer è compatibile con questa scheda?
2. esistono schede con, diciamo, 60 pin di dati, anziché utilizzare uno (o più?) multiplexer?
3. PWR non credo sia un problema, in quanto non si premono tutti i pulsanti insieme, quindi di fatto sarà come premere un pulsante solo alla volta, ma avete suggerimenti in merito?

E poi una cosa stupida: il layout del game controller stesso: esiste un software per realizzare dei layout facilmente, che non sia photoshop? Inoltre quali sono i tipi di "pulsanti" che posso usare? Pensavo a diversi tipi:

1. "slide" 0-100 (come quelli dei controller MIDI per intenderci), magari mappati (lato programmazione) a range (pulsante X per 0, pulsante Y per 1-25 etc)
2. knob con pulsante (indietro, avanti, premuto)
3. pulsanti semplici quadrati (come quelli delle tastiere, ma magari più economici visti i costi dei meccanici :roll: )
4. "clicker" (ossia degli switch che tornano in posizione), in quanto dubito il gioco supporti i pulsanti on/off
5. decal per ricordarsi cosa facciano i vari pulsanti :mrgreen:

Se poi i pulsanti fossero retroilluminati farebbe tutto molto TRON e soprattutto visibile anche con poca luce (alias circuito di alimentazione led separato?).

Grazie per le risposte :)
Bomba de caporal elettronico
Avatar utente
Foto Utenteelegos
330 3 6
Frequentatore
Frequentatore
 
Messaggi: 160
Iscritto il: 29 gen 2013, 19:43
Località: Milano

0
voti

[2] Re: "Mega" game controller (40+ tasti) con Arduino

Messaggioda Foto Utentedimaios » 29 dic 2018, 22:50

Con una qualsiasi board NUCLEO-144 della ST puoi realizzare quello che vuoi.

link
Ingegneria : alternativa intelligente alla droga.
Avatar utente
Foto Utentedimaios
28,7k 7 10 12
G.Master EY
G.Master EY
 
Messaggi: 3206
Iscritto il: 24 ago 2010, 14:12
Località: Behind the scenes

0
voti

[3] Re: "Mega" game controller (40+ tasti) con Arduino

Messaggioda Foto Utenteelegos » 2 gen 2019, 14:14

Mmmm ho sbattuto un po' la testa con un Arduino Pro Micro per vedere come funziona il mondo degli input/output, prima di lanciarmi sul progetto vero e proprio.

Ho realizzato tre applicazioni per sondare il funzionamento dell'hardware:

1. Lettura di un pulsante
Configurazione: pulsante connesso a GND e D9
Programma: lettura e stampa su seriale del digitalRead su D9

2. Lettura di un potenziometro da 10k Ohm
Configurazione: P0 -> GND, P1 -> A0, P2 -> VCC (3.3V)
Programma: lettura e stampa su seriale dell'analogRead su A0

3. Lettura di un segnale (che sia analogico o digitale) su una porta di un multiplexer
Ecco, su questo ho ancora qualche problema...

Multiplexer: CD74HC4067
Arduino: Keyestudio Leonardo Pro Micro

Cablaggio (multiplexer -> arduino):
- GND -> GND
- VCC -> VCC (3.3V)
- EN -> GND
- S0 -> RX1 (D0)
- S1 -> TX0 (D1)
- S2 -> D2
- S3 -> D3
- Z -> A0

Codice del programma:
Codice: Seleziona tutto
const int MUX_0_ANALOG_PIN = 0;
const int MUX_0_DIGITAL_PIN = 18;
const int MUX_0_SELECTOR_PINS[] = {0, 1, 2, 3};

int currentAnalogState[16];
int currentDigitalState[16];

void addressToBinaryArray(unsigned int address, int *out);
int readMux(int address, bool digital);

void setup() {
  pinMode(MUX_0_ANALOG_PIN, INPUT);
  pinMode(MUX_0_DIGITAL_PIN, INPUT);
  pinMode(MUX_0_SELECTOR_PINS[0], OUTPUT);
  pinMode(MUX_0_SELECTOR_PINS[1], OUTPUT);
  pinMode(MUX_0_SELECTOR_PINS[2], OUTPUT);
  pinMode(MUX_0_SELECTOR_PINS[3], OUTPUT);
}

void loop() {
  int address[4];
  for (int i = 0; i <= 15; i++) {
    addressToBinaryArray(i+1, address);
    currentDigitalState[i] = readMux(address, true);
    currentAnalogState[i] = readMux(address, false);

    Serial.print(i);
    Serial.print(": ");
    Serial.print(currentAnalogState[i]);
    Serial.print("; ");
  }

  Serial.println("");
}

void addressToBinaryArray(unsigned int address, int *out) {
  for (int i = 0; i < 4; i++) {
    out[i] = 1 & address >> i;
  }
}

int readMux(int *address, bool digital) {
  for (int i = 0; i < 4; i++) {
    digitalWrite(MUX_0_SELECTOR_PINS[i], address[i]);
  }

  if (digital) {
    return digitalRead(MUX_0_DIGITAL_PIN);
  }
 
  return analogRead(MUX_0_ANALOG_PIN);
}


Problema:
Provo a collegare un qualsiasi input Y (Y0...Y15) a GND, ma i valori non saltano, ma rimangono ai loro valori, come se non avessi fatto contatto. Ho provato anche con digitalRead, ma ovviamente il risultato non cambia come mi aspettavo. Esempio di output:

Codice: Seleziona tutto
0: 266; 1: 255; 2: 264; 3: 281; 4: 265; 5: 254; 6: 264; 7: 323; 8: 298; 9: 282; 10: 287; 11: 306; 12: 284; 13: 272; 14: 281; 15: 287;
0: 271; 1: 259; 2: 268; 3: 291; 4: 272; 5: 261; 6: 270; 7: 285; 8: 269; 9: 258; 10: 267; 11: 294; 12: 272; 13: 262; 14: 274; 15: 278;
0: 262; 1: 252; 2: 261; 3: 288; 4: 269; 5: 259; 6: 268; 7: 285; 8: 269; 9: 257; 10: 265; 11: 294; 12: 272; 13: 261; 14: 271; 15: 284;
0: 266; 1: 254; 2: 263; 3: 279; 4: 264; 5: 254; 6: 263; 7: 361; 8: 331; 9: 310; 10: 310; 11: 321; 12: 299; 13: 283; 14: 290; 15: 296;
0: 278; 1: 265; 2: 271; 3: 289; 4: 272; 5: 262; 6: 271; 7: 289; 8: 272; 9: 261; 10: 269; 11: 347; 12: 317; 13: 300; 14: 307; 15: 299;
0: 283; 1: 270; 2: 277; 3: 299; 4: 280; 5: 268; 6: 276; 7: 287; 8: 272; 9: 260; 10: 269; 11: 368; 12: 334; 13: 315; 14: 318; 15: 311;
0: 294; 1: 278; 2: 281; 3: 294; 4: 277; 5: 264; 6: 272; 7: 303; 8: 283; 9: 269; 10: 277; 11: 298; 12: 277; 13: 265; 14: 274; 15: 289;
0: 270; 1: 258; 2: 268; 3: 286; 4: 269; 5: 258; 6: 267; 7: 289; 8: 272; 9: 261; 10: 270; 11: 359; 12: 328; 13: 310; 14: 316; 15: 305;
0: 289; 1: 274; 2: 281; 3: 302; 4: 283; 5: 270; 6: 278; 7: 287; 8: 272; 9: 261; 10: 270; 11: 295; 12: 274; 13: 263; 14: 274; 15: 280;
0: 264; 1: 253; 2: 261; 3: 283; 4: 266; 5: 256; 6: 265; 7: 288; 8: 270; 9: 258; 10: 266; 11: 293; 12: 271; 13: 260; 14: 270; 15: 284;
0: 266; 1: 255; 2: 263; 3: 281; 4: 265; 5: 255; 6: 265; 7: 287; 8: 269; 9: 258; 10: 266; 11: 313; 12: 288; 13: 276; 14: 286; 15: 286;
0: 271; 1: 259; 2: 268; 3: 294; 4: 275; 5: 264; 6: 273; 7: 285; 8: 270; 9: 259; 10: 268; 11: 293; 12: 272; 13: 262; 14: 274; 15: 278;
0: 263; 1: 252; 2: 262; 3: 289; 4: 269; 5: 259; 6: 268; 7: 288; 8: 270; 9: 258; 10: 267; 11: 296; 12: 274; 13: 262; 14: 272; 15: 285;
0: 267; 1: 255; 2: 265; 3: 280; 4: 265; 5: 255; 6: 263; 7: 308; 8: 286; 9: 272; 10: 278; 11: 301; 12: 279; 13: 267; 14: 277; 15: 285;
0: 268; 1: 257; 2: 266; 3: 292; 4: 273; 5: 262; 6: 271; 7: 285; 8: 270; 9: 258; 10: 268; 11: 293; 12: 271; 13: 262; 14: 274; 15: 277;
0: 262; 1: 251; 2: 261; 3: 290; 4: 271; 5: 260; 6: 269; 7: 286; 8: 269; 9: 258; 10: 266; 11: 317; 12: 291; 13: 278; 14: 285; 15: 292;
0: 274; 1: 261; 2: 270; 3: 284; 4: 269; 5: 257; 6: 266; 7: 352; 8: 322; 9: 303; 10: 305; 11: 317; 12: 295; 13: 280; 14: 287; 15: 294;
0: 276; 1: 263; 2: 268; 3: 288; 4: 271; 5: 261; 6: 270; 7: 284; 8: 269; 9: 258; 10: 266; 11: 356; 12: 325; 13: 307; 14: 313; 15: 303;
0: 287; 1: 273; 2: 280; 3: 302; 4: 282; 5: 269; 6: 277; 7: 290; 8: 274; 9: 262; 10: 269; 11: 364; 12: 331; 13: 312; 14: 316; 15: 309;
0: 291; 1: 276; 2: 279; 3: 293; 4: 276; 5: 263; 6: 271; 7: 345; 8: 317; 9: 298; 10: 301; 11: 313; 12: 291; 13: 276; 14: 284; 15: 296;
0: 277; 1: 264; 2: 272; 3: 287; 4: 271; 5: 260; 6: 268; 7: 293; 8: 274; 9: 262; 10: 270; 11: 366; 12: 333; 13: 314; 14: 319; 15: 309;
0: 292; 1: 277; 2: 283; 3: 302; 4: 282; 5: 270; 6: 277; 7: 290; 8: 274; 9: 262; 10: 270; 11: 372; 12: 338; 13: 318; 14: 322; 15: 312;
0: 294; 1: 278; 2: 282; 3: 296; 4: 278; 5: 265; 6: 273; 7: 314; 8: 291; 9: 276; 10: 282; 11: 300; 12: 279; 13: 266; 14: 274; 15: 293;
0: 272; 1: 260; 2: 268; 3: 281; 4: 266; 5: 255; 6: 265; 7: 351; 8: 322; 9: 303; 10: 305; 11: 318; 12: 296; 13: 281; 14: 289; 15: 290;
0: 274; 1: 262; 2: 269; 3: 289; 4: 272; 5: 261; 6: 270; 7: 288; 8: 271; 9: 260; 10: 268; 11: 377; 12: 342; 13: 322; 14: 326; 15: 313;
0: 296; 1: 280; 2: 286; 3: 300; 4: 281; 5: 268; 6: 276; 7: 296; 8: 277; 9: 264; 10: 271; 11: 298; 12: 276; 13: 264; 14: 273; 15: 290;
0: 270; 1: 258; 2: 266; 3: 281; 4: 266; 5: 255; 6: 264; 7: 344; 8: 316; 9: 297; 10: 300; 11: 314; 12: 292; 13: 277; 14: 285; 15: 293;
0: 275; 1: 263; 2: 272; 3: 293; 4: 274; 5: 263; 6: 272; 7: 288; 8: 272; 9: 260; 10: 269; 11: 324; 12: 297; 13: 284; 14: 293; 15: 290;
0: 274; 1: 262; 2: 270; 3: 295; 4: 275; 5: 264; 6: 272; 7: 288; 8: 271; 9: 260; 10: 267; 11: 322; 12: 296; 13: 281; 14: 288; 15: 294;
0: 276; 1: 263; 2: 272; 3: 287; 4: 270; 5: 259; 6: 268; 7: 367; 8: 336; 9: 314; 10: 314; 11: 324; 12: 301; 13: 286; 14: 292; 15: 298;
0: 280; 1: 266; 2: 274; 3: 290; 4: 273; 5: 262; 6: 271; 7: 288; 8: 271; 9: 259; 10: 267; 11: 368; 12: 335; 13: 316; 14: 321; 15: 309;
0: 292; 1: 277; 2: 283; 3: 302; 4: 283; 5: 270; 6: 279; 7: 290; 8: 274; 9: 262; 10: 270; 11: 374; 12: 340; 13: 320; 14: 323; 15: 313;
0: 295; 1: 278; 2: 282; 3: 296; 4: 278; 5: 266; 6: 273; 7: 331; 8: 306; 9: 289; 10: 292; 11: 307; 12: 286; 13: 272; 14: 280; 15: 294;
0: 275; 1: 262; 2: 271; 3: 285; 4: 270; 5: 259; 6: 268; 7: 292; 8: 273; 9: 262; 10: 269; 11: 368; 12: 334; 13: 315; 14: 319; 15: 310;
0: 293; 1: 277; 2: 284; 3: 301; 4: 283; 5: 270; 6: 278; 7: 290; 8: 274; 9: 262; 10: 270; 11: 349; 12: 319; 13: 301; 14: 307; 15: 302;
0: 285; 1: 270; 2: 276; 3: 293; 4: 275; 5: 262; 6: 270; 7: 291; 8: 273; 9: 260; 10: 269; 11: 292; 12: 272; 13: 260; 14: 270; 15: 289;
0: 269; 1: 257; 2: 265; 3: 280; 4: 265; 5: 254; 6: 264; 7: 362; 8: 332; 9: 311; 10: 311; 11: 324; 12: 301; 13: 286; 14: 293; 15: 294;
0: 276; 1: 264; 2: 272; 3: 291; 4: 274; 5: 262; 6: 271; 7: 288; 8: 272; 9: 260; 10: 268; 11: 356; 12: 325; 13: 307; 14: 313; 15: 304;
0: 288; 1: 273; 2: 279; 3: 296; 4: 278; 5: 265; 6: 273; 7: 293; 8: 275; 9: 262; 10: 274; 11: 299; 12: 277; 13: 264; 14: 273; 15: 289;
0: 270; 1: 258; 2: 265; 3: 279; 4: 265; 5: 254; 6: 263; 7: 322; 8: 298; 9: 282; 10: 286; 11: 303; 12: 282; 13: 269; 14: 277; 15: 290;
0: 272; 1: 260; 2: 267; 3: 288; 4: 270; 5: 259; 6: 268; 7: 289; 8: 272; 9: 260; 10: 268; 11: 360; 12: 328; 13: 310; 14: 315; 15: 306;
0: 289; 1: 274; 2: 281; 3: 299; 4: 280; 5: 268; 6: 275; 7: 292; 8: 275; 9: 263; 10: 269; 11: 300; 12: 277; 13: 265; 14: 274; 15: 288;
0: 269; 1: 257; 2: 265; 3: 279; 4: 265; 5: 254; 6: 263; 7: 315; 8: 291; 9: 276; 10: 279; 11: 297; 12: 277; 13: 264; 14: 273; 15: 292;
0: 272; 1: 260; 2: 268; 3: 284; 4: 269; 5: 258; 6: 267; 7: 291; 8: 273; 9: 260; 10: 268; 11: 298; 12: 276; 13: 265; 14: 275; 15: 282;
0: 266; 1: 255; 2: 264; 3: 287; 4: 269; 5: 259; 6: 268; 7: 286; 8: 269; 9: 258; 10: 266; 11: 315; 12: 290; 13: 276; 14: 284; 15: 291;
0: 273; 1: 260; 2: 268; 3: 284; 4: 268; 5: 257; 6: 266; 7: 328; 8: 304; 9: 286; 10: 288; 11: 302; 12: 282; 13: 269; 14: 276; 15: 295;


EDIT: dopo un riavvio di Arduino ora tutti i valori sono a 0 (devo aver fatto prima corto con i 3.3v?)

Suggerimenti?

Grazie :)
Bomba de caporal elettronico
Avatar utente
Foto Utenteelegos
330 3 6
Frequentatore
Frequentatore
 
Messaggi: 160
Iscritto il: 29 gen 2013, 19:43
Località: Milano


Torna a Arduino

Chi c’è in linea

Visitano il forum: Nessuno e 2 ospiti