Tag Archives: tacho

Telemetry in LCD

LCD vs. LCD – oder warum ist mein LCD so langsam

Nachdem jetzt doch einige gefragt haben ob ich nicht noch mehr Telemetrydaten in das rcc – (real cockpit connecktor) einbauen kann, habe ich mich entschlossen den Wünschen nachzukommen da ich ja sowieso noch einige Ideen im Hinterkopf habe.

Eine davon ist das Anzeigen der Telemetrydaten auf einem 20×4 LCD (HD44780) .

Da ich schon einige andere Arduinoprojekte mit LCD gemacht habe war die Umsetzung recht schnell erledigt.
Zu diesem Zweck habe ich mir noch ein I2C-controler besorgt. Schnell und unkompliziert, denn damit ist das LCD mit 4 Kabeln an den Arduino angeschlossen.

Jaaaa… und damit fingen die Probleme dann auch an.
Da die Daten relativ schnell kommen und nicht statisch sind, lassen sich die Werte, trotz Gegenprüfung auf alte und neue Werte im Code, schlecht lesen.

Also die grosse Glaskugel befragt und dort bin ich auf verschiedene Anschlussmöglichkeiten mit doch sehr verschiedenen Geschwindigkeiten gestoßen.
Stichwort NewLiquidCrystal

Unter anderem finden wir im oben genannen Link folgende Tabelle.

Interface    ByteXfer    16x2FPS      Ftime
----------------------------------------------
4BIT          338us        86.92     11.51ms (orignal Arduino IDE Liquid Crystal)
4BIT           98us       298.58      3.35ms
SR2W           76us       388.62      2.57ms
SR_2W          72us       406.90      2.46ms
SR_3W          61us       480.03      2.08ms
SR3W          102us       287.92      3.47ms
I2C           957us        30.74     32.25ms
I2C (GPIO)    839us        35.07     28.51ms
SR1W_HC        94us       311.41      3.21ms
SR1W_SC       116us       252.83      3.96ms

Diese Werte musste ich doch sofort überprüfen da es doch schon ein gravierender Unterschied geben soll. Zu diesem Zweck hab ich mir also ein noch rumliegendes
Shiftregister Breakout mit 74HC595 mit einem LCD 16×2 und ein LCD 16×2 mit I2C geschnappt und verkabelt.

LCD mit I2C LCD mit SR_3W
lcdi2cframes lcdi2ctrans lcdsw3frames lcdsw3trans

Fazit:
I2C ist schön weil es schnell angeschlossen ist. Aber für schnelle Zeichenwechsel auf einem LCD ist es leider nicht zu gebrauchen.
Ich werde dann jetzt mal mein Cockpit wieder zerlegen und wacker ein bischen umlöten.

LCD vs. LCD – oder warum ist mein LCD so langsam
5 (100%) 6 stimmen

Neue Software – RCC – real cockpit connector

Nachdem hier länger nicht mehr passiert ist, möchte ich meine neue Software vorstellen.

Sie trägt derzeit den Namen „RCC“ – real cockpit connector (Name kann sich noch ändern) und ist mittlerweile im Betastatus funktionstüchtig.

Warum eine eigene Software ?
Ich hatte einfach keine Lust mehr meinen Arduinosketch für die unterschiedlichen Schnittstellen der Softwareanbieter anzupassen.

Welche Funktion hat „RCC“ ?
RCC bildet die Konfigurierbare Schnittstelle zwischen dem Arduino und dem Spiel ohne den Sketch wechseln zu müssen.

Wo kommt „RCC“ zum Einsatz ?
Überall da wo du externe Harrdware (Tacho, Handbremse, Blinker, Hupe etc.) an deinem PC anschließen willst um das Game noch realitätsnäher zu machen.

Welche Spiele werden unterstützt ?
Unterstützt: Assetto Corsa, Project Cars.
Geplant: LFS, rFactor2, RRR Experience, Euro Truck Sim 2

Was wird benötigt?
Ein Arduino Mega, UNO, Nano (clone) und 1 Computer mit dem entsprechendem Spiel unter Windows 7,8 oder 10

Welche Komponenten kann ich steuern ?
Getestet sind Tacho vom BMW e36, Golf3.  (OBD2 in Planung)
Led’s, Segmentanzeigen als Visualisierung sowie Potis und Schalter als Eingänge.

Welche Simmulationswerte können verarbeitet werden ?
Alle gängigen Werte die aus den verschieden Spielen ausgelesen werden können, werden nach und nach unterstützt.
Derzeit KMH, RPM, GEAR, FUELL, TEMP als Anzeigewerte, sowie eine analoger und ein digitaler Input.
Inputs verhalten sich als wären sie Joystick und brauchen nur im Spiel hinterlegt werden.
Zum Beispiel könnte man eine originale Handbremse mit einem Poti verbinden und schon wäre sie funktionstüchtig.

Wann ist „RCC“ downloadbar ?
Voraussichtlich Mitte bis Ende Januar 2016

Wird RCC etwas kosten ?
Nein, ich habe viele Anfragen aus aller Welt bezüglich meines Sketches und der Verdrahtung bekommen. Es hat sich gezeigt das es viele Gamer gibt die gerne einen Simulator bauen wollen aber keine Computer/Programmierwissen haben. Mir ging es in anderen Situationen ähnlich und ich war für jede Hilfe dankbar. Es bleibt jedem selbst überlassen ob er mir eine kleine Spende zukommen lassen möchte.

Screenshots RCC v.1.0.0.0 (Beta)

 

 

Neue Software – RCC – real cockpit connector
4.3 (86.67%) 3 stimmen

BMW e36 Tacho zu Arduino

Damit das Tacho auch ordnungsemäß funktioniert, muss es wie auf der Zeichnung angeschlossen werden:

BMW e36 Tachosteckerbelegung

BME e36 Tacho Pinbelegung Arduino

BMW e36 Tacho zu Arduino

BMW e36 Tacho zu Arduino
4.9 (97.5%) 16 stimmen

BMW Tacho an Arduino – Video1

So, hier mal ein erstes Video von meinem Tacho am Arduino Nano

BMW Tacho an Arduino – Video1
5 (100%) 7 stimmen

Platine für Drehzahl und Ganganzeige im BMW e36 Cockpit

Drehzahl und Ganganzeige

8 x 3mm LED mit eingebautem Vorwiderstand,
1 x 7 Segment, 9mm Common Cathode (FYS-3612),
8 x 150 ohm Widerstände

Platine für Drehzahl und Ganganzeige im BMW e36 Cockpit
4.7 (93.33%) 3 stimmen

BMW e36 Tacho sketch

Arduino Code für GameDash (XSimulator Motion Simulator)

unten stehender Code ist aus bestehenden Sketche adaptiert und verändert
(Technikprojekte, XSIMULATOR)

Alle funktionen des Tacho,  Ganganzeige, eine 8 stellige konfigurierbare LED-Anzeige für Rpm

funktioniert mit Mega2560, Uno und Nano
Die Pins müssen den entsprechenden Mikrocontroller angepasst werden.
#include 
#include 
char kind_of_data;
// shiftpoint #############
int ShiftPoint  = 0;   
int RpmSimTools = 6500;  // Schaltpunkt vorbelegen
int LimitRange  = 0;
int UnderShiftPoint;
int OverShiftPoint;
int OverShift;
int UnderShift;
int ButtonState;
int LastButtonState = LOW;
long lastDebounceTime = 0;
long debounceDelay    = 5;
//LED rpm
int rpmLED = 0;
// 7segment Common Cathode 
int Gear;
int GearLight = 0;
int N1[9] = {63,6,91,79,102,109,124,7,80};  // 0 1 2 3 4 5 6 7 r
//arduino pins
int prpm = 2;      
int pkmh = 3;          
int ful  = 5;   // pwm 
int tmp  = 6;   // pwm 
int capture_button = 4;  //shift point capture button
int analog_adj_pot = 0;  // adjusting poti
//arduino spi pins nach 74HC595 (Shiftregister)
int latchpin = 10;   // blaues kabel >> RCLK   (Register clock)
int clockpin = 13;   // grünes kabel >> SRCLK  (Shift register clock)
int datapin  = 11;   // gelbes kabel >> SER    (Serial data input)
// Tone
Tone kmh;
Tone rpm;
 
void setup(){
  pinMode(latchpin, OUTPUT);  
  pinMode(ful, OUTPUT);  
  pinMode(tmp, OUTPUT); 
  pinMode(capture_button,INPUT);
   
  digitalWrite(latchpin, LOW);
 
  //Setup SPI
  SPI.setBitOrder(MSBFIRST);
  SPI.begin(); 
  
  //Setup TONE 
  kmh.begin(pkmh);
  rpm.begin(prpm);
 
  Serial.begin(115200);
  // Vorbelegung auf 50°c
  analogWrite(tmp,85); 
  // Vorbelegung auf 30 Ltr.
  analogWrite(ful,95); 
}
 
void CheckButtonPress() {   // shiftlight 
  int reading = digitalRead(capture_button);
  if (reading != LastButtonState){
    lastDebounceTime = millis();
  }
  if ((millis() - lastDebounceTime) > debounceDelay) {
    if (reading != ButtonState){
      ButtonState = reading;
      if (ButtonState == HIGH){
        ShiftPoint = RpmSimTools;
      }
    }
  }
  LastButtonState = reading;
}
 
void CheckShiftLightAdj() {  // shiftlight nachjustieren
  LimitRange = analogRead(analog_adj_pot);
  int RpmAdjust = map(LimitRange, 1, 1023, 0, 2000);
  UnderShift = RpmAdjust;
  OverShift = RpmAdjust;
}
 
void SetLimits() {  // shiftlight
  UnderShiftPoint = ShiftPoint - UnderShift;
  OverShiftPoint = ShiftPoint + OverShift;
}
  
void ReadData(){
if(Serial.available() > 0) {
    kind_of_data = Serial.read();
    delay(1);
    int Data100 = Serial.read() - '0';
    delay(1);
    int Data10 = Serial.read()- '0';
    delay(1);
    int Data1 = Serial.read()- '0';
 
    //Daten anpassen: aus 1 wird 001, aus 10 wird 010 etc.
    while (Data1 < 0) {
      Data1 = Data10;
      Data10 = Data100;
      Data100 = 0;
    }
 
    int Data = 100*Data100 + 10*Data10 + Data1;
      //  Speed
      if (kind_of_data == 'S') {
      int Speed = map(Data,0,255,0,318);
      //  Gauge begrenzen
       if(Speed > 318) {
        Speed = 318;
        kmh.play(Speed);
       }
       else if((Speed <= 318) && (Speed >= 25)) {
        kmh.play(Speed);
       }
       else if(Speed < 25) {
        kmh.stop();
       }
      } 
 
      // Drehzahl      
      else if (kind_of_data == 'R') {
       RpmSimTools = Data*10;
       int Drehzahl = map(Data,0,700,0,350);
    
       if(Drehzahl > 350) {
        Drehzahl = 350;
       }
       if(Drehzahl < 025) {
        Drehzahl = 000;
       }
       rpm.play(Drehzahl);
     }
 
      // Gang 
      else if (kind_of_data == 'G') {
       Gear = Data;
 
       if (Gear == 9) {   // rückwärts
        GearLight = N1[8];
       } 
       if (Gear == 0) {   // neutral
        GearLight = N1[0];
       } 
       if (Gear == 1) {   // 1 gang
        GearLight = N1[1];  
       } 
       if (Gear == 2) {   // 2 gang
        GearLight = N1[2];
       }  
       if (Gear == 3) {   // 3 gang
        GearLight = N1[3];
       } 
       if (Gear == 4) {   // 4 gang
        GearLight = N1[4];
       } 
       if (Gear == 5) {   // 5 gang
        GearLight = N1[5];
       }
       if (Gear == 6) {   // 6 gang
        GearLight = N1[6];
       }
       if (Gear == 7) {   // 7 gang
        GearLight = N1[7];
       }
      }
 
      //Tankinhalt 
      else if (kind_of_data == 'F') {
       int Tankinhalt = map(Data,0,65,13,155);
 
       if(Tankinhalt > 155) {
        Tankinhalt = 155;
       }
       if(Tankinhalt < 13) {
        Tankinhalt = 13;
       }
       analogWrite(ful,Tankinhalt);      
     }
 
      //Temperatur 
      else if (kind_of_data == 'T') {
       int Temperatur = map(Data,0,140,140,0);
       analogWrite(tmp,Temperatur);             
      }
 
    DisplayLeds();    
   }
}
 
void DisplayLeds(){  
       
   if (RpmSimTools < UnderShiftPoint *0.25){     
    rpmLED=0;    
   }       
   
   if (RpmSimTools >= UnderShiftPoint *0.25){
    rpmLED=1; 
   }
   
   if (RpmSimTools >= UnderShiftPoint *0.5){
    rpmLED=3;  
   }
 
   if (RpmSimTools >= UnderShiftPoint *0.75){
    rpmLED=7;  
   }
   
   if (RpmSimTools >= UnderShiftPoint){
    rpmLED=15;  
   }
    
   if (RpmSimTools >= ShiftPoint -500){
    rpmLED=31;   
   }

   if (RpmSimTools >= ShiftPoint){
    rpmLED=63;   
   }
  
   if (RpmSimTools >= OverShiftPoint -500){
    rpmLED=127;
   } 
  
   if (RpmSimTools >= OverShiftPoint){
    rpmLED=255;
   }
 
  digitalWrite(latchpin, HIGH);                       
  SPI.transfer(GearLight);    // Ganganzeige
  SPI.transfer(rpmLED);       // LED's Drehzahl
  digitalWrite(latchpin, LOW); 
}   
 
void loop(){ 
  CheckButtonPress();
  CheckShiftLightAdj();
  SetLimits();
  ReadData(); 
}

Die passende GameDash konfiguration findet ihr >> hier <<

BMW e36 Tacho sketch
4.8 (95.71%) 28 stimmen
1
Facebook Auto Publish Powered By : XYZScripts.com