Quote:
Originally Posted by AlDee
I'm planning to work on a custom controller using the teensy. Can you tell me, if there is any limit to the number of buttons or axis that the driver station will recognize? Did you have to do any additional programming to get it to work with the DS? Also, I'm curious as to how you mounted it. It doesn't look like there are any screw holes or any place to drill any either.
|
I don't know about the limit of buttons the DS can read the teensy can do 16 (or 32 total if using the ++2 model) and up to 6 Axis. You do have to do additional programming on the teensy, the robot side is exactly the same. As for mounting you need to solder on
header pins such that it looks like this:
https://www.pjrc.com/store/teensy31_pins.jpg. Attach that to a bread board and then your wires from the switches to the bread board. Also check this:
http://www.chiefdelphi.com/media/papers/2666 though be aware that we used the newer example code below for ours. One word of warning, make sure you strain relive the USB cable going from the teensy to the computer. We broke the micro USB off the teensy once and switching to a xbox controller mid competition isn't fun.
Code:
/* Complete USB Joystick Example
Teensy becomes a USB joystick with 16 or 32 buttons and 6 axis input
You must select Joystick from the "Tools > USB Type" menu
Pushbuttons should be connected between the digital pins and ground.
Potentiometers should be connected to analog inputs 0 to 5.
This example code is in the public domain.
*/
// Configure the number of buttons. Be careful not
// to use a pin for both a digital button and analog
// axis. The pullup resistor will interfere with
// the analog voltage.
const int numButtons = 16; // 16 for Teensy, 32 for Teensy++
void setup() {
// you can print to the serial monitor while the joystick is active!
Serial.begin(9600);
// configure the joystick to manual send mode. This gives precise
// control over when the computer receives updates, but it does
// require you to manually call Joystick.send_now().
Joystick.useManualSend(true);
for (int i=0; i<numButtons; i++) {
pinMode(i, INPUT_PULLUP);
}
Serial.println("Begin Complete Joystick Test");
}
byte allButtons[numButtons];
byte prevButtons[numButtons];
int angle=0;
void loop() {
// read 6 analog inputs and use them for the joystick axis
Joystick.X(analogRead(0));
Joystick.Y(analogRead(1));
Joystick.Z(analogRead(2));
Joystick.Zrotate(analogRead(3));
Joystick.sliderLeft(analogRead(4));
Joystick.sliderRight(analogRead(5));
// 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]);
}
// make the hat switch automatically move in a circle
angle = angle + 1;
if (angle >= 360) angle = 0;
Joystick.hat(angle);
// Because setup configured the Joystick manual send,
// the computer does not see any of the changes yet.
// This send_now() transmits everything all at once.
Joystick.send_now();
// check to see if any button changed since last time
boolean anyChange = false;
for (int i=0; i<numButtons; i++) {
if (allButtons[i] != prevButtons[i]) anyChange = true;
prevButtons[i] = allButtons[i];
}
// if any button changed, print them to the serial monitor
if (anyChange) {
Serial.print("Buttons: ");
for (int i=0; i<numButtons; i++) {
Serial.print(allButtons[i], DEC);
}
Serial.println();
}
// a brief delay, so this runs "only" 200 times per second
delay(5);
}