Sporadische Datensprünge in analogen Eingängen

Hallo zusammen,

ich bräuchte eure Hilfe für mein 1. Arduino-Projekt.

Ich habe für meine DMX-Lichtsoftware (ChamSys) ein Pult zur Steuerung gebaut. Dies sendet über den USB des Aduino Mega serielle Daten an die Software. Die 8 Encoder und 10 Buttons unter den Fadern funktionieren einwandfrei. Ich habe lediglich Probleme bei den Fadern.
Achja, die vielen Tasten oberhalb der Fader kommen von einer Kassentastatur. Diese läuft nicht über den Arduino, sondern direkt über USB.

Zu dem Problem:

Bringe ich einzelne Fader in Endposition ganz nach oben (Widerstand 0 Ohm), bekomme ich starke Sprünge in den seriellen Befehlen. Auch andere Fader schicken plötzlich sporadisch Signale, obwohl ich sie nicht angerührt habe. In allen anderen Positionen habe ich keinerlei Sprünge, wirklich nur ganz oben im Endanschlag. Das Problem wandert auch. Mal funktionieren alle Fader, mal der eine mal der andere. Ich kann auf keinen Fall sagen, dass es nur bei bestimmten Fadern auftritt. Ich beobachte die Fehler aktuell im seriellen Monitor. Hat also auf keinen Fall was mit der Lichtsoftware zutun.

Was ich bereits getan habe und zu keiner Besserung des Problems geführt hat:

  • alle Verbindungen geprüf
  • mehrere verschiedene externe Spannungsversorgungen benutzt
  • Widerstand zwischen Potiausgang und Analog In des Arduinos

Was ich heute noch probieren werde: ein Kondensator hinter die Potieingänge auf Masse ziehen.

Ich benutze folgende Stereo-Fader von Reichelt, nutze aber nur einen Kanal der Fader:
https://www.reichelt.de/Schieb…/RS60112-LIN10K/3/index.html

Hier der Sketch:
https://create.arduino.cc/editor/drummdan/32e90c17-0cf8-46bd-91ff-0274a9e978b6/preview

Ich hoffe ihr könnt mir weiterhelfen.

Danke!

Chamsys.ino (3.55 KB)

Hänge bitte den Sketch hier an deinen Post.
Der Link funktioniert nicht.
Grüße Uwe

Sry, habe die Links nun nochmal richtig eingefügt und den Sketch in die Anhänge gepackt.

Hallo,

die Installation der Fader wäre fiel interessanter. Das Phänomen tritt immer bei nicht installierten oder nicht wirklich gegen GND verbundenen Dreh- oder Schiebe- Widerständen auf. Die eine Seite muss an 5V , die andere an GND und der Abgriff muss an den Analog Pin. Es gibt Fader die an Ihrer Endlage die Verbindung Kappen. Meistens dann wenn die Endlage nicht richtig justiert ist.

Mach mal folgendes Experiment. Stelle den Fader auf 0 und klemme mit einem Schalter getrennt und einem Widerstand gegen GND den Analog pin auf LOW. Dann sollte das Verhalten eigentlich verschwinden. Wenn nicht hast du ein anderes Problem.

Dies als kleine Eingebung

Gruss Turgut

Danke temucin für die schnelle Antwort!

Werde ich probieren! Frage ist nur wieso ich auch Probleme bei anderen Fadern bekomme, obwohl diese nicht bewegt werden und auf vollem Widerstandwert stehen. Da muss ja auch irgendwie die Verbindung abbrechen.

Ich dachte eigentlich, dass die Fader von Reichelt nicht so billig verarbeitet sind…

drummdan:
Frage ist nur wieso ich auch Probleme bei anderen Fadern bekomme, obwohl diese nicht bewegt werden und auf vollem Widerstandwert stehen. Da muss ja auch irgendwie die Verbindung abbrechen.

Weil wahrscheinlich die Fader zu hochohmig für die Analogeingänge sind und der interne Sample and Hold Kondensator des AD-Wandlers zwischen einer und der anderen Messung nicht auf Endwert geladen wird. So hast Du eine gegenseitige Beeinflussung der Analogmessungen auf veschiedenen Pins.
Abhilfe:

  • 0,1µF Kondensator zwischen Analogeingang und Masse.
  • 2-3 analogRead() vom gleichen Pin machen und nur die letzte Messung verwenden.

Grüße Uwe

Hallo,

benutzt du zufällig einen Atmega2560 aus China? Die Software scheint OK zu sein. Aus meiner Sicht fehlt die Anbindung an die Referenz Spannung. AREF auf 5V. Du müsstest mal den Fehler genauer beschreiben … oder noch besser … mach ein Video draus.
Solche Spikes können natürlich auch durch Induktion entstehen. Aber ehrlich gesagt habe ich da nicht die super Erfahrung. Du must auf jedenfall mal Prüfen, am besten mit einem Ossy. Ob die Sprünge auch wirklich die Analogen Eingänge widerspiegeln.
Und fielleicht solltest du Playbackwert nicht als Int sondern als Float benutzen, da du ja mit 0.6 Multiplizierst.

uwefed:
Weil wahrscheinlich die Fader zu hochohmig für die Analogeingänge sind und der interne Sample and Hold Kondensator des AD-Wandlers zwischen einer und der anderen Messung nicht auf Endwert geladen wird. So hast Du eine gegenseitige Beeinflussung der Analogmessungen auf veschiedenen Pins.
Abhilfe:

  • 0,1µF Kondensator zwischen Analogeingang und Masse.
  • 2-3 analogRead() vom gleichen Pin machen und nur die letzte Messung verwenden.

Grüße Uwe

Werde ich ausprobieren und berichten! Vielen Dank! Wie genau realisiere ich das mit den 2-3 analogReads?

temucin:
Hallo,

benutzt du zufällig einen Atmega2560 aus China? Die Software scheint OK zu sein. Aus meiner Sicht fehlt die Anbindung an die Referenz Spannung. AREF auf 5V. Du müsstest mal den Fehler genauer beschreiben .. oder noch besser ... mach ein Video draus.
Solche Spikes können natürlich auch durch Induktion entstehen. Aber ehrlich gesagt habe ich da nicht die super Erfahrung. Du must auf jedenfall mal Prüfen, am besten mit einem Ossy. Ob die Sprünge auch wirklich die Analogen Eingänge widerspiegeln.
Und fielleicht solltest du Playbackwert nicht als Int sondern als Float benutzen, da du ja mit 0.6 Multiplizierst.

Ist ein orginaler Arduino Mega. Ich teste nochmal mit den Kondensatoren, ansonsten mache ich ein Video. Die AREF ist doch Default sowieso auf 5V oder? Muss ich ja eigentlich nicht explizit setzen. Mit den Float bei den Playbackwert hast du Recht. Jetzt weiß ich auch, wieso da nicht der Wert am Ende raus gekommen ist, den ich wollte.

temucin:
Aus meiner Sicht fehlt die Anbindung an die Referenz Spannung. AREF auf 5V.

Die Verbindung Vref auf Vcc ist intern im Controller und braucht und darf darum nicht auf der Platine verbunden sein, da man auch eine externe Referenzspannung auf das Pin VREF geben kann (und die externe Referenz aktiviern muß).

Grüße Uwe

Hallo,

aaa OK . Wider was dazu gelern. :slight_smile:

Hallo zusammen,

habe nun 10 Kondensatoren wie oben geschrieben eingebaut. Keine Besserung des Problems. :frowning:

@uwefed, kannst du mir mal anhand meines Codes zeigen wie du folgendes gemeint hast?

uwefed:

  • 2-3 analogRead() vom gleichen Pin machen und nur die letzte Messung verwenden.

Hi

Bin nicht der Uwe, aber Er meinte genau Das, was Er sagte:
Mehrfach den analog-Read auslösen (damit der S&H-Kondensator sich der Mess-Spannung angleicht) und eben nur die letzte Messung benutzen.

Wenn die zu messenden Spannungen weit auseinander liegen, ist der S&H-Kondensator im µC genau am falsch Ende der Spannung und muß ein Maximum an Ladung aufnehmen(oder abgeben) um auf Mess-Spannung zu kommen.
Das kann Er nur, wenn die Impedanz am Analog-Pin <10k ist.
Wenn größer, kann nicht genug Strom in den Eingang rein fließen oder eben von Diesem aufgenommen werden.
Durch das öfter Lesen wird nur der S&H-Kondensator x Mal in die gleiche Richtung - Die der zu messenden Spannung - umgeladen und je später die Messung, desto wahrscheinlicher ist Es, daß Du auf Mess-Spannung bist.

Hoffe, war halbwegs verständlich formuliert.

MfG

So?

void fadercode() {
for(y = 0; y < 10; y++) {

analogRead(fader[y]);
analogRead(fader[y]);
faderwert[y] = analogRead(fader[y]);

dmxwert[y] = map(faderwert[y],0,1023,257,0);

playbackwert[y] = 0.6 * playbackwert[y] + 0.4 * dmxwert[y];

if(playbackwert[y] != playbackwertalt[y]) {

Serial.print(playbacknummer[y]);
Serial.println(playbackwert[y]);

ich würde es anders machen:

ist der gemessene Wert höher, aktuellen Wert um 1 erhöhen
ist der gemessene Wert niedriger, aktuellen Wert um 1 vermindern

Damit wirken sich einzelnen Ausreisser nicht mehr so sehr aus

analogRead(fader[y]);
if (fader[y] > faderwert[y]) {faderwert[y]++;}
if (fader[y] < faderwert[y]) {faderwert[y]–;}

Ausprobieren! einzelne Spitzen verschwinden gut!

Wenn Du den Code in Codetags setzt (</> oben links im Forumseditor) und die { wieder richtig schließt, könnte etwas brauchbares rauskommen.

Gruß Tommy

Hi

faderwert[y] = analogRead(fader[y]);
faderwert[y] = analogRead(fader[y]);
faderwert[y] = analogRead(fader[y]);

Der glesene Wert muß ja auch irgendwo hin.
faderwert ist global?

Wobei: Wie sicher ist Es, daß der Compiler Das nicht wegoptimiert?

MfG

Ich habe eben beide Varianten von noiasca und postmaster-ino ausprobiert. Danke für euere Vorschläge!

Das Problem besteht weiterhin :frowning:

Was spricht den das Voltmeter, wenn du am Poti direkt misst?

Was passiert, wenn du nur einfach alle 8 Potis seriell ausgibst?

Fehlersuche: alles vereinfachen und runterbrechen, bis nur noch der Fehler übrig bleibt. Dann siehst du ihn oft direkt.

noiasca:
ich würde es anders machen:

ist der gemessene Wert höher, aktuellen Wert um 1 erhöhen
ist der gemessene Wert niedriger, aktuellen Wert um 1 vermindern

Damit wirken sich einzelnen Ausreisser nicht mehr so sehr aus

analogRead(fader[y]);
if (fader[y] > faderwert[y]) {faderwert[y]++;}
if (fader[y] < faderwert[y]) {faderwert[y]–;}

Ausprobieren! einzelne Spitzen verschwinden gut!

Ist so eine Änderung nicht höllisch langsam? Ein Wechsel von 0 bis max in über 1000 Schleifendurchgängen?

Grüße Uwe

uwefed:
Ist so eine Änderung nicht höllisch langsam? Ein Wechsel von 0 bis max in über 1000 Schleifendurchgängen?

Grüße Uwe

nein eigentlich nicht.
den Initialwert hole ich mir einmalig im setup()

und dann bei jedem Loopdurchlauf auslesen ... das geht schon hurtig (nicht nachgerechnet ... wie lange brauch ein mittelmäßiger delayloser sketch für 1000 durchläufe?)