Handheld console issue
-
So I am making a portable handheld console and have the screen, raspberry pi and cooling and stuff. I am going to 3D print a case. There is only one problem. I have no controllers for a handheld system and don’t know how to get it to work. I want something similar to switch joy cons but they do not come off. I could use some bootleg joycons but they probably will be made to come off and you they will be classified as different controllers on retropie. Can someone please recommend me some good controllers that register as one controller on retropie and can have a left one and right one.
-
For handheld systems, the controllers are usually custom made, connected via the GPIO or USB.
You can take a look at PiGRRL, it doesn't have any joysticks, but should give you an idea what's there.
For a switch-like build, you can take a look at this topic, I think @StonedEdge used an Arduino based PCB for the input part. -
@MANMAKRO said in Handheld console issue:
Can someone please recommend me some good controllers that register as one controller on retropie and can have a left one and right one.
You don't need registered controllers. You can create your own with a 3D printer if you want. You can copy what I did but for a wired controller if you want a fully personalized project.
You can use a teensyLC.
To program it, see on Google . With this, I created the equivalent of a PS3 controller for my handheld (including R3 and L3).see: https://www.pjrc.com/teensy/td_joystick.html (It's a good start)
Here is my code for my .ino file (inspired by Pi Ultra project but with more buttons and some tweaks in the code for deadzone and speed response )
/* Buttons to USB Joystick Example You must select Joystick from the "Tools > USB Type" menu This example code is in the public domain. */ #include <Bounce.h> #define ANALOG_CENTER 512 int Xstick; int Ystick; int Zstick; int Zstickrotate; int upperBound=540; int lowerBound=420; // Create Bounce objects for each button. The Bounce object // automatically deals with contact chatter or "bounce", and // it makes detecting changes very simple. // 10 = 10 ms debounce time which is appropriate for most mechanical pushbuttons // Action buttons Bounce button0 = Bounce(13, 20); Bounce button1 = Bounce(14, 20); Bounce button2 = Bounce(15, 20); Bounce button3 = Bounce(16, 20); // Select Bounce button4 = Bounce(17, 20); // D-Pad Bounce button5 = Bounce(0, 20); Bounce button6 = Bounce(1, 20); Bounce button7 = Bounce(2, 20); Bounce button8 = Bounce(3, 20); // Start Bounce button9 = Bounce(4, 20); // Shoulder buttons Bounce button10 = Bounce(9, 20); Bounce button11 = Bounce(10, 20); Bounce button12 = Bounce(11, 20); Bounce button13 = Bounce(12, 20); // Analogue buttons Bounce button14 = Bounce(5, 20); Bounce button15 = Bounce(6, 20); void setup() { // Configure the pins for input mode with pullup resistors. // The pushbuttons connect from each pin to ground. When // the button is pressed, the pin reads LOW because the button // shorts it to ground. When released, the pin reads HIGH // because the pullup resistor connects to +5 volts inside // the chip. LOW for "on", and HIGH for "off" may seem // backwards, but using the on-chip pullup resistors is very // convenient. The scheme is called "active low", and it's // very commonly used in electronics... so much that the chip // has built-in pullup resistors! pinMode(0, INPUT_PULLUP); pinMode(1, INPUT_PULLUP); pinMode(2, INPUT_PULLUP); pinMode(3, INPUT_PULLUP); pinMode(4, INPUT_PULLUP); pinMode(5, INPUT_PULLUP); pinMode(6, INPUT_PULLUP); pinMode(9, INPUT_PULLUP); pinMode(10, INPUT_PULLUP); pinMode(11, INPUT_PULLUP); pinMode(12, INPUT_PULLUP); pinMode(13, INPUT_PULLUP); pinMode(14, INPUT_PULLUP); pinMode(15, INPUT_PULLUP); pinMode(16, INPUT_PULLUP); pinMode(17, INPUT_PULLUP); } void loop() { // Update all the buttons. There should not be any long // delays in loop(), so this runs repetitively at a rate // faster than the buttons could be pressed and released. // Right Analogue Stick Xstick = analogRead(18); Ystick = analogRead(19); if ((Xstick > 512 && Xstick <= upperBound) || (Xstick < 512 && Xstick >= lowerBound)) { Xstick = 512; } if ((Ystick > 512 && Ystick <= upperBound) || (Ystick < 512 && Ystick >= lowerBound)) { Ystick = 512; } Xstick = (Xstick - 511) * 2 + 511; // cap result if (Xstick > 1023) Xstick=1023; if (Xstick < 0) Xstick = 0; Joystick.X(Xstick); Joystick.Y(Ystick); // Left Analogue Stick Zstick = analogRead(22); Zstickrotate = analogRead(23); if ((Zstick > 512 && Zstick <= upperBound) || (Zstick < 512 && Zstick >= lowerBound)) { Zstick = 512; } if ((Zstickrotate > 512 && Zstickrotate <= upperBound) || (Zstickrotate < 512 && Zstickrotate >= lowerBound)) { Zstickrotate = 512; } Joystick.Z(Zstick); Joystick.Zrotate(Zstickrotate); // Joystick.X(((analogRead(18)-ANALOG_CENTER) * 1.6) + ANALOG_CENTER); // Joystick.Y(((analogRead(19)-ANALOG_CENTER) * 1.6) + ANALOG_CENTER); // Joystick.Z(((analogRead(22)-ANALOG_CENTER) * 1.6) + ANALOG_CENTER); // Joystick.Zrotate(((analogRead(23)-ANALOG_CENTER) * 1.6) + ANALOG_CENTER); button0.update(); button1.update(); button2.update(); button3.update(); button4.update(); button5.update(); button6.update(); button7.update(); button8.update(); button9.update(); button10.update(); button11.update(); button12.update(); button13.update(); button14.update(); button15.update(); // Check each button for "falling" edge. // Update the Joystick buttons only upon changes. // falling = high (not pressed - voltage from pullup resistor) // to low (pressed - button connects pin to ground) if (button0.fallingEdge()) { Joystick.button(1, 1); } if (button1.fallingEdge()) { Joystick.button(2, 1); } if (button2.fallingEdge()) { Joystick.button(3, 1); } if (button3.fallingEdge()) { Joystick.button(4, 1); } if (button4.fallingEdge()) { Joystick.button(5, 1); } if (button5.fallingEdge()) { Joystick.button(6, 1); } if (button6.fallingEdge()) { Joystick.button(7, 1); } if (button7.fallingEdge()) { Joystick.button(8, 1); } if (button8.fallingEdge()) { Joystick.button(9, 1); } if (button9.fallingEdge()) { Joystick.button(10, 1); } if (button10.fallingEdge()) { Joystick.button(11, 1); } if (button11.fallingEdge()) { Joystick.button(12, 1); } if (button12.fallingEdge()) { Joystick.button(13, 1); } if (button13.fallingEdge()) { Joystick.button(14, 1); } if (button14.fallingEdge()) { Joystick.button(15, 1); } if (button15.fallingEdge()) { Joystick.button(16, 1); } // Check each button for "rising" edge // Update the Joystick buttons only upon changes. // rising = low (pressed - button connects pin to ground) // to high (not pressed - voltage from pullup resistor) if (button0.risingEdge()) { Joystick.button(1, 0); } if (button1.risingEdge()) { Joystick.button(2, 0); } if (button2.risingEdge()) { Joystick.button(3, 0); } if (button3.risingEdge()) { Joystick.button(4, 0); } if (button4.risingEdge()) { Joystick.button(5, 0); } if (button5.risingEdge()) { Joystick.button(6, 0); } if (button6.risingEdge()) { Joystick.button(7, 0); } if (button7.risingEdge()) { Joystick.button(8, 0); } if (button8.risingEdge()) { Joystick.button(9, 0); } if (button9.risingEdge()) { Joystick.button(10, 0); } if (button10.risingEdge()) { Joystick.button(11, 0); } if (button11.risingEdge()) { Joystick.button(12, 0); } if (button12.risingEdge()) { Joystick.button(13, 0); } if (button13.risingEdge()) { Joystick.button(14, 0); } if (button14.risingEdge()) { Joystick.button(15, 0); } if (button15.risingEdge()) { Joystick.button(16, 0); } }
You can also use a PS4 controller if you want a separate controller.
Contributions to the project are always appreciated, so if you would like to support us with a donation you can do so here.
Hosting provided by Mythic-Beasts. See the Hosting Information page for more information.