Ausgänge
- 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
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
"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
- Sebastian N.
- Beiträge: 419
- Registriert: 07.10.2011 06:24:53
- Kontaktdaten:
Re: Ausgänge
Die geschwungene Klammer kann ich bei nur einer Anweisung ja weglassen und das |= ist nur die Kurzschreibweise deiner Version.nonesense hat geschrieben:Hallo,
"INa|=1" ...bekommst du da keine Fehlermeldung?
Ich hätte geschrieben:
if(digitalRead(22)==HIGH){INa = INa | 1;}
Hab mir schon gedacht dass ich das irgendwo Null setzen muss. Oder ich verwende den xor Operator.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.
Eins noch, wo muss ich diese Funktion nun aufrufen?
Gruß,
Sebastian N.
- 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
In loop.
Und dann auch leicht anders, als du es geschrieben hast...
Beim lesen der analogen Eingänge musst du noch eine Typenkonvertierung vornehmen. Die gehen ja bis 1023, statt 255.
Gruß
Jens
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();
}
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);
}
Jens
- Sebastian N.
- Beiträge: 419
- Registriert: 07.10.2011 06:24:53
- Kontaktdaten:
Re: Ausgänge
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
...und der des VB Programms:
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.
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);
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
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.
- 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
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
...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
- Sebastian N.
- Beiträge: 419
- Registriert: 07.10.2011 06:24:53
- Kontaktdaten:
Re: Ausgänge
Dankesehr, so funktioniert das super!
- Sebastian N.
- Beiträge: 419
- Registriert: 07.10.2011 06:24:53
- Kontaktdaten:
Re: Ausgänge
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.
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.
- 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
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
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
- Sebastian N.
- Beiträge: 419
- Registriert: 07.10.2011 06:24:53
- Kontaktdaten:
Re: Ausgänge
Könnte daran liegen, dass in meinem Code ein Interrupt für die Motoransteuerung enthalten ist, wo loop dann kurz pausiert wird.nonesense hat geschrieben: Warum sollte des Controller mal Zeit haben und mal nicht?
Absturz ist eigentlich falsch ausgdrückt, das Programm reagiert einfach nicht mehr.Was passiert denn genau bei den Abstürzen? An welcher Stelle bleibt der Code hängen?
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.
- 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
Auch sowas geht mit dem Arduino:
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
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.
-
- Beiträge: 82
- Registriert: 22.01.2007 18:01:17
- Wohnort: Nürnberg
Re: Ausgänge
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
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
- SgtMcExodus
- Beiträge: 220
- Registriert: 27.03.2012 17:56:48
- Aktuelle Projekte: Studium
- Wohnort: Berlin
Re: Ausgänge
Ich als Programmierlaie habe den Zielweg in Zwei Bytes Geteilt und so versendetAndreas 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 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);
}
Re: Ausgänge
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:
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
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);
}
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
-
- Beiträge: 4718
- Registriert: 28.04.2002 12:56:00
- Kontaktdaten:
Re: Ausgänge
Gab es nicht von Jens Wurster schon eine C++-Variante? Oder war das Java?
Re: Ausgänge
Nicht, dass ich es mitbekommen hätte. Evtl in einem anderen Thema.
-
- Beiträge: 379
- Registriert: 15.01.2009 23:29:56
- Aktuelle Projekte: Gesundheit geht vor...
- Wohnort: Haidlfing
Re: Ausgänge
Jens wollte eine Java-Variante veröffentlichen.Andreas Karg hat geschrieben:Gab es nicht von Jens Wurster schon eine C++-Variante? Oder war das Java?
Christian
-
- Beiträge: 4718
- Registriert: 28.04.2002 12:56:00
- Kontaktdaten:
Re: Ausgänge
Ah, okay. Prima - dann haben wir ja für alle gängigen Plattformen jetzt/bald eine Schnittstelle. :-)
Re: Ausgänge
Wo ist denn der beste Ort, um die zwei Dateien (DLL und Header-Datei) zu hinterlegen?
Arndt
Arndt
Re: Ausgänge
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
Arndt
Re: Ausgänge
Hinterlegung ist in Arbeit
Viele Grüße,
Arndt
Viele Grüße,
Arndt