Forum: Mikrocontroller und Digitale Elektronik arduino leonardo arcade controller mit shift register cd4021 für 24 taster


von Christian K. (chris3790)


Lesenswert?

Hallo allerseits
Habe vor einen arcade Controller zu bauen als Basis benutze ich den 
Arduino Leonardo. Auf ein Arduino sollen zwei Spieler mit betrieben 
werden… dadurch komme ich auf ca. 24/25 tasten (erstmal nur 8 taster). 
Da ich auf dem Leonardo nicht viele digitalen Inputs Pins habe benutze 
ich deshalb einen Schieberegister empfohlen von dieser netten community 
hier. Danke nochmals 
Den Schieberegister denn ich benutze ist ein CD4021.
Hab aus der Arduino Seite eine Schaltung gefunden mit dem cd4021 und aus 
einer anderen Seite einen passenden Code.
Den Code habe ich so angepasst, dass es mit 8 Tastern auf den cd4021 
Register funktioniert. Damit lässt es sich wie mit einer Tastatur 
schreiben und zwar die Bustaben: A b c d e f g h.

Jetzt das Problem:
1.  Leider Kann ich die Tasten z.B nicht zum Spielen verwenden.
2.  Die Tasten lassen sich NICHT gleichzeitig tippen. (Zum Spielen von 
Combos wäre das schon nützlich)
Hier die links zu meinen Quellen:


https://www.arduino.cc/en/Tutorial/ShiftIn
http://lucidtronix.com/tutorials/15


Hier die Schaltung:

https://www.arduino.cc/en/uploads/Tutorial/ShftInExmp1_Schem.png

Hier der Code:
1
#include <Keyboard.h>
2
int dataPin = 9;
3
int clockPin = 7;
4
int latchPin = 8;
5
6
unsigned long last_press = 0;
7
unsigned long last_key_press = 0;
8
9
char* letters[] ={"dcbahgfe" };
10
11
int num_chars = 43;
12
int num_registers = 1;
13
byte button_states[] = {0x00,0x00,0x00,0x00};  //01001000
14
int cursor_index = 0;
15
int char_index = 0;
16
char cur_char = 'X';
17
18
void setup() {
19
  Serial.begin(9600);
20
  pinMode(latchPin, OUTPUT);
21
  pinMode(clockPin, OUTPUT); 
22
  pinMode(dataPin, INPUT);
23
  Keyboard.begin();
24
25
}
26
27
void loop() {
28
  if (millis() - last_key_press > 350) read_keyboard();
29
  delay(1);
30
}
31
32
33
void read_keyboard(){
34
  //set it to 0 to transmit data serially  
35
  digitalWrite(latchPin,LOW);
36
  //while the shift register is in serial mode
37
  //collect each shift register into a byte
38
  //the register attached to the chip comes in first 
39
  for (int i = 0; i < num_registers; i++){
40
    button_states[i] = shiftIn(dataPin, clockPin);
41
  }
42
  boolean something_in = false;
43
  for (int i = 0; i < num_registers; i++){    
44
    something_in = translate_buttons_2_keys(button_states[i], letters[i]);
45
    if (something_in) last_key_press = millis(); 
46
  }
47
  digitalWrite(latchPin,HIGH);
48
}
49
50
boolean translate_buttons_2_keys(byte buttons, char* keys){
51
  for(int i = 0 ; i < 8; i++){
52
     if ( (1 << i) & buttons ){
53
       cur_char = keys[i];
54
       Keyboard.print(keys[i]);
55
       char_index++;
56
       return true;
57
     }     
58
  }
59
 return false; 
60
}
61
byte shiftIn(int myDataPin, int myClockPin) { 
62
  int i;
63
  int temp = 0;
64
  int pinState;
65
  byte myDataIn = 0;
66
67
  pinMode(myClockPin, OUTPUT);
68
  pinMode(myDataPin, INPUT);
69
70
  for (i=7; i>=0; i--)
71
  {
72
    digitalWrite(myClockPin, 0);
73
    delayMicroseconds(20);
74
    temp = digitalRead(myDataPin);
75
    if (temp) {
76
      pinState = 1;
77
      myDataIn = myDataIn | (1 << i);
78
    }
79
    else {
80
      pinState = 0;
81
    }
82
    digitalWrite(myClockPin, 1);
83
  }
84
  return myDataIn;
85
}


Außerdem gibt es die Möglichkeit eine Libary einzurichten wodurch der Pc 
den Arduino als Gamepad erkennt wäre für den Arcade Controller genial . 
Jedoch hab ich mit diesem Code überhaupt keine übersticht und keine 
Ahnung wie ich das mit dem Schieberegister einbinden soll?

Link:

http://www.instructables.com/id/Arduino-LeonardoMicro-as-Game-ControllerJoystick/

Ich hoffe Ich konnte mein Anliegen gut schilden und hoffe auf Hilfe und 
Unterstützung da meine Programmierkentnisse nicht sehr überragend sind.

Bedanke mich hiermit nochmal :)

Grüße

Christian

: Bearbeitet durch User
von Arduinoquäler (Gast)


Lesenswert?

Christian K. schrieb:
> Jetzt das Problem:
> 1.  Leider Kann ich die Tasten z.B nicht zum Spielen verwenden.

Wo ist das Problem? Wenn man wie mit einer Tastatur schreiben
kann, dann kann man sie auch zum Spielen verwenden.

Christian K. schrieb:
> Damit lässt es sich wie mit einer Tastatur
> schreiben und zwar die Bustaben: A b c d e f g h.


Christian K. schrieb:
> Jetzt das Problem:
> ......
> 2.  Die Tasten lassen sich gleichzeitig tippen. (Zum Spielen von Combos
> wäre das schon nützlich)

Wo ist das Problem? Ich sehe keines. Erkläre es.

von Arduinoquäler (Gast)


Lesenswert?

Christian K. schrieb:
> Ich hoffe Ich konnte mein Anliegen gut schilden

Nein ..... nicht wirklich.

von Rene K. (xdraconix)


Lesenswert?

Du willst ihn sicherlich als HID-Joystick Device nutzen richtig? War ja 
in dem anderen Thread mal so angedacht weil du ihn ja an deinem 
Raspberry nutzen magst.

Würdest du in AVR Studio programmieren hätte ich dir meine Library für 
eine HID Device (Joystick) für den Mega32u4 rüberschwuchteln können :-/ 
Aber in der Ardunio Umgebung nutzt dir das nix. Außerdem brauchst du da 
noch einen ISP Programer dafür. Da ich natürlich nicht den Arduino 
Bootloader nutze.

von Christian K. (chris3790)


Lesenswert?

Arduinoquäler schrieb:
> Christian K. schrieb:
>> Jetzt das Problem:
>> 1.  Leider Kann ich die Tasten z.B nicht zum Spielen verwenden.
>
> Wo ist das Problem? Wenn man wie mit einer Tastatur schreiben
> kann, dann kann man sie auch zum Spielen verwenden.

Es geht einfach nicht! Auf word oder einem Texteditor klappt es nur im 
spiel nicht.

> Christian K. schrieb:
>> Damit lässt es sich wie mit einer Tastatur
>> schreiben und zwar die Bustaben: A b c d e f g h.
>
> Christian K. schrieb:
>> Jetzt das Problem:
>> ......
>> 2.  Die Tasten lassen sich gleichzeitig tippen. (Zum Spielen von Combos
>> wäre das schon nützlich)
>
> Wo ist das Problem? Ich sehe keines. Erkläre es.

Sorry meinte die tasten Lassen sich NICHT gleichzeitig tippen.

von Christian K. (chris3790)


Lesenswert?

Rene K. schrieb:
> Du willst ihn sicherlich als HID-Joystick Device nutzen richtig?
> War ja
> in dem anderen Thread mal so angedacht weil du ihn ja an deinem
> Raspberry nutzen magst.
>
> Würdest du in AVR Studio programmieren hätte ich dir meine Library für
> eine HID Device (Joystick) für den Mega32u4 rüberschwuchteln können :-/
> Aber in der Ardunio Umgebung nutzt dir das nix. Außerdem brauchst du da
> noch einen ISP Programer dafür. Da ich natürlich nicht den Arduino
> Bootloader nutze.

ISP Prgrammer hab ich leider nicht ..hmm muss ich erstmal so versuchen 
aber danke nochhmals^^.

wie ist der ablauf den arduino mit Avr zu programmieren?

von Draco (Gast)


Angehängte Dateien:

Lesenswert?

Also bei mir, siehe oben ^^

Ist auch ein Leonardo, Pro Micro Clone. Aber ich benutze ihn halt immer 
als Mega32u4 - man kommt halt nicht günstiger an nen Brett und MC ran. 
;-)

Sorry für die Bildgröße, is halt grad mim Handy aufgenommen.

von Christian K. (chris3790)


Lesenswert?

Draco schrieb:
> Also bei mir, siehe oben ^^
>
> Ist auch ein Leonardo, Pro Micro Clone. Aber ich benutze ihn halt immer
> als Mega32u4 - man kommt halt nicht günstiger an nen Brett und MC ran.
> ;-)
>
> Sorry für die Bildgröße, is halt grad mim Handy aufgenommen.

Wow echt cool  ;) nur leider fehlt mir der isp Programmer.... :/

: Bearbeitet durch User
von Arduinoquäler (Gast)


Lesenswert?

Christian K. schrieb:
> Sorry meinte die tasten Lassen sich NICHT gleichzeitig tippen.

Ein Korinthenkacker könnte sagen: sie lassen sich immer
gleichzeitig betätigen - nur auswerten kannst du sie nicht.

Aber es geht doch! Sogar dein Tutorial zeigt es.

--> Code Sample 1.3 Button Combination Check


Christian K. schrieb:
> Es geht einfach nicht!

Toll. Und wie soll man das verstehen?


Bist du sicher dass du Student bist, oder ist das eine
beliebige Bezeichnung die du dir ausgedacht hast?

von Arduinoquäler (Gast)


Lesenswert?

Rene K. schrieb:
> Da ich natürlich nicht den Arduino Bootloader nutze.

Da bedeuted ja nicht das er nicht nutzbar wäre.
Man kann durchaus ein lauffähiges Hexfile mit AVRSTudio
erzeugen und dieses mit einem Bootloader ins Flash schreiben
lassen. AVRDude. Ist sogar bei der Arduono IDE dabei.

Rene K. schrieb:
> Außerdem brauchst du da noch einen ISP Programer dafür.

Braucht er nicht, da er ja auch unabhängig von der Entwicklungs-
umgebung den AVRDude benutzen kann der wiederum den Bootloader
ansprechen kann.

von Draco (Gast)


Lesenswert?

Avrdude ist mit dem Arduino Bootloader des Mega32u4 garnicht so simpel 
wie du denkst, entweder hat man da ganz flinke Finger oder ich weiß auch 
nicht... ;-) Beim Leonardo wird dies wie folgt gemacht, da die USB 
Funktionalität beibehalten muss für den Bootloader (der geht ja nicht 
über einen externen USB-Seriell Chip ala FTDI)  der U4 lauscht über 
USB-UART auf der seriellen Schnittstelle (welche übrigens beim HID-CDC 
wegfallen würde) auf eine Verbindung mit, ich glaube es waren, 200 Baud 
- dann springt er in den Bootloader, wechselt den COM Port und man hat 
2sec Zeit in den Programmiermudos zu wechseln bevor er wieder ins 
Hauptprogramm springt. Da unterscheidet sich der Leonardo deutlichst von 
den anderen Arduinos.

von Christian K. (chris3790)


Lesenswert?

Arduinoquäler schrieb:
> Christian K. schrieb:
>> Sorry meinte die tasten Lassen sich NICHT gleichzeitig tippen.
>
> Ein Korinthenkacker könnte sagen: sie lassen sich immer
> gleichzeitig betätigen - nur auswerten kannst du sie nicht.
>
> Aber es geht doch! Sogar dein Tutorial zeigt es.
>
> --> Code Sample 1.3 Button Combination Check

hmm danke für den Hinweis muss ich mal eher austesten..

> Christian K. schrieb:
>> Es geht einfach nicht!
>
> Toll. Und wie soll man das verstehen?

in dem sinne dass es nicht funktioniert..ich kann im spiel die tasten 
belegen aber es tut sich nix!

> Bist du sicher dass du Student bist, oder ist das eine
> beliebige Bezeichnung die du dir ausgedacht hast?

ich bin student im 3. semester und programmieren ist nicht so mein 
fall.....hab dafür andere stärken ;)..aber gebe mein besten und will 
mich da etwas versuchen was programmieren angeht.

: Bearbeitet durch User
von Christian K. (chris3790)


Lesenswert?

so hab mal jetzt die leichte alternative versucht und das shift register 
weggelassen  die taster auf die inputs und auf ground gelegt... und ja 
es funktioniert!

der code hierführ:
1
  #include <Keyboard.h>  
2
    void setup() {  
3
      Keyboard.begin();  
4
      
5
      
6
      //Joystick and buttons pin allocations  
7
      pinMode(0, INPUT_PULLUP); //Joystick Up  
8
      pinMode(1, INPUT_PULLUP); //Joystick Down  
9
      pinMode(2, INPUT_PULLUP); //Joystick Left  
10
      pinMode(3, INPUT_PULLUP); //Joystick Right  
11
      pinMode(4, INPUT_PULLUP); //Button 1  
12
      pinMode(5, INPUT_PULLUP); //Button 2  
13
      pinMode(6, INPUT_PULLUP); //Button 3  
14
      pinMode(7, INPUT_PULLUP); //Button 4  
15
      pinMode(8, INPUT_PULLUP); //Coin  
16
      pinMode(9, INPUT_PULLUP); //Start  
17
    }  
18
      
19
      
20
    void loop() {  
21
      
22
      
23
      // Button labels:  
24
      int joystickUp = digitalRead(0);  
25
      int joystickDown = digitalRead(1);  
26
      int joystickLeft = digitalRead(2);  
27
      int joystickRight = digitalRead(3);  
28
      int button1 = digitalRead(4);  
29
      int button2 = digitalRead(5);  
30
      int button3 = digitalRead(6);  
31
      int button4 = digitalRead(7);  
32
      int coin = digitalRead(8);  
33
      int start = digitalRead(9);  
34
      
35
      
36
      // Joystick Up - Arrow Up Key  
37
      if (joystickUp == LOW) {  
38
        Keyboard.press(218);  
39
      }  
40
      else {  
41
        Keyboard.release(218);  
42
      }  
43
      
44
      
45
      // Joystick Down - Arrow Down Key  
46
      if (joystickDown == LOW) {  
47
        Keyboard.press(217);  
48
      }  
49
      else {  
50
        Keyboard.release(217);  
51
      }  
52
      
53
      
54
      // Joystick Left - Arrow Left Key  
55
      if (joystickLeft == LOW) {  
56
        Keyboard.press(216);  
57
      }  
58
      else {  
59
        Keyboard.release(216);  
60
      }  
61
      
62
      
63
      // Joystick Right - Arrow Right Key  
64
      if (joystickRight == LOW) {  
65
        Keyboard.press(215);  
66
      }  
67
      else {  
68
        Keyboard.release(215);  
69
      }  
70
      
71
      
72
      // Button 1 - Left CTRL  
73
      if (button1 == LOW) {  
74
        Keyboard.press(128);  
75
      }  
76
      else {  
77
        Keyboard.release(128);  
78
      }  
79
      
80
      
81
      // Button 2 - Left ALT  
82
      if (button2 == LOW) {  
83
        Keyboard.press(130);  
84
      }  
85
      else {  
86
        Keyboard.release(130);  
87
      }  
88
      
89
      
90
      // Button 3 - Left CTRL  
91
      if (button3 == LOW) {  
92
        Keyboard.press(32);  
93
      }  
94
      else {  
95
        Keyboard.release(32);  
96
      }  
97
      
98
      
99
      // Button 4 - Left CTRL  
100
      if (button4 == LOW) {  
101
        Keyboard.press(129);  
102
      }  
103
      else {  
104
        Keyboard.release(129);  
105
      }  
106
      
107
      
108
      // Coin - 5  
109
      if (coin == LOW) {  
110
        Keyboard.press(53);  
111
      }  
112
      else {  
113
        Keyboard.release(53);  
114
      }  
115
      
116
      
117
      // Start - 1  
118
      if (start == LOW) {  
119
        Keyboard.press(49); delay(100);  
120
      }  
121
      else {  
122
        Keyboard.release(49);  
123
      }  
124
        
125
    }

jemand ne idee vielleicht das Schieberegister hier im code einzubinden?

: Bearbeitet durch User
von STK500-Besitzer (Gast)


Lesenswert?

Christian K. schrieb:
> jemand ne idee vielleicht das Schieberegister hier im code einzubinden?

Deine Hardware funktioniert?
Kannst du dir die eingelesenen Werte des Schieberegisters am Terminal 
anzeigen lassen?

von Wolfgang (Gast)


Lesenswert?

Christian K. schrieb:
> Wow echt cool  ;) nur leider fehlt mir der isp Programmer.... :/

Steht doch vor dir.
In der Arduino IDE unter Menü Beispiele - 11.ArduinoISP

von Christian K. (chris3790)


Lesenswert?

STK500-Besitzer schrieb:
> Christian K. schrieb:
>> jemand ne idee vielleicht das Schieberegister hier im code einzubinden?
>
> Deine Hardware funktioniert?
> Kannst du dir die eingelesenen Werte des Schieberegisters am Terminal
> anzeigen lassen?

welchen code meinst du jetzt? ...der erste code ist mit dem register und 
der 2. code ist ohne register und direkt mit den digipins verbunden.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.