PS2 Controller Umbau

Hallo,

ich bin gerade dabei, meinen PS2 Kontroller Umbau soweit zu planen. Bislang habe ich bereits einen Controller soweit auseinander genommen und mit einem Arduino Pro Mini 16MHz/5V bestückt. Konnte nach dem Ausbau der Motoren ordentlich Platz gewinnen. Ich habe die 6 Leitungen für den Arduino USB Serial Adapter nach außen geführt und mit der PS2X Lib die Tasten soweit getestet.

################################
# Druecke die folgenden Tasten #
#   innerhalb von 5 Sekunden   #
################################
#    START              :   OK #
#    SELECT             :   OK #
#    Steuerkreuz oben   :   OK #
#    Steuerkreuz unten  :   OK #
#    Steuerkreuz links  :   OK #
#    Steuerkreuz rechts :   OK #
#    Dreieck            :   OK #
#    Kreuz              :   OK #
#    Quadrat            :   OK #
#    Kreis              :   OK #
#    L3                 :   OK #
#    R3                 :   OK #
#    L3 oben            :   OK #
#    L3 unten           :   OK #
#    L3 links           :   OK #
#    L3 rechts          :   OK #
#    R3 oben            :   OK #
#    R3 unten           :   OK #
#    R3 links           :   OK #
#    R3 rechts          :   OK #
################################
#  PS2 Controller in Ordnung!  #
#   Erneuter Test mit  START   #
################################

Ich habe mir nun die XBee Pro Module bestellt. Nun ist das erste Problem, die XBee Modelle arbeiten lieber mit 3,3V. Das soll jetzt noch kein wirkliches Problem sein. Ich könnte nun entweder mit Spannungsteilern arbeiten (sehr unschön) oder mit entsprechenden Pegelwandlern. Egal wie klein auch die Pegelwandler sind, im Gehäuse ist das unnötiger Verdrahtungsaufwand und zuviele Platinen sollten dort nicht untergebracht werden.
Nun gut, habe ich mir direkt einen Arduino Pro Mini 8MHz/3,3V bestellt bei exp-tech.

Nun geht es an die Spannungsversorgung des PS2 Controller sowie das XBee Module. Ich würde gerne beide Komponenten über den Vcc des Pro Mini speisen. Problem ist, mir ist der Imax vom PS2 Kontroller nicht bekannt, müsste ich gleich vielleicht mal versuchen, ob ich plausible Messwerte rausbekomme. Nach einiger Recherche war zu finden, dass der PS2 Controller problemlos mit 3-5V funktioniert. Das XBee Module wird mit 215mA (Senden) und 55mA (Empfangen) (Legacy XBee S1 802.15.4 Product Datasheet | Digi International) angegeben.

Nun geht es weiter mit der verbauten Led des PS2 Kontroller. Diese leuchtet nur, wenn ANALOG gedrückt wurde. Die Abfrage, ob ANALOG gedrückt wurde, ist scheinbar über die Libary nicht möglich. Das würde ich gerne ändern. Led1+ liegt direkt an der Versorgungsspannung (3-5V). Das IC schaltet über einen 330Ohm SMD Widerstand GND auf Led1-. Somit scheint die Led auf 5V mit 10mA ausgelegt zu sein.

~~Nun möchte ich die Verbindung von Led1- zur Platine unterbrechen und auf den Arduino Eingang legen. Dazu einfach die PullUps aktiveren. Sind PullUps auch für die IO von Analog gekennzeichneten Pins möglich?~~Bereits erledigt.

Sollte ich die 330Ohm eventuell auslöten und brücken?

Ein Ausgang soll dann wieder über einen 160Ohm Wiederstand die Led wieder antreiben.

Das Gesamtpaket soll später über ein kleinen Lipo angetrieben werden. Kapazität noch unbekannt, jenachdem welche Größe ich noch intern, notfalls extern unterbringen kann. Geladen soll dieser über einen einfachen Sparkfun LiPo Charger o.ä. mit 5V. Bislang ist noch nicht klar, ob ich diesen im Gehäuse mit unterbringen kann. Falls ja, kommt der Ein/Aus Schalter direkt an den BATT_IN+ Strang des Lipo Chargers.

Im Anhang befindet sich noch die Verdrahtung mit Fritzing, falls nötig, sende ich den Stromplan nach (hab ich noch nicht zurechgeschoben). Könnt ihr mal soweit drüber schaun, ob ihr grobe Schnitzer entdeckt? XBee Pro ist nicht mit angeschlossen, dass sehe ich sobald die Teile da sind. Fritzing hat die nicht direkt drin.

#include <PS2X_lib.h>		// http://www.billporter.info/2010/06/05/playstation-2-controller-arduino-library-v1-0/
#include <Streaming.h>		// http://arduiniana.org/libraries/streaming/
PS2X ps2x;

boolean error;
boolean actMsg;
byte keyCheck;
unsigned long lastMillis;
boolean startState;
boolean selectState;

void setup(){
	Serial.begin(57600);
	// Initialisiere Controller (Clock, Command, Attention, Data, Druck, Rumble)
	ps2x.config_gamepad(13, 11, 10, 12, true, false);
}


void keyTimeout() {
	if (millis() - lastMillis >= 5000) {
		actMsg = false;
		Serial << F("n.OK #") << endl;
		error = true;
	}
}

void keyPassed() {
	actMsg = false;
	Serial << F("  OK #") << endl;
	lastMillis = millis();
	keyCheck++;
}

void ControllerCheck() {

}

void loop() {
	ps2x.read_gamepad(); // PS2 Controller auslesen

	if (error == true) {
		if (actMsg == false) {
			actMsg = true;
			Serial << F("################################") << endl;
			Serial << F("#  PS2 Controller fehlerhaft!  #") << endl;
			Serial << F("#   Erneuter Test mit  START   #") << endl;
			Serial << F("################################") << endl;
		}
		if (ps2x.Button(PSB_START) == true) {
			actMsg = false;
			error = false;
			lastMillis = millis();
			keyCheck = 1;
		}
	}

	else {
		switch (keyCheck) {
		case 0:
			if (actMsg == false) {
				actMsg = true;
				Serial << F("################################") << endl;
				Serial << F("# Druecke die folgenden Tasten #") << endl;
				Serial << F("#   innerhalb von 5 Sekunden   #") << endl;
				Serial << F("################################") << endl;
				Serial << F("#    START              : ");
			}
			if (ps2x.Button(PSB_START) == true) {
				keyPassed();
			}
			else keyTimeout();
			break;

		case 1:
			if (actMsg == false) {
				actMsg = true;
				Serial << F("#    SELECT             : ");
			}
			if (ps2x.Button(PSB_SELECT) == true) {
				keyPassed();
			}
			else keyTimeout();
			break;

		case 2:
			if (actMsg == false) {
				actMsg = true;
				Serial << F("#    Steuerkreuz oben   : ");
			}
			if (ps2x.Button(PSB_PAD_UP) == true) {
				keyPassed();
			}
			else keyTimeout();
			break;

		case 3:
			if (actMsg == false) {
				actMsg = true;
				Serial << F("#    Steuerkreuz unten  : ");
			}
			if (ps2x.Button(PSB_PAD_DOWN) == true) {
				keyPassed();
			}
			else keyTimeout();
			break;

		case 4:
			if (actMsg == false) {
				actMsg = true;
				Serial << F("#    Steuerkreuz links  : ");
			}
			if (ps2x.Button(PSB_PAD_LEFT) == true) {
				keyPassed();
			}
			else keyTimeout();
			break;

		case 5:
			if (actMsg == false) {
				actMsg = true;
				Serial << F("#    Steuerkreuz rechts : ");
			}
			if (ps2x.Button(PSB_PAD_RIGHT) == true) {
				keyPassed();
			}
			else keyTimeout();
			break;

		case 6:
			if (actMsg == false) {
				actMsg = true;
				Serial << F("#    Dreieck            : ");
			}
			if (ps2x.Button(PSB_GREEN) == true) {
				keyPassed();
			}
			else keyTimeout();
			break;

		case 7:
			if (actMsg == false) {
				actMsg = true;
				Serial << F("#    Kreuz              : ");
			}
			if (ps2x.Button(PSB_BLUE) == true) {
				keyPassed();
			}
			else keyTimeout();
			break;

		case 8:
			if (actMsg == false) {
				actMsg = true;
				Serial << F("#    Quadrat            : ");
			}
			if (ps2x.Button(PSB_PINK) == true) {
				keyPassed();
			}
			else keyTimeout();
			break;

		case 9:
			if (actMsg == false) {
				actMsg = true;
				Serial << F("#    Kreis              : ");
			}
			if (ps2x.Button(PSB_RED) == true) {
				keyPassed();
			}
			else keyTimeout();
			break;

		case 10:
			if (actMsg == false) {
				actMsg = true;
				Serial << F("#    L3                 : ");
			}
			if (ps2x.Button(PSB_L3) == true) {
				keyPassed();
			}
			else keyTimeout();
			break;

		case 11:
			if (actMsg == false) {
				actMsg = true;
				Serial << F("#    R3                 : ");
			}
			if (ps2x.Button(PSB_R3) == true) {
				keyPassed();
			}
			else keyTimeout();
			break;

		case 12:
			if (actMsg == false) {
				actMsg = true;
				Serial << F("#    L3 oben            : ");
			}
			if (ps2x.Analog(PSS_LY) == 0) {
				keyPassed();
			}
			else keyTimeout();
			break;

		case 13:
			if (actMsg == false) {
				actMsg = true;
				Serial << F("#    L3 unten           : ");
			}
			if (ps2x.Analog(PSS_LY) == 255) {
				keyPassed();
			}
			else keyTimeout();
			break;

		case 14:
			if (actMsg == false) {
				actMsg = true;
				Serial << F("#    L3 links           : ");
			}
			if (ps2x.Analog(PSS_LX) == 0) {
				keyPassed();
			}
			else keyTimeout();
			break;

		case 15:
			if (actMsg == false) {
				actMsg = true;
				Serial << F("#    L3 rechts          : ");
			}
			if (ps2x.Analog(PSS_LX) == 255) {
				keyPassed();
			}
			else keyTimeout();
			break;

		case 16:
			if (actMsg == false) {
				actMsg = true;
				Serial << F("#    R3 oben            : ");
			}
			if (ps2x.Analog(PSS_RY) == 0) {
				keyPassed();
			}
			else keyTimeout();
			break;

		case 17:
			if (actMsg == false) {
				actMsg = true;
				Serial << F("#    R3 unten           : ");
			}
			if (ps2x.Analog(PSS_RY) == 255) {
				keyPassed();
			}
			else keyTimeout();
			break;

		case 18:
			if (actMsg == false) {
				actMsg = true;
				Serial << F("#    R3 links           : ");
			}
			if (ps2x.Analog(PSS_RX) == 0) {
				keyPassed();
			}
			else keyTimeout();
			break;

		case 19:
			if (actMsg == false) {
				actMsg = true;
				Serial << F("#    R3 rechts          : ");
			}
			if (ps2x.Analog(PSS_RX) == 255) {
				keyPassed();
			}
			else keyTimeout();
			break;

		default:
			if (actMsg == false) {
				actMsg = true;
				Serial << F("################################") << endl;
				Serial << F("#  PS2 Controller in Ordnung!  #") << endl;
				Serial << F("#   Erneuter Test mit  START   #") << endl;
				Serial << F("################################") << endl;
			}
			if (ps2x.Button(PSB_START) == true) {
				actMsg = false;
				lastMillis = millis();
				keyCheck = 1;
			}
			break;
		}
	}
}

Was willst du dann mit dem PS2 Controller machen ?

Wird ein Wireless Controller mit XBee Pro zum steuern von QC oder anderen Geräten.

Was ist QC ?

Einsatzzweck ist vorerst für einen Quadcopter gedacht. Ist aber multifunktional Einsetzbar. Könnte auch zum Steuern Lichterketten etc genutz werden.