Das Ziel: Kastenzehner-Führerstand

Da immer mehr Zusi User von einem 1:1 Führerstand mit träumen, soll es zumindest an Datenaustausch nicht hapern.
Nachricht
Autor
Benutzeravatar
SgtMcExodus
Beiträge: 220
Registriert: 27.03.2012 17:56:48
Aktuelle Projekte: Studium
Wohnort: Berlin

Re: AW: Das Ziel: Kastenzehner-Führerstand

#21 Beitrag von SgtMcExodus »

Dann poste mal bitte deinen Code wie er jetzt aussieht, vielleicht kann ich dann helfen.

Gruß,
Jakob

trainboy12
Beiträge: 55
Registriert: 27.06.2012 20:02:45

Re: Das Ziel: Kastenzehner-Führerstand

#22 Beitrag von trainboy12 »

Code: Alles auswählen

#include <Servo.h>         // Damit wir auch Servos ansteuern können.
Servo servoHLL;            // So heißt der Servo für die Hauptluftleitung
Servo servoHLB;            // So heißt der Servo für den Hauptluftbehälter
Servo servoBZD;            // So heißt der Servo für den Bremszylinderdruck
byte  inputByte[2];        // [0] gibt das Ziel, [1] den Wert an
void setup()
{
  //servoHLL.attach(x);      // Den 3 Servos wird der Pin zugewiesen, an dem sie angeschlossen sind    
  //servoHLB.attach(x);
  servoBZD.attach(5);

  Serial.begin(9600);      // Der serial port soll mit 9600 bps starten
  pinMode(3, OUTPUT);      // PWM-Ausgang für einen Tacho Pin 3 sein
  pinMode(7, OUTPUT);      // LM "Sifa" soll an Pin 7
  pinMode(6, OUTPUT);      // -nicht benutzt-
  pinMode(9, OUTPUT);      // LM "Bef. 40" soll an Pin 9
  pinMode(11, OUTPUT);     // LM "500Hz" soll an Pin 11
  pinMode(13, OUTPUT);     // LM "1000Hz" soll an Pin 13
  pinMode(8, OUTPUT);      // LM "O" soll an Pin 8
  pinMode(10, OUTPUT);     // LM "M" soll an Pin 10
  pinMode(12, OUTPUT);     // LM "U" soll an Pin 12
}

void loop()
{
  if (inputByte[0]=='w'){                    // Wenn wir an erster Stelle ein "w" empfangen, möchte der PC wissen, ob wir wirklich
    Serial.println("I am a drivers desk");   // der Arduino  für das Fahrpult sind. Das bestätigen wir mit "I am a drivers desk""
    if (inputByte[1]=='w'){                  // Wenn an zweiter Stelle ebenfalls ein "w" kommt, sollen wir akustisch quitieren
      tone(5, 1000, 100);
      delay(200);
      tone(5, 1000, 100);
    }
  }
  if (inputByte[0] == 'V'){                  // "V" für Geschwindigkeit
    analogWrite(3,inputByte[1]);             // Wir geben den Wert von 0 - 255 PWM an Pin 6 aus
    Case 2561   'Geschwindigkeit3'
                            OutChar(0) = 86     'V'
                            if data.Value < 25 Then
                                OutChar(1) = CByte(System.Math.Round({1.0314} * data.Value - 6.9758, 0))
                            else
                                OutChar(1) = CByte(System.Math.Round((1.8753) * data.Value - 22,982, 0))
                            End If
                           

                            Serial.Write(OutChar, 0, 2)
  }

trainboy12
Beiträge: 55
Registriert: 27.06.2012 20:02:45

Re: Das Ziel: Kastenzehner-Führerstand

#23 Beitrag von trainboy12 »

Also die Fehler sind folgende:

ZUSI_OUTPUT_ino.ino: In function 'void loop()':
ZUSI_OUTPUT_ino:27: error: 'Case' was not declared in this scope
ZUSI_OUTPUT_ino:28: error: 'OutChar' was not declared in this scope
ZUSI_OUTPUT_ino:31: error: expected `;' before 'if'
ZUSI_OUTPUT_ino:32: error: 'data' was not declared in this scope
ZUSI_OUTPUT_ino:32: error: expected `;' before ')' token

ich weiß einfach nicht weiter....
Kann mir jemand anderes nicht vielleicht seinen Skript-"kopf" senden?

Gruß Jean-Maurice
Zuletzt geändert von trainboy12 am 02.03.2013 19:15:52, insgesamt 1-mal geändert.

Benutzeravatar
Johannes
Beiträge: 3203
Registriert: 14.03.2009 22:36:06
Aktuelle Projekte: Zusitools (http://git.io/zusitools)

Re: Das Ziel: Kastenzehner-Führerstand

#24 Beitrag von Johannes »

trainboy12 hat geschrieben:Also die Fehler sind folgende:

ZUSI_OUTPUT_ino.ino: In function 'void loop()':
ZUSI_OUTPUT_ino:27: error: 'Case' was not declared in this scope
ZUSI_OUTPUT_ino:28: error: 'OutChar' was not declared in this scope
ZUSI_OUTPUT_ino:31: error: expected `;' before 'if'
ZUSI_OUTPUT_ino:32: error: 'data' was not declared in this scope
ZUSI_OUTPUT_ino:32: error: expected `;' before ')' token
Hallo Jean-Maurice,

also ich sehe da (ohne mich groß mit Arduino-Programmierung auszukennen) einen Block Basic-Code in einem ansonsten in C geschriebenen Programm. Zwei verschiedene Programmiersprachen in einer Datei, das kann eigentlich nicht funktionieren. Du musst entweder den Codeschnipsel von Jakob in C übersetzen oder dein komplettes Programm in Basic schreiben.

Grüße
Johannes

Benutzeravatar
F. Schn.
Beiträge: 6693
Registriert: 24.10.2011 18:58:26

Re: Das Ziel: Kastenzehner-Führerstand

#25 Beitrag von F. Schn. »

SgtMcExodus Beitrag bezog sich auf den VisualBasic-Code, also auf das Programm, das du nutzt, um den Audorino mit dem TCP-Server zu verbinden, nicht auf den Audorino-Code selbst.
Diese Signatur möchte folgendes bekannter machen: ZusiWiki · ZusiSK: Streckenprojekte · YouTube: Objektbau für Zusi · euirc: Zusi-Chat

trainboy12
Beiträge: 55
Registriert: 27.06.2012 20:02:45

Re: Das Ziel: Kastenzehner-Führerstand

#26 Beitrag von trainboy12 »

Achsooooo,

und wo füge ich das beim VB-Code ein?

Benutzeravatar
F. Schn.
Beiträge: 6693
Registriert: 24.10.2011 18:58:26

Re: Das Ziel: Kastenzehner-Führerstand

#27 Beitrag von F. Schn. »

Also, du nutzt warscheinlich dieses Programm, um den Audorino mit dem TCP-Server zu verbinden.

Wie du vielleicht erkannt hast, werden immer, wenn neue Daten vom TCP-Server ankommen, diese Private Sub MyTCPConnection_???Received-Blöcke ausgeführt. Wenn die Daten ein Wahrheitswert (Ja/Nein = True/False) sind, wird MyTCPConnection_BoolReceived aufgerufen, wenn es (Gleitkomma-)Zahlen sind wird MyTCPConnection_FloatReceived aufgefuren, und wenn ein Fehler aufgetreten ist wird MyTCPConnection_ErrorReceived aufgerufen.

Die Geschwindigkeit ist eine Gleitkommazahl. Also findest du das in MyTCPConnection_FloatReceived. Hier steht in Zeile 161ff ja bereits

Code: Alles auswählen

                    Case 2561   'Geschwindigkeit3
                        OutChar(0) = 86     'V
                        OutChar(1) = CByte(System.Math.Round(data.Value, 0))
                        Serial.Write(OutChar, 0, 2)
Also => Wenn es sich um eine Geschwindigkeit handelt (Z.161), soll die erste Zahl, die das Programm dem Audorino sendet, 86 sein (was dem Buchstaben V entspricht) (Z.162) und die Zweite soll aus der Geschwindigkeit berechnet werden (Z.163). Zuletzt sendest du die Daten an den Auodorino (Z.164)

SgtMcExodus hat jetzt vorgeschlagen diese Berechnung davon abhänig zu machen, ob die Geschwindigkeit unter 25 km/h liegt oder nicht. Du must also den alten mechanismus (Z.163) durch das, was die SgtMcExodus geschrieben hat ersetzen:

Code: Alles auswählen

                            If data.Value < 25 Then
                                OutChar(1) = CByte(System.Math.Round( {Hier die neue Formel einfügen} * data.Value), 0))
                            Else
                                OutChar(1) = CByte(System.Math.Round((1.8753) * data.Value - 22,982, 0)
                            End If
Bei {Hier die neue Formel einfügen} setht dabei natürlich für einen neuen Verzerrungsfaktor, den du zuvor per Excel berechnen musst. (Das selbe was du hier gemacht hast, aber jetzt nur mit den Werten 20, 11 und 0. Die Formel steht dann ganz oben in deinem Beispiel war es die Formel y = 1,875 x - 22,9982. Ich nehme hieraus mal an, dass es OutChar(1) = CByte(System.Math.Round(1 * data.Value), 0)) seien wird.)

Der obige Absatz müsste dann also

Code: Alles auswählen

                    Case 2561   'Geschwindigkeit3
                        OutChar(0) = 86     'V
                        If data.Value < 25 Then
                            OutChar(1) = CByte(System.Math.Round( {Hier die neue Formel einfügen} * data.Value), 0))
                        Else
                            OutChar(1) = CByte(System.Math.Round((1.8753) * data.Value - 22,982, 0)
                        End If
                        Serial.Write(OutChar, 0, 2)
heißen.
Alles klar? :)
Diese Signatur möchte folgendes bekannter machen: ZusiWiki · ZusiSK: Streckenprojekte · YouTube: Objektbau für Zusi · euirc: Zusi-Chat

trainboy12
Beiträge: 55
Registriert: 27.06.2012 20:02:45

Re: Das Ziel: Kastenzehner-Führerstand

#28 Beitrag von trainboy12 »

Hii, danke,
ich teste mal eben...

trainboy12
Beiträge: 55
Registriert: 27.06.2012 20:02:45

Re: Das Ziel: Kastenzehner-Führerstand

#29 Beitrag von trainboy12 »

Ich habe das jetzt zwar das eingefügt, aber das einzige was sich geändert hat ist, das etwas zum "überlauf" oder so geführt hat (müsste ich später nochmal genau nachgucken). :(

trainboy12
Beiträge: 55
Registriert: 27.06.2012 20:02:45

Re: Das Ziel: Kastenzehner-Führerstand

#30 Beitrag von trainboy12 »

Hallo,

fragt mich jetzt nicht wieso, aber der Tacho geht jetzt um +-2 genau.
Im Arduino-Skript habe ich noch -10 rein geschrieben, und da ist jetzt mein Problem:

Code: Alles auswählen

  if (inputByte[0] == 'V'){                  // "V" für Geschwindigkeit
    analogWrite(8,inputByte[1] -10);             // Wir geben den Wert von 0 - 255 PWM an Pin 6 aus
  }
Ist die Geschwindigkeit <10 Km/h schlägt der Tacho voll aus, hat jemand eine Idee warum?

Gruß Jean-Maurice

Benutzeravatar
SgtMcExodus
Beiträge: 220
Registriert: 27.03.2012 17:56:48
Aktuelle Projekte: Studium
Wohnort: Berlin

Re: Das Ziel: Kastenzehner-Führerstand

#31 Beitrag von SgtMcExodus »

Vermutlich kommt der Arduino nicht damit klar, wenn inputByte[1] kleiner als 10 ist. (9-10=-1 passt nicht in ein Byte)

Und wenn du versuchst, die -10 in den Visual-Code einzubauen?
Zuletzt geändert von SgtMcExodus am 03.03.2013 12:22:18, insgesamt 1-mal geändert.

trainboy12
Beiträge: 55
Registriert: 27.06.2012 20:02:45

Re: Das Ziel: Kastenzehner-Führerstand

#32 Beitrag von trainboy12 »

Habe ich gemacht, nur sobald ich unter 10 Km/h fahre taucht der Fehler auf:
Bild

Jan-Ole
Beiträge: 570
Registriert: 08.04.2010 18:00:45

Re: Das Ziel: Kastenzehner-Führerstand

#33 Beitrag von Jan-Ole »

Ziemlich einfache Sache: Da lag ein Wert außerhalb des zulässigen Bereiches.
Die Ausnahme tritt z.B. dann auf, wenn du in einer Variable, die nur Zahlen zwischen 0 und 7 speichern kann (so einen Datentyp gibt es nicht; ich habe es lediglich zur Veranschaulichung erfunden!), die Zahl 8 (oder eine andere Zahl, die nicht zwischen 0 und 7 liegt oder 0 bzw. 7 ist) speichern willst.

Jan-Ole

PS.: Ich hoffe, dass ich es nicht zu kompliziert und sachlich korrekt erklärt habe... :O
Zuletzt geändert von Jan-Ole am 03.03.2013 13:21:31, insgesamt 1-mal geändert.

trainboy12
Beiträge: 55
Registriert: 27.06.2012 20:02:45

Re: Das Ziel: Kastenzehner-Führerstand

#34 Beitrag von trainboy12 »

Das heißt im Klartext, dass ich nicht -10 in das Skript schreiben kann?

Andreas Karg
Beiträge: 4718
Registriert: 28.04.2002 12:56:00
Kontaktdaten:

Re: Das Ziel: Kastenzehner-Führerstand

#35 Beitrag von Andreas Karg »

Doch, das geht. Probier mal folgendes:

Code: Alles auswählen

analogWrite(8, Math.Max(0, inputByte[1] -10));
Math.Max() nimmt zwei Zahlen an und gibt die größere der beiden zurück. Wenn also inputByte[1]-10 kleiner als 0 ist, gibt Max() die 0 zurück. Damit hast du den Wertebereich passend beschränkt.

Es KANN sein, dass das Programm trotzdem mit der selben Fehlermeldung abstürzt - dazu kenn ich VB nicht gut genug. In diesem Fall müssten wir noch eine oder zwei weitere Zeilen zur Zwischenrechnung mit größeren Zahlen einbauen.

Benutzeravatar
F. Schn.
Beiträge: 6693
Registriert: 24.10.2011 18:58:26

Re: Das Ziel: Kastenzehner-Führerstand

#36 Beitrag von F. Schn. »

Die Idee von SgtMcExodus sieht vor, dass du die Umrechung von der Geschwindikteit in die Ausgangsspannung im VisulaBasic-Programm machst. Wenn du jetzt zusätzlich noch mal eine Umrechnung in den Audorino-Code schreibst, wirst du später Probleme bekommen, heruszufinden, wo du gegebenenfalls Fehler gemacht hast.

Prinzipiell kannst du natürlich auch in den Audorino-Code einfach -10 reinschreiben. Dann darfst du allerdings nicht langsamer als 10 km/h fahren, weil Werte kleiner als 0 nicht mehr darstellbar sind. Genau so darfst du im Normalzustand* ja auch nicht schneller als 255 km/h (bzw. in deinem Fall schenller als 149 km/h) fahren, weil das sonnst ebenfalls nicht mehr darstellbar wäre.
Wenn du das trotsdem machen möchtest, musst du im Code definieren, was bei Geschwindigkeiten größer als 149 bzw. kleiner als 10 km/h pasieren soll. Dies macht man normalerweise mit IF-Blöcken. In diesem Fall wäre es z.B. sinnvoll, bei Geschwindigkeiten kleiner als 10 km/h beim kleinesten Wert stehen zu bleiben. Die von Andreas vorgeschlagene Alternative wäre die verwendung von Mathematischen Funktionen, die ein Maximum ausgeben, der Wert ist damit immer mindestens 0 und damit immer darstellbar.
Wie gesagt, ich würde dir allerdings raten, diese Umrechnungen im VisualBasic-Code zu machen und im Audorino die -10 wieder zu streichen.

Den Code von gestern muss ich außerdem noch mal korrigieren, weil das Dezimaltrennzeichen ein Punkt und kein Komma ist (falsch kopiert):

Code: Alles auswählen

                    Case 2561   'Geschwindigkeit3
                        OutChar(0) = 86     'V
                        If data.Value < 25 Then
                            OutChar(1) = CByte(System.Math.Round(1 * data.Value), 0))
                        Else
                            OutChar(1) = CByte(System.Math.Round((1.8753) * data.Value - 22.982, 0)
                        End If
                        Serial.Write(OutChar, 0, 2)
* Dort tritt der Fehler dann allerdings im VisualBasic-Programm auf.

Edit: Wertebereich des Tachos nach Tabelle aus Beitrag 228213 angepasst.


Edit: Vielleicht noch ein Nachtrag hierzu:
Ist die Geschwindigkeit <10 Km/h schlägt der Tacho voll aus, hat jemand eine Idee warum?
Ein Computer kann nicht unendlch viele verschiedene Zustände speichern, sondern nur endlich viele. In diesem Fall sind es 256 verschiedene Zahlen, die der Audorino für die Geschwindigkeit bekommen kann und an den Tacho weiterleitet: 0, 1, 2, ... 253, 254, 255.
Ein Computer kann nur plus rechnen. Dies hängt mit der zu grunde liegenden Digitaltechnik zusammen. Um aber auch minus zu unterstützen, wendet er einen Trick an: er fügt einfach eine große Zahl hinzu, und rechnet dann mit Überlauf. Dies kann man mit einer alten Zeigeruhr vergleichen. Sie geht um eine Stunde vor und du möchtest sie richtig stellen. Du darfst die Uhr allerdings nicht zurückstellen, weil sie sonnst kaputt gehen würde. Was machst du: Du stellst einfach die Uhr um 11 Stunden vor, und hast damit das gleiche getan, wie eine Stunde zurückzustellen. Wenn du also 10 abziehst, macht der Audorino das selbe wie 245 dazu zählen. 0 - 10 = 0 + 245 = 245 => Vollausschlag. Der Computer macht das auch so. Aber im Unterschied zum Audorino überprüft er, ob er dabei auch alles richtig gemacht hat, und dabei stellt er fest, das die Zahl zu klein zum Minus-Rechnen gewesen war. Also erzeugt er eine Fehlermeldung.
Um dies zu beheben musst du, wie schon geschrieben, prüfen, ob die Zahl in einem Bereich liegt, der vom Tacho dargestellt werden kann, oder nicht, und dem Programm entsprechend sagen, was es dann machen soll.
Zuletzt geändert von F. Schn. am 03.03.2013 14:58:03, insgesamt 4-mal geändert.
Diese Signatur möchte folgendes bekannter machen: ZusiWiki · ZusiSK: Streckenprojekte · YouTube: Objektbau für Zusi · euirc: Zusi-Chat

Jan-Ole
Beiträge: 570
Registriert: 08.04.2010 18:00:45

Re: Das Ziel: Kastenzehner-Führerstand

#37 Beitrag von Jan-Ole »

trainboy12 hat geschrieben:Das heißt im Klartext, dass ich nicht -10 in das Skript schreiben kann?
Da hast du mich wohl falsch verstanden... Den Datentyp aus meinem Beispiel gibt es nicht. Siehe:
Jan-Ole hat geschrieben:...(so einen Datentyp gibt es nicht; ich habe es lediglich zur Veranschaulichung erfunden!)...
Für den Rest siehe F.Schn.s Post.

Jan-Ole

trainboy12
Beiträge: 55
Registriert: 27.06.2012 20:02:45

Re: Das Ziel: Kastenzehner-Führerstand

#38 Beitrag von trainboy12 »

Ich finde das echt toll, wie schnell hier einem geholfen wird.

Es hat auf Anhieb der Code von Andreas Karg funktioniert, worüber ich sehr froh bin und woran ich auch erstmal nichts ändern werde ;)

Gruß Jean-Maurice

trainboy12
Beiträge: 55
Registriert: 27.06.2012 20:02:45

Re: Das Ziel: Kastenzehner-Führerstand

#39 Beitrag von trainboy12 »

Moin Moin,

ich möchte mal wieder ein Skript für den Lonardo schreiben....
das ist jetzt vielleicht ein wenig OT aber ich hoffe, dass ihr mir vielleicht helfen könnt.

ich möchte mit einem Taster eine Tastenkombination auslösen, sprich 2 Tasten gleichzeitig. In diesem ersten Fall währe es "[shift]+[P].
Wie würde denn jetzt das skript dafür aussehen? Bei Onkel Gockel finde ich auch nix :wand

Gruß
Jean-Maurice

Edit: Problem gelöst.
Zuletzt geändert von trainboy12 am 29.03.2013 19:12:28, insgesamt 1-mal geändert.

IG-Einheitsloks
Beiträge: 22
Registriert: 16.06.2012 22:21:27
Aktuelle Projekte: Umbau der 110 228-4 in den Ursprungszustand als E10 228, Bau eines Führerstandes der Baureihe E40.11
Wohnort: Stuttgart
Kontaktdaten:

Re: Das Ziel: Kastenzehner-Führerstand

#40 Beitrag von IG-Einheitsloks »

Hallo,
mal eine kleine Frage in die Runde. Die Originalgeschwindigkeit der Serien E10 war ja 150km/h und nicht wie heute 140km/h. Ist Zusi oder auch andere Programme nur für die heutige 140km/h ausgelegt oder gibt es auch Varianten für 150km/h oder auch 160km/h für die Rheingold/TEE Maschinen? Die Tachos der E10 gehen ja Skalenmäßig bis 180km/h.

Viele Grüße
Sven

Antworten