Handbremse für LKW-Spiel

Hallo zusammen,

ich würde gerne meinem Sohn eine Handbremse für sein LKW-Spiel machen.
Die "Hardware" habe ich schon gebaut. Mit einem Mikroschalter darin.
Ein Arduino Leonardo R3 habe ich schon für die Gangschaltung in Gebrauch.
Im Internet hatte ich mal eine Programmierung für einen Joystick gefunden die jetzt darauf läuft.
In der Programmierung ist noch ein Anschluss (Pin 9) frei. Da soll die Bremse dran.
Nun ist das Problem, dass man den Hebel nochmal ziehen muss um die Bremse zu lösen.
Es soll aber so sein, dass man den Schalter drückt und die Bremse geht zu. Lässt man den Schalter dann wieder los soll die Bremse auf gehn.

Im Spiel geht das über die Leertaste. Einmal drücken die Bremse geht zu und nochmal drücken und die Bremse löst sich wieder.

Ist sowas machbar und wenn ja, könnte mir das jemand netterweise machen?
Ich hab von sowas leider keine Ahnung.

Schönen Sonntag noch...

Miracolix

Das ist die Programmierung, die ich aus dem Internet habe.

// Simple example application that shows how to read four Arduino
// digital pins and map them to the USB Joystick library.
//
// Ground digital pins 9, 10, 11, and 12 to press the joystick
// buttons 0, 1, 2, and 3.
//
// NOTE: This sketch file is for use with Arduino Leonardo and
// Arduino Micro only.
//
// by Matthew Heironimus
// 2015-11-20
//--------------------------------------------------------------------

#include <Joystick.h>

Joystick_ Joystick;

void setup() {
// Initialize Button Pins
pinMode(9, INPUT_PULLUP);
pinMode(10, INPUT_PULLUP);
pinMode(11, INPUT_PULLUP);
pinMode(12, INPUT_PULLUP);

// Initialize Joystick Library
Joystick.begin();
}

// Constant that maps the phyical pin to the joystick button.
const int pinToButtonMap = 9;

// Last state of the button
int lastButtonState[4] = {0,0,0,0};

void loop() {

// Read pin values
for (int index = 0; index < 4; index++)
{
int currentButtonState = !digitalRead(index + pinToButtonMap);
if (currentButtonState != lastButtonState[index])
{
Joystick.setButton(index, currentButtonState);
lastButtonState[index] = currentButtonState;
}
}

delay(50);
}

In der Programmierung ist noch ein Anschluss (Pin 9) frei.

Nein. Ich sehe, dass Pin 9 genauso wie die anderen drei (10..12) behandelt wird. Also weiß ich nicht, was du willst.

Und was das für ein LKW-Spiel ist, verstehe ich auch nicht.

Was man findet ist nie das was man will.
Dafür kann man Unmengen an Zeugs finden.

Hallo michael_x,

Das Spiel ist Eurotruck Simulator 2.

Die Anschlüsse 10 - 12 konnte man im Spiel so einstellen, dass man einen LKW Schaltknauf anschließen kann.
Hab also nen Knauf vom TGX gekauft und die Schalter an die Pins angeschlossen.
Das wollte ich auch mit der Handbremse (Pin 9) machen. Aber das kann man nicht im Spiel so einstellen, dass das funktioniert. Darum war mein Gedanke das Arduino so zu programmieren, dass es einmal schalten wenn man den Hebel (Mikroschalter) umlegt (drückt) und es wieder schaltet wenn der Schalter los gelassen wird.

LG
Miracolix

Ich hab jetzt nochmal im Spiel geschaut. Die Funktion für die Getriebewahl heißt:"Umschaltmodus für Schalter am Schalthebel".
Darüber kann man mit einem "normalen" Schalter das Getriebe vorwählen. Also so als ob man dauernd auf einen Knopf drückt und wenn man den dann irgendwann los lässt schaltet das Getriebe wieder zurück. Darum dachte ich erst das ginge auch mit der Handbremse.

Aber wenn Du sagst das geht nicht, dann hatte ich Pech gehabt.

Vielen Dank, dass Du dir das angeschaut hast.

Wünsch Dir noch einen schönen Tag.

Miracolix

Natürlich ist es möglich nen arduino so zu programmieren, dass er nen impuls auslöst wenn eine Taste (Mikroschalter) gedrückt wird, und wieder ein impuls ausgelöst wird, wenn der Mikroschalter wieder gelöst wird.

Und wenn dein Modul dafür nen Eingang oder ne Taste für die Handbremse frei hat, kannst du das auch nutzen.
(ist natürlich grundbedinnung, dass Du über diesen besagten Pin die Handbremse nutzen kannst.

LG Stefan

Hallo Deltaflyer,

ich glaub schon, dass man das programmieren kann und das Arduino dann wieder als Joystick erkannt wird.
Leider kann ich es nicht machen und ich will niemandem die Zeit stehlen. Auch wüsste ich nicht wie ich eine komplett neue Programmierung entlohnen sollte.
Ich werd mich wieder ans Reißbrett setzen und das Gehäuse so umbauen, dass der Mikroschalter als Taster fungiert. Dann kann kommen was will.

Über diesen Pin kann ich die Handbremse auslösen. Dann ist aber der Hebel eingerastet. Um dann die Bremse zu lösen muss ich den Hebel entsperren, sodass er nach oben klappt und dann wieder runter drücken bis er einrastet. Was er aber nicht soll. Denn dann ist ja eigentlich die Bremse angezogen. Ich kann das schlecht erklären. Ist etwa so wie beim Auto. Du ziehst den Handbremshebel hoch, dann ist die Handbremse zu. Handbremshebel runter, Bremse offen.
Bei mir ist es jetzt so, dass ich hoch ziehe, dann ist die Bremse zu. Dann drück ich wieder runter und dann nochmal hoch und die Bremse ist offen.

Trotzdem vielen Dank, dass Ihr Euch das durch denk Kopf habt gehen lassen und so schnell geantwortet habt.

LG
Miracolix

Hi Miracolix,
lass mir etwas (diese Nacht) Zeit, ich setze mich an Deinen Code dran, so dass Du Deinen Handbremshebel so Nutzen kannst , wie es sein sollte. (also so wie beim Auto auch).

Muss kurz schauen, ich müsste eigentlich noch einen Arduino Mikro da haben, damit ich das auch testen kann.

LG Stefan

p.s. Ich bin nicht grad der schnellste, aber dafür kostenlos - aus Spass an der Freude.

Hallo Deltaflyer

das ist echt lieb von Dir. Danke schön.

Bitte keine Hektik. Schlag Dir nicht wegen mir die Nacht um die Ohren!
Das ist es nicht wert.

LG

Miracolix

Ich habe keinen Leonardo, keinen Joystick und auch kein Spiel, aber eine Idee zum Probieren:

#include <Joystick.h>

Joystick_ Joystick;

// Constant that maps the phyical pin to the joystick button.
const int pinToButtonMap = 9;

// Last state of the button
bool lastButtonState[4] = {0, 0, 0, 0};
bool currentButtonState0;
bool ButtonState;

void setup() {
  // Initialize Button Pins
  pinMode(9, INPUT_PULLUP);
  pinMode(10, INPUT_PULLUP);
  pinMode(11, INPUT_PULLUP);
  pinMode(12, INPUT_PULLUP);
  // Initialize Joystick Library
  Joystick.begin();
}

void loop() {
  int index = 0;
  lastButtonState[index] = currentButtonState0;
  currentButtonState0 = !digitalRead(index + pinToButtonMap);
  if (currentButtonState0 && !lastButtonState[index])
  {
    ButtonState = !ButtonState;
    Joystick.setButton(index, ButtonState);
  }

  // Read pin values
  for (int index = 1; index < 4; index++)
  {
    bool currentButtonState = !digitalRead(index + pinToButtonMap);
    if (currentButtonState != lastButtonState[index])
    {
      Joystick.setButton(index, currentButtonState);
      lastButtonState[index] = currentButtonState;
    }
  }

  delay(50);
}

Das Verhalten von Pin 9 sollte sich verändern.

Ich bin nunmal ein Nachtmensch. Und da ich höchstens 3 Stunden pro Nacht schlafe, muss ich ja was zu tun haben. und es macht mir Spass und gibt mir das Gefühl, noch zu was nütze zu sein.

Ich hab übrigens nen Mikro da , so dass ich testen kann.
Da ich nicht weiss, wie das LKW-Spiel die Handbremse Auswertet, baue ich Dir eine Variable in den Sketch ein, wo Du durch ändern von 'true' zu 'false' die Funktion der Handbremse umkehren kannst, falls die Bremse im gezogenen Zustand als gelöst erkannt wird.

Ich werde einen ensprechenden Vermerk im Sketch eintragen, damit Du siehst, wo du das umschalten kannst.

LG Stefan

OK da war ich wohl zu langsam.
LG Stefan

Deltaflyer:
OK da war ich wohl zu langsam.

Probiere doch mal, ich kann es ja nicht.

Man benötigt ja wohl den Micro, weil der die Tastatur nachbildet, oder?

Deltaflyer:
Und da ich höchstens 3 Stunden pro Nacht schlafe, muss ich ja was zu tun haben. und es macht mir Spass und gibt mir das Gefühl, noch zu was nütze zu sein.

Ich halte mich gerne zurück :slight_smile:

Hallo Deltaflyer,
hallo agmue,

eigentlich würde es reichen wenn dei Handbremse (Joystickknopf) meinmal auslöst wenn er gedrückt wird und einmal wenn er wieder losgelassen wird. Da die Handbremse länger angezogen ist muss auch nicht "wild" rumgeschaltet werden.

Danke für Deine Bemühungen agmue. Ich kann das gleich mal drauf machen und berichten ob es funktioniert.

Nachtmenschen sind wir doch alle irgendwo, Deltaflyer. Aber bitte nicht wegen mir unnötig lange davor sitzen.

LG

Miracolix

Ich hab das Programm mal getestet.
Leider war es das noch nicht. Mit der Änderung muss ich den "Taster" drei mal drücken um die Bremse zu lösen.
Habe zwar keine Ahnung aber ich bin am zweifeln das man das dem Arduino beibringen kann, dass es beim drücken und halten von dem "Taster" einen (ich sag jetzt mal) Impuls schicken kann und nochmal den gleichen "Impuls" wenn man den "Taster" wieder los lässt.
Das Arduino blink so. Wenn ich drauf drücke leichte kurz eine gelbe LED und wenn ich los lasse leuchtet die gleiche LED nochmal.

Ich kann in dem Spiel eine Taste zuweisen. Egal ob Tastatur oder Joystick.
Wenn es hilft könnte ich twitch ein Stream starten. Dann kann ich das vielleicht besser beschreiben was ich meine.

LG
Miracolix

OK Miracolix,
dann schau ich nun doch, wie das hinzukriegen ist. Nach agume's post hab ich dann nichts weiter versucht, da ich dachte, dass seine Lösung sicher ok ist. Kann sein, dass ein Prellen des Mikroschalters da ein Problem macht.
Ich nehme mich des Problems an.

LG Stefan

Hallo Deltaflyer,

Danke nochmal.

Meinst Du das ein Problem kommen könnte? Der Schaltknauf, der an den anderen Pins angeschlossen ist hat auch nur einfache Mikroschalter und bis jetzt gab er keine Probleme. Und die Schalter werden bei weitem häufiger geschaltet.

Wenn ich Dir, von hier aus, irgendwas tun kann sag Bescheid. Ab morgen Nachmittag bin ich wieder daheim.

LG

Miracolix

Frage: ist beim spielstart die Handbremse im Spiel angezogen? und in welcher stellung ist der Handbremshebel beim spielstart?

Hab übrigens rausgefunden, warum es mit agmues code nicht klappt : da wird einfach beim öffnen und schliessen der bremse jeweils der neue Zustand gespeichert, anstatt jeweils beim öffnen und schliessen der Bremse ein Impuls gesendet.

das werde ich korrigieren. hab so ähnliche probleme beim umbau eines 3-Kanal RC-Senders gehabt, da musste auch mittels arduino der Schalter für den 3. Kanal umgebaut (umprogrammiert) werden, damit ich da bis zu 10 Schaltfunktionen drüber schicken kann.

LG Stefan

Hallo Miracolix,

Das hier sollte eigentlich genau das tun, was Du wolltest.

// Ground digital pins 9, 10, 11, and 12 to press the joystick
// buttons 0, 1, 2, and 3.
//
// NOTE: This sketch file is for use with Arduino Leonardo and
//       Arduino Micro only.
//
// by Matthew Heironimus
// 2015-11-20
//--------------------------------------------------------------------

#include <Joystick.h>

Joystick_ Joystick;



void setup() {
  // Initialize Button Pins
  pinMode(9, INPUT_PULLUP);
  pinMode(10, INPUT_PULLUP);
  pinMode(11, INPUT_PULLUP);
  pinMode(12, INPUT_PULLUP);

  // Initialize Joystick Library
  Joystick.begin();
}

// Constant that maps the phyical pin to the joystick button.
const int pinToButtonMap = 9;

// Last state of the button
int lastButtonState[4] = {0,0,0,0};

// Variablen für die Handbremse
boolean man_break = true;      //wenn Beim Spielstart die handbremse gelöst ist, hier 'false' eintragen (false ohne die ' Zeichen)
boolean current_ManBreak = !digitalRead(0+pinToButtonMap);   // Position des Handbremshebels beim Start des Arduinos.
boolean last_ManBreak = man_break;  // Handbremse beim Spielstart (Zustand im Programm)
boolean impulse = false;            // Merker dass grad ein Impuls erzeugt wird
unsigned long impulslen = 300;      // Länge des erzeugten Impulses hier 300ms sorgt  gleichzeitig für entprellen des mikroswitch
unsigned long impstart = 0;         // Speichert die Startzeit der impulserzeugung
void loop() {

  // Read pin values
  // Handbremse abfragen
  int index = 0;
  if (impulse == true) {
    ManBreak_Impuls(index);
  }
  else
  {
    current_ManBreak = !digitalRead(index + pinToButtonMap);
    if(last_ManBreak != current_ManBreak){
       ManBreak_Impuls(index);
       last_ManBreak = current_ManBreak;
    }
  }
  
  for (int index = 1; index < 4; index++)
  {
    int currentButtonState = !digitalRead(index + pinToButtonMap);
    if (currentButtonState != lastButtonState[index])
    {
      Joystick.setButton(index, currentButtonState);
      lastButtonState[index] = currentButtonState;
    }
  }

  delay(50);
}

void ManBreak_Impuls(int index) {            // hier wird der Impuls beim btätigen der Handbremse (öffnen oder schliessen) erzeugt
  if (impulse == true) {                     // impulserzeugung ist bereits aktiv
    if (millis() - impstart > impulslen) {   // wenn Impulslänge erreicht..
      Joystick.setButton(index, LOW);        // "Taste losgelassen" senden
      impulse = false;                       // impulserzeugung deaktiviert
    }
  return;                                    // zurück in die loop
  }
  Joystick.setButton(index, HIGH);           // "Taste gedrückt" senden
  impstart = millis();                       // Startzeit des Impulses merken
  impulse = true;                            // Impulserzeugung aktiviert
}

Gib mir bitte Bescheid obs wirklich so klappt, wie Du es Dir vorstellst.

LG Stefan

Hallo Deltaflyer,

wie 10 Schaltfunktionen über einen Schalter? Ähnelt das nicht Morsen bis Du die letzte Funktion über den Taster rein gedrückt hast?

Ähm... Beim Spielstart ist die Handbremse auf. Der Schalter... Keine Ahnung wie der Lütte das macht. Ich würde beim Parken die Bremse anziehen. Aber ich denke das wird nicht wichtig sein. Zur not könnte man über die Leertaste die Bremse anziehen damit es mit dem Hebel überein stimmt.

Du hast auch Gottvertrauen. mich in der Programmierung Änderungen machen zu lassen.
Erst ging es nicht. Aber dann habe ich das da geändert, so wie Du das rein geschrieben hattest.
'boolean man_break = false; ' und schwupps ging es wie es soll.

Ui ui... Da bin ich mal auf die Reaktion vom Halbhohen gespannt wenn er sieht, dass das geht.

Aber warum ist das wichtig ob im Spiel die Bremse schon angezogen ist? Ist doch nur ein Tastendruck.

Vielen Dank für Deine Arbeit. Werde Dir berichten wie mein Halbhoher reagiert hat.

LG

Miracolix

Ob beim Spielstart die Bremse angezogen is oder nicht (also vom Spiel her selbst, ohne den Joystick), hab ich deshalb gefragt, weil mein sketch-teil entsprechend konfiguriert werden könnte. Hab da extra ne Variable drin, die den Anfangszustand ans spiel anpassen kann.
Funktioniert aber nur, wenn mit dem spiel auch der arduino gestartet wird, da ich ja vom Spiel keine direkte Rückmeldung habe.

Aber wenn es jetzt so funktioniert dass du damit leben kannst, ist das völlig ok. Es freut mich sehr, dass ich Dir helfen durfte und konnte.

Bei den 10 funktionen, nein da muss ich nicht morsen, da hab ich 5 Tasten von die alle zwei Funktionen haben.
Auf Taste 5 liegt neben den normalen funktionen noch eine Shift Funktion, die mir Zugriff auf die zweite Fuktionsebene jeder Taste gibt (wie die gross/kleinumschaltung auf der PC-Tastatur. Das Ganze wird ebenfalls vom gleichen Attiny-Controller gesteuert, der auch die impulsaufbereitung macht um alles auf kanal 3 drauf zu packen.

Im modell Ist dann ebenfalls ein Attiny-Controller, der den 3. Kanal liest, decodiert und die enzelnen funktionen wieder zur verfügung stellt, daran hängen dann die schaltverstärker und evt sound - und/oder lichteffekte.

LG Stefan

Deltaflyer:
Hab übrigens rausgefunden, warum es mit agmues code nicht klappt : da wird einfach beim öffnen und schliessen der bremse jeweils der neue Zustand gespeichert, anstatt jeweils beim öffnen und schliessen der Bremse ein Impuls gesendet.

Ging bei mir in die falsche Richtung:

[sup]¯¯¯|____|¯¯¯|____|¯¯¯ Pin 9
___|¯¯¯¯|___|¯¯¯¯|___ Joystick alt
___|¯¯¯¯¯¯¯¯|________ Joystick agmue
___|¯|__|¯|_|¯|__|¯|_ Joystick Deltaflyer[/sup]

Schön wenn es jetzt funktioniert.

Hi

agmue:
...
Schön wenn es jetzt funktioniert.

Noch schöner, wenn (bzw. hier eher 'daß') Du Fehler selber dingfest machen konntest - willkommen bei den Programmierern :slight_smile:
(Das werden jetzt wohl 'echte' Progger anders sehen * g *)

MfG