Projekt: Bau einer Buttonbox [Blutiger Anfänger]

Moin

Dieses Projekt ist das Resultat purer Langeweile. :joy:

Ich habe mir vor 2 Wochen in den Kopf gesetzt eine (im weitesten sinne) Buttonbox für den Landwirtschaftssimulator 2022 zu Bauen. Beim Landwirtschaftssimulator wird ja meistens von einer Seitenkonsole geredet wenn man soetwas plant.

Seitenkonsole L (V3) – LS Seitenkonsolen (ls-seitenkonsolen.de)

Die Seitenkonsole im Link wäre für mich quasi das Ende des Projekts. Allerdings ist mir bewust dass das für nen Blutigen Anfänger wie mich eher Optimistisch ist. Für den Anfang habe ich mir zum Ziel gesetzt eine Buttonbox also 9 Taster und einen Joystick über einen Arduino Leonardo anzusteuern. Hierfür habe ich zunächst Folgenden Mikrocontroller bestellt.

Arduino Leonardo with Headers [A000057] : Amazon.de: Computer & Zubehör

zudem habe ich mir ein Paar Taster, einen Joystick, ein Breadboard, einige Kabel und einen Lötkolben bestellt. Ich versuche hier alles was zum Projekt gehört möglichst genau zu beschreiben damit ihr mir folgen könnt und euch vorstellen könnt wie es am Ende aussehen soll (im idealfall).

Für den Anfang geht es hier logischerweise um den Code. Ich habe mich über die vergangene Zeit Tag und nacht über den Arduino schlau gelesen. Und habe blind drauf los geschrieben. Daher verzeiht mir bitte wenn der Sketch arg stümperhaft wirkt, Ich habe absolut keine Ahnung was Fachlich richtig ist und wie man einen Sketch richtig Formatiert (Ich habe es mit STRG+T in der IDE Formatiert). Es ist halt viel zusammen gelesenes aus verschiedenen foren, wovon die meisten auch noch Englischsprachig waren (Ich würde sagen das ich über ein gutes Schulenglisch verfüge :joy: also ich verstehe 95% von dem was ich lese). Also hier zunächst mein Code.

#include <Joystick.h> //Öffne Die Joystick Libary

Joystick_ Joystick; //sage dem Joystick das er ein Joystick ist

#define Taster1 3 //Weise dem Pin auf dem Arduino einen Namen zu
#define Taster2 4
#define Taster3 5
#define Taster4 6
#define Taster5 7
#define Taster6 8
#define Taster7 9
#define Taster8 10
#define Taster9 11

const bool testAutoSendMode = true; //Der Joystick soll Kontinuierlich Infos an den PC senden

void setup() {

  pinMode(Taster1, INPUT_PULLUP); //Configuriere den Pin als Eingang mit Pullup wiederstand
  pinMode(Taster2, INPUT_PULLUP);
  pinMode(Taster3, INPUT_PULLUP);
  pinMode(Taster4, INPUT_PULLUP);
  pinMode(Taster5, INPUT_PULLUP);
  pinMode(Taster6, INPUT_PULLUP);
  pinMode(Taster7, INPUT_PULLUP);
  pinMode(Taster8, INPUT_PULLUP);
  pinMode(Taster9, INPUT_PULLUP);

  Joystick.begin(); //Starte das Joystick Programm

  uint8_t buttonCount(9); // Der Joystick soll 9 Buttons haben

  bool includeXAxis; //Integriere eine X Achse zum Joystick
  bool includeYAxis;
  bool includeZAxis;

  Joystick.setXAxisRange(-1, 1); // Gebe dem Joystick eine Reichweite in der Achse vor
  Joystick.setYAxisRange(-1, 1);

  int lastButtonState[9] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,}; //setze die einzelnen Buttons auf 0 (aus)
}

void loop() {

  digitalRead(Taster1); //lese den Zustand der Pins aus
  digitalRead(Taster2);
  digitalRead(Taster3);
  digitalRead(Taster4);
  digitalRead(Taster5);
  digitalRead(Taster6);
  digitalRead(Taster7);
  digitalRead(Taster8);
  digitalRead(Taster9);

  delay(500); // wiederhole die Befehlsschleife nach 500 Millisekunden
}

Das ist das was ich zunächst Zustande gebracht habe. Nicht viel aber ich bin bis jetzt einigermaßen zufrieden. Ich habe mal hinter die befehle geschrieben was ich versucht habe mit meinen Eingaben zu bezwecken. Sollte ich irgendeinen Denkfehler haben bitte sofort drauf hinweisen :innocent: :smiling_face_with_tear: .

Für den Code habe ich die Joystick library von MHeironimus genutzt.

Nun meine Frage:

Für mein Verständnis habe ich jetzt zwar den Pins einen Namen gegeben und sie in der Loop ausgelesen, aber ich kann mir einfach nicht zusammenreimen wie ich einem Pin (also einen Taster) einen Button auf dem Joystick in meinem Pc zuweise.

Bis jetzt beschäftige ich mich nur mit dem Code. Ich habe noch nichts zusammengelötet und auch noch nichts aufgebaut. Ich habe nur Testweise einem von den Examples in der Library einen Taster an den Leonardo angeschlossen und ausprobiert. Alles hat Funktioniert. Leider kann ich die Sketche aus der Library nur bedingt lesen. Dafür bin ich wohl noch nicht bewandert genug.

Zum Schluss noch: Ich habe mir dieses Projekt ausgesucht um mich selbst in die Materie einzuarbeiten. Ich würde gerne den ganzen Sketch verstehen und ihn nach möglichkeit auch selber Schreiben. Darum suche ich hier jemanden der sich mit der Joystick Library auskennt und vielleicht die Geduld hat mir zwischendurch mal auf den (wie wir Norddeutschen sagen) "Patt" zu helfen.

Vielen Dank im Vorraus
euer Jörn

Noin!

Erstmal ein paar Tipps...
Darin findest du auch Begriffen, nach denen man suchen kann.

Heutzutage brauchts kaum noch define.
Konstanten mit Type sind meist sinnvoller.

Dann sind durchnummerierte Dinge meist recht übel...
Sie führen fast zwangsläufig zu Code Duplikaten.
Ist damit Fehleranfällig und unübersichtlich.
Arrays sind eigentlich immer die bessere Wahl

Deine Tasten werden entprellt werden müssen.

Das kann ich nicht ändern.
Die Beispiele funktionieren nicht?

Doch die Beispiele Funktionieren Zweifelsohne aber sie passen nicht so richtig zu meinem Projekt. Ich wollte mir was schreiben was genau auf die zu Bauende Console zugeschnitten ist. Am Ende (Also wenn ich langsam sicherer in der Marterie bin) möchte ich gerne noch einen zweiten Joystick und ein paar Kippschalter und einen Schlüsselschalter integrieren. Aber um mir erstmal nicht zu viel vorzunehmen und zum Lernen wollt ich mich erstmal nur auf die Buttons Fokussieren (Ja ich weiss ich hab in dem Sketch Schon 3 Joystickachsen eingefügt aber die wollte ich erstmal vernachlässigen.

Ich werd mich dann mal über "Type" und Arrays schlaulesen Danke für die Tipps. Wie mache ich das mit dem Entprellen richtig? muss ich das für jeden Taster Extra machen? ich dachte das ich das mit dem delay ganz unten geregelt hätte aber jetzt wo dus sagst verzöger ich ja nur die Wiederholung der ganzen schleife :sweat_smile: . Auch hier danke für den Tipp

Hallo,
Stimmt du ließt zwar die Eingänge ein , wirfst den Zustand aber auf den Müll.

Vorschlag :slight_smile:
schau Dir erst mal ein paar Beispiele aus der IDE an um ein paar Grundlagen zu lernen. Dann kannst Du an Deinem Projekt weiter machen.

Das ist Grundsätzlich auch der Plan. Ich wollte nur zusätzlich die hier vorhandene "Schwarmintellegenz" Aktivieren um erste Fehler erkennen zu können. Was nun ja auch schon Passiert ist. Danke für die Antwort.

Du spricht mir "Persönlichkeit" ab.
Gleichzeitig präsentierst du dich mir als Ausnutzer.

Und behinderst/untergräbst deine eigenen Fähigkeiten diese Dinge zu lernen.

hmm so wars nicht gemeint aber ich denke man kann alles Falsch verstehen wenn man es gerne möchte. Habs oben ja geschrieben. Ich möchte es nicht vorgekaut haben und auch nicht das jemand anders meine Arbeit macht. Ich habe nur nach Tipps an der richtigen stelle gefragt, die ihr mir nun ja auch gegeben habt.

Wenn ich mich falsch ausgedrückt habe : Sorry dafür. :slightly_smiling_face: :upside_down_face:

ist deine Frage jetzt beantwortet?

du hast keine konkrete Frage gestellt.
aber die Leute haben dir schon Tipps gegeben.
Du liest mit digitalRead(Taster) zwar was aus machst aber dann nichts damit.
Das ist das was dir einige sagen wollen.
Der nächste Schritt wäre jetzt, dass du abhängig vom dem gelesen Taster halt einen Buchstaben/Key an den PC sendest.
Das scheint dir zu fehlen.

Du willst es selber machen. Ist ja fein. Aber wenn du mal nach "Arduino Buttonbox" googelst oder auf Youtube guckst, da gibts REICHLICH einfache "Projekte" zum nachbauen, lernen und verstehen.

Schwarmintelligenz:
Ein Intelligentes Verhalten ergibt sich aus der großen Masse eigentlich recht dummer Wesen

Von der Schwarmintelligenz kann man nur profitieren, wenn man ein Teil des Schwarmes ist, oder als Raubtier, welches einen Weg gefunden hat die Dummheit auszunutzen.

"Was/Wer" bist du in dem Spiel?

Hast du!
Zumindest mich stört das.

Mein Rat:
Werde selber Teil des Schwarms.
Dazu gehört, dass du die Sprache(C++) lernst, welche du verwendest.
Auch: Das kann dir keiner abnehmen.

Also die Frage steht sehr wohl in meinem Beitrag: "Für mein Verständnis habe ich jetzt zwar den Pins einen Namen gegeben und sie in der Loop ausgelesen, aber ich kann mir einfach nicht zusammenreimen wie ich einem Pin (also einen Taster) einen Button auf dem Joystick in meinem Pc zuweise.". Wenn dir die Frage zu Dumm ist dann Ignorier sie doch bitte einfach. Und das Schwarmintellegenz für dich nur entsteht wenn sich "dumme Leute" zusammentuhen kann ich nicht wissen. Ich Interpretier das eigentlich eher anders, nämlich so: das wenn mehrere Leute sich einem Problem zuwenden schneller eine Lösung entsteht. In meinem Fall wollte ich eigentlich nur das man mich (wenn ich jetzt mal bildlich sprechen darf) in die richtige richtung schubst. Was du ja auch gemacht hast. Ich frage mich nur wie man so schnell beleidigt sein kann. Und dieses Forum hier ist zumindest für mein verständnis doch dazu da um sich mit dem Arduino und der Plattform auseinander zu setzen. Was ich ja wohl tuhe und ich bin auch sehr wohl dabei die Programmiersprache zu lernen. Sonst wäre ich nämlich garnicht bis zu dem, zugegeben sehr rohem Sketch gekommen. Übrigens habe ich den Beitrag sogar mit [Blutiger Anfänger] gekennzeichnet damit man ihn gleich übergehen kann wenn man sich nicht mit einem solchen ausseinander setzen möchte. Ich versteh dein Problem nicht und ich finde es schade das ich innerhalb von 5 Posts gleich in die Ecke gestellt werde ich wolle dich ausnutzen und wäre nur zu faul selbst zu recherchieren. Ich hab hier übrigens schon Beiträge gesehen wo wesentlich banaleres besprochen wurde und dachte ich versuchs auch mal mit einem Thread. Wird wohl mein erster und auch letzter gewesen sein..... Schade.

Hallo
Oh ha, da würde , sicher nicht nur ich, mich dann nicht anschließen wollen. Und Du wirst Doch Deine Bienen nicht für dumm halten ?
Aber ich weiß schon wie Du es meinst.
Gruß Heinz

Die einzelne Biene ist zwar hoch spezialisiert, aber ansonsten halt das, was man landläufig einen "Fachidioten" nennt. :wink:

Gruß Tommy

1 Like

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

Hallo Joern1337

Herzlich Willkommen im weltbesten Arduinoform, zumindest teilweise.

Ich habe für dich zum Ausprobieren und Spielen einen einfachen ButtonManager für vier Knöpfe "zusammemgelötet".

Im Bereich - button applications - sind die Aktionen hinzuzufügen, die für den Knopf, wenn er gedrückt oder losgelassen worden ist.

Für dein Projekt werden das definierte Keyboard.write()´s sein.

#define ProjectName "Bau einer Buttonbox"
//names
enum ButtonsStates {Released, Pressed};
enum ButtonNames {One, Two, Three, Four};
//variables
constexpr uint8_t ButtonPins[] {A0, A1, A2, A3};
String ButtonsStatesText[] {"Released", "Pressed"};
String ButtonNamesText[] {"One", "Two", "Three", "Four"};
//structures
struct TIMER
{
  uint32_t intervalMillis;
  uint32_t previousMillis;
};
struct BUTTON
{
  uint8_t identifier;
  uint8_t pin;
  uint8_t stateOld;
  TIMER debounce;
};
BUTTON buttons[]
{
  {
    One, ButtonPins[One], LOW, 20, 0
  },
  {
    Two, ButtonPins[Two], LOW, 20, 0
  },
  {
    Three, ButtonPins[Three], LOW, 20, 0
  },
  {
    Four, ButtonPins[Four], LOW, 20, 0
  },
};
// button applications ----------------------------------------------------------------------------------------------------

void buttonHandler (uint8_t buttonName, uint8_t buttonState)
{
  Serial.print(F("Button number ")), Serial.print(ButtonNamesText[buttonName]), Serial.print(F(" becomes ")), Serial.println(ButtonsStatesText[buttonState]);
  switch (buttonName)
  {
    case One:
      switch (buttonState)
      {
        case Released:

          break;
        case Pressed:

          break;
      }
      break;
    case Two:
      switch (buttonState)
      {
        case Released:

          break;
        case Pressed:

          break;
      }
      break;

    case Three:
      switch (buttonState)
      {
        case Released:

          break;
        case Pressed:

          break;
      }
      break;
    case Four:
      switch (buttonState)
      {
        case Released:

          break;
        case Pressed:

          break;
      }
      break;
  }
}
//---------------------------------------------------------------------------------------------------------------------
//support
void heartBeat(int LedPin, uint32_t currentMillis)
{
  static bool setUp = false;
  if (!setUp) pinMode (LedPin, OUTPUT), setUp = !setUp;
  digitalWrite(LedPin, (currentMillis / 500) % 2);
}
void setup()
{
  Serial.begin(115200);
  Serial.println(ProjectName);
  for (auto &button : buttons) pinMode(button.pin, INPUT_PULLUP);
}
void loop()
{
  uint32_t currentMillis = millis();
  heartBeat(LED_BUILTIN, currentMillis);

  for (auto &button : buttons)
  {
    if (currentMillis - button.debounce.previousMillis >= button.debounce.intervalMillis)
    {
      button.debounce.previousMillis = currentMillis;
      uint8_t stateNew = digitalRead(button.pin) ? LOW : HIGH;
      if (button.stateOld != stateNew)
      {
        button.stateOld = stateNew;
        buttonHandler (button.identifier, stateNew);
      }
    }
  }
}

Ich wünsche einen geschmeidigen Tag und viel Spass beim Programmieren in C++.

1 Like

Hallo. Schön drüber nachgedacht die Buttonbox komplett ohne Arduino zu bauen?
Meine DIY Seitenkonsole unterstütz weit über 100 Tasten - OHNE Programmierung.
Einfache Tastenzuordnung im LS.

Ich verwende ein
Development Keyboard Encoder Board

Es wird per USB angeschlossen und man hat eine parallel laufende Tastatur.
Zusätzlich ist ein Joystick und ein Arcade USB Board eingebaut. ALLES wird einfach via Tastenzuordnung im LS konfiguriert. Obige
Development Keyboard Encoder Board kostet um 35€. Arcade USB unter 5€.

Klappt tadellos.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.