Verzögerungen bei der Kommunikation zwischen Arduino & PySerial

Hallo Zusammen,

ich bin absoluter Python Beginner und habe gerade mein erstes Projekt gestartet: Ich will über ein am Arduino Uno angeschlossenen Potentiometer die Lautstärke an meinem Mac steuern. Ich verwende PySerial und py-AppleScript um dies zu erreichen. Dazu habe ich diese Codes geschrieben:

Arduino:

int analogPin = 3; 

int data = 0;
int val; 

void setup(){
  Serial.begin(9600);
  }

void loop() {
  val = analogRead(analogPin);
  data = map(val, 0, 1023, 0, 100);
  Serial.println(data);
  }

Python:

import applescript

import serial

ser = serial.Serial('/dev/cu.usbmodem1434301', baudrate = 9600)

while 1:
    
    v = ser.readline().decode('ascii')
    print(v)
    applescript.AppleScript("set volume output volume %s" %v).run()

Da ich noch keinen Potentiometer kaufen wollte, bis ich den Code ausprobiert habe, habe ich ein Labornetzteil verwendet um den Potentiometer zu simulieren.

Mein Problem ist allerdings, dass es ziemlich lange dauert, bis sich die Werte am Computer anpassen, nachdem ich die Spannung am Netzteil geändert habe (der Wert sinkt langsam bis null und springt dann auf einmal auf den neuen Wert, wenn er sich überhaupt ändert). Vorgestellt habe ich mir eigentlich, dass es direkt auf den neuen Wert springt. Das langsame Absinken könnte ich mir durch das Netzteil erklären, doch ich verstehe nicht warum es so lange braucht. Im Seriellen Monitor passen sich die Werte schnell an, aber mit Python dauert es extrem lange. Was könnte die Ursache sein?

Ich konnte leider zu diesem Thema nichts im Internet finden und bin deshalb ratlos. Falls es bereits ein Eintrag gibt und ich ihn nur nicht gefunden habe, ist ein Link zum Eintrag ausreichend.

Ich freue mich über jede Antwort,
Danke

Bist du dir sicher, dass der Pin 3 am Uno ein analoger Pin ist ?
Ich würde da besser A3 o.ä. schreiben.

Hallo,

Generell kannst Du die Ausgabe des UNO ja auch auf dem Seriellen Monitor in der IDE verfolgen. Dann kämpfst Du erst mal nur auf einer Baustelle.

Heinz

Ich würe auch zuerst schauen was an der seriellen Schnittstelle ausgegeben eben mit dem Erwähnten Terminal in der Arduino IDE.
Hast Du Widerstände zwischen das Netzteil und den analogen Eingang geschaltet?

Grüße Uwe

Bei 9600 Baud dauert ein Zeichen eine ganze Millisekunde (1 / Baudrate * 10 Sekunden). Durch das ständige Senden kann es ein dass du dir den Ausgabe-Puffer zumüllst und wenn er voll ist blockiert das erst mal. Du sagst zwar dass es auf dem seriellen Monitor geht - und durch as Blockieren verzögert sich die Messung automatisch - aber auch da versucht du mehr zu senden als der Arduino in der Zeit eigentlich kann

Erstens solltest du die Baudrate viel höher einstellen. Das geht auch noch mit 500.000. Und zweitens kannst du auch einfach nicht so oft messen. Du braucht nicht in jedem Durchlauf von loop() eine Messung damit das flüssig geht.

HotSystems:
Bist du dir sicher, dass der Pin 3 am Uno ein analoger Pin ist ?
Ich würde da besser A3 o.ä. schreiben.

A3 wäre irgendwie konsequenter/klarer, ist aber in diesem Fall völlig egal.

combie:
A3 wäre irgendwie konsequenter/klarer, ist aber in diesem Fall völlig egal.

Ok, ich bin da eher für das Konsequente und auch direkte.
Habe es am Uno noch nie anders probiert.
Danke..

Muss man auch nicht probieren!

In analogRead() findet sich u.A. folgender Code:

if (pin >= 14) pin -= 14; // allow for channel or pin numbers

combie:
Muss man auch nicht probieren!

In analogRead() findet sich u.A. folgender Code:

if (pin >= 14) pin -= 14; // allow for channel or pin numbers

Ja, das ist auch klar.
Aber bei Pin 3 ist mir das nicht so klar, daher noch nicht probiert.

Super, vielen Dank. Ich freue mich sehr, dass sich so viele gemeldet haben :). Mein Problem hat sich erledigt.

Viele Grüße,
Lorin

Dann ist es üblich, die funktionierende Lösung für die Nachwelt im Forum zu veröffentlichen.

Gruß Tommy

Würde ich gerne, doch ich weiß nicht wie.

Ich bin noch neu in diesem Forum. :cold_sweat:

logs:
Würde ich gerne, doch ich weiß nicht wie.

Ich bin noch neu in diesem Forum. :cold_sweat:

So wie du zuerst auch den Sketch gepostet hast.