Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!
ich hab für meine Carrerabahn einen digitalen Start- Ziel Bogen entworfen. MIt zwei Lichtschranken und 4 - 7 Segmentanzeigen.
MIt hilfe des Arduino Mega habe ich ein Programm geschrieben, wenn eine Lichtschranke unterbrochen ist, soll zählt die anzeige hoch! Das funktioniert auch alles, nun will ich mit HIlfe von Labview auch die Runden und danach die Rundenzeiten auf Laptop angezeicht bekommen.
Mein Problem ist jetzt das ich ein Singal bekommen aber die Runde nicht gespeichert wird bei Labview!
Kann mir jemand helfen warum das so ist, ich möchte das der Wert in Labview gespeichter wird.
Rückfrage: Du arbeitest mit aktiviertem Termination Char bei der seriellen Kommunikation. Ist das korrekt? Beendet dein Arduino jede Nachricht mit einem <LF>. Wenn ja, dann brauchst du kein Bytes at Port. Außerdem fehlt dir jegliche Fehler-Auswertung. Wer sagt denn, dass alle 30 ms die Nachricht über die Anzahl der Runden kommt? Wenn dein Such-Tag "Runde1=" nicht gefunden wird, dann solltest du auch keine Rundenanzahl anzeigen.
Gruß, Jens
Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)
!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!
// Programmierung des Mikrocontrollers
// Thomas Biedenbach
// CarreraBike
// Mikrocontroller Arduino Mega 2560
// Um die Runden der Fahrzeuge zu zählen, bedarf es einer Abfrage am Startzielbogen
// um dem Mikrocontroller mitzuteilen ob das Fahrzeuge durchgefahren ist oder nicht.
// Die Kontrolle, ob ein Fahrzeug durch den Startzielbogen gefahren ist , geschieht durch
// eine selbst gebaute Infrarot - Lichtschranke, die am Bogen unten angebracht ist.
// Ist die Lichtschranke belegt, dann sendet sie eine 1 an den Mikrokontroller, sobald sich
// nicht belegt ist sendet sie eine 0. Durch einen Reset Taster werden die Runden wieder auf zurückgesetzt
int Lichtschranke1 = 11; // Zuweisung für Lichtschranke Bahn1 = Pin 11
int Lichtschranke2 = 13; // Zuweisung für Lichtschranke Bahn2 = Pin 13
int Lichtschrankeunterbrochen1; // Variable für Pin Zustand Bahn 1
int Lichtschrankeunterbrochen2; // Variable für Pin Zustand Bahn 2
int letzteRunde1; // Variable für den letzten Schalterzustand letzte Runde Bahn1
int letzteRunde2; // Variable für den letzten Schalterzustand letzte Runde Bahn2
int Runde1 = 0; // Varialbe für Rundeanzahl Bahn 1, am Anfang Runde = 0
int Runde2 = 0; // Varialbe für Rundeanzahl Bahn 2, am Anfang Runde = 0
int reset = 12; // Zuweisung für Resettaster = Pin 11
int resetdruecken; // Variable für Pin Zustand Resettaster
int auszugebende_Zahl; // Variable für auszugebende Zahl, am Display
void setup(){ //Setup Bedingungen des Programms
Serial.begin(9600); // Start der seriellen Kommunikation mit 9600bps
pinMode(Lichtschranke1,INPUT); // setzt den DigitalPin als Eingang
pinMode(Lichtschranke2,INPUT); // setzt den DigitalPin als Eingang
sevseg.Begin(1,2,5,6,32,3,7,28,24,22,4,30,26); // Pin Belegung des Mikroconrollers für 4 stellige 7 Segement Display
sevseg.Brightness(10); // Helligkeit des Displays Wert von 0-100
}
void loop() { // Bedingungen die ständig wiederholt werden
sevseg.PrintOutput(); // Erzeugt die Ausgabe am Display
if (digitalRead(reset) == HIGH) // Wenn Reset 1, Dann Runde1 = 0, Runde wird zurückgesetzt
Runde1 = 0;
Lichtschrankeunterbrochen1 = digitalRead(Lichtschranke1); // Lichtschranke1 Wert lesen und in Varibale Lichtschrankeunterbrochen1 speichern
if (Lichtschrankeunterbrochen1 != letzteRunde1) { // Der Zustand des Schalters hat sich verändert
if (Lichtschrankeunterbrochen1 == LOW) { // Wenn Lichtschranke unterbrochen dann
Runde1++; // Runde1 hochzählen +1
if (Runde1==99) { // Wenn Runde 99 erreicht, dann zurücksetzen auf 0
Runde1=0;}
Serial.print("Wir sind jetzt in der "); // Ausgaben zum Serial Monitor, nur sichtbar am PC
Serial.print(Runde1);
Serial.println(" Runde Bahn1");
}
}
letzteRunde1 = Lichtschrankeunterbrochen1; // Den letzten Schalterzustand merken
if (digitalRead(reset) == HIGH) // Wenn Reset 1, Dann Runde2 = 0, Runde wird zurückgesetzt
Runde2 = 0;
Lichtschrankeunterbrochen2 = digitalRead(Lichtschranke2); // Lichtschranke2 Wert lesen und in Varibale Lichtschrankeunterbrochen2 speichern
if (Lichtschrankeunterbrochen2 != letzteRunde2) { // Der Zustand des Schalters hat sich verändert
if (Lichtschrankeunterbrochen2 == HIGH) { // Wenn Lichtschranke unterbrochen
Runde2++; // Runde2 hochzählen +1
if (Runde2==99) { // Wenn Runde 99 erreicht, dann zurücksetzen auf 0
Runde2=0;}
Serial.print("Wir sind jetzt in der "); // Ausgaben zum Serial Monitor, nur sichtbar am PC
Serial.print(Runde2);
Serial.println(" Runde Bahn2");
}
letzteRunde2 = Lichtschrankeunterbrochen2; // Den letzten Schalterzustand merken
}
Und musst du wirklich "Wir sind jetzt in der xx Runde Bahn1<LF>" über die serielle Schnittstelle schicken, wenn es auch die kürzere Botschaft "B1=xx<LF>" tun würde? Bei nur 9600baud macht das schon eine Menge aus…
Hallo ich hab hier mein arduino Programm, reingestellt ich beende meine nachricht zum schluss mit ln,
Beispie: Wir sind jetzt in Runde " " Bahn 1!
Wie meinst du das mit den keine Bytes at Port?
die 30 ms habe ich eingefügt das er immer alle 30 ms sekunden abfragt, ob was passiert ist oder nicht, dass kann ich auch höher setzen!
es kommt die RUnde ja auch an nur der Wert wird nicht gespeichert!
Ja das mit dem Wir sind jetzt in der Runde Bahn 1 war ja nur ein Beispiel,
ich kann das schön kürzer machen!
05.03.2014, 17:01 (Dieser Beitrag wurde zuletzt bearbeitet: 05.03.2014 17:19 von jg.)
(05.03.2014 16:48 )biede1987 schrieb: Hallo ich hab hier mein arduino Programm, reingestellt ich beende meine nachricht zum schluss mit ln,
Beispie: Wir sind jetzt in Runde " " Bahn 1!
Wie meinst du das mit den keine Bytes at Port?
Ganz einfach: Bei aktiviertem Term Char übernimmt LabVIEW die "Ende" Erkennung einer Botschaft. Du musst bei VISA-Read eine sehr große Anzahl von Bytes anschließen, der Lesevorgang wird trotzdem bei Erkennung des TermChar (oder des Timeout) beendet.
Bei deinem Vorgehen dagegen wird der Read-Vorgang in der Regel viel früher beendet, da Bytes at Port im schlimmsten Fall eine 0 (oder 1) zurückliefert, VISA-Read liest also 0 oder 1 Byte, du hast keine komplette Botschaft. EDIT: Und in diesen unvollständigen Botschaften suchst du dann nach deinem Suchtext...
Gruß, Jens
Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)
!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!
ich versuch grad weiter zuarbeiten an meinem Projekt!
Ich hab mir jetzt das arduino tool kit herruntergeladen, hat auch alles so weit geklappt,
hab auf meinem Arduino Steckbrett ein Taster angeschlossen um ein Eingang am Controller zu erhalten!
Ich möchte jetzt das ich wenn den Taster drücke eine 1 in Labview ankommt,Also das ich den Eingang abfrage in Labview!
Meine erste Frage ist muss am meinem Mikrocontroller, ein bestimmtes Programm aufladen, damit er mit Labview kommuniziert?
z.B? LIFA_Base
im Anhang ist meine VI angefügt, wer schön wenn wir jeamnd helfen könnte
Labview erkennt nur den Eingag wenn ich dann auch schreibe
Serial.print(Eingang 13);
z.B Beispiel wenn ich z.B die Übung Blink nehme,
müsste man doch dann in Labview die 1 dann sehen oder?
Danke für euer HIlfe
/*
Blink
Turns on an LED on for one second, then off for one second, repeatedly.
This example code is in the public domain.
*/
// Pin 13 has an LED connected on most Arduino boards.
// give it a name:
int led = 13;
// the setup routine runs once when you press reset:
void setup() {
// initialize the digital pin as an output.
Serial.begin(9600);
pinMode(led, OUTPUT);
}
// the loop routine runs over and over again forever:
void loop() {
digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(led, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
Serial.print(led);
}