Serielle Datenübertragung Arduino <-> PC

Hi Leute,

ich wollte mal hören ob jemand schonmal größere Datenmengen vom Arduino zur verarbeitung an den PC gesendet hat?

Im prinzip dreht sich das ganze darum, dass ich an meiner Uni an einem Projekt teilnehme, in dessen Rahmen ein Rastertunnelmikroskop gebaut wurde. Nun hat sich dort keiner für die Steuerung zuständig gefühlt und ich habe dann den part übernommen und mir gedacht, das kannste doch mit nem Arduino einfach lösen.

An sich die Steuerung der Elektronik ist auch überhaupt kein Problem. Das ganze wird mit DACs bzw ADCs der Firma Microchip (MCP4922 und MCP3201) realisiert. Diese werden per SPI angesteuert. Es folgt nach den Wandlern natürlich noch weitere Elektronik, die ist aber für diesen Teil des Projektes unwichtig.

Mein Problem ist derzeit, dass ich noch nicht die zündende Idee habe, wie ich die Rohdaten des RTMs effektiv zum PC übertrage. Ich habe mit meinem Bruder zusammen ein Java-Applett geschrieben, welches automatisch Befehle an den Arduino senden kann (Start / Stopp, Auflösung, etc...) und auf eingehende Daten wartet. im Moment sende ich die erhaltenen Messwerte noch als String mit der Serial.print() Funktion, was aber denkbar ungünstig ist, da ich erst die Zahl erstmal in zeichen umsetzen und dann 4Byte pro Messwert senden muss. Bei auflösungen größer 1024x1024 Pixeln dauert das schon ziemlich lange.

Ein weiteres Problem ist die Synchronität der Daten. Wenn ich einfach mit Gewalt alle chars mit voller Geschwindigkeit über die Serielle Schnittstelle jage verliert das Java-Programm irgendwann denn Faden und ordnet nicht mehr immer die 4 richtigen Chars in einen Integer. Durch geringe Delays beim senden bekommt man das zwar in den Griff, aber das verlängert die Datenübertragung nochmals. Ich bin da etwas ratlos wie ich das verbessern kann und wäre dankbar für Beispiele oder Anregungen wie man das beschleunigen kann.

Ach ja: An der Änderung die Daten nicht mehr als String zu senden sondern als Rohdaten (jeweils ein Messwert in 2 Bytes) arbeite ich schon, aber das größere Problem dürften die Delays sein...

Beste Grüße,
Eike

Hm, klingt als müsstest du über sowas wie eine Komprimierung deines Datenstroms nachdenken.

Erstmal würde ich versuchen den Datenstrom mit spezifischen Zeichen auszustatten, um damit das Ende einer "Pixelübertragung" zu kennzeichnen, dann kannst du mehr oder minder auf die Delays pfeifen. Ende ist, wenn Zeichen X kommt und nicht nach einem bestimmten Zeitintervall. Wenn bei der Übertragung nix verschluckt wird (und dir dessen sicher sein kannst), dann erhöhst du damit die Übertragungsrate.

Für sich wiederholende Pixel (kommt sicher vor) würde ich eine Lauflängenkodierung implementieren, das wäre wohl erstmal das Einfachste: Run-length encoding - Wikipedia

Danke für die promte antwort.

Ja sowas wie codierung wäre ne idee, aber wohl auch mit Arbeit für den Arduino verbunden. Ich muss mal testen wie ausgelastet der ist, nicht das die Codierung mehr zeit in anspruch nimmt als im Endeffekt durch die reduzierung der redundanten Daten gewonnen wird.

Ansonsten das mit den Trennungszeichen machen wir im moment schon, immer nach 6Byte senden wir ein Steuerzeichen auf das das Java-Programm prüft. Leider hat das aber nicht wirklich nen bedeutenden Vorteil geschaffen. Ich bin mir auch nicht sicher an welcher Stelle der anfängt Bytes zu verschlucken. Denke der Arduino bekommt das wohl auf die Reihe alles in der richtigen Reihenfolge zu senden, daher dürfte das Problem im Java-Prog liegen.

Ich mache gleich nochmal ein paar Tests und aktualisiere hier dann :slight_smile:

Ich sehe da eine andere Plattform als Arduino besser geeignet, die mehr Rechenpower und eine native USB v2.0-Schnittstelle hat.
Viele Grüße Uwe

Ja wahrscheinlich gibt es da wesentlich bessere Plattformen, aber meine wahl fiel in diesem Fall wegen der einfachn Programmierung, meinen Vorkentnissen und der vorhandenen Hardware nunmal auf den Arduino...

Naja auf jeden Fall habe ich gestern noch ne Weile daran gebastelt und bin jetzt soweit, dass ich jeweils 8 Bytes an Daten (4 Messwerte) übertrage und dann ein Trennungszeichen sende. Das hat sich ganz gut bewehrt und 4 ist auch ein ganzzahliger Teiler der Bildauflösung, daher passt das mit der Anzahl an Paketen.

Das Problem mit den Delays haben wir nun auch soweit im Griff, lag tatsächlich am Java-Programm, aber ich weiß nicht genau wo (bin nicht so der Java-König xD). Die PC-Seite hat mein Bruder da mehr im Blick, auf jeden Fall geht das jetzt (vergleichsweise) flott von statten. Eine Messung mit 512x512 Pixel geht jetzt etwa 3 Minuten und das ist im erträglichen Rahmen.

Das Projekt für die Uni ist in meinen Augen damit abgeschlossen, aber für mich persönlich natürlich nicht. ich denke sowohl das Java-Programm als auch eine abgewandelte Form des Arduino-Programms werde ich sicher nochmal irgendwo verwenden. Und wenns mich wirklich reizt versuche ich mich auch mal an einer anderen Plattform, aber das ist was für die Zukunft, wenn ich irgendwann mal kein Student am Limit des Kontos bin. Erstmal bleibe ich beim Arduino und anderen atMegas.

Also nochmals danke und beste Grüße,

Eike