Rumble Mod für Pedale - G27 Adapter - Arduino

U

User 26677

Hi,

ich bin zwar noch ziemlicher Neuling in der ganzen Szene, aber DIY reizt mich bei dem ganzen Thema schon sehr.

Ich nutze ein G27 und die zugehörigen Pedale. Die Bremse ist allerdings modifiziert -> https://www.axc-sim.com/product/brake-pedal-mod-for-logitech-g29-g920-g27-g25-pedals/

Bin damit bislang auch echt zufrieden. Da man die Pedale aber standardmäßig nicht kalibrieren kann, habe ich nun den Weg über einen Arduino mit JoystickLibrary gewählt. Bin bislang auch soweit zufrieden mit dem Setup.

Nun kam heute der nächste Step: ich hab jetzt mal an Gas- und Bremspedal Motoren angebracht. Hab hierzu auf folgende Lösung zurückgegriffen: https://www.racedepartment.com/down...corsa-codmasters-pcars-rf1-rf2-iracing.13563/

Nun habe ich versucht das ganze im ersten Schritt mit Simhub zum laufen zu kriegen, scheiter aber aktuell an der Verbindung zwischen Arduino und Simhub.
Hab nun testweise mal Shakeit aus dem Download genutzt und damit klappt es grundsätzlich erstmal. Konnte also beim fahren ein wenig an den Reglern spielen und bekam gewünschtes Feedback.

Ergo: ich weiß schon mal, dass ich grundsätzlich einen Sketch hab der die Motoren entsprechend antreiben kann und zeitgleich meine Pedaleingaben an den Computer schickt.

Eine richtige Frage oder so hab ich jetzt aktuell noch nicht, da es jetzt schon etwas spät ist. (Außer dass ich zwischen Simhub und Arduino aktuell keine Verbindung habe)


Gibt es hier denn gleichgesinnte die etwas ähnliches umgesetzt haben oder umsetzen wollen?

Da *.ino Dateien nicht angehängt werden können der Code im Spoiler:

#include <Joystick.h>
#include <Wire.h>
#include <Adafruit_MotorShield.h>
#include "utility/Adafruit_MS_PWMServoDriver.h"

// Create the Joystick
Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID,JOYSTICK_TYPE_MULTI_AXIS,
0, 0, // Button Count, Hat Switch Count
false, false, true, // X and Y, but no Z Axis
false, false, false, // No Rx, Ry, or Rz
false, true, // No rudder or throttle
false, true, false); // No accelerator, brake, or steering

int Throttle_ = 0;
int Brake_ = 0;
int ZAxis_ = 0;


// Motor settings
float maxMotorRumbleOutput = 255;

char inputChar = 0;
String inputString;

int valuesBuffer [] = { 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0 };

Adafruit_MotorShield Shield1(0x60); // Default address, no jumpers
//Adafruit_MotorShield Shield2(0x61); // Rightmost jumper closed
//Adafruit_MotorShield Shield3(0x62); // Rightmost jumper closed

Adafruit_DCMotor *motor01 = Shield1.getMotor(1);
Adafruit_DCMotor *motor02 = Shield1.getMotor(2);

const char startDelimiter = '<';
const char endDelimiter = '>';
const char fieldDelimiter = ';';


void setup() {
// put your setup code here, to run once:
// Initialize Joystick Library
Joystick.begin();

//while (!Serial);
Serial.begin(115200);

Shield1.begin(); // Start the bottom shield
//Shield2.begin(); // Start the top shield
//Shield3.begin(); // Start the top shield
//Shield4.begin(); // Start the top shield
}

void setSpeed(Adafruit_DCMotor* motor, int value){

if (value == 0){
motor->run(RELEASE);
return;
}
motor->run(FORWARD);
motor->setSpeed(min(maxMotorRumbleOutput, (int) (((float) value)* (maxMotorRumbleOutput) / (100.0f))));

}

int i;
void loop() {
// put your main code here, to run repeatedly:
Throttle_ = analogRead(A0);
Throttle_ = map(Throttle_,1023,0,0,255);
Joystick.setThrottle(Throttle_);

Brake_ = analogRead(A1);
Brake_ = map(Brake_,1023,0,0,255);
Joystick.setBrake(Brake_);

ZAxis_ = analogRead(A2);
ZAxis_ = map(ZAxis_,1023,0,0,255);
Joystick.setZAxis(ZAxis_);

if (Serial.available() > 0)
{
inputChar = Serial.read();

if (inputChar == startDelimiter)
{
readData();
setSpeed(motor01, valuesBuffer[0]);
setSpeed(motor02, valuesBuffer[1]);
}
else
{

}
}

delay(50);
}

void readData()
{
inputString = "0";
inputChar = '0';
int fieldNumber = 0;
while (true)
{
while (!Serial.available()){}

inputChar = Serial.read();
switch (inputChar)
{
case startDelimiter:
return;
break;
case endDelimiter:
valuesBuffer[fieldNumber] = inputString.toInt();
return;
break;
case fieldDelimiter:
valuesBuffer[fieldNumber] = inputString.toInt();
inputString = "";
fieldNumber++;
break;
default:
inputString += inputChar;
break;
}
}
}
 
U

User 20913

Gibt es einen speziellen Grund für deine delay(50) Anweisung?

Die Verbindung zwischen Arduino und Simhub ist auch für mich noch ein Problem, welches ich nicht geschafft habe (außer mit einem fertigen Simhub sketch). Wenn du es schaffst würde mich sehr interessieren wie du es gemacht hast ;)
 
U

User 13499

Hallo Kai,


Ich benutze Simhub mit Rumble Motoren für meine Pedale und es funktioniert einwandfrei. Wenn du Hilfe brauchst schreib mir einen PN. Dann können wir am Abend kurz quatschen im Discord oder Teamspeak !


LG Thomas
 
U

User 26677

Gibt es einen speziellen Grund für deine delay(50) Anweisung?

Die Verbindung zwischen Arduino und Simhub ist auch für mich noch ein Problem, welches ich nicht geschafft habe (außer mit einem fertigen Simhub sketch). Wenn du es schaffst würde mich sehr interessieren wie du es gemacht hast ;)

Für den delay habe ich keine spezielle Erklärung. Hab den so aus einem Sketch zum Joystick kopiert und stehen gelassen.
Ehrlicherweise halte ich aber eigentlich nicht viel von einem delay bei einem µC.

Grundsätzlich habe ich nun aber das erste Mal mit einem Arduino und den entsprechenden Libraries gearbeitet. Hatte mal aus Langeweile mit einem ATMega8 und LEDs rumgespielt (ohne Anwendung auf Simracing bezogen). Aber da bin ich auch nicht tiefer gegangen als LEDs blinken lassen und das per delay.

Vom Prinzip wäre natürlich ein sleep Befehl und entsprechendes aufwecken beim loop sinnvoller. Das ist zumindest spontan meine Einschätzung.
Dann bleibt der µC nicht stehen und du könntest immer noch per Interrupt etc. Funktionen aufrufen.

Im Gesamten kann es natürlich auch sein, dass wir hier weder die eine noch die andere Lösung benötigen und einfach den loop durchlaufen lassen können.

Hallo Kai,


Ich benutze Simhub mit Rumble Motoren für meine Pedale und es funktioniert einwandfrei. Wenn du Hilfe brauchst schreib mir einen PN. Dann können wir am Abend kurz quatschen im Discord oder Teamspeak !


LG Thomas

Das klingt ja schon mal spannend.

Hast du den Sketch selber geschrieben oder per Simhub generiert?

Ich hatte gestern abend mal in den Code Generator geschaut, aber leider ist das alles etwas viel um da in 5 Minuten eine Lösung zu erarbeiten.

Aber grundsätzlich möchte ich den Sketch schlank halten und nur die Teile Code integrieren die ich benötige. Der Simhub Ansatz ist ja etwas anders, grundsätzlich steht ja alles im Code und wird dann nur über entsprechende Variablen "ein-" oder "ausgeschaltet".
 
Oben