Forum: Mikrocontroller und Digitale Elektronik PC -> Arduino über Processing nur extrem langsam


von Frank (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich habe mein Arduino (Mega2560) über USB am PC verbunden und möchte 
testweise eine LED ansteuern.

Das ganze funktioniert mehr schlecht als recht. Es geht nur wenn ich im 
Processing Scetch jeweils eine Pause von mindestens 0,9 Sekunden 
einbaue.

Bei einer kleineren Pause bleibt die LED immer aus, auf den Arduino 
Board werden aber immer Daten empfangen, da RX blinkt/an ist, je nach 
delay-Zeit.

Ich habe testweise mal die bitrate variiert, was aber keine Verbesserung 
brachte.

Über einen Tipp wäre ich dankbar.

von R. R. (elec-lisper)


Lesenswert?

900ms ist doch schon relativ gut. Vermutlich werden mehrere
Bytes am Ende zusammen übertragen, so dass er die 200 nur eine
einzige loop() Iteration lang setzt. Und das draw() in Processing
wird vermutlich auch "nur" mit 60fps oder sowas aufgerufen.
Dh. es liegt immer länger 0 an den Pin an als 200.

Ich würde vorschlagen, dass du gleich mehrere Bytes überträgst,
inklusive dem angestrebten Timing (also die delays auch).
Dann lässt du den Controller das Timing mit delays/timern
erledigen.

Das auf PC-Seite zu machen kann zu langsam sein, alleine ein
Schreibzugriff auf den COM-Port kann ein paar ms verbraten.
Und dann wird draw() vermutlich wirklich rate-limited aufgerufen,
also alle 16ms.

Ambesten du guckst die mal an, was da auf der Seriellen-Schnittstelle
raus kommt (einfach mal 2 USB<->RS232 verbinden). Noch besser wäre es,
wenn du mit einem Oszilloskop mal den Pin vom Arduino/Controller
ansiehst.

von Frank (Gast)


Lesenswert?

Robin R. schrieb:
> 900ms ist doch schon relativ gut. Vermutlich werden mehrere
> Bytes am Ende zusammen übertragen, so dass er die 200 nur eine
> einzige loop() Iteration lang setzt. Und das draw() in Processing
> wird vermutlich auch "nur" mit 60fps oder sowas aufgerufen.
> Dh. es liegt immer länger 0 an den Pin an als 200.
>
> Ich würde vorschlagen, dass du gleich mehrere Bytes überträgst,
> inklusive dem angestrebten Timing (also die delays auch).
> Dann lässt du den Controller das Timing mit delays/timern
> erledigen.
>
> Das auf PC-Seite zu machen kann zu langsam sein, alleine ein
> Schreibzugriff auf den COM-Port kann ein paar ms verbraten.
> Und dann wird draw() vermutlich wirklich rate-limited aufgerufen,
> also alle 16ms.
>
> Ambesten du guckst die mal an, was da auf der Seriellen-Schnittstelle
> raus kommt (einfach mal 2 USB<->RS232 verbinden). Noch besser wäre es,
> wenn du mit einem Oszilloskop mal den Pin vom Arduino/Controller
> ansiehst.

Vielen Dank für die Antwort.Wenn ich erlich bin, verstehe ich das aber 
nicht ganz. Die LED wird ja nur geschaltet, wenn der PC sendet, 
ansonsten wird das ganze ja übersprungen.

Bei den Programm handelt es sich übrigens um ein Beispielcode aus der 
Processing Entwicklungsumgebung.
Ursprünglich ganz ohne delays.
"mouseX" gibt hier einfach einen Wert von 0-255 zurück.
Im Internet gibt es auch ein Video, dort geht es auch ohne delays in 
weicher Echtzeit.

<c>
void draw() {
 for (int i = 0; i < 256; i++) {
 stroke(i);
 line(i, 0, i, 150);
 }
 port.write(mouseX);
 }
</c>

https://www.youtube.com/watch?v=a8ZB1fnEi_4

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
Noch kein Account? Hier anmelden.