Koder for arduino-basert utstyr til trucksim


Koder brukt for kontrollpanel, automatgir og USB konvertert logitech (driving force) girskifter laget for gøy og morro. Brukt med Arduino Micro og Arduino IDE.

Benytter https://github.com/MHeironimus/ArduinoJoystickLibrary



Selve stikka (Eaton Fuller S-2588 Roadranger valve assy RTLO 18 speed genuine shifter og 2x selvmonterte hall-sensor magnetiske brytere, tror jeg brukte KY-003 sine sensorer uten pcb):
#include <Joystick.h>

// GND til digitale pins 2-12 for knappetrykk.
// Hardkodet for opptil 11 knapper som burde være nok for det meste.

Joystick_ Joystick(
  0x03,   // hidReportId
  0x04,   // joystickType
  2,     // buttonCount
  0,      // hatSwitchCount
  false,  // includeXAxis
  false,  // includeYAxis 
  false,  // includeZAxis
  false,  // includeRxAxis
  false,  // includeRyAxis
  false,  // includeRzAxis
  false,  // includeRudder
  false,  // includeThrottle
  false,  // includeAccelerator
  false,  // includeBrake
  false   // includeSteering
);

void setup() {
  for (int n=2; n<=3; n++) {
    pinMode(n, INPUT_PULLUP);
  }
  Joystick.begin();
}

int LastButtonStates[11] = {0};
int TmpButtonState = 0;

void loop() {
  TmpButtonState = 0;

  for (int n=2; n<=3; n++) {
    TmpButtonState = digitalRead(n); // Reverse on/off
    if (TmpButtonState != LastButtonStates[n-2]) {
      Joystick.setButton(n-2, TmpButtonState);
      LastButtonStates[n-2] = TmpButtonState;
    }
  }

  delay(50);
}


Logitech Driving Force Shifter:
#include <Joystick.h>

// 6 gir + revers.
int AntallKnapper = 7;

// Potmetere på stikke.
int X = A0;
int Y = A1;

// Grenser lest ut via konsoll debugging.
int GearPositionsXY[6][2] = {
  {291, 924}, // 1st
  {288, 112}, // 2nd
  {503, 926}, // 3rd
  {505, 101}, // 4th
  {699, 945}, // 5th
  {704, 113}  // 6th & R
};
int PositionMargin = 50;

Joystick_ Joystick(
  0x03,   // hidReportId
  0x04,   // joystickType
  AntallKnapper,     // buttonCount
  0,      // hatSwitchCount
  false,  // includeXAxis
  false,  // includeYAxis 
  false,  // includeZAxis
  false,  // includeRxAxis
  false,  // includeRyAxis
  false,  // includeRzAxis
  false,  // includeRudder
  false,  // includeThrottle
  false,  // includeAccelerator
  false,  // includeBrake
  false   // includeSteering
);

void setup() {
  // Bryter i bunn av stikke som avgjør om den er 
  // trykket ned og skal aktivere reverse i HØYRE-NED.
  pinMode(2, INPUT); 
  Joystick.begin();

  /*
  // DEBUGGING
  Serial.begin(9600);
  */
}

void loop() {

  // Revers. Denne har en pull-down resistor siden 
  // stikka bryter oransj mot 5V og tar den HIGH.
  if (
    analogRead(X) >= (GearPositionsXY[5][0]-PositionMargin) && 
    analogRead(Y) <= (GearPositionsXY[5][1]+PositionMargin) &&
    digitalRead(2) == HIGH
  )
    Joystick.setButton(0, 1);
  else
    Joystick.setButton(0, 0);



  // 1st
  if (
    analogRead(X) <= (GearPositionsXY[0][0]+PositionMargin) && 
    analogRead(Y) >= (GearPositionsXY[0][1]-PositionMargin)
  )
    Joystick.setButton(1, 1);
  else
    Joystick.setButton(1, 0);



  // 2nd
  if (
    analogRead(X) <= (GearPositionsXY[1][0]+PositionMargin) && 
    analogRead(Y) <= (GearPositionsXY[1][1]+PositionMargin)
  )
    Joystick.setButton(2, 1);
  else
    Joystick.setButton(2, 0);



  // 3rd
  if (
    analogRead(X) <= (GearPositionsXY[2][0]+PositionMargin) && 
    analogRead(X) >= (GearPositionsXY[2][0]-PositionMargin) && // Rundt 500 et sted.
    analogRead(Y) >= (GearPositionsXY[2][1]-PositionMargin)
  )
    Joystick.setButton(3, 1);
  else
    Joystick.setButton(3, 0);



  // 4th
  if (
    analogRead(X) <= (GearPositionsXY[3][0]+PositionMargin) && 
    analogRead(X) >= (GearPositionsXY[3][0]-PositionMargin) && // Rundt 500 et sted.
    analogRead(Y) <= (GearPositionsXY[3][1]+PositionMargin)
  )
    Joystick.setButton(4, 1);
  else
    Joystick.setButton(4, 0);



  // 5th
  if (
    analogRead(X) >= (GearPositionsXY[4][0]-PositionMargin) && 
    analogRead(Y) >= (GearPositionsXY[4][1]-PositionMargin)
  )
    Joystick.setButton(5, 1);
  else
    Joystick.setButton(5, 0);



  // 6th
  if (
    analogRead(X) >= (GearPositionsXY[5][0]-PositionMargin) && 
    analogRead(Y) <= (GearPositionsXY[5][1]+PositionMargin) && 
    digitalRead(2) == LOW
  )
    Joystick.setButton(6, 1);
  else
    Joystick.setButton(6, 0);

  /*
  // DEBUGGING
  // Les ut X og Y akse for å debugge girposisjonsverdier.
  Serial.print("X akse: ");
  Serial.print(analogRead(X));
  Serial.print(", Y akse: ");
  Serial.println(analogRead(Y));
  */

  delay(10);
}







DJ_Truck_Dash.ino (panelet med brytere fra biltema):
#include <Joystick.h>

int AntallKnapper = 17;

Joystick_ Joystick(
  0x03,   // hidReportId
  0x04,   // joystickType
  AntallKnapper,     // buttonCount
  0,      // hatSwitchCount
  false,  // includeXAxis
  false,  // includeYAxis 
  false,  // includeZAxis
  false,  // includeRxAxis
  false,  // includeRyAxis
  false,  // includeRzAxis
  false,  // includeRudder
  false,  // includeThrottle
  false,  // includeAccelerator
  false,  // includeBrake
  false   // includeSteering
);

void setup() {
  // Alle brytere unntatt START holdes i HIGH modus. 
  // Siden arduino har intern pullup resistor, er det praktisk å gjøre det slik.
  pinMode(2, INPUT_PULLUP); // JAKE
  pinMode(3, INPUT_PULLUP); // JAKE OPP
  pinMode(4, INPUT_PULLUP); // JAKE NED
  pinMode(5, INPUT_PULLUP); // PARK
  pinMode(6, INPUT_PULLUP); // TRAILER
  pinMode(7, INPUT_PULLUP); // LIGHTS
  pinMode(8, INPUT_PULLUP); // HIGH BEAM
  pinMode(9, INPUT_PULLUP); // BEACON
  pinMode(10, INPUT_PULLUP); // HAZARDS
  pinMode(11, INPUT_PULLUP); // LIFT AXLE TRACTOR
  pinMode(12, INPUT_PULLUP); // LIFT AXLE TRAILER
  pinMode(A5, INPUT_PULLUP); // LOCK DIFF
  pinMode(A4, INPUT_PULLUP); // VINDU H NED
  pinMode(A3, INPUT_PULLUP); // VINDU H OPP
  pinMode(A2, INPUT_PULLUP); // VINDU L NED
  pinMode(A1, INPUT_PULLUP); // VINDU L OPP

  // A0 er koblet til GND via en 10K resistor for pulldown slik at den holder seg i LOW status.
  // Da kan vi koble +5V til bryter slik at den lyser rødt, og benytte at A0 da går i HIGH modus.
  pinMode(A0, INPUT); // START
  
  Joystick.begin();
}

void loop() {

  // START.
  // Denne har LOW når den er av, så vi leser vanlig.
  Joystick.setButton(0, digitalRead(A0));
  
  // Alle de andre.
  // Disse har HIGH når de er av, vi leser derfor !(motsatt).
  Joystick.setButton(1, !digitalRead(2));
  Joystick.setButton(2, !digitalRead(3));
  Joystick.setButton(3, !digitalRead(4));
  Joystick.setButton(4, !digitalRead(5));
  Joystick.setButton(5, !digitalRead(6));
  Joystick.setButton(6, !digitalRead(7));
  Joystick.setButton(7, !digitalRead(8));
  Joystick.setButton(8, !digitalRead(9));
  Joystick.setButton(9, !digitalRead(10));
  Joystick.setButton(10, !digitalRead(11));
  Joystick.setButton(11, !digitalRead(12));
  Joystick.setButton(12, !digitalRead(A1));
  Joystick.setButton(13, !digitalRead(A2));
  Joystick.setButton(14, !digitalRead(A3));
  Joystick.setButton(15, !digitalRead(A4));
  Joystick.setButton(16, !digitalRead(A5));
  
  delay(50);
}


Automatgirboks (M + - D N R) med brytere fra biltema (midlertidige PÅ brytere):
#include <Joystick.h>

// GND til digitale pins 2-12 for knappetrykk.
int AntallKnapper = 6;

Joystick_ Joystick(
  0x03,   // hidReportId
  0x04,   // joystickType
  AntallKnapper,     // buttonCount
  0,      // hatSwitchCount
  false,  // includeXAxis
  false,  // includeYAxis 
  false,  // includeZAxis
  false,  // includeRxAxis
  false,  // includeRyAxis
  false,  // includeRzAxis
  false,  // includeRudder
  false,  // includeThrottle
  false,  // includeAccelerator
  false,  // includeBrake
  false   // includeSteering
);

void setup() {
  for (int n=2; n<=AntallKnapper+1; n++) {
    pinMode(n, INPUT_PULLUP);
  }
  Joystick.begin();
}

int LastButtonStates[11] = {0};
int TmpButtonState = 0;

void loop() {
  TmpButtonState = 0;

  for (int n=2; n<=AntallKnapper+1; n++) {
    TmpButtonState = !digitalRead(n);
    if (TmpButtonState != LastButtonStates[n-2]) {

      // Hold R D aktivert hvis de blir trykket på.
      if (TmpButtonState == 0 && (n==2 || n==6)) {
        TmpButtonState = LastButtonStates[n-2];
      }

      // Overstyr R D aktive statuser hvis R N D blir trykket.
      if (TmpButtonState != 0 && n==2) {
        Joystick.setButton(6-2, 0);
        LastButtonStates[6-2] = 0;
      }
      if (TmpButtonState != 0 && n==6) {
        Joystick.setButton(2-2, 0);
        LastButtonStates[2-2] = 0;
      }
      if (TmpButtonState != 0 && n==7) {
        Joystick.setButton(2-2, 0);
        Joystick.setButton(6-2, 0);
        LastButtonStates[2-2] = 0;
        LastButtonStates[6-2] = 0;
      }

      // Oppdater knappestatus.
      Joystick.setButton(n-2, TmpButtonState);
      LastButtonStates[n-2] = TmpButtonState;
    }
  }

  delay(50);
}



Publisert: 14.aug.2023 11:47 | Oppdatert: 14.aug.2023 12:18.
Arduino

Erklæring om bruk av informasjonskapsler/cookies

Ditt personvern er ivaretatt; Informasjonskapsler brukes kun for funksjon.

Tredjeparter som har sine egne erklæringer:
Site Stats
OK / Skjul