DC Motor mit PS2 Thumbstick steuern

Guten Tag liebe Community,

ich bitte um eine Idee/Rat/Vorschlag,
ich habe einen PS2 Controller mit Arduino, der über eine H-Brücke (L298N) einen DC-Motor ansteuert, ich möchte den Motor proportional steuern, benötigt wird nur die Y-Achse vom rechten Stick.
(0=Vorwärts, 127 = Mittelstellung(Stop), 255 = rückwärts)

Es funktioniert auch soweit super, nur im loop() Teil fragt er immer nach der Stick-Position ab, was dazu führt, dass der Motor selbstständig hin- und herspringt die ganze Zeit, dieses Problem muss eliminiert werden. o.O

Hier der Code:

//-----------------------------------------------------------------------------------------

// Bibliotheken //

#include <PS2X_lib.h>

//-----------------------------------------------------------------------------------------

// PS2 Controller //

PS2X ps2x;

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

//-----------------------------------------------------------------------------------------

// H-Brücke //

const int motor1_1 = 4;
const int motor1_2 = 5;
const int ENA = 3;
int motorspeed;

//-----------------------------------------------------------------------------------------

void setup(){
  
  Serial.begin(9600);
       error = ps2x.config_gamepad(13,11,10,12, true, true);
      type = ps2x.readType(); 
      switch(type) {
        case 0:
            Serial.println("Unknown Controller type");
            break;
        case 1:
            Serial.println("DualShock Controller Found");
            break;
      }
      
  pinMode(ENA, OUTPUT);
  pinMode(motor1_1, OUTPUT);
  pinMode(motor1_2, OUTPUT);
 
}

//-----------------------------------------------------------------------------------------

void loop(){
  ps2x.read_gamepad();
   
  int y_pos = (ps2x.Analog(PSS_RY));

  if (y_pos < 100){
    motorspeed = map(y_pos, 100, 0, 0, 255);
    digitalWrite(motor1_1, HIGH);
    digitalWrite(motor1_2, LOW);
    analogWrite(ENA, motorspeed);
  }
  else if (y_pos > 150){
    motorspeed = map(y_pos, 150, 255, 0, 255);
    digitalWrite(motor1_1, LOW);
    digitalWrite(motor1_2, HIGH);
    analogWrite(ENA, motorspeed);
  } else {
    digitalWrite(motor1_1, LOW);
    digitalWrite(motor1_2, LOW);
    analogWrite(ENA, 0);
  }

 delay(50);
}

//-----------------------------------------------------------------------------------------

Vielen lieben Dank :slight_smile:

Hi

Was auffällt:
In Deiner switch-Abfrage hast Du nur einen bekannten Kontroller (type==1).
Sofern die Bibliothek definitiv nur o und 1 ausgeben kann - passt's - sonst würde ich auf den korrekten Kontroller prüfen, und ALLES ANDERE per default: als Unbekannt anmeckern.
Dann brauchst Du auch die Prüfung auf 0 nicht, da Das, wenn nicht separat geprüft, ebenfalls default wird.

Wie ich sehe, hast Du sogar einen gewissen Tot-Bereich, zwischen 100 und 150 - Das hätte eigentlich ausreichen sollen.

Hast Du Dir Mal die Werte anzeigen lassen, Die Du bekommst?
Wie stark wackeln Diese bei still ruhendem Kontroller?
Du könntest versuchen, den Messwert per RunningMedian (Libary ist im Beispiel 'SharpDistSensor' enthalten oder Du nimmst Die von mir 'aufgepumpte' Version Bibliothek Running Median, Daten-Typ angepasst).

Was Du bedenken musst: Das macht das Ganze träger, da hier mehrere Messwerte 'gemittelt' werden.
Wenn Du dafür das delay() raus wirfst, sollte Das aber wieder kompensiert sein.
Wofür sollte das delay() gewesen sein?

MfG

So, habe mir die Werte mal ausgeben lassen,

127
127
127
127
127
127
127
255
127
127
127
127
127
127
127
127
127
127
127
127
127
127
127
127
127
127
127
127
127
127
127
127
127
127
255
127
127
127
127
127
127
127
127
127
127
127
127
127
255
127
127
127

wie man sieht, hält er die Mittelstellung auf 127 nicht permanent, springt aber auf 255 einfach so...


EDIT:
Okay, ich habe das Problem gelöst, ich darf nicht max 255 angeben, sondern alle "255" Werte auf "254" geändert, wunderbar... :wink: