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 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?
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.