Auslesefehler Ardunino Uno "unable to read any data"

Hallo,

ich habe folgendes System:
Ein Sensor schaltet zwischen an und aus unregelmäßig hin und her. Diesen Sensor habe ich an einen Arduino Uno angeschlossen. Der Arduino soll die Zeit ermitteln, die zwischen zwei aus/an-Schaltungen vergeht. Also immer wenn der Sensor von "aus" auf "an" springt, soll das Programm die Zeit bis zum nächsten "aus" zu "an" messen und per USB ausgeben. Dazu habe ich folgenden Code für den Arduino:

const int inputPin = 3;  // Pin 3 als Eingang für das Signal festlegen
int previousState = LOW; // Vorheriger Zustand des Eingangs
unsigned long previousTime = 0; // Vorherige Zeit des Zustandswechsels

void setup() {
  pinMode(inputPin, INPUT); // Pin als Eingang festlegen
  Serial.begin(9600); // Serielle Kommunikation starten
}

void loop() {
  int currentState = digitalRead(inputPin); // Aktuellen Zustand des Eingangs lesen

  if (currentState != previousState) { // Wenn sich der Zustand geändert hat
    if (currentState == HIGH) { // Wenn der Zustand "an" ist
      unsigned long currentTime = millis(); // Aktuelle Zeit erfassen
      unsigned long elapsedTime = currentTime - previousTime; // Zeitdifferenz berechnen
      Serial.print(elapsedTime); // Zeitdifferenz über die serielle Schnittstelle ausgeben
      Serial.println(";"); // Terminator hinzufügen (vermutlich unnötig)
      previousTime = currentTime; // Vorherige Zeit aktualisieren
    }

    previousState = currentState; // Vorherigen Zustand aktualisieren
  }
}

Das Ergebnis will ich mit Matlab auslesen und habe dazu folgenden Code:

% Serielle Verbindung zum Arduino herstellen
arduino = serial('COM3', 'BaudRate', 9600);
fopen(arduino);

% Startzeitpunkt festlegen
startTime = tic;

% Endlosschleife zum Lesen der Daten vom Arduino für 60 Sekunden
while toc(startTime) < 60
    % Daten vom Arduino lesen
    data = fscanf(arduino, '%s');

    % ASCII-Code anzeigen
    fprintf('Zeit: %s\n', data);
end

% Serielle Verbindung schließen
fclose(arduino);

Die Ausgabe funktioniert, allerdings nur für die erste Schaltung, danach kommt eine Fehlermeldung, dass Matlab keine Daten mehr auslesen kann:

">> chat
Warning: serial will be removed in a future release. Use serialport instead.
Zeit: 2522;
Warning: Unsuccessful read: A timeout occurred before the Terminator was reached.
'serial' unable to read any data. For more information on possible reasons, see Serial Read Warnings.
Zeit:
Warning: Unsuccessful read: A timeout occurred before the Terminator was reached.
'serial' unable to read any data. For more information on possible reasons, see Serial Read Warnings.
Zeit: "

Die ein mal ausgegebene Zeit (2522) in ms passt. Weiterhin habe ich festgestellt, dass der Wert auch beim ersten mal nur ausgegeben wird, wenn der Arduino neu angeschlossen ist. Wenn ich das Matlabprogramm nach Beendigung (60s Laufzeit) erneut starte, kommt folgendes Ergebnis:

">> chat
Warning: serial will be removed in a future release. Use serialport instead.
Zeit: 0;
Warning: Unsuccessful read: A timeout occurred before the Terminator was reached.
'serial' unable to read any data. For more information on possible reasons, see Serial Read Warnings.
Zeit: "

Es wird also wieder ein mal etwas vom Arduino ausgelesen "0;", aber eben nicht der richtige Wert und danach gibt es wieder kein Signal. Leider konnt ich bisher keine Lösung finden. Kann mir jemand sagen, warum weitere Schaltvorgänge nicht zu einer erneuten Signalausgabe führen? Und warum der Arduino beim zweiten Lauf des Programms nur "0;" ausgibt? Denn die Verbindung wird ja am Ende des Matlabprogramms geschlossen und dann beim 2. Durchlauf wieder neu geöffnet. Wenn ich den USB Stecker ziehe (auch Stromverbindung) und den Arduino somit neu starte, klappt es wieder für den 1. Wert.

Viele Grüße und schon mal Danke für die Mühe,

Simon

Hallo,
Sorry, aber deine Beschreibung verstehe ich nicht.
Was ist das für ein Sensor ? Poste bitte einen Link des Sensors.
Wie ist dieser am Uno angeschlossen ?
Normalerweise liefert ein Sensor einen Messwert, was macht dein Sensor ?
Poste bitte ein Schaltbild, wie du alles verdrahtet hast.

Hallo,
es handelt sich dabei um einen Kontasttaster:

Dieser gibt mir je nachdem ob er gerade schwarz oder weiß detektiert nahezu 24V oder 0V aus.
Vielleicht kurz als Kontext: Ich möchte die Geschwindigkeit eines Fördergurtes messen. Dazu wurden schwarze Streifen auf den weißen Gurt gemalt. Immer wenn ein Streifen kommt, schaltet der Sensor. Bei bekanntem Abstand kann ich mir so über die Zeit zwischen 2 Schaltungen die Geschwindigkeit ausrechnen.
Das Ausgangssignal habe ich über einen Vorwiderstand an einen Optokoppler angeschlossen, um den Arduino galvanisch getrennt zu betreiben (und nicht zu zerstören). Der Optokoppler gibt, wenn er das Signal vom Sensor bekommt und schaltet, einfach nur die 5V vom 5V Pin des Arduino für den Pin 3 frei. Pin 3 hat also entweder 0V oder 5V anliegen.
Leider kann ich keinen Schaltplan hochladen, da ich ein neuer Benutzer bin :confused:
Hab hier ein Foto der Skizze hochgeladen, hoffe mal externe Links sind erlaubt:

Google Photos

Ich glaube aber nicht, dass es an der Schaltung liegt, denn sonst dürfte eigentlich auch der erste Wert nicht stimmen.

Hoffe es ist so etwas klarer,

Viele Grüße,

Simon

Ok, jetzt ist es klar, danke dafür.

Meine Vermutung:
Du hast de seriellen Monitor und Matlab gleichzeitig zum auslesen aktiviert.
Das funktioniert nicht.
Du kannst nur mit einer Anwendung zur Zeit auf der seriellen "horchen".

Hallo,

also Arduino IDE hab ich eigentlich komplett geschlossen, während das Programm läuft, das brauch ich ja nur ein mal um den Code auf den Arduino zu laden. Demnach müsste der serielle Monitor eigentlich auch geschlossen sein. Oder muss der irgendwie besonders deaktiviert werden?

Viele Grüße,

Simon

Wenn die IDE geschlossen ist, ist auch der serielle Monitor zu.
Dann blockiert irgend etwas anderes die Schnittstelle oder Matlab blockiert.
Ok, da bin ich dann mangels Matlab-Wissen raus.

Habs so ziemlich gelöst, es waren 2 Punkte, vielleicht hilfts ja zukünftig jemandem:

  1. In der Schaltung war die Masse vom Arduino nicht gleich der Masse vom Rest der Schaltung.

  2. Der Timeoutfehler kommt wohl dadaurch zustande, dass Matlab ständig nachfragt, der Arduino aber nur beim Schalten ausgibt. Matlab gibt dann irgendwann auf. Habe hinter die 1. If-Schleife im Arduinocode ein "else print 0" eingebaut. Das wird dann erstmal dauerd ausgelesen und spammt die Ausgabe voll, aber hab das den print-Befehl in Matlab dann in eine If-Schleife gesetzt, die nur geht wenn data ~= 0. Matlab liest also permanent die Nuller aus, zeigt aber nur die Werte ungleich 0, also bei einer Schaltung, an.

Viele Grüße,

Simon

Prima, wenn es jetzt funktioniert.
Danke für die Rückmeldung.

Die gibt's nicht :wink:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.