Tabelle aus .txt Datei in mehrdimensionales Array einlesen

Hallo Leute,

bin neu im Forum und noch Anfänger. Hätte eine dringende Frage und zwar:

Ich habe eine Text-Datei im folgenden Format:

  0.000000 ;   0.587759 ;  -0.256313 ;  -0.260647 ;  -0.093224 ;  -0.195787 ;  -9.930157
  0.010000 ;  -0.071264 ;  -0.018506 ;   0.774013 ;   0.080251 ;  -0.486344 ;  -9.915776
  0.020000 ;   0.082807 ;  -0.166837 ;  -0.124259 ;  -0.305346 ;  -0.468850 ;  -9.858902
  0.030000 ;  -0.268074 ;   0.500416 ;  -0.710785 ;   0.131093 ;  -0.463167 ;  -9.819186
  0.040000 ;   0.834082 ;   0.269191 ;   0.032760 ;  -0.223208 ;  -0.659480 ; -10.068884

Diese Werte sollen in ein mehrdimensionales Array eingelesen werden.
Ich habe leider bis jetzt keine Idee wie, darum bitte ich euch um Hilfe :confused:

Wie genau ist das möglichst einfach zu verwirklichen?

Danke für eure Hilfe! :sweat_smile:

Warum setzt Du das Posting 2 mal ab?

Die Datei steht auf einer SD? Dann SD öffnen (Lib SdFat), Zeilenweise lesen und mit strtok zerlegen und mit atof in float umwandeln. Infos zu Zeichenketten in C.

Du solltest aber wissen, wieviele Zeilen Du maximal erwartest, damit Du die Arraygröße festlegen kannst.

Gruß Tommy

Danke für deine Antwort.
Sorry das war keine Absicht...

Nein leider nicht auf einer SD-Karte. Wäre es möglich den "Text" direkt in den Sketch einzufügen und zu verwenden?

Wenn Du ihn in den Quelltext schreibst, dann kannst Du ihn auch gleich als Array im PROGMEM anlegen.

Wo kommen denn die Daten her und was willst Du damit machen? Wie oft ändern sie sich?

Gruß Tommy

Du menist so?

array [2] [3] = {{1,2,3},{4,5,6}};

Grüße Uwe

Tommy56:
Warum setzt Du das Posting 2 mal ab?

Hab den kürzeren gelöscht.
Grüße Uwe

Danke Uwe :slight_smile:

Das sind je 6 Beschleunigungswerte aller Freiheitsgrade inkl. der jeweiligen Zeit in der ersten Spalte in sec.
Das Problem ist, dass das insgesamt mehr als 10.000 Zeilen Daten sind. Somit kann ich die alle schlecht manuell in ein Array schreiben…

Deshalb bräuchte ich einen Sketch der mir aus dem eingefügten Text die Werte holt und in ein mehrdimensionales Array einliest.

Gruß Chris

Das kannst Du auf einem Arduino vergessen, die dynamisch zu vearbeiten.

Pro Zeile 7 Werte zu je 4 Byte = 28 Byte * 10.000 Zeilen = 280.000 Byte

Gruß Tommy

Edit: Woher kommen die Werte denn?

Ok das ist schlecht...
Und würde die Möglichkeit über eine SD-Karte funktionieren? Über Serielle Kommunikation die Daten einzulesen?

Tommy56:
Edit: Woher kommen die Werte denn?

Die Datei habe ich von einem Freund. Das sind gemessene Beschleunigungsdaten eines Fahrzeugs. Wie genau die Werte gemessen wurden kann ich nicht sagen.

Gruß Chris

Was willst Du auf dem Arduino damit machen? Der UNO z.B. hat 2.048 Byte RAM.

Gruß Tommy

Der Arduino soll dann 6 Servos ansteuern welche an einer Platte befestigt sind. Siehe Stewart Platform.

Das heißt die Werte sollen in die jeweiligen Servowinkel umgerechnet werden und an die Servos ausgeben werden.

Gruß Chris

Das heißt- wieviele Werte brauchst Du gleichzeitig zur Verarbeitung? Eine Zeile?
Werden die Werte in der Reihenfolge der Datei abgearbeitet?

Gruß Tommy

Ja genau die Werte je einer Zeile "durchlaufen" einmal das gesamte Programm und beim nächsten Durchlauf sollen die Werte der nächsten Zeile verwendet werden.

Ja die Werte sind immer gleich angeordnet (winkelx; winkely; winkelz; ax; ay; az;) und die Reihenfolge der Abarbeitung entspricht der Datei, also Zeile für Zeile (wie gerade beschrieben).

Gruß Chris

Gut, dann geht es, wenn die Datei auf SD-Card liegt und von dort zeilenweise gelesen wird.
Immer eine Zeile bis zum '\n' mit fgets in ein Char-Array lesen und wie in meinem ersten Posting geschrieben mit strtok zerlegen.
Du arbeitest dann intern mit einem eindimensionalen Array aus 7 float-Werten.

Nimm nicht die originale SD-Lib, sondern die SdFat.

Ich weiß nicht, wieviel Erfahrung Du schon mit dem Arduino hast. Evtl. kann es sinnvoll sein, erst mal die Grundlagen zu lernen, bevor Du Dich an dieses Projekt setzt.

Gruß Tommy

Super danke dir. :slight_smile:

Weist du ob das ganze von den Zeitschritten bzw. der Daten-Frequenz her funktionieren würde?

Sprich die Messdaten sind in einer Auflösung von 100Hz aufgenommen, aber ich würde die Datei hoffentlich auch in 10Hz Auflösung bekommen.
Und somit ist die Frage ob es klappt die Daten so schnell zu verarbeiten und an die Servos zu schicken, dass die Servowinkel auch in 10Hz “Abständen” an die Servos geschickt werden?

Hoffe du verstehst was ich versuche zu sagen.

Gruß Chris

Da ich mit Servos noch nichts gemacht habe, muss ich diese Frage an die Wissenden auf diesem Gebiet im Forum weiter reichen.
Das zeilenweise einlesen und zerlegen ist zeitlich kein Problem. In wieweit die Servos schnell genug sind, kann ich nicht beurteilen.

Gruß Tommy

Ich möchte Dich noch auf FRAM aufmerksam machen.

Außerdem gibt es den Teensy 3.6 mit mehr Speicher und Gleitkommarecheneinheit.

Ist eine Variante, doch der muss auch erst beschrieben werden und für 280.000 Bytes muss man da schon einiges basteln. Da ist die SD, die am PC beschrieben werden kann schon einfacher.

Nur mit den Servos kenne ich mich überhaupt nicht aus. Da sollte jemand anderes klare Aussagen, besonders zur Geschwindigkeit (10Hz) treffen können.

Gruß Tommy

Hi

Da ein Standard-Servo alle 20ms den Impuls erwartet, werden wohl nicht viel mehr als 50 Werte pro Sekunde 'möglich' sein - alleine, da das Servo noch am Einlesen des aktuellen Impuls ist.
Mit digitalen Servos habe ich keine Erfahrung, hier dürfte auch 'Mehr' gehen.

Bei der analogen Variante würde ich über einen Timer gehen, Der je aktuellem Wert das Signal 1...2ms HIGH hält und nach 18ms 'von vorne anfängt'.
Alternativ eine per I²C ansprechbare Servo-Platine - wie Die auf schnellere Änderungen reagiert, als das analoge Signal braucht, müsste man austesten.

MfG

Der Arduino braucht nur den neuen Sollwert zu senden, dann bewegt sich der Servo zur neuen Position. Dafür dürfte der Wert des Servos (Model: DS-319HV) "Operating Speed: 0.05sec.60º 7.4V" ausschlaggebend sein.