Arduino Gamepad, Servo Bewegung auslösen

Hallo zusammen,

ich möchte einen Gamepad am Arduino betreiben. Der Gamepad ist von Pollin und mit bluetooth.

Kann mir jemand zeigen, wie ich eine Servobewegung von zwei Servos mit dem Gamepad auslöse?

Hier der Code des Gamepads mit dem Namen Ps2x_example:

#include <PS2X_lib.h>  //for v1.6

/******************************************************************
* set pins connected to PS2 controller:
*   - 1e column: original 
*   - 2e colmun: Stef?
* replace pin numbers by the ones you use
******************************************************************/
#define PS2_DAT        13  //14    
#define PS2_CMD        11  //15
#define PS2_SEL        10  //16
#define PS2_CLK        12  //17

/******************************************************************
* select modes of PS2 controller:
*   - pressures = analog reading of push-butttons 
*   - rumble    = motor rumbling
* uncomment 1 of the lines for each mode selection
******************************************************************/
//#define pressures   true
#define pressures   false
//#define rumble      true
#define rumble      false

PS2X ps2x; // create PS2 Controller Class

//right now, the library does NOT support hot pluggable controllers, meaning 
//you must always either restart your Arduino after you connect the controller, 
//or call config_gamepad(pins) again after connecting the controller.

int error = 0;
byte type = 0;
byte vibrate = 0;

void setup(){

 Serial.begin(57600);
 
 delay(300);  //added delay to give wireless ps2 module some time to startup, before configuring it
  
 //CHANGES for v1.6 HERE!!! **************PAY ATTENTION*************
 
 //setup pins and settings: GamePad(clock, command, attention, data, Pressures?, Rumble?) check for error
 error = ps2x.config_gamepad(PS2_CLK, PS2_CMD, PS2_SEL, PS2_DAT, pressures, rumble);
 
 if(error == 0){
   Serial.print("Found Controller, configured successful ");
   Serial.print("pressures = ");
if (pressures)
 Serial.println("true ");
else
 Serial.println("false");
Serial.print("rumble = ");
if (rumble)
 Serial.println("true)");
else
 Serial.println("false");
   Serial.println("Try out all the buttons, X will vibrate the controller, faster as you press harder;");
   Serial.println("holding L1 or R1 will print out the analog stick values.");
   Serial.println("Note: Go to www.billporter.info for updates and to report bugs.");
 }  
 else if(error == 1)
   Serial.println("No controller found, check wiring, see readme.txt to enable debug. visit www.billporter.info for troubleshooting tips");
  
 else if(error == 2)
   Serial.println("Controller found but not accepting commands. see readme.txt to enable debug. Visit www.billporter.info for troubleshooting tips");

 else if(error == 3)
   Serial.println("Controller refusing to enter Pressures mode, may not support it. ");
 
//  Serial.print(ps2x.Analog(1), HEX);
 
 type = ps2x.readType(); 
 switch(type) {
   case 0:
     Serial.print("Unknown Controller type found ");
     break;
   case 1:
     Serial.print("DualShock Controller found ");
     break;
   case 2:
     Serial.print("GuitarHero Controller found ");
     break;
case 3:
     Serial.print("Wireless Sony DualShock Controller found ");
     break;
  }
}

void loop() {
 /* You must Read Gamepad to get new values and set vibration values
    ps2x.read_gamepad(small motor on/off, larger motor strenght from 0-255)
    if you don't enable the rumble, use ps2x.read_gamepad(); with no values
    You should call this at least once a second
  */  
 if(error == 1) //skip loop if no controller found
   return; 
 
 if(type == 2){ //Guitar Hero Controller
   ps2x.read_gamepad();          //read controller 
  
   if(ps2x.ButtonPressed(GREEN_FRET))
     Serial.println("Green Fret Pressed");
   if(ps2x.ButtonPressed(RED_FRET))
     Serial.println("Red Fret Pressed");
   if(ps2x.ButtonPressed(YELLOW_FRET))
     Serial.println("Yellow Fret Pressed");
   if(ps2x.ButtonPressed(BLUE_FRET))
     Serial.println("Blue Fret Pressed");
   if(ps2x.ButtonPressed(ORANGE_FRET))
     Serial.println("Orange Fret Pressed"); 

   if(ps2x.ButtonPressed(STAR_POWER))
     Serial.println("Star Power Command");
   
   if(ps2x.Button(UP_STRUM))          //will be TRUE as long as button is pressed
     Serial.println("Up Strum");
   if(ps2x.Button(DOWN_STRUM))
     Serial.println("DOWN Strum");

   if(ps2x.Button(PSB_START))         //will be TRUE as long as button is pressed
     Serial.println("Start is being held");
   if(ps2x.Button(PSB_SELECT))
     Serial.println("Select is being held");
   
   if(ps2x.Button(ORANGE_FRET)) {     // print stick value IF TRUE
     Serial.print("Wammy Bar Position:");
     Serial.println(ps2x.Analog(WHAMMY_BAR), DEC); 
   } 
 }
 else { //DualShock Controller
   ps2x.read_gamepad(false, vibrate); //read controller and set large motor to spin at 'vibrate' speed
   
   if(ps2x.Button(PSB_START))         //will be TRUE as long as button is pressed
     Serial.println("Start is being held");
   if(ps2x.Button(PSB_SELECT))
     Serial.println("Select is being held");      

   if(ps2x.Button(PSB_PAD_UP)) {      //will be TRUE as long as button is pressed
     Serial.print("Up held this hard: ");
     Serial.println(ps2x.Analog(PSAB_PAD_UP), DEC);
   }
   if(ps2x.Button(PSB_PAD_RIGHT)){
     Serial.print("Right held this hard: ");
     Serial.println(ps2x.Analog(PSAB_PAD_RIGHT), DEC);
   }
   if(ps2x.Button(PSB_PAD_LEFT)){
     Serial.print("LEFT held this hard: ");
     Serial.println(ps2x.Analog(PSAB_PAD_LEFT), DEC);
   }
   if(ps2x.Button(PSB_PAD_DOWN)){
     Serial.print("DOWN held this hard: ");
     Serial.println(ps2x.Analog(PSAB_PAD_DOWN), DEC);
   }   

   vibrate = ps2x.Analog(PSAB_CROSS);  //this will set the large motor vibrate speed based on how hard you press the blue (X) button
   if (ps2x.NewButtonState()) {        //will be TRUE if any button changes state (on to off, or off to on)
     if(ps2x.Button(PSB_L3))
       Serial.println("L3 pressed");
     if(ps2x.Button(PSB_R3))
       Serial.println("R3 pressed");
     if(ps2x.Button(PSB_L2))
       Serial.println("L2 pressed");
     if(ps2x.Button(PSB_R2))
       Serial.println("R2 pressed");
     if(ps2x.Button(PSB_TRIANGLE))
       Serial.println("Triangle pressed");        
   }

   if(ps2x.ButtonPressed(PSB_CIRCLE))               //will be TRUE if button was JUST pressed
     Serial.println("Circle just pressed");
   if(ps2x.NewButtonState(PSB_CROSS))               //will be TRUE if button was JUST pressed OR released
     Serial.println("X just changed");
   if(ps2x.ButtonReleased(PSB_SQUARE))              //will be TRUE if button was JUST released
     Serial.println("Square just released");     

   if(ps2x.Button(PSB_L1) || ps2x.Button(PSB_R1)) { //print stick values if either is TRUE
     Serial.print("Stick Values:");
     Serial.print(ps2x.Analog(PSS_LY), DEC); //Left stick, Y axis. Other options: LX, RY, RX  
     Serial.print(",");
     Serial.print(ps2x.Analog(PSS_LX), DEC); 
     Serial.print(",");
     Serial.print(ps2x.Analog(PSS_RY), DEC); 
     Serial.print(",");
     Serial.println(ps2x.Analog(PSS_RX), DEC); 
   }     
 }
 delay(50);  
}

Gruss

Das mit den Codetags hat bei Dir schon mal besser funktioniert.

Gruß Tommy

Hi

Da Du nicht schreibst, was funktioniert und was nicht: Indem Du Das machst.
Wird der Controller gefunden, spuckt Dieser Werte aus? Welche?

MfG

Ich habe zwei Servos mit der Servo Lib angesteuert. jetzt hätte ich dieses Programm gerne in das oben genannte Programm eingefügt und mit der X-Taste ausgelöst. Ich weiss aber nicht wie ich das einfüge. Ob der Controller erkannt wird, oder Werte ausspuckt, weiss ich auch nicht wie.

Gruss

Äääh ...

Der Sketch, Den Du oben 'ohne Codetags' gepostet hast, sollte doch, bei erkanntem Controller, diverse Werte von Diesem ausspucken ... oder was soll Der machen?
Oder eben anzeigen, daß kein Controller gefunden wurde - WAS macht der Sketch??

MfG

Ich habs noch nichts angeschlossen, daher weiss ich nicht. Der Sketch soll einfach nur die Servos ansteuern.

Gruss

... dann schreibe Das doch 'einfach' Da mit rein ...

Was denkst Du?
Natürlich habe ich zwölf dieser Controller hier rumfliegen und mir ist natürlich auch klar, was Diese so senden, wenn ich auf 'egal welchen' Knopf drücke - natürlich ist Das So für mich überhaupt kein Problem, den Kram nebenher zusammen zu würfeln ... solltest Du Ironie finden: Glückwunsch!

MfG

Der Gamepad muss zuerst eingeschaltet werden, dann den Arduino mit dem PC verbinden und dann die ide öffnen. Weiter weiss ich nicht

Gruss

@peter1984: Da Du die Bitte um Korrektur der Codetags im Ursprungsposting ignorierst, werde ich das mit Deinen Postings wohl auch so machen.

Gruß Tommy

Nochmal zum Nachlesen für Dich:

Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).
Dann ist er auch auf mobilen Geräten besser lesbar.
Das kannst Du auch noch nachträglich ändern.

Gruß Tommy

So wie es freundlicherweise Uwe für dich beim letzten Mal gemacht hat.

Ich habe die Klammern vergessen :slight_smile:

Hier ist noch der Servo code:

 #include <Servo.h> //Die Servobibliothek wird aufgerufen. Sie wird benötigt, damit die Ansteuerung des Servos vereinfacht wird.
 

Servo servoblau; //Erstellt für das Programm ein Servo mit dem Namen „servoblau“

 

void setup()

{

servoblau.attach(8); //Das Setup enthält die Information, dass das Servo an der Steuerleitung (gelb) mit Pin 8 verbunden wird. Hier ist natürlich auch ein anderer Pin möglich.

}

 

void loop()

{ //Im „loop“ wird über den write-Befehl „servoblau.write(Grad)“ das Servo angesteuert. Zwischen den einzelnen Positionen gibt es eine Pause, damit das Servo genug Zeit hat, die gewünschten Positionen zu erreichen.

servoblau.write(0); //Position 1 ansteuern mit dem Winkel 0°

delay(3000); //Das Programm stoppt für 3 Sekunden

servoblau.write(90); //Position 2 ansteuern mit dem Winkel 90°

delay(3000); //Das Programm stoppt für 3 Sekunden

servoblau.write(180); //Position 3 ansteuern mit dem Winkel 180°

delay(3000);//Das Programm stoppt für 3 Sekunden

servoblau.write(20); //Position 4 ansteuern mit dem Winkel 20°

delay(3000);//Das Programm stoppt für 3 Sekunden

}

... die Kommunikation mit Dir ist mühsam ...

Servo-Sketch:

  • Kommentare sinnlos, DAS sieht man
  • delay() macht den Fetzen unbrauchbar für irgendwelche Zusammenführungen
  • Leerzeilen, wohin das Auge sieht ... muß Das So sein?

Was ich mir wünsche:
Deine Aussage, WAS der Controller-Sketch (erste Post) bei Dir macht, WAS kommt bei WELCHEM KNOPF, bekommst Du Winkelangaben/Beschleunigungen, whatever.
Deine Aussage, WAS DU WANN haben willst - bitte so, daß Deine Großmutter Dir folgen könnte.
Deine Mitarbeit
Und ... daß Du Dir nicht jeden Krümel aus der Nase zerren lassen musst - wäre sehr hilfreich.

Wie ich ein Servo angesprochen bekomme, ist mir durchaus bewusst, was von Deinem BT-Controller kommt, aber in keiner Weise.

MfG

Ich habe hier ein Kettenfahrzeug mit zwei DC Motoren(5V), die ich via Joystick über l293 H-Brücke ansteuern möchte. Zusätzlich noch einen Roboterarm auf das Fahrzeug, bei welchem ich mit der X-Taste eine Servobewegung auslösen möchte. Also der Roboterarm soll ein Steinchen aufheben können und auf die Ladefläche tun und das durch einmaliges drücken der X-Taste.
Hinzuzufügen ist, dass ich einen Arduino mega2560 hierfür verwenden möchte.
Gruss

Ich habe jetzt den Controller und ein Servo angeschlossen an den Mega2560. Dann habe ich die ide geöffnet. Controller wird erkannt. Weiter weiss ich nicht.

Gruss