Mowersteuerung mit PS2-Controller

kilipet

Member
Hallo zusammen,
mir ist ein alter drahtloser Playstation 2-Controller in die Hände gefallen den ich jetzt mir relativ wenig Aufwand als RC-Fernbedienung für den Mower verwende:

Bildschirmfoto 2021-04-24 um 21.37.59.png

Ich verwende folgenden Controller: z.B. bei Reichelt

Als Vermittler dient ein Arduino Nano mit einem kleinem Programm.
Der Empfänger wird einfach und direkt an den Nano angeschlossen:
...nach dieser Anleitung...

Anschluss an den Mower wie folgt:
Arduino Nano Vin ---> +5VP
Arduino Nano Gnd ---> GND
Arduino Nano D2 ---> pinRemoteMow
Arduino Nano D3 ---> pinRemoteSteer
Arduino Nano D4 ---> pinRemoteSpeed
Arduino Nano D5 ---> pinRemoteSwitch

Bildschirmfoto 2021-04-24 um 21.49.48.png

Die Analogsticks des Controllers werden vom Arduino in PPM-Signale umgewandelt:
- Links-Y auf Pin D2 für die Geschwindigkeit
- Rechts-X auf Pin D3 für die Lenkung
Dies funktioniert bereits mit der Originalen Sunray-Firmware. Die Einschaltung des RC-Mode erfolgt dann mit einem Button an P20 (3s gedrückt halten).

- Der Pin D4 (pinRemoteSpeed) wird mit dem Kreis-Button auf High geschaltet und mit Quadrat wieder ausgeschaltet. Dies verwende ich für die Ein- und Ausschaltung des Mäh-Motors.
- Pin D5 (pinRemoteSwitch) wird High solange der Start-Button am Controller gedrückt wird. Dies verwende ich für die Ein- Ausschaltung der RC-Funktionen über den Controller (3s gedrückt halten).
Für diese Funktionen ist eine angepasste Firmware nötig (angepasste rcmodel.cpp).

Im Anhang findet Ihr den Arduino-Code und die angepasste rcmodel.cpp falls ihr das nachbauen wollt. Für den Nano-Code wird die Bibliothek 'PsxNewLib' (installierbar über den Bibliotheksverwalter) benötigt.
Ich gehe damit jetzt gezielt gegen Löwenzahn vor ;-).

Viel Spaß damit.

Grüße
Kilian
 

Anhänge

  • PS2remote.zip
    2,7 KB · Aufrufe: 21
  • rcmodel.zip
    1,4 KB · Aufrufe: 20
Zuletzt bearbeitet:
Finde ich genial!
Evtl. wäre es ja möglich, eine Lerntaste (teach) zu machen, und eine Löschtaste (ausklammern der Fläche).
Analog zu den Drohnen, bei wechem das Handy oben als Display in der Fernbedienung festgeklemmt wird.
Eine Taste dann als Hupe, das der Roboter das obligatorische "Mäh" eines Schafes abgibt zur Festigung des nachbarschaftlichen Verhältnisses.
 
Das mit dem "Mäh" gibt es bei Youtube als Video, wenn der Ardumower gegen ein Hinderniss stößt.
 
Hallo zusammen,
mir ist ein alter drahtloser Playstation 2-Controller in die Hände gefallen den ich jetzt mir relativ wenig Aufwand als RC-Fernbedienung für den Mower verwende:

Anhang anzeigen 1914

Ich verwende folgenden Controller: z.B. bei Reichelt

Als Vermittler dient ein Arduino Nano mit einem kleinem Programm.
Der Empfänger wird einfach und direkt an den Nano angeschlossen:
...nach dieser Anleitung...

Anschluss an den Mower wie folgt:
Arduino Nano Vin ---> +5VP
Arduino Nano Gnd ---> GND
Arduino Nano D2 ---> pinRemoteMow
Arduino Nano D3 ---> pinRemoteSteer
Arduino Nano D4 ---> pinRemoteSpeed
Arduino Nano D5 ---> pinRemoteSwitch

Anhang anzeigen 1915

Die Analogsticks des Controllers werden vom Arduino in PPM-Signale umgewandelt:
- Links-Y auf Pin D2 für die Geschwindigkeit
- Rechts-X auf Pin D3 für die Lenkung
Dies funktioniert bereits mit der Originalen Sunray-Firmware. Die Einschaltung des RC-Mode erfolgt dann mit einem Button an P20 (3s gedrückt halten).

- Der Pin D4 (pinRemoteSpeed) wird mit dem Kreis-Button auf High geschaltet und mit Quadrat wieder ausgeschaltet. Dies verwende ich für die Ein- und Ausschaltung des Mäh-Motors.
- Pin D5 (pinRemoteSwitch) wird High solange der Start-Button am Controller gedrückt wird. Dies verwende ich für die Ein- Ausschaltung der RC-Funktionen über den Controller (3s gedrückt halten).
Für diese Funktionen ist eine angepasste Firmware nötig (angepasste rcmodel.cpp).

Im Anhang findet Ihr den Arduino-Code und die angepasste rcmodel.cpp falls ihr das nachbauen wollt. Für den Nano-Code wird die Bibliothek 'PsxNewLib' (installierbar über den Bibliotheksverwalter) benötigt.
Ich gehe damit jetzt gezielt gegen Löwenzahn vor ;-).

Viel Spaß damit.

Grüße
Kilian
Funktioniert das ganze noch oder bei Dir?
Hab das ganze mal aufgebaut mit dem Controller vom Reichelt, aber funktioniert bei mir nicht.
Wenn ich den Nano mit dem oben angegebenen Programm und der genannten Verkabelung und der Bibliothek PsxNewLib verwende, wird lediglich der Mähmotor ein und aus geschalten, laut Konsole des Nano, am Rover passiert dagegen gar nichts.

Verkabel ich den Nano laut dem Datenblatt vom Reichelt und verwende die dort genannte PS2lib und das Beispielprogramm der Biblothek dann funktionieren alle Tasten vom Controller. Also an der Hardware kann es demnach nicht liegen.
Vermutlich habe ich eine andere Hardwareversion von dem Controller, Dein Programm auf eine andere Lib umzustellen ist mir etwas zu hoch :confused:

Noch eine Frage zu der rcmodel.cpp, die lässt sich bei mir gar nicht mit auf den Rover schieben, weil "buttontimer" nicht deklariert ist, hab sie als int mit angefügt, aber wie gesagt, am Rover passiert bei mir trotzdem nichts.
Vielleicht hast Du ja einen Rat für mich :) Danke schön
 
Hallo Algo,

ich bastel gerade an dem gleichen Problem.
Weil ich den günstigeren 'Nano Avery' verwende, funktioniert dort die von killpet verwendete 'PsxNewLib' nicht, weil die die 'DigitalIO' vorraussetzt und dort wiederum der Avery nicht unterstützt wird. Ich habe es jetzt auch mit der 'PS2X_lib' umgesetzt. In dem beschriebenen Example muss man dann lediglich die Deklarationen von killpet übernehmen
Code:
#include <Servo.h>

Servo ServoSpeed;
Servo ServoSteer;

bool relay = false;
#define RELAYPIN 5
bool mow = false;
#define MOWPIN  4

#define SPEEDPIN 2
#define STEERPIN 3

in void setup() die entsprechenden Konfigurationen machen:
Code:
  ServoSpeed.attach(SPEEDPIN);
  ServoSteer.attach(STEERPIN);
  pinMode(RELAYPIN, OUTPUT);
  pinMode(MOWPIN, OUTPUT);

und in der void loop() am Ende:
Code:
 digitalWrite(RELAYPIN, relay);
digitalWrite(MOWPIN, mow);
setAnalog();

Das fahren via der Joysticks habe ich so angepasst:
Code:
void setAnalog() {
  byte lx, ly, rx, ry;
  int speedus, steerus;
  if (ps2x.Button(PSB_L1) || ps2x.Button(PSB_R1)) { //steering only possible if either is TRUE
    //Left stick, Y axis.
    ly = ps2x.Analog(PSS_LY);
    speedus = map(255 - ly, 0, 255, 1100, 1900);
    Serial.print("Left Y: \t");
    Serial.print(ly);
    Serial.print("\t-->\t");
    Serial.println(speedus, DEC);
    ServoSpeed.writeMicroseconds(speedus);

    //Right stick, X axis
    rx = ps2x.Analog(PSS_RX);
    steerus = map(255 - rx, 0, 255, 1100, 1900);
    Serial.print("Right X:\t");
    Serial.print(rx);
    Serial.print("\t-->\t");
    Serial.println(steerus, DEC);
    ServoSteer.writeMicroseconds(steerus);
    vibrate = 2;
  }
  if (ps2x.ButtonReleased(PSB_L1) || ps2x.ButtonReleased(PSB_R1)) {
    ServoSpeed.writeMicroseconds(1500);
    ServoSteer.writeMicroseconds(1500);
    vibrate = 0;
  }
}

Um versehentliches fahren zu vermeiden (meine Tochter fummelt gern an allem rum) ist bei mir fahren nur möglich wenn man L1 oder R1 gedrückt hält. Das Steuern des Mowers funktioniert damit soweit erstmal flüssig. An dem Rest mit [START] = RC On/Off und [O] = Mow On(Off arbeite ich noch, aber ich muss erstmal das gesamte Konzept hinter der remote.cpp verstehen und schauen was sich da geändert hat.

Wenn ich soweit bin, dann werde ich den angepassten Code hier gerne zur Verfügung stellen.
 
Zuletzt bearbeitet:
danke für Deine Mühe, also Deine Codeschnipsel alle in die PS2X_Example.ino?! Die rcmodel.cpp hast Du unverändert gelassen?
 
Da mein Rasen mittlerweile auch wieder so hoch ist, dass der Roboter den Dienst verweigern wird, finde ich diese Lösung äußerst interessant. Als Fallback- und Spaßlösung eine Alternative.

Den undeklakierten "buttontimer" kann ich nachvollziehen. Gibt es dafür mittlerweile einen Fix?
Für den Einbau muss ich mir nur noch die Übersetzung des UNO zum Nano raussuchen, um das Funkmodul am Nano anzuschließen.

Wenn das funktioniert, gibt es ein Feedback.
 
danke für Deine Mühe, also Deine Codeschnipsel alle in die PS2X_Example.ino?! Die rcmodel.cpp hast Du unverändert gelassen?
Ja, ich habe wie gesagt einen Nano Avery verwendet, weil der noch etwas günstiger war als der Nano. Die angepasste PS2X_Example.ino hier funktioniert mit unveränderter rcmodel.cpp zum reinen fahren. Dazu am besten die lib von hier laden und nach C:\Users\<USER>\Documents\Arduino\libraries kopieren.
Den Rest schaue ich mir mal etwas genauer an, wenn ich mit mal wieder Zeit zum basteln habe...

C-ähnlich:
#include <PS2X_lib.h>  //for v1.6
#include <Servo.h>

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

bool relay = false;
#define RELAYPIN 5
bool mow = false;
#define MOWPIN  4

#define SPEEDPIN 2
#define STEERPIN 3

Servo ServoSpeed;
Servo ServoSteer;

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

  ServoSpeed.attach(SPEEDPIN);
  ServoSteer.attach(STEERPIN);
  pinMode(RELAYPIN, OUTPUT);
  pinMode(MOWPIN, OUTPUT);

  //CHANGES for v1.6 HERE!!! **************PAY ATTENTION*************

  //delay(300);  //added delay to give wireless ps2 module some time to startup, before configuring it
  //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);

  // retry logic to avoid a reset after power up
  do
  {
    delay(1000);
    //error = ps2x.config_gamepad(13, 11, 10, 12, true, true);
    error = ps2x.config_gamepad(PS2_CLK, PS2_CMD, PS2_SEL, PS2_DAT, pressures, rumble);
    if (error == 1)
      Serial.println("No controller found, retry in a sec");
  } while (error == 1);

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

  digitalWrite(RELAYPIN, relay);
  digitalWrite(MOWPIN, mow);
  setAnalog();

  delay(50);
}

void setAnalog() {
  byte lx, ly, rx, ry;
  int speedus, steerus;
  if (ps2x.Button(PSB_L1) || ps2x.Button(PSB_R1)) { //slower steering only possible if either is TRUE
    //Left stick, Y axis.
    ly = ps2x.Analog(PSS_LY);
    speedus = map(255 - ly, 0, 255, 1300, 1700);
    Serial.print("Left Y: \t");
    Serial.print(ly);
    Serial.print("\t-->\t");
    Serial.println(speedus, DEC);
    ServoSpeed.writeMicroseconds(speedus);

    //Right stick, X axis
    rx = ps2x.Analog(PSS_RX);
    steerus = map(255 - rx, 0, 255, 1300, 1700);
    Serial.print("Right X:\t");
    Serial.print(rx);
    Serial.print("\t-->\t");
    Serial.println(steerus, DEC);
    ServoSteer.writeMicroseconds(steerus);
    vibrate = 2;
  }
  if (ps2x.Button(PSB_L2) || ps2x.Button(PSB_R2)) { //faster steering only possible if either is TRUE
    //Left stick, Y axis.
    ly = ps2x.Analog(PSS_LY);
    speedus = map(255 - ly, 0, 255, 1100, 1900);
    Serial.print("Left Y: \t");
    Serial.print(ly);
    Serial.print("\t-->\t");
    Serial.println(speedus, DEC);
    ServoSpeed.writeMicroseconds(speedus);

    //Right stick, X axis
    rx = ps2x.Analog(PSS_RX);
    steerus = map(255 - rx, 0, 255, 1100, 1900);
    Serial.print("Right X:\t");
    Serial.print(rx);
    Serial.print("\t-->\t");
    Serial.println(steerus, DEC);
    ServoSteer.writeMicroseconds(steerus);
    vibrate = 127;
  }
  if (ps2x.ButtonReleased(PSB_L1) || ps2x.ButtonReleased(PSB_R1) || ps2x.ButtonReleased(PSB_L2) || ps2x.ButtonReleased(PSB_R2)) {
    ServoSpeed.writeMicroseconds(1500);
    ServoSteer.writeMicroseconds(1500);
    vibrate = 0;
  }
}
 
Zuletzt bearbeitet:
Danke, hatte es mit Deinen Codeschnipseln schon probiert und auch festgestellt, dass es mit der originalen rcmodel.cpp funktioniert. Schade um den Mähmotor, aber eigentlich wollte ich die Steuerung als Alternative für die Sunray-App, weil ich mit der gar nicht zu Recht komme, daher reicht mir das so erstmal.

Hast Du auch Verbindungsprobleme mit dem Joystick? Bei mir verbindet der Joystick immer erst nach einem Reset des Nano. Das ist natürlich unpraktisch wenn der im Rover ist. Hier hat einer den Code um eine do-Schleife erweitert https://stackoverflow.com/questions...after-ps2-controller-communication-in-arduino
das klappt bei mir ganz gut so.
 
Ich habe so meine Probleme die Steuerung umzusetzen.

Für die Verkabelung habe ich mich für meinen originalen Nano an folgender Anleitung orientiert und versucht die Anschlüsse zu übertragen: https://cdn-reichelt.de/documents/datenblatt/A300/SBC-WLGAMEPAD_ANLEITUNG_2021-04-13.pdf

FunkmodulArduino Uno Kontakt laut AnleitungArduino Nano
1PIN 13D9
2PIN 11D7
4GNDGND
53.3V3.3V
6PIN 10D6
7PIN 12D8

Die Anschlüsse vom Nano zum PCB habe ich aus dem Einstiegsbeitrag übernommen.

IMG_7740.jpeg

Mag sein, dass mein Problem in der Software liegt. Ich hatte gehofft jemand könnte meine Übersetzung der Anschlüsse verifizieren.
 
Ich habe so meine Probleme die Steuerung umzusetzen.

Für die Verkabelung habe ich mich für meinen originalen Nano an folgender Anleitung orientiert und versucht die Anschlüsse zu übertragen: https://cdn-reichelt.de/documents/datenblatt/A300/SBC-WLGAMEPAD_ANLEITUNG_2021-04-13.pdf

FunkmodulArduino Uno Kontakt laut AnleitungArduino Nano
1PIN 13D9
2PIN 11D7
4GNDGND
53.3V3.3V
6PIN 10D6
7PIN 12D8

Die Anschlüsse vom Nano zum PCB habe ich aus dem Einstiegsbeitrag übernommen.

Anhang anzeigen 4592

Mag sein, dass mein Problem in der Software liegt. Ich hatte gehofft jemand könnte meine Übersetzung der Anschlüsse verifizieren.
warum nimmst Du dann nicht die Pin-Belegung wie sie bei Reichelt beschrieben ist für den Arduino?
Der Nano hat doch auch zb. einen D13 (liegt gegenüber der anderen digitalen Anschlüsse)
1654164902756.png

1654165154764.png
 
Zuletzt bearbeitet:
warum nimmst Du dann nicht die Pin-Belegung wie sie bei Reichelt beschrieben ist für den Arduino?
Der Nano hat doch auch zb. einen D13 (liegt gegenüber der anderen Digitalen Eingängen)
Ich kenne mich mit der Pinbelegung nicht aus und habe ich einer gegoogelten Beschreibung vertraut: http://christianto.tjahyadi.com/wp-content/uploads/2014/11/nano.jpg

Wenn die D-Kontakte den durchnummerierten Kontakten des Uno entsprechen, dann ändere ich das natürlich. Sind D10 bis D13 auf dem Nano gleich dem Kontakten 10 bis 13 auf dem Uno?
 
Ich kenne mich mit der Pinbelegung nicht aus und habe ich einer gegoogelten Beschreibung vertraut: http://christianto.tjahyadi.com/wp-content/uploads/2014/11/nano.jpg

Wenn die D-Kontakte den durchnummerierten Kontakten des Uno entsprechen, dann ändere ich das natürlich. Sind D10 bis D13 auf dem Nano gleich dem Kontakten 10 bis 13 auf dem Uno?
genau

kannst ja dann mal das Beispiel aus der PS2X_lib auf den Nano laden und in der Console den Controller testen ob alle Tasten etc. gehen.
 
[...]

Hast Du auch Verbindungsprobleme mit dem Joystick? Bei mir verbindet der Joystick immer erst nach einem Reset des Nano. Das ist natürlich unpraktisch wenn der im Rover ist. Hier hat einer den Code um eine do-Schleife erweitert https://stackoverflow.com/questions...after-ps2-controller-communication-in-arduino
das klappt bei mir ganz gut so.
Danke für den Tipp! Ich hatte in der Tat immer mal wieder keine Verbindung und im setup() mit einem delay experimentiert. Aber mit der do-Schleife funktioniert es jetzt perfekt. Ich würde ja auch lieber die SPI-library statt dieser Bibliothek mit Bit-Banging-Nachbau verwenden, aber der Nano Every wird von PsxNewLib bzw. von DigitalIO leider nicht unterstützt und ich bin nicht fit genug um das einzubauen.

Ich hab den Code oben mal angepasst und gleich noch je nachdem ob man L1/R1 oder L2/R2 gedrückt hält zwei unterschiedliche Fahr- und Lenkgeschwindigkeiten eingebaut. Bei Gelegenheit werde ich auch mal aufräumen und den ganzen unnötigen Kram von der example_PSXlib rausschmeissen, aber im Moment habe ich noch andere Sorgen mit meinem GPS-RTK...
 
Danke für den Tipp! Ich hatte in der Tat immer mal wieder keine Verbindung und im setup() mit einem delay experimentiert. Aber mit der do-Schleife funktioniert es jetzt perfekt. Ich würde ja auch lieber die SPI-library statt dieser Bibliothek mit Bit-Banging-Nachbau verwenden, aber der Nano Every wird von PsxNewLib bzw. von DigitalIO leider nicht unterstützt und ich bin nicht fit genug um das einzubauen.

Ich hab den Code oben mal angepasst und gleich noch je nachdem ob man L1/R1 oder L2/R2 gedrückt hält zwei unterschiedliche Fahr- und Lenkgeschwindigkeiten eingebaut. Bei Gelegenheit werde ich auch mal aufräumen und den ganzen unnötigen Kram von der example_PSXlib rausschmeissen, aber im Moment habe ich noch andere Sorgen mit meinem GPS-RTK...
schön wenn es geholfen hat :)

Im Moment komm ich irgendwie zu nix, hab mir erst einmal noch 6pol Stecker bestellt um die Fernbedienung außen am Rover anschließen zu können, kannst Du evtl. Deinen fertigen Code hier mit uns teilen? Funktioniert das mit dem Mähmotor ein/aus bei Dir nun (wäre ja auch nur nice to have)
Danke Dir
 
Hallo Algo,

meinen verwendeten Code findest du oben in dem Posting. Ich habe da eigentlich nur die example_PSxLib leicht angepasst und noch nicht aufgeräumt.

Den Empfänger habe ich übrigens in ein passendes Gehäuse von Reichelt vorn unter das "Vordach" des Dipond-Chassis gehängt.

Mähmotor ein/aus und insbesondere RC-Mode ein/aus habe ich noch nicht hinbekommen, da ich die Architektur mit der rcmodell.cpp noch nicht verstanden habe. Es wäre super wenn uns da ein "Insider" etwas Nachhilfe geben könnte, wie man das möglichst sauber implementieren könnte.
 
Hallo @tetzlav,
wenn Du Interesse hast, kann ich Dir morgen Abend mal meine angepasste Version zur Verfügung stellen.
- RC-Mode ein/aus durch langes Drücken der Start-Taste (>5sek) auf dem Controller.
- Mähmotor ein durch Keis-Taste, aus durch X-Taste.
- Geschwindigkeit mit linken Analogstick vor und zurück.
- Lenkung mit rechtem Analogstick rechts und links.
- durch langes Drücken (>2sek) von Select kann die Lenkung mit auf den linken Analogstick umgeschaltet werden. (Steuerung dann wie in der App mit nur einem Stick)
- Die Geschwindigkeit kann durch gedrückt halten von L1 oder L2, die Lenkung durch R1 oder R2 erhöht werden.
- permanentes Force Feedback bei Bumper Auslösung, pulsierendes Force Feedback bei Sonar Auslösung.
- kurzer Druck auf Select schaltet die Force Feedback Funktion aus/ein.

Ich verwende einen Arduino Nano.

Gruß Sven
 
Zuletzt bearbeitet:
Hallo @tetzlav,
wenn Du Interesse hast, kann ich Dir morgen Abend mal meine angepasste Version zur Verfügung stellen.
- RC-Mode ein/aus durch langes Drücken der Start-Taste (>5sek) auf dem Controller.
- Mähmotor ein durch X-Taste, aus durch Quadrat-Taste.
- Geschwindigkeit mit linken Analogstick vor und zurück.
- Lenkung mit rechtem Analogstick rechts und links.
- durch langes Drücken (>2sek) von Select kann die Lenkung mit auf den linken Analogstick umgeschaltet werden. (Steuerung dann wie in der App mit nur einem Stick)
- Die Geschwindigkeit kann durch gedrückt halten von L1 oder L2, die Lenkung durch R1 oder R2 erhöht werden.
- permanentes Force Feedback bei Bumper Auslösung, pulsierendes Force Feedback bei Sonar Auslösung.
- kurzer Druck auf Select schaltet die Force Feedback Funktion aus/ein.

Ich verwende einen Arduino Nano.
Hallo Sven, ich verwende auch einen Nano. Deine Beschreibung liest sich wie eine vollumfängliche Version. Ich wäre auch sehr daran interessiert.

Viele Grüße
Oliver
 
Oben