Daten vom PC Datei vom Arduino Board einlesen

Hallo

Ich bin neu im Forum und brauche Hilfe.

Ich habe ein Arduino Mega Board, und möchte eine Datei, die von einer angeschlossenen Messeinheit erstellt wird, auslesen und darauf reagieen können.

Dabei werden die Messdaten (von der Messeinheit) untereinander in eine TXT-Datei geschrieben. Ich bräuchte dabei immer den letzten Wert.

Zum Verständnis: Ich habe einen Druckaufnehmer an einem Hydraulikzylinder angebracht, der zu der Messeinheit (Messeinheit muss unbedingt verwendet werden) geht. Diese Messeinheit ist mit einem PC verbunden, und erstellt beim Starten ein Datenfile (TXT) erstellt, das die Messdaten untereinander speichert. Diese Daten sollten mir dann auf das Arduinoboard gesendet werden, um einen Regler, der den Hydraulikzylinder auf eine bestimmte Anpresskraft bringen soll, einen Imput zu liefern.

Jetzt habe ich zwei Fragen:

  1. gibt es ein gute Kommunikationsmöglichkeit (z.B. USB zu Speicherkarte oder Chip)? Das Problem ist dass ich einen Schrittmotor steuere, der zwar schnell schalten könnte, aber durch das Aktivieren der seriellen Schnittstelle (z.B. beim Schreiben vom Board zu PC), die Schaltfrequenz stark abnimmt. Kann ich das Problem vielleicht verbessern (Schrittgeschwindigkeit bei aktiver serieller schreib/lese Funktion erhöhen)?

  2. Wie kann ich mir Daten vom PC auf das Board ziehen? Und das relativ zügig. Was im Grunde meine Hauptfrage ist.

Vielen Dank für die Unterstützung schon im Voraus und LieGrü Hanphry

Hi, Wenn Du einen Stepper betreibst, hast Du immer eine Delay für den Step, den Du zum Kommunizieren benützen kannst. Brauchst Du die Stepper Lib? Dann den Puls besser selber ohne lib erzeugen und zwischen den Flanken den Wert abholen.

Wie viel Bit hat der Wert? Bei 8 bit kannst den Wert über USB/Serial mit einem zweiten Arduino abholen und an 8 Pins parallel dem Stepper Arduino anbieten. Dort mit einem Port Read abholen, nicht digitalRead. Pat

Hi,

wie ist denn diese Messeinheit mit dem PC verbunden? Via USB oder vielleicht Seriell? Wo ich drauf hinaus möchte ist, siehst Du eine Möglichkeit diese notwendige Messeinheit direkt mit dem Arduino zu verbinden? Zu klären wäre natürlich die Hardware Seite bzgl. der Schnittstelle und das Kommunikationsprotokoll, wie sendet diese Messeinheit ihre Daten.
Ich gehe mal davon aus, das Du auf dem PC eine Software laufen hast welche dir das erwähnte txt File erstellt.
Das war der erste Ansatz. Mein zweiter Ansatz wäre:

Nicht die ganze Datei auf der Arduino senden sondern immer nur die neuesten Daten. Also den aktuellen Wert. Unter Linux wäre das ein einfaches Script welches die Datei einfach endlos liest und neue Daten dann wie immer geartet zu Deinem Arduino sendet.
Dafür könntest Du z.B. die serielle Schnittstelle nehmen.

Serielle Kommunikation mit dem PC geht locker mit 250.000 oder 500.000 Baud. Wenn du dazu dann eine serielle Einlese-Funktion hast du das alles zügig und nicht-blockierend macht geht das. Also keine Schleifen die auf irgendwas warten, kein delay() und keine String Klasse.

hi,

wie oben schon geschrieben: wichtig ist, wie diese meßeinheit an den pc sendet !!! mit welchem kabel ist sie an welchem port angesteckt. wenn Du das über den pc machst, hast Du immer eine ganz schöne verzögerung. besser wäre

meßeinheit > arduino > motor

falls Du die daten auf dem pc AUCH brauchst, und die verbindung ist seriell, nimm einen MEGA, der hat mehrere serielle schnittstellen, dann empfängt er die werte von der meßeinheit, regelt den motor und schickt die daten über eine andere serielle weiter an den pc.

gruß stefan

Hallo zusammen

Vielen Dank für die raschen Antworten. Ist echt erstaunlich.

Also zu der Messeinheit. Die Messeinheit wird von einem Anakogen Signal gespeist (ich glaube mV/V). Das Problem ist, dass diese Messeinheit (komplette Messkette) kalibriert sein muss. Deshalb brauche ich den genauen Wert dieser Messkette und sollte Ihn nicht den AD-Wander am Board wandeln. Die Anbindung zum PC ist eine serielle Schnittstelle (ist auch schon ein wenig älter). Diese könnte ich evtl. abgreifen. Aber woher weiß ich was in der Übertragung das Signal ist? Die Messeinheit ist ein Mehrkanalmesssystem (Spider8 von HBM - wird gar nicht mehr vertrieben).

Zum analogen Messsignalabgriff: Außerdem vertraue ich dem AD-Wandler nicht so wirklich. Was zusätzlich die Frage aufwirft: hat jemand Erfahrung mit AD-Shields? Ich habe da sogar ein 24bit Shield gefunden. Aber ich habe keine Ahnung wie gut diese Dinger sind.

Zum Stepper: Der Stepper arbeitet so lange flüssig und schnell bis ich den Befehl Serial.begin(9600) aktiviere, um Werte auszulesen. Dann sind die Schaltzyklen um ein Vielfaches (ca. Faktor 10) langsamer. Wie es scheint ist ein Delay durch das serielle Schreiben gesetzt (kann man das vielleicht verkürzen? Oder benötigt das Protokoll einfach diese Zeit?).

Zur seriellen Schnittstelle: Ich muss im Grunde nichts zum PC senden (außer zu Testzwecken). Also bräuchte ich nur eine Schnittstelle. Aber wie der zufall so will habe ich sogar einen Mega.

Das mit dem Dateizugriff habe ich mir auch schon kurz überlegt. Man könnte doch ein Script schreiben der immer nur den letzten Wert holt und übeträgt (sehr guter Vorschlag). Am besten wäre es aber ich kann den Datenstrom direkt von der Schnittstelle verwenden. Gibt es irgendwelche Tools zu Auswerten von solchen Datenströmen? Oder kennt sich jemand mit dem Spider8 soweit aus?

Jedenfalls werde ich mal testen wie schnell der Motor mit der eigenen Motorcodierung ohne (bzw. mit sehr kurzen) Delays arbeitet.

Schönen Abend

hi,

Du hast also eine serielle verbindung von der meßeinheit zum PC? den PC brauchst Du nicht?

die kalibrierten werte kommen also von der meßeinheit zum pc, also dann schließ das ding an, starte das programm auf dem pc nicht und nimm stattdessen einen seriellen monitor wie zb. HTerm, ist kostenlos. dort die richtige schnittstelle (COM) auswählen und beobachten, was der sensor schickt.

wenn Du die einstellungen nicht kennst, wirst Du ein bißchen probieren müssen (baudrate, stopbit, parity usw), aber das geht mit HTerm schnell umzustellen, und irgendwann wirst Du schöne werte sehen (ASCII versuchen und dezimal).

der zweite schritt ist dann nur noch die programmierung, um die werte mit dem arduino einzulesen (ohne PC), und was der motor bei welchen werten machen soll.

die analogen werte würde ich vergessen, der sensor schickt doch anscheinend schon das, was Du brauchst.

gruß stefan

Ich würde mit eine Pegelwandler die serielle Datenübertragung anzapfen und mit einem Logikanalyzer und USB Seriell Wandler das ganze mal anschauen bevor ich da was mit dem Arduino direkt mache.

hi, spanier,

ich weiß nicht, ob das nötig ist. wenn ich das (aufgrund von "ist schon älter") richtig einschätze, steckt das messgerät an einer RS232-schnittstelle am computer. da brauchts keinen analyser oder wandler, einfach anstecken, HTerm starten und schauen, was daherkommt...

gruß stefan

das ist mir schon klar, aber ich gehe mal davon aus, dass da nur im laufenden Betrieb vernünftige Daten kommen. Und dafür sollte es doch am PC angeschlossen sein und die entsprechende Anwendung belegt den Port.

Jetzt kann man den Datenfluss per Software anzapfen, sofern man auf dem PC was installieren kann bzw. darf.

Oder eben die Datenleitung auf den RX Pin von einer richtigen RS232 legen, vom selben PC oder einem Notebook, falls diese darüber verfügen. Wenn nicht, eben über Inverter, Spannungsteiler an ein usb-ttl-seriell adapter. Der LA mit autobaud gibt mir schnell die benötigten Parameter

hi,

ich verstehe, was Du meinst. ich glaube aber nicht, daß die zugegörige anwendung laufen muß. deswegen gibts auch kein blockieren. einfach HTerm starten und lauschen. jedenfalls wäre das mein erster ansatz...

gruß stefan

stellt hterm alle nicht druckbaren Zeichen dar?

Bei den üblichen Steuerzeichen kann man einstellen was bei denen gemacht wird

hi,

stellt hterm alle nicht druckbaren Zeichen dar?

darum dezimal UND ASCII. dann zeigt er Dir's übereinander. wenn kein ASCII möglich, eben nur dezimal. aber es geht nix verloren.

gruß stefan

Ich würde für den PC ein kleines Tool machen, was dort den jeweils letzten Messwert aus der Datei ausliest (damit bleibt das PC-System insich geschlossen) und diesen Wert per UDP zum Arduino senden. Ich habe gerade ein Projekt mit einem Nano inkl. Ethernetshield gemacht, funktioniert hervorragend ...

Ob udp, tcp oder seriell, ist zweitranging, nur sicher (idealerweise mit Handshake) sollte die übertragung sein. Momentan geht es ja noch darum, ob man aus dem seriellen Datenstrom, der an den PC geschickt wird, das passende abschöpfen kann. Bisher hat der TE auch noch nichts dazu gesagt, ob er auf dem PC was installieren kann/darf. Und auch fehlen noch Infos, wie zeitkritisch das ganze ist.

Eisebaer: ich verstehe, was Du meinst. ich glaube aber nicht, daß die zugegörige anwendung laufen muß. deswegen gibts auch kein blockieren. einfach HTerm starten und lauschen. jedenfalls wäre das mein erster ansatz...

Wenn der PC nichts zurücksendet oder als Master was abfragt, ist nur noch die Frage, welche der RS232 Hardware-Steuerleitungen erforderlich sind um den Datenfluß anzuregen...

Aber bevor man groß mit Logik-Analyzer rumhantiert ist hterm ausprobieren sicher einfacher.

Ansonsten müsste man auch Glück haben, dass die ominöse Datei im laufenden Betrieb überhaupt geöffnet werden kann, um den jeweils letzten Wert zu sehen

michael_x: Ansonsten müsste man auch Glück haben, dass die ominöse Datei im laufenden Betrieb überhaupt geöffnet werden kann, um den jeweils letzten Wert zu sehen

Das kann u.U. auch noch zum Problem werden.

Aber ich würde an einem Produktionssystem nicht so einfach rumschrauben und Probieren, sondern zuerst alle Informationen sammeln und dann weiterentscheiden.

Vor allem würde ich das nicht laufen lassen, ohne sicher zu sein, dass die zugehörige Anwendung auf dem PC aus anderen, uns noch unbekannten Gründen nicht ebenfalls laufen muss.

Es ist müssig, hier weiter zu sinnieren, wenn sich der TE nicht mehr blicken lässt.

Vielleicht hat er das Ding schon abgefackelt und ist fristlos entlassen worden. ??? :roll_eyes:

Danke für die Diskussion.

Im Prinzip haben alle recht. Ich muss das Signal splitten und schauen welche Strings für ich für meinen Regler nutzen kann. Zusätzlich muss ich aber auch die Messdaten weiterhin aufzeichnen, um die Messung qualitativ verwenden zu können.

HTerm war auch meine erste Wahl, nur muss ich nun den richtigen String finden. Was evtl. auch noch ein Problem darstellen kann ist, dass der Verkehr bidirektional passiert, da das Messgerät über die Software gesteuert wird.

Aber mal sehen wie das Ganze aufgebaut ist. Vielleicht mann man da was mit der Software trixen. Kann aber erst am Montag das Ganze ausprobieren. Werde dann versuchen den Verkehr zu posten. Schönes Woend :sleeping:

Den seriellen Datenverkehr kann man per Software auf dem PC abgreifen oder indem man die Datenleitungen anzapft und an bis zu 3 Comports weitergibt. D.h. Tx, Rx und TxRx über Dioden auf die Dritte, damit man die Gesamtkommunikation und somit die Reihenfolge hat.