Arduino Codebeispiel mit (PSP) Analogstick

In diesem Codebeispiel mit der Arduino-Software widmen wir uns der Realierung der Steuerung mit einem PSP-Analog Stick. Wie das ganze auf den Microcontroller gespielt wird, entnehme bitte der Allgemeinen Anleitung für Arduino Lenoardo Microcontroller mit ATmega32U4 Chip.

Der Teensy fungiert hier als Joystick mit 11 Buttons und 2 Achsen Input des Sticks. Button 12 ist das ESC Keyboard, Button 13 ist ENTER.
Wichtig: Du musst “Joystick and Keyboard” in der Arduino Software wählen (Tools => USB TYPE).
Die Pushbuttons sollten bei den digitalen PINS und GRND angeschlossen werden, Potentiometer bei den analogen inputs 0 bis 5.
Falls du dein PIN Layout anders gestaltet hast, musst du dies im Code natürlich anpassen
ACHTUNG: Bitte IMMER die aktuellste Version der Arduino IDE Software verwenden!

/* Teensy mit zwei Modi: Gamepad mit Analogstick und Tastatur mit Maus (PC Modus)
*
* Standardmäßig ist der Gamepad-Modus aktiviert.
* Durch die Tastenkombination: R1, R2, R1, R2, R1 lässt sich zwischen den Modi wechseln
* Im PC-Modus wird der Analogstick als Maus erkannt und die normalen Knöpfe werden als Buchstaben ausgegeben.
* In beiden Modi fungieren L2 und R2 als Escape- und Enter-Taste.
*/
#include
#define NUM_KEYS 15

struct Key {
char keycode;
Bounce* bounce;
};

Key keys[NUM_KEYS];

Key key(char keycode, int pin) {
Key *ret = new Key;
ret->keycode = keycode;
ret->bounce = new Bounce(pin, 10);
pinMode(pin, INPUT_PULLUP);
return *ret;
}

//Keyboard-Tastenbelegung
void setupKeys() {
keys[0] = key('a', 0);
keys[1] = key('w', 1);
keys[2] = key('s', 2);
keys[3] = key('d', 3);
keys[4] = key('m', 4);
keys[5] = key('n', 5);
keys[6] = key('b', 6);
keys[7] = key('v', 7);
keys[8] = key('y', 8);
keys[9] = key('x', 9);
keys[10] = key('q',10);
keys[11] = key('e',11);
keys[12] = key('u',12);
keys[13] = key('l',13);
keys[14] = key('k',14);
}

//L2 und R2
Bounce button9 = Bounce(15, 10);
Bounce button10 = Bounce(16, 10);
boolean pcMode = false;
int pcButtonCount = 0;
const int numButtons = 16; // 16 for Teensy, 32 for Teensy++

void setup() {

//Debug-Nachrichten über Serial.println("Nachricht") verschicken
Serial.begin(9600);

setupKeys();
pinMode(15, INPUT_PULLUP);
pinMode(16, INPUT_PULLUP);
Joystick.useManualSend(true);

for (int i=0; i<numButtons; i++) {
pinMode(i, INPUT_PULLUP);
}
}

byte allButtons[numButtons];
byte prevButtons[numButtons];
int mapX;
int mapY;
int deadzone=60;
void loop() {

//L2 und R2, Aktivierung des PC-/Gamepadmodus
button9.update();
button10.update();

if (button9.fallingEdge()) {
Keyboard.set_key1(KEY_ENTER);
Keyboard.send_now(); // send the button press
Keyboard.set_key1(0);
Keyboard.send_now(); // send the button release

if(pcButtonCount%2!=0){
Serial.println(pcButtonCount);
pcButtonCount=0;
}
if(pcButtonCount%2==0){
Serial.println(pcButtonCount);
pcButtonCount++;
}
if(pcButtonCount==5){
pcMode=!pcMode;
pcButtonCount=0;
}
}
if (button10.fallingEdge()) {
Keyboard.set_key1(KEY_ESC);
Keyboard.send_now(); // send the button press
Keyboard.set_key1(0);
Keyboard.send_now(); // send the button release
if(pcButtonCount%2==0){
Serial.println(pcButtonCount);
pcButtonCount=0;
}
if(pcButtonCount%2!=0){
Serial.println(pcButtonCount);
pcButtonCount++;
}
if(pcButtonCount==5){
pcMode=!pcMode;
pcButtonCount=0;
}
}

// Analog Stick Kalibrierung
// Zu faul meine Kommentare wieder einzudeutschen... :)

//Remap the data range
mapX=map(analogRead(23),235, 1259, 0, 1023); // My analogstick upper bounds where out of range,
mapY=map(analogRead(22),200, 1224, 0, 1023); // so I added 1024 to its minimum as an imaginary maximum.

//Deadzones
if(mapX<512+deadzone&&mapX>512-deadzone)mapX=512;
if(mapY<512+deadzone&&mapY>512-deadzone)mapY=512;
if(mapX<24)mapX=0;
if(mapY<24)mapY=0; //Non-linear correction if(mapX>512){
mapX=(int)(0.006*mapX*mapX-5.8788*mapX+1950); // This is needed since my upper bounds are out of Range. I basically scale all values
if(mapX>1023) mapX=1023; // greater than 512, so the analogstick reaches its full maximum of 1023. The math "adds" a little bit
} // more resolution when the stick is only moved a little.
if(mapY>512){
mapY=(int)(0.0037*mapY*mapY-3.2716*mapY+1225);
if(mapY>1023) mapY=1023;
}

//Send final values
Joystick.X(mapX);
Joystick.Y(mapY);

// PC mode

//Analogstick as Mouse
if(pcMode==true){
float X=(float)mapX;
float Y=(float)mapY;
float dX=6*((X-512)/512); //scale the mousespeed by 6.
float dY=6*((Y-512)/512);
Mouse.move(dX, dY, 0);

for (int i = 0; i < NUM_KEYS; i++) { keys[i].bounce->update();

if (keys[i].bounce->fallingEdge()) {
if(i==13) Mouse.press(MOUSE_RIGHT);
else if(i==14) Mouse.press(MOUSE_LEFT);
else Keyboard.press(keys[i].keycode);
}

else if (keys[i].bounce->risingEdge()) {
if(i==13) Mouse.release(MOUSE_RIGHT);
else if(i==14) Mouse.release(MOUSE_LEFT);
else Keyboard.release(keys[i].keycode);
}
}
}

// Gamepad mode
else{
// read digital pins and use them for the buttons
for (int i=0; i<numButtons; i++) {
if (digitalRead(i)) {
// when a pin reads high, the button is not pressed
// the pullup resistor creates the "on" signal
allButtons[i] = 0;
}
else {
// when a pin reads low, the button is connecting to ground.
allButtons[i] = 1;
}
Joystick.button(i + 1, allButtons[i]);
}
Joystick.send_now();
}
}

This site uses cookies to offer you a better browsing experience. By browsing this website, you agree to our use of cookies.