PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Arduino Eingänge sehr empfindlich?



fredyxx
27.09.2016, 22:36
Hallo,

ich habe im Moment den Eindruck, dass die Eingänge eines Arduino MEGA trotz der Nutzung der internen Pulllup-Widerstände sehr empfindlich sind.
Das habe ich festgestellt, weil ich mit den Eingängen von einigen Schaltern (Mäuseklavier) einen Alt-/ Neu-Vergleich mache und bei einer Änderung ein delay(500) wirksam werden lasse. Vorher schalte ich jedoch an einem Ausgang eine LED ein, die ich sofort nach den 500 ms wieder ausschalte.
Ohne dass ich an den Schaltern etwas mache, blinkt diese LED während des Programmablaufs schon mal auf; d.h. an einem der Eingänge hat sich also was getan.

Wie sind da eure Erfahrungen?

vG

fredyxx

Ceos
28.09.2016, 07:05
Soweit ich die Zahlen im Hinterkopf habe sind die internen Widerstände SEHR ungenau und gehen von 10k - 80kOhm wirklich toll sind sie nicht aber wenn man sich unbedingt ein Bauteil sparen will reichen sie i.d.R. aus

Hubert.G
28.09.2016, 08:25
Dazu müssten die Leitungen zum Mäuseklavier schon sehr lang sein. Oder du produzierst in deinem Programmablauf irgend welche Störungen die sich an den Eingängen bemerkbar machen. Es könnte auch ein Fehler im Programm sein.
Du siehst es gibt jede Menge Möglichkeiten für dein Phänomen. Ohne Kenntnisse von deinem Aufbau und Programm ist das ein stochern im Nebel.

HaWe
28.09.2016, 10:58
Dazu müssten die Leitungen zum Mäuseklavier schon sehr lang sein. Oder du produzierst in deinem Programmablauf irgend welche Störungen die sich an den Eingängen bemerkbar machen. Es könnte auch ein Fehler im Programm sein. Du siehst es gibt jede Menge Möglichkeiten für dein Phänomen. Ohne Kenntnisse von deinem Aufbau und Programm ist das ein stochern im Nebel. ich habe auch 2 Megas schon seit ein paar Jahren aber so einen Fehler noch nicht beobachtet, wenn man die Taster unberührt lässt. Ich denke da auch eher an ein Kontakt- bzw. Wackelkontakt-, Kabellängen- oder Programmproblem, eventuell auch sehr starke elektromagnetische Störfelder in der Nähe, aber genaueres kann ich bei deinen Infos auch nicht sagen.

ps,
in meinen eigenen Programmen jage ich sämtliche Inputwerte (analog + digital) aber auch fast immer durch Filter (Lowpass oder gleitender Median von 3), um auch weitere (!) Störeffekte im laufenden Betrieb durch Prellen von Kontakten oder schwankende ADC Werte zu ent-rauschen und zu glätten, denn dann werden solche Störungen, wie du sie jetzt beobachtest hast, ständig unvermeidbar vorkommen. Dennoch wäre es schon sehr sinnvoll, deinen momentanen Fehler exakt zu lokalisieren.

fredyxx
28.09.2016, 17:31
Hallo,

Kommissar Zufall hat mir geholfen, den Fehler zu finden!! :)

Ich hatte einen Schalter vom Mäuseklavier, den ich im Programm zZ noch nicht brauche, zwar auf Änderung überwacht, ihn aber weder als INPUT deklariert und schon gar nicht den Pullup-Widerstand eingeschaltet. Wenn der sich also was eingefangen hatte, hat er sofort die 500 ms, das Blinken der LED verursacht und das Drehen der Motore wurde unterbrochen.

Trotzdem bin ich doch sehr überrascht, wie empfindlich so ein unbeschalteter Eingang auf Umweltbeeinflussung reagiert.

Das Modell stand auf Kunststoffrädern auf einem Teppichboden, hatte keine Verbindung zum PC und wurde von einem Akku betrieben.
Ich brauchte nur meinen Schuh vom Teppich zu heben und wieder auf den Boden zu setzen, oder mich mit meinem Schreibtischstuhl etwas zu bewegen und schon kam es meistens zu der Störung.

Ich bin heil froh, dass das die Ursache war. Ich sah mich schon wild mit Entstörmaßnahmen rumexperimentieren.


Zitat von HaWe
in meinen eigenen Programmen jage ich sämtliche Inputwerte (analog + digital) aber auch fast immer durch Filter (Lowpass oder gleitender Median von 3), um auch weitere (!) Störeffekte im laufenden Betrieb durch Prellen von Kontakten oder schwankende ADC Werte zu ent-rauschen und zu glätten

Trotzdem würde mich interessieren, wie das konkret aussieht.

vG

fredyxx

HaWe
28.09.2016, 18:15
Zitat von HaWe
in meinen eigenen Programmen jage ich sämtliche Inputwerte (analog + digital) aber auch fast immer durch Filter (Lowpass oder gleitender Median von 3), um auch weitere (!) Störeffekte im laufenden Betrieb durch Prellen von Kontakten oder schwankende ADC Werte zu ent-rauschen und zu glätten
Trotzdem würde mich interessieren, wie das konkret aussieht.

am einfachsten geht es mit dem Lowpassfilter; der merkt sich eine Art gleitenden Durchschnitt:

du fragst in einer schnellen Schleife (z.B. alle 1-10ms) den Wert eines Ausgangs ab, z.B.


void loop() {
float oldvar, fvar;
int pinvar, pinNr;

oldvar = fvar;
pinvar = digitalRead (pinNr);
fvar = 0.4*pinvar + 0.6*oldvar;
pinvar = round(fvar);
delay(5);
//...
}


wenn z.B. bisher "0" anlag (also oldvar=0) und jetzt 1x "1" gemessen wurde, ergibt sich
0.4*1 + 0 = 0.4
round(0.4) = 0

bleibt es ein einmaliger Ausreißer, wird der Wert also verschluckt, es bleibt bei 0.

Kommt jetzt in der nächsten Abfragerunde aber nochmal eine "1" dazu, ergibt sich
0.4*1 + 0.6*0.4 = 0.4 +0.24 = 0.64
round(0.64) = 1

wenn also erneut eine "1" anliegt, also quasi nach 2 Durchläufen "dauerhaft", dann kommt jetzt eine 1 heraus.

Die Summe aus beiden Faktoren soll immer 1 betragen, also
0.4 & 0.6
oder 0.2 & 0.8
oder 0.3 & 0.7
oder 0.5 & 0.5 (entspricht arithmetischem Mittel)
oder für analoge Werte auch z.B. 0.9 & 0.1 oder 0.1 & 0.9


allgemein:

Durchschnitt = a*aktuell + (1-a)*Durchschnitt, 0<a<1

durch "Spielen" mit den Koeffizienten und testen kannst du den Filter für deine Anwendung darauf optimieren und Störungs-empfindlicher und schneller reagierend (größere a) oder Störungs-unempfindlicher und träger machen (kleinere a).

Da du sowieso in den loops ein paar ms delays brauchst, fällt das bisschen float-Arithmetik auch absolut nicht ins Gewicht. Falls doch: per Integer mit 100 multiplizieren und das Ergebnis später wieder durch 100 teilen, ist aber nicht nötig bei dem bisschen Rechnerei.

HaWe
01.10.2016, 12:48
war das verständlich und hilfreich? 8)

Unregistriert
01.10.2016, 14:45
Verständlich? Ja! Interessant aber Fließkommarechnung nur zur Tastenabfrage frißt unangemessen viel Rechenzeit.
Hilfreich eher nicht. Problem war ja schon gelöst, oder? Ein Danke wär es aber schon wert gewesen.

fredyxx
01.10.2016, 18:43
war das verständlich und hilfreich? 8)

Danke auf jeden Fall!

Da ich es zZ nicht benötige, habe ich mich damit nicht sehr ausführlich befasst, habe es aber für den Fall, dass ich es mal brauche, gespeichert.

vG

fredyxx

HaWe
01.10.2016, 19:04
ok, gerne.
OT
Nachdem in diesem Arduino-Unterform jedes unregistrierte ********* aus dem anonymen Off spammen und trollen und die Atmosphäre vergiften kann, werde ich dir künftig allerdings hier im Forum eher nur noch ausnahmsweise Hilfestellung geben. Ich hoffe, dass die admins und mods hier endlich Einsicht zeigen und hier ebenfalls eine Registrier / LogIn-pflicht für Posts einführen, um Spammer und Trolle zu identifizieren und notfalls zu sperrren. Zum Glück ist das ja auch nicht in allen Unterforen hier so ungeordnet.
/OT