Teensy joystick issues.

NutellaRat

New member
I'm using a TEENSY 4.0, with the latest IDE from arduino/latest version of Teensyduino. I'm using this following code snippet below to emulate 14 buttons and 2 joysticks, and while my buttons work fine, the sticks (connected or not) seem to move very violently, between each end of their respective axis. even just placing my finger or a piece of metal against the analogue pins appears to cause this distress for the signal the pin i'm touching would correspond to.

If it helps, the sticks I'm trying to use are Nintendo Switch joycons fitted to a breakout board that outputs the x and y axes.

Code:
/* 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=530;
int lowerBound=495;

// 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, 10);
Bounce button1 = Bounce(14, 10); 
Bounce button2 = Bounce(15, 10);
Bounce button3 = Bounce(16, 10);

// Select
Bounce button4 = Bounce(17, 10);

// D-Pad
Bounce button5 = Bounce(0, 10);
Bounce button6 = Bounce(1, 10); 
Bounce button7 = Bounce(2, 10); 
Bounce button8 = Bounce(3, 10); 

// Start
Bounce button9 = Bounce(4, 10);

// Shoulder buttons
Bounce button10 = Bounce(9, 10);
Bounce button11 = Bounce(10, 10); 
Bounce button12 = Bounce(11, 10);
Bounce button13 = Bounce(12, 10);

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(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();

  // 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);
  }

  // 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);
  }
}
 
Have you compared to a potentiometer, 10k or so (connected to ground and 3.3V, middle pin to analog in), to check if the code is fine? Then you could compare and check if the wiring of the board you are is the way it should be.
 
Back
Top