Arrays von Computer an Arduino übergeben

hallo liebe Community,

mal wieder eine Frage zum Thema Werteübergabe von PC an Arduino:
Wie kann ich ein Array an meinen Arduino übergeben.
Ich möchte hintereinander immer wieder verschieden Potis auf einen bestimmten Wert einstellen und dies nachdem, dies geschehen ist als nächsten Schritt mit einem höheren Index machen. Also alle Werte sind eingestellt, der Index wird um 1 höher und die neuen Werte zum Einstellen werden verwendet.

Wie kann ich also diese Arrays übergeben? Von einer Windows Forms?

lg flar2000

a) Mit einer seriellen Verbindung. Das ist im Prinzip eine Einzelzeichen-Übertragung. Also musst du dein Array in eine Reihe von Zeichen wandeln (binär oder ASCII), mit Start- und Stopzeichen versehen und ggf. noch mit einer Prüfsumme. Dann wird dieser Bandwurm Zeichen für Zeichen gesendet bzw. empfangen. War die Übertragung erfolgreich, sollte der Empfänger das bestätigen ... anderenfalls sendet der Sender nochmal ...

b) Mit einer paket-orientierten Verbindung (UDP oder TCP per Netzwerk). Du "bastelst" aus deinen Einzelwerten ein Datenpaket und sendest es zum Arduino (der mit einem Ethernet-Shield ausgestattet ist). Das geht "in einem Rutsch" und ist bereits auf Protokollebene gegen Verfälschung gesichert ...

In beiden Fällen musst du die empfangenen Werte zeichen- oder byteweise aus dem Empfangspuffer heraussammeln und ihrer Verwendung zuführen.

Hängt davon ab, was es für ein Arduino ist, und wie er mit dem PC verbunden ist. Bei einem einfachen Uno/Nano/Mega ist Seriell über USB das einfachste. Wenn der Arduino eine Netzwerk-Verbindung hat, dann diese.

Ich möchte hintereinander immer wieder verschieden Potis auf einen bestimmten Wert einstellen und dies nachdem, dies geschehen ist als nächsten Schritt mit einem höheren Index machen. Also alle Werte sind eingestellt, der Index wird um 1 höher und die neuen Werte zum Einstellen werden verwendet.

Verstehe ich nicht. Das Poti wird am Arduino gelesen? Mehrere Werte sollen in ein Array auf dem arduino? Was soll dann vom PC gesendet werden?

Also es ist ein einfacher Arduino Mega der eben 5 unterschiedliche Arrays haben sollen. Wir steuern mit Hilfe von Motoren unterschiedliche Gelenke deren Winkel mit Hilfe von Potis angegeben werden. Nun soll dies mehrfach hintereinander auf unterschiedliche Werte geschehen und daher muss ich für jedes Gelenk ein Array haben welches, eben dann die unterschiedlichen Werte für das Gelenk inkludiert hat.

Da du offensichtlich nichts eigenes bauen möchtest, wäre ja evtl. der CmdMessenger was für dich.

Hi

Also eine Art Einlern-Fahrt. Position anfahren (Potis einstellen, bis Alles passt), Knopf drücken -> Position speichern. Das machst Du 20x, eben 20 Positionen. Dann Start und der Arduino fährt diese 20 Positionen der Reihe nach ab.

MfG

daher muss ich für jedes Gelenk ein Array haben

Was ist ein Array ? (Deiner Meinung nach?). Evtl. verstehe ich dich deshalb nicht.

Du hast mehrere Gelenke, deren Winkel du einstellen kannst. Du hast einen Bewegungsablauf, der für die Gelenke aus einer Serie von Winkelwerten besteht.

Wenn deine Gelenke keine sinnvollen Namen haben (z.B. Schulter_hoch, Schulter_quer, Ellbogen_drehen, Ellbogen_winkel, Hand, Finger) kannst du stattdessen zur Not auch ein Array mit 6 Elementen nehmen, um darin alle Werte deiner 6 Gelenke zu einer Gesamt-Position zu speichern. Musst du dir eben merken, welcher Motor für welchen Index in deinem Array zuständig ist. Mit Namen hättest du es halt einfacher, und was du (vermutlich) Array nennst, wäre eher eine struct.

Dann hast du vermutlich eine Serie von zeitlich aufeinanderfolgenden Elementen, die aus je einer solchen Struktur (mit je einem Wert für jedes Gelenk) und evtl noch anderen Informationen (Geschwindigkeit, Wartezeit oder so?) besteht. Diese Informationen könnten auch Teil deiner struct sein, denn da kann man verschiedene Daten zusammenfassen. Diese zeitliche Serie ist unterschiedlich lang, daher passt dafür auch kein Array, ausserdem braucht der Arduino nicht unbedingt die ganze Serie komplett, sondern nur das aktuelle und das nächste Element. ( Oder wofür ist der PC da ? )


ein einfacher Mega

hat zur Kommunikation mit einem PC am einfachsten die Serielle Schnittstelle. Damit sind Netzwerk-Überlegungen erstmal vom Tisch, finde ich.

Willst du nun die ganzen Winkel-Werte vom Arduino per Poti eingeben und auf dem PC speichern, oder willst du solch eine gepeicherte Serie vom PC zum Arduino übertragen und dort abspielen ?

Bzw. womit willst du anfangen ;)

Also ich hätte gerne für jedes Gelenk ein eigenes Array damit ich für jeden Index in jedem Array einen Wert habe. Nun habe ich aber das Problem das die IDE ja schon zu beginn wissen will welche Werte und vor allem wie viele ich gerne speicher möchte (in meinem Array) Also muss ich zu erst alle Daten einlesen und dann erst die Arrays erzeugen oder? Oder kann ich einfach Ellbogen machen wie z.B. in c#

Nun habe ich aber das Problem das die IDE ja schon zu beginn wissen will welche Werte und vor allem wie viele ich gerne speicher möchte (in meinem Array)

Ja, genau. Deswegen habe ich auch versucht dir zu zeigen, dass deine Idee Mist ist.

Ist doch Unsinn, erst alle Ellbogen-Werte zu senden, dann -unabhängig davon- alle Knie-Werte, oder? Was, wenn das mal erweitert werden soll und man am Anfang noch gar nicht weiss, was "alle" sein wird ? Mal abgesehen davon, dass es so rum sehr speicheraufwendig ist...

Oder kann ich einfach Ellbogen machen wie z.B. in c#

Keine Ahnung was "Ellbogen machen" ist, aber das wird evtl. auch in Arduino's C++ gehen. Wenn es nicht viel RAM kostet ;)

eben ist es sehr speicheraufwändig aber ich weiß nie wie viele Daten ich bekomme
nur gibt es eine möglichkeit dies zu umgehen…?

nämlich das ich einfach ein array erzeuge dem es egal ist wie viele werte ich bekomme
also als maximalen index einen WErt erst später einlese wenn ich weiß wie viele ich bekomme?

Das liest sich wie dynamische Speicherverwaltung.

Anm.: Der Link geht auf ein C-Buch, nicht C++.

eben ist es sehr speicheraufwändig aber ich weiß nie wie viele Daten ich bekomme nur gibt es eine möglichkeit dies zu umgehen...?

Ich weiß auch nicht wieviel Daten du bekommst. Woher auch? Und wie die Arrays aussehen?

Also kann ich dir auch nicht sagen wie du was umgehen kannst, denn ich weiß ja noch nicht mal, was umgangen werden soll.

Mein Tipp: Verschaffe dir Klarheit über die Daten. Und wenn du die selber bestimmen darfst, dann verwende ein klug gewähltes Protokoll.

Für mich liegt das alles im Nebel. Denn Details habe ich hier noch keine gesehen.

Also auch keine Vorschläge von mir.

nur gibt es eine möglichkeit dies zu umgehen…?

Wenn du meine Antwort (#6) liest, und deine ### Idee der Arrays aufgibst (sorry)

Warum willst du für jedes Gelenk ein eigenes Array haben ?
Warum nicht ein einziges Array, das in jedem Index die Werte aller Gelenke sammelt?

Dann ist es nur noch ein kleiner Schritt, zu erkennen, dass dieses Array gar nicht unendlich groß sein muss, sondern du eigentlich nur wenige (zwei) solcher ArrayElemente brauchst: die aktuelle Position und die nächste Ziel-Position…

So ich habe das ganze jetzt noch mal über dacht und werde es wie folgt ändern (nur hier stoße ich schon wieder auf ein Problem): Ich übergebe meinem Arduino folgenden Variable: MO+123+5435+345+435+345 Das MO steht für MOVE und die dahinter folgenden Zahlen sind die Winkel auf die das Gelenk eingestellt werden soll. Sind die Winkel eingestellt sendet der Arduino eine Variable finished an den Computer und der Computer sendet die nächsten Werte.

Nur wie kann ich meine inComing-Variable in die einzelnen Winkel zerlengen also im Prinzip das Plus als Trennzeichen verwenden...

lg flar2000

strtok() – einen String anhand bestimmter Zeichen zerlegen

Ich schaue hier (11.13), Du bitte in ein C++-Buch.

Hi

Bei dem Ansatz sehe ich das Problem, daß der Arduino nicht weiß, wann die Winkel erreicht sind.
Oder fragst Du aktiv die Winkel ab?

Alternativ kannst Du auch einfach ‘so und so lange’ warten, bis der nächste BEfehl gesendet wird - also eine Zeit, in Der definitiv der Endpunkt erreicht wurde.
Fahren die Servos mit maximaler Geschwindigkeit, oder werden die Servos, Die nur einen kurzen Winkel zu verstellen haben, entsprechend langsam angesteuert?
Bei eigener Ansteuerung hast Du natürlich schon die Information, wann Du damit wohl fertig bist.

MfG

strtok funktioniert bei mir leider nicht
definiere ich die Variable die ich zerlegen will im Programm selber, dann funktionier es genau einmal.
Will ich die zu zerteilende Variable über die serielle Schnittstelle einlesen so bekomme ich gar nichts

flar2000: strtok funktioniert bei mir leider nicht definiere ich die Variable die ich zerlegen will im Programm selber, dann funktionier es genau einmal. Will ich die zu zerteilende Variable über die serielle Schnittstelle einlesen so bekomme ich gar nichts

Dann machst du eben etwas falsch. Zumindest beschreibst du dein Problem nicht so, dass man mehr dazu sagen kann.

flar2000: strtok funktioniert bei mir leider nicht

Ich habe eine Struktur angelegt, um Bewegung und Winkel zu speichern. Dann lese ich die Zeichen in einen Puffer und zerlege bei 0x0A die Zeichenkette in einzelne Abschnitte, die in der Struktur gespeichert werden.

Daher behaupte ich mal, das geht.

Wenn man dann ein Feld der Struktur anlegt, kann man das für jedes Gelenk speichern. Wenn man "MO" als Zahl ablegt, wird es ohne Struktur etwas einfacher.

flar2000: Ich übergebe meinem Arduino folgenden Variable: MO+123+5435+345+435+345

13 Postings hats gedauert, bis du mal mit Daten raus rückst.... Immerhin!

Und ja, strtok() tut genau das, wofür es gemacht wurde! Für eine falsche Anwendung kann es nichts.

Ich kann nur nochmal meinen Tipp Wiederholen: Machs dir mit dem CmdMessenger (dann ist das Thema in 1 Stunde durch)

MO+123+5435+345+435+345 Sollte dann so gesendet werden: 1,123,5435,345,435,345; 1 für das Kommando "MO"

Ok ok, ich sehe es ein, wenn man es in der Tiefe begreifen will, sind 5 Tage an so einem Problem schon irgendwie angemessen. Meine Glaskugel sagt: Aber dann kommen da noch etliche Tage drauf, bis das Protokoll wirklich wasserdicht ist.