Guten Morgen und ein frohes neues Jahr, ich möchte für eine offline Datenauswertung die Daten einer IMU mit einer hohen Frequenz (10 ms) abtasten und auf einer SD-Karte speichern. Dafür schicke ich die Daten von einem Arduino Due über den seriellen Bus alle 10 ms einen String an einen Arduino Uno. Am Arduino Uno ist das SD-Modul angeschlossen. Der Uno puffert immer 512 Byte und speichert den Datenblock auf der SD-Karte sobald genügend Daten gesammelt sind. Mein Problem ist, dass die Speicherung ca. 1 Sekunde dauert und in dieser Zeit die Daten verloren gehen. Bisher habe ich keine sinnvolle Variante gefunden in dieser Zeit die Daten weiter zu puffern um den Datenverlust zu vermeiden. Welche Möglichkeiten habe ich? Vielen Dank und beste Grüße Ben
Ben Z. schrieb: > Mein Problem ist, dass die Speicherung ca. 1 Sekunde dauert und in > dieser Zeit die Daten verloren gehen. Dann stellst du dich wohl ungeschickt an. > Welche Möglichkeiten habe ich? Lern (richtig) programmieren. Der UART kann einen Interrupt auslösen, wenn ein neues Zeichen angekommen ist. Und im Interrupt-Handler kann man dieses Zeichen abholen und in den Buffer legen. Auch wenn die SD Karte gerade Daten wegschreibt.
Ben Z. schrieb: > Guten Morgen und ein frohes neues Jahr, > ich möchte für eine offline Datenauswertung die Daten einer IMU mit > einer hohen Frequenz (10 ms) abtasten Das ist eher langsam. > und auf einer SD-Karte speichern. > Dafür schicke ich die Daten von einem Arduino Due über den seriellen Bus > alle 10 ms einen String an einen Arduino Uno. Das ist Käse. Sowas macht EIN AVR/Adruino locker. > Am Arduino Uno ist das SD-Modul angeschlossen. Der Uno puffert immer 512 > Byte und speichert den Datenblock auf der SD-Karte sobald genügend Daten > gesammelt sind. Das kann ein Arduino allein, ert Recht ein Due mit seiner 32 Bit CPU. Das vereinfaht das Ganze zusätzlich. > Mein Problem ist, dass die Speicherung ca. 1 Sekunde dauert und in > dieser Zeit die Daten verloren gehen. Dann machst du massiv was falsch. > Bisher habe ich keine sinnvolle Variante gefunden in dieser Zeit die > Daten weiter zu puffern um den Datenverlust zu vermeiden. > Welche Möglichkeiten habe ich? Man braucht so oder so einen FIFO. Die Datenerfassung muss in einem Interrupt erfogen, denn der wird mit Priorität ausgeführt. Das Speichern auf SD-Karte erfolgt mittels periodischem Aufruf in der Hauptschleife, welche aber problemlos durch den Interrupt unterbrochen werden kann. Ich hab mal einen DMX512 Rekorder/Player gebaut, der hat mit 22kB/s gelesen/geschrieben und nebenbei den DMX512 Datenstrom erzeugt bzw. gelesen. VOn diesen Datenraten bist du WEIT entfernt. Und das war nur ein kleiner AVR mit 16 MHz + externer SRAM.
Um dem Prozess des Lernens auf die Sprünge zu helfen: Ja, das Stichwort FIFO im irq befüllen musst du dir angucken. In dem Fall vielleicht nicht mal einen Ringspeicher sondern ein ping-pong Buffer für die 512 Byte. Wenn dein Sektor zum wegschreiben voll ist umschalten auf einen zweiten und da die Daten rein, den alten an die Karte. So ein Konzept ist sowiso unerlässlich und da solltest du dich reinwühlen. Eine Sekunde ist wirklich lange. Du musst deine Datei ja nicht jedesmal neu auf der Karte suchen, öffnen und schließen. Merk dir den Handle und mache ein file.flush() nach dem speichern. Funktioniert dein SD-Modul denn nicht am due? Warum die die Daten noch mal verschickst verstehe ich nämlich auch nicht so ganz.
Zoidberg schrieb: > Funktioniert dein SD-Modul denn nicht am due? Warum die die Daten noch > mal verschickst verstehe ich nämlich auch nicht so ganz. Das ist ein vergleichsweise unwichtiges Detail. Ich gehe mal davon aus, daß er das ganze Arduino-Style programmiert hat mit einer Schleife, in der er den UART pollt und wenn der Buffer auf die Karte geschrieben wird, die Schleife so lange stalled, daß der UART überläuft. Klassischer Anfängerfehler, wenn man noch nie von Interrupts gehört hat. Das Problem hätte er mit dieser Art "Programmierung" genauso, wenn die SD-Karte direkt am Due hinge.
Das kann sein. Ich glaube das ist aber auch mit verhälnismäßig wenig gebashe geklärt worden. Wenn du eine FIFO-Klasse hast, könnte man die natürlich für die Messwerte/ADC Daten benutzen. Das kann man sich ja auch in 512 Byte Blöcke geteilt vorstellen. Oder halt Zeichenweise in einen Schreibpuffer packen. Ggf. wartet deine Klasse ja auch selber bis ein Sektor voll ist mit wegschreiben wenn nicht geschlossen wird. Ich weiß nur nicht ob die Arduino Klasse das macht, da müsste jemand anderes etwas zu sagen. Es ist manchmal lehrreich, sich in die Gedanken und Probleme von jemandem ohne Vorbelastung zu versetzen. Dafür sind natürlich Feedback und Gegenfragen vom TO hilfreich.
Beitrag "Re: Arduino Nano, SD Card, PCM" Das ist zwar "nur" Lesen, zeigt aber, was auch normaler Arduino-Style alles kann. Beim Schreiben ist es im Prinzip das Gleiche, allerdings hat man da bei SD-Karten das Problem, daß die ab und zu mal einige hundert Millisekunden eine Pause machen dürfen, wenn sie Sektoren löschen etc. Dann braucht man für diese Zeit einen ausreichend großen FIFO.
Guten Abend zusammen, erstmal vielen Dank für die konstruktiven Beiträge. Ich habe meine Hausaufgaben gemacht und programmieren gelernt ;) Ich habe den Abruf der seriellen Daten als Interrupt umgesetzt und einen Ringspeicher eingebaut. Jetzt verliere ich auch keine Daten mehr. Anschließend habe ich auch noch die Variante ausprobiert nur den Arduino Due zu verwenden. und wie hier richtig vermutet wurde klappt das reibungslos. Als ich mich entschlossen hatte einen zweiten Arduino zu verwenden, habe ich noch eine Library ohne Datenpuffer verwendet. Jetzt verwende ich eine alternative Library (SDFat) die selbstständig puffert. Vielen Dank für die Hilfe!
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.