Ausgänge

Da immer mehr Zusi User von einem 1:1 Führerstand mit träumen, soll es zumindest an Datenaustausch nicht hapern.
Nachricht
Autor
Benutzeravatar
nonesense
Beiträge: 506
Registriert: 15.07.2006 12:50:10
Aktuelle Projekte: QDmi
Fahrpult Einheitsführerstand
Ludmilla
Wohnort: Köln
Kontaktdaten:

Re: Ausgänge

#181 Beitrag von nonesense »

Hallo,

"INa|=1" ...bekommst du da keine Fehlermeldung?
Ich hätte geschrieben:
if(digitalRead(22)==HIGH){INa = INa | 1;}

Die Delays zwischen dem Senden kannste weglassen.
A,B,C und D vor dem eigentlichen Byte kannste auch weglassen. Denn deine VB-Software hat die Bytes ja gerade mit "r" angefordert und sollte daher wissen, wie viele Bytes, mit welcher Bedeutung da jetzt kommen.

Und noch etwas wichtiges: Du musst die Sende-Variablen lokal in deiner Funktion deklarieren, sonst wird der Inhalt nie gelöscht. Heisß, du hättest eine Einbahnstraße. der |-Operator setzt die Bits auf 1, aber nicht zurück nach 0.

Gruß
Jens

Benutzeravatar
Sebastian N.
Beiträge: 419
Registriert: 07.10.2011 06:24:53
Kontaktdaten:

Re: Ausgänge

#182 Beitrag von Sebastian N. »

nonesense hat geschrieben:Hallo,

"INa|=1" ...bekommst du da keine Fehlermeldung?
Ich hätte geschrieben:
if(digitalRead(22)==HIGH){INa = INa | 1;}
Die geschwungene Klammer kann ich bei nur einer Anweisung ja weglassen und das |= ist nur die Kurzschreibweise deiner Version.
nonesense hat geschrieben: Und noch etwas wichtiges: Du musst die Sende-Variablen lokal in deiner Funktion deklarieren, sonst wird der Inhalt nie gelöscht. Heisß, du hättest eine Einbahnstraße. der |-Operator setzt die Bits auf 1, aber nicht zurück nach 0.
Hab mir schon gedacht dass ich das irgendwo Null setzen muss. Oder ich verwende den xor Operator.

Eins noch, wo muss ich diese Funktion nun aufrufen?


Gruß,
Sebastian N.

Benutzeravatar
nonesense
Beiträge: 506
Registriert: 15.07.2006 12:50:10
Aktuelle Projekte: QDmi
Fahrpult Einheitsführerstand
Ludmilla
Wohnort: Köln
Kontaktdaten:

Re: Ausgänge

#183 Beitrag von nonesense »

In loop.
Und dann auch leicht anders, als du es geschrieben hast...

Code: Alles auswählen

void loop()
{
  //... 
  //...
  //...
  if (inputByte[0] == 'P'){                  // "P" für PZB, stellvertretend für alle Leuchtmelder
    LmPZB(inputByte[1]);                   // Wir geben das Byte an eine Funktion, die die 8 Bits je einem Digitalausgang zuordnet
  }
  //...
  //...
  //...
  if (inputByte[0] == 'r'){                  //Jetzt will der blöde PC auch noch von mir etwas wissen!
    Input();
  }
Beim lesen der analogen Eingänge musst du noch eine Typenkonvertierung vornehmen. Die gehen ja bis 1023, statt 255.

Code: Alles auswählen

void Input() {
  byte INa = 0;
  byte INb = 0;
  byte INc = 0;
  byte INd = 0;
  if (digitalRead(22)==HIGH){INa = INa | 1};
  if (digitalRead(23)==HIGH){INa = INa | 2};
  if (digitalRead(24)==HIGH){INa = INa | 4};
  if (digitalRead(25)==HIGH){INa = INa | 8};
  //...
  INc=round((analogRead(14)-1)/4);
  //...
  Serial.write(INa);
  Serial.write(INb);
  Serial.write(INc);
  Serial.write(INd);
}
Gruß
Jens

Benutzeravatar
Sebastian N.
Beiträge: 419
Registriert: 07.10.2011 06:24:53
Kontaktdaten:

Re: Ausgänge

#184 Beitrag von Sebastian N. »

Hallo nochmals!

Das C- Programm funktioniert nun fehlerfrei, ich habe nur noch etwas Probleme mit dem VB Teil, da ich darin ein Anfänger bin.

Hier mal der fertige C- Teil

Code: Alles auswählen

 
...
  if (inputChar[0]=='r')
  Input();
...
  INc=round((analogRead(14)-1)/4);
  INd=round((analogRead(15)-1)/4);
  
          
    Serial.write(INa);
    Serial.write(INb); 
    Serial.write(INc);
    Serial.write(INd);
   
  
...und der des VB Programms:

Code: Alles auswählen

            Serial.WriteLine("rr")      'Werte vom Arduino anfordern
            INa = 0
            INb = Serial.ReadByte()
            INc = Serial.ReadByte()
            INd = Serial.ReadByte()
            Label17.Text = INa



            If INa And 1 <> 0 Then SendKeys.Send("K") 'Lüfter
            If INa And 2 <> 0 Then SendKeys.Send("ß") 'Befehl
            If INa And 4 <> 0 Then SendKeys.Send("1") 'Frei
            If INa And 8 <> 0 Then SendKeys.Send("R") 'Wachsam
            If INa And 16 <> 0 Then SendKeys.Send("H") 'HSein
            If INa And 32 <> 0 Then SendKeys.Send("H") 'HSaus
            If INa And 64 <> 0 Then SendKeys.Send("+") 'Horn
            If INa And 128 <> 0 Then SendKeys.Send("-") 'Sand
Diesen habe ich jetzt nach dem End Select eingefügt ?(

Leider hängt das Programm sobald ich Zusi verbinde und macht nichts mehr, nachdem eine Übertragung stattgefunden hat.


Ich hoffe diese Fragestellung ist etwas klarer, bin derzeit etwas im Zeitdruck.


Gruß,
Sebastian N.

Benutzeravatar
nonesense
Beiträge: 506
Registriert: 15.07.2006 12:50:10
Aktuelle Projekte: QDmi
Fahrpult Einheitsführerstand
Ludmilla
Wohnort: Köln
Kontaktdaten:

Re: Ausgänge

#185 Beitrag von nonesense »

Wenn, dann würde ich die Abfrage in einem Timer einfügen und nicht hinter "einem" select.
...Denn dann würde ja nur, wenn sich in der Simulation etwas verändert hat, auch eine Abfrage stattfinden.
Zumal es zwei Funktionen mit selct case gibt. Die für die Bool-Werte und die für die Single-Werte.

Timer findest du links bei den vielen anderen Elementen, die man auf die Form zeichnen kann. Wenn du ihn eingefügt hast, doppelklick drauf und du landest in seinem Quellcodebereich.

Gruß
Jens

Benutzeravatar
Sebastian N.
Beiträge: 419
Registriert: 07.10.2011 06:24:53
Kontaktdaten:

Re: Ausgänge

#186 Beitrag von Sebastian N. »

Dankesehr, so funktioniert das super!

Benutzeravatar
Sebastian N.
Beiträge: 419
Registriert: 07.10.2011 06:24:53
Kontaktdaten:

Re: Ausgänge

#187 Beitrag von Sebastian N. »

Ein Problem habe ich nun doch noch:

Lasse ich das Programm mit der aktiven Dateneingabe über längere Zeit laufen, hängt es sich irgendwann mal auf und ich muss den Arduino neu verbinden, damit es wieder funktioniert. Bei deaktivierter Dateneingabe tritt dieser Effekt nicht auf.

Ich denke es ist darauf zurückzuführen, dass mein Arduinoprogramm recht umfangreich ist und der Arduino manchmal "keine Zeit hat", um Daten abzusendenn und sich somit ein Stau im Puffer bildet.

Wie kann ich dem am besten vorbeugen?

Gruß,
Sebastian N.

Benutzeravatar
nonesense
Beiträge: 506
Registriert: 15.07.2006 12:50:10
Aktuelle Projekte: QDmi
Fahrpult Einheitsführerstand
Ludmilla
Wohnort: Köln
Kontaktdaten:

Re: Ausgänge

#188 Beitrag von nonesense »

Das ist unwahrscheinlich.

Warum sollte des Controller mal Zeit haben und mal nicht?


Was passiert denn genau bei den Abstürzen? An welcher Stelle bleibt der Code hängen?

Oder erstellst du immer eine Exe, die du dann ausführst?

Gruß
Jens

Benutzeravatar
Sebastian N.
Beiträge: 419
Registriert: 07.10.2011 06:24:53
Kontaktdaten:

Re: Ausgänge

#189 Beitrag von Sebastian N. »

nonesense hat geschrieben: Warum sollte des Controller mal Zeit haben und mal nicht?
Könnte daran liegen, dass in meinem Code ein Interrupt für die Motoransteuerung enthalten ist, wo loop dann kurz pausiert wird.
Was passiert denn genau bei den Abstürzen? An welcher Stelle bleibt der Code hängen?
Absturz ist eigentlich falsch ausgdrückt, das Programm reagiert einfach nicht mehr.


Ich habe zum Test mal eine zusätzliche Abfrage wie beim Verbinden eingebaut, wo der Arduino vor dem Senden der Bytes nochmals mit "readytosend" antwortet, und nur wenn diese Bestätigung im VB Programm ankommt werden dort die nächsten Bytes eingelesen.
Das scheint das Problem behoben zu haben.

Benutzeravatar
nonesense
Beiträge: 506
Registriert: 15.07.2006 12:50:10
Aktuelle Projekte: QDmi
Fahrpult Einheitsführerstand
Ludmilla
Wohnort: Köln
Kontaktdaten:

Re: Ausgänge

#190 Beitrag von nonesense »

Auch sowas geht mit dem Arduino:

Bild
Der Chip unter dem LCD-Display wird per I²C vom Arduino angesteuert, die LEDs halt direkt vom Arduino.

Wer so ein Ding ergattert, AZ720 von Messma, kann mich ja dann auf den Arduino-Code dafür ansprechen.
Der ist ziemlich lang geworden.

Gruß
Jens
Zuletzt geändert von nonesense am 21.11.2012 23:10:19, insgesamt 1-mal geändert.

Andreas K.
Beiträge: 82
Registriert: 22.01.2007 18:01:17
Wohnort: Nürnberg

Re: Ausgänge

#191 Beitrag von Andreas K. »

Fragen über Fragen!

Würde gerne mit meinem Arduino Zahlen größer als 255 (Wohl ein Byte) darstellen. Würde es gerne als String übertragen:

Also eine klare Beschreibung z.B.: "LZBZielweg" und danach den Wert als Klartext 3687 (hier m). Würde dann im Arduino die Beschreibung abtrennen und den Klartext weiterverarbeiten. Der Code im Arduino steht und funktioniert, aber beim VB-Client stehe ich total am Schlauch.

Kann da jemand mir weiter helfen?

Grüße Andreas

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

Re: Ausgänge

#192 Beitrag von SgtMcExodus »

Andreas K. hat geschrieben:Fragen über Fragen!

Würde gerne mit meinem Arduino Zahlen größer als 255 (Wohl ein Byte) darstellen. Würde es gerne als String übertragen:

Also eine klare Beschreibung z.B.: "LZBZielweg" und danach den Wert als Klartext 3687 (hier m). Würde dann im Arduino die Beschreibung abtrennen und den Klartext weiterverarbeiten. Der Code im Arduino steht und funktioniert, aber beim VB-Client stehe ich total am Schlauch.

Kann da jemand mir weiter helfen?

Grüße Andreas
Ich als Programmierlaie habe den Zielweg in Zwei Bytes Geteilt und so versendet :D

Ich habe aber ein ganz anderes Problem, dessen Lösung vermutlich auf der Hand liegt, ich aber den Wald vor lauter Bäumen nicht sehe:
Ich habe eine Stützkurve für meinen Tacho erstellt und in den Arduino-Code eingefügt. Jedoch erhalte ich beim Dividieren von einem Integer immer das Tausendfache des Divisors, egal welchen Wert der Dividend hat. Auch mit einem Float der später gerundet wird habe ich keinen Erfolg ;(

Code: Alles auswählen

int VIst = 81;
int a = 0;

void setup(){
Serial.begin(9600);
}

void loop(){
int a = (VIst / 0,459);
analogWrite(3, a); 
Serial.println(a);
}


Benutzeravatar
Arndt
Beiträge: 78
Registriert: 05.06.2011 14:24:18
Wohnort: Windeck Herchen

Re: Ausgänge

#193 Beitrag von Arndt »

Hallo

Ich habe mich jetzt auch mal an das Thema Arduino und Übermittlung der Zusi-Daten begeben und brachte Dank Eurer Beiträge recht schnell gute Ergebnisse. Danke!

Da mir die 8Bit-Auflösung der Arduino-eigenen PWM zu mager sind, suchte ich nach einer Möglickeit, eine höhere Auflösung zu bekommen und entschied mich für den PCA9685, den man mit I2C anspricht und der 16 PWM-Ausgänge mit 12Bit-Auflösung und die Möglichkeit des Phasenverschubs (Verteilen der PWM-Signale über den Zyklus) bietet. Die Programmierung ist zugegebenerweise deutlich komplizierter als beim Arduino (ich knabbere auch noch daran), bringt aber den Vorteil des geringeren Sekundenzeiger-Effekts beim Beschleunigen oder Bremsen. Um für ihn aber die Daten in den Arduino zu bekommen, musste ich ja auch die 12Bit senden. Ich habe das mit zwei Datenpaketen gelöst. Hier mein Code:

Code: Alles auswählen

    if (inputByte[0] == 'V')
      tmp = (inputByte[1] * 256);
    if (inputByte[0] == 'v')
    {
      tmp += inputByte[1];

      PWMwrite(PinTacho, tmp);
    }
Im PC-Programm werden die beiden Pakete sofort hintereinander gesendet.

Was mir noch Sorge macht, ist das doch recht simple Protokoll, bei dem es keine Synchronisation gibt. Wenn der Arduino ein Byte verpasst, funktioniert die Übertragung bis zum nächsten verpassten Byte nicht mehr. Jede Methode der Synchronisation würde das Datenvolumen verdoppeln bis verdreifachen, also nicht so gut. Auch Aufbohren der Pakete auf drei Byte pro Übertragung ging schief, da recht bald das Problem mit dem verpassten Byte eintrat.

Ich habe mir übrigens (da ich kein Freund von .NET bin) die Mühe gemacht und habe eine eigene TCP-DLL in C++ geschrieben. Es kam weiter vorne die Frage nach einer C-Variante auf. Besteht noch Interesse an daran?

Gruß Arndt

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

Re: Ausgänge

#194 Beitrag von Andreas Karg »

Gab es nicht von Jens Wurster schon eine C++-Variante? Oder war das Java?

Benutzeravatar
Arndt
Beiträge: 78
Registriert: 05.06.2011 14:24:18
Wohnort: Windeck Herchen

Re: Ausgänge

#195 Beitrag von Arndt »

Nicht, dass ich es mitbekommen hätte. Evtl in einem anderen Thema.

Christian Sch.
Beiträge: 379
Registriert: 15.01.2009 23:29:56
Aktuelle Projekte: Gesundheit geht vor...
Wohnort: Haidlfing

Re: Ausgänge

#196 Beitrag von Christian Sch. »

Andreas Karg hat geschrieben:Gab es nicht von Jens Wurster schon eine C++-Variante? Oder war das Java?
Jens wollte eine Java-Variante veröffentlichen.

Christian

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

Re: Ausgänge

#197 Beitrag von Andreas Karg »

Ah, okay. Prima - dann haben wir ja für alle gängigen Plattformen jetzt/bald eine Schnittstelle. :-)

Benutzeravatar
Arndt
Beiträge: 78
Registriert: 05.06.2011 14:24:18
Wohnort: Windeck Herchen

Re: Ausgänge

#198 Beitrag von Arndt »

Wo ist denn der beste Ort, um die zwei Dateien (DLL und Header-Datei) zu hinterlegen?

Arndt

Benutzeravatar
Arndt
Beiträge: 78
Registriert: 05.06.2011 14:24:18
Wohnort: Windeck Herchen

Re: Ausgänge

#199 Beitrag von Arndt »

Hat jemand einen Server, wo die beiden Dateien hinterlegt werden können? Oder soll ich die Sachen bei mir lassen und bei Interesse und Anfrage per Mail schicken?

Arndt

Benutzeravatar
Arndt
Beiträge: 78
Registriert: 05.06.2011 14:24:18
Wohnort: Windeck Herchen

Re: Ausgänge

#200 Beitrag von Arndt »

Hinterlegung ist in Arbeit

Viele Grüße,

Arndt

Antworten