ich wollte mit einem Duemilanove mehrere Relais und Pneumatikventile steuern. Dafür habe ich einen Taster an Pin8 mit ca. 2 Metern Länge, den ich gegen Masse schalte. Am Pin8 ist der interne Pull-up eingeschalten.
Mein Problem ist jedoch, dass wenn das Kabel des Tasters angeschlossen ist, dann wird das Programm gestartet, ohne Druck auf den Taster. Das passiert nicht immer sondern nur von Zeit zu Zeit. Auch wenn im Betrieb ein 10cm Kabel an den Pin angehängt wird beginnt er ab und zu von selbst.
Am Tasterpin liegen ca. 4,5 Volt an. Ändern des Pins auf einen anderen bringt keine Verbesserung. Bei meinem 2. Duemilanove Board (anderer Hersteller) ist es das Selbe.
Mein Code:
boolean Sperre = false;
const int Taster = 8;
void setup() {
pinMode(Taster, INPUT); // setzt ‘pin’ als Eingang
digitalWrite(Taster, HIGH); //Pullup einschalten
delay(1000);
}
void loop(){
if (digitalRead(Taster) == HIGH && Sperre == false){
Sperre = true;
TuWas();
delay(500);
Sperre = false;
}
}
void TuWas(){
digitalWrite(13, HIGH); // set the LED on
delay(100); // wait for a second
digitalWrite(13, LOW); // set the LED off
}
Woran könnte es liegen? Ist es generell besser auf die internen Pullups zu verzichten? Kann es sein dass irgendwie Störungen eingefangen werden, und der Taster als Antenne fungiert?
Hi,
bei mir ergibt sich mit deinem Code das selbe Problem.
Versuch mal zum einen den Pin 13, also die onboard LED als OUTPUT zu definieren, bei mir glimmt die LED ansonsten nur leicht vor sich hin. Und zum zweiten solltest du bei deiner if() Bedingung auf LOW prüfen und nicht auf HIGH. Macht wenig sinn in meinen Augen das ganze mit nem Pullup auf 5V zu legen und dann auf high zu prüfen. Klar das der dann immer von alleine los rennt
Mit den beiden Änderungen funktioniert das mit meinem UNO prächtig.
Tschuldigung mein Fehler. Mein WerkstattPC hängt nicht am Netz dadurch habe ich falsches kopiert und gepostet.
Hier der aktuelle Code (gerade getestet):
boolean Sperre2 = false;
const int Taster = 7;
void setup() {
pinMode(13, OUTPUT);
pinMode(Taster, INPUT); // setzt Taster als Eingang
digitalWrite(Taster, HIGH); //Pullup einschalten
delay(1000);
}
void loop(){
if (digitalRead(Taster) == LOW && Sperre2 == false){
Sperre2 = true;
TuWas();
delay(500);
Sperre2 = false;
}
}
void TuWas(){
digitalWrite(13, HIGH); // set the LED on
delay(1000); // wait for a second
digitalWrite(13, LOW); // set the LED off
}
Das hat jedoch nichts an meinem Fehler geändert. Ca. jedes 2. oder 3. mal wenn ich mit dem Kabel den TasterPin berühre started das die Funktion TuWas(). Sogar wenn ich ein Multimeter dazwischenhänge (zwischen Pin und freihängendem Kabel) welches mir beim Berühren kurzzeitig bis zu 0,5V anzeigt wird gestartet.
Kann es sich dabei um Potentialunterschiede oder Kapazitäten oder EMV-Störungen handeln? Ich habe zu wenig Ahnung und nicht die richtigen Geräte dafür. Vorallem wie kann ich es abstellen?
Ist eine Schaltung mit externen Pullups/Pulldowns verlässlicher? Ich will meinen Arduinos wieder vertrauen.
Hmm seltsam.
Also mit dem neuen Code läuft das programm bei mir problemlos. Ich kann auch wild am Taster herumspielen, die Strippen abnehmen oder sonst was tun...
An EMV oder Leitungskapazitäten kann es eigentlich nicht liegen. Da der Pin ja auf high gezogen wird sollte eine Einkopplung von irgendwelchen Störungen wenig Effekt haben und dazu müssten die Störungen auch ganz schön groß sein, damit da wirklich was passiert. Im umgekehrten Fall, also mit low im ruhenden Zustand und ohne Pulldown Widerstände würde das sicher Probleme bereiten.
Und die Kanalkapazitäten wirken sich erst bei höheren Frequenzen aus. Also ich würde mal übern Daumen gepeilt sagen unter 100kHz oder 200kHz braucht man sich um sowas keine Gedanken machen. Außerdem würde das dann auch nicht erklären warum du das selbe Problem bei sehr kurzen Zuleitungen hast.
Was ich aber grad nicht verstehe ist dein Satz:
Sogar wenn ich ein Multimeter dazwischenhänge (zwischen Pin und freihängendem Kabel) welches mir beim Berühren kurzzeitig bis zu 0,5V anzeigt wird gestartet
Was meinst du damit? Wenn ich dich richtig verstehe hast du vom Pin 7 zum Taster eine Leitung gelegt und vom anderen Anschluss des Tasters eine Leitung gegen Masse gelegt. Wo misst du da dann 0,5V? Denn entweder sollten vom Taster gegen Masse (im nicht betätigten Zustand) ~4,5V liegen oder 0V im Betätigten zustand.
Ach ja, noch was. Ich weiß nicht wie die allgemeine Meinung zu den internen Pullups ist, ich persönlich stehe denen aber skeptisch gegenüber. Wie gesagt bei mir klappt das so wie du dein Programm geschrieben hast, aber wenn ich was aufbaue, dann verwende ich eigentlich immer externe Pullup- bzw Pulldown-Widerstände...
Danke für die Überprüfung!! Schön dass es der Code nicht ist. Danke für die Hintergrundinfos.
Alles weitere kann ich mir auch nicht mehr erklären. Also zwischen TasterPin und Gnd liegen 4,5 Volt an. Wenn der Taster betätigt wird, dann 0V.
Wenn ich an Pin7 das Multimeter hänge, und das 2. Multimeterkabel an die Leitung des Tasters, welcher nicht betätigt ist. Und die Rückleitung des Tasters nirgends angeschlossen ist. Dann zeigt mir Das Multimeter bis zu 0,5Volt an (bei freihängendem Kabel).
Trenne ich das Kabel des Tasters vom Multimeter und verbinde ich es danach wieder, so wird wieder geschaltet > TuWas();.
Kann man die internen Pull-ups eigentlich irgendwie abschiessen? Ich werde in Zukunft wohl nicht mehr auf die internen Pull-ups vertrauen.
Die internen Pullups funktionieren in der Regel sehr gut. Sie sind so zwischen 10k und 40k. Hast Du schon mal nachgemessen ob Dein Taster / Kabel auch wirklich sauber trennen? Wie groß ist der Innenwiderstand Deines Multimeters?
der Taster trennt sauber. Auch wenn ich den Taster vom Kabel abklemme und auch die Rückleitung nicht am Arduino angeschlossen ist (damit ist ausgeschlossen dass das Kabel selbst einen Kurzschluss verursacht), kommt der Fehler.
Den Innenwiderstand des Multimeters weiß ich noch nicht. Aber bei der Messung mit dem Multimeter habe ich es zwischen den Tasterpin und die Tasterleitung (die ins nichts führt) gehängt. Und beim Anhängen hat er geschalten.
Kann es sein dass ein Funke so eine Störung verursachen kann?
Ein "Funke"? Von was redest Du? Wenn der Pin einen Pullup hat und sonst nichts, dann gibt es keine Funken. Wenn es bei Deiner Schaltung zu Funken kommt, dann ist das irgendwas gewaltig daneben.
Was z.B. ein Grund für dieses Verhalten sein könnte ist eine unsaubere Spannungsversorgung. Da kann man die tollsten Überraschungen erleben. Dann kann insbesondere auch ein Taster als Antenne fungieren.
ich habe mit Funken diverse Störungen gemeint (Leuchtstofflampen...). Ich habe einmal ein Problem mit einem Relais gehabt (bei einer zugekauften und fremdprogrammierten Funk-Platine). Die Schaltung hat ohne Last super Funktioniert. Mit Last hat das Relais angefangen zu klackern. Selber Effekt wenn man ein Elektrisches Feuerzeug gezündet hat.
Beim Anschließen am Arduino hat nichts sichtbar gefunkt. Wohin auch? Ich bin nur mit meinem Latein am Ende.
Danke für den Tipp mit der Spannungsversorgung!
Der Fehler tritt jedoch bei Versorgung über USB Buchse sowie über ein 12V Schaltnetzteil auf. Ich werde das morgen noch einmal mit anderen Quellen testen.
Also dein Problem offenbart sich mir immer noch nicht ganz.
Deine Messung mit dem Multimeter will mir nicht richtig einleuchten. Also mit einer Leitung des Multimeter hängst du an dem offenen Kabel das vom Arduino kommt und mit der anderen Seite? Am Pin des Taster der direkt mit Masse verbunden ist? Dann wärs ne normale Messung gegen Masse. Am "offenen" Pin des Tasters? Dann wäre das eigentlich so ziemlich garnix ordentlichen, das wäre zu Vergleichen mit nicht angeschlossener zweiter Leitung und was du da misst ist wohl eher völliger zufall, da dir ein Bezugspotential fehlt.
Und wenn du das Messgerät in Reihe schaltest, dann müsstest du das Geräte auf Strommessung stellen. Bei Spannungsmessung hat ein normales Messgerät einen Innenwiderstand >>1MOhm und da kann nicht viel passieren. Einen Grund für eine Strommessung (also in Reihe) sehe ich so oder so nicht, da keine großen Ströme fließen sollten und diese letztlich das Schaltverhalten des Arduino nicht beeinflussen. Dieser reagiert nämlich auf unterschiedliche Potentiale am Eingang, in diesem Fall verursacht durch den offenen bzw geschlossenen Taster und dem internen Pullup Widerstand (~10 bis 40kOhm).
Von daher sollte bei offenem Taster kein Strom fließen und bei geschlossenem Taster maximal 0,5mA oder so (halt was durch den Pullup bei 5V gegen Masse fließen kann)... Dem entsprechend sollte die Spannung zu messen am Pin 7 des Arduinos bei offenem Taster ~4,5V und bei geschlossenem Taster 0V sein.
Mehr messbare Potentiale bzw Ströme würden mir so nicht einfallen. Eventuell könnte man sich die Geschichte mit nem Oszilloskop anschauen und so auf höherfrequente Störungen prüfen, aber ich glaube nicht daran das es an sowas liegt und außerdem weiß ich nicht ob du ein Oszilloskop besitzt (ich leider nicht...).
Vielleicht kannst du mal nen kompletten Schaltplan uppen, eventuell mit den verschiedenen Fällen wie du gemessen hast und wie du das alles aufgebaut hast. Möglicherweise bringts was, ansonsten gehen mir nämlich langsam die Ideen aus, vor allem weils bei mir auf anhieb tadellos läuft.
Multimeter 1 (V1 in Zeichnung): Innenwiderstand 1M Ohm
Multimeter 2 (V2 in Zeichnung): Innenwiderstand >2M Ohm (Multimeter1 kann nicht mehr als 2M Ohm Messen)
Ad Skizze 1:
Taster offen, Spannung zwischen Pin 7 und Gnd mit Multimeter1: 4,75 V (bei 12V Versorgung aus Netzteil/Akku)
Taster offen, Spannung zwischen Pin 7 und Gnd mit Multimeter2: 4,95 V (bei 12V Versorgung aus Netzteil/Akku)
Taster geschlossen, Spannung zwischen Pin 7 und Gnd: 0V bis max 0,01V.
Die Funktion TuWas() startet bei gedrücktem Taster immer. Bei nicht gedrücktem Taster alle 1 - 2minuten.
Ad Skizze 2:
Tasterkabel hängt in der Luft.
Spannungsmessung von V1 unterschiedliche Werte bis zu 200mV
Spannung zwischen Pin 7 und Gnd mit Multimeter2: 4,95 V
Wenn das Tasterkabel von Multimeter1 getrennt wird und wieder angehängt wird (im laufenden Betrieb), dann startet: TuWas() bei ca jedem 2. - 3. mal. Wenn das Tasterkabel angehängt bleibt startet TuWas() nach Pause von 1 bis 2 Minuten immer wieder einmal.
Multimeter2 zeigt keine Spannungsänderung.
Das Multimeter1 nichts sinnvolles misst ist mir jetzt klar. In den vorangegangenen Tests wollte ich damit einen möglichen Kurzschluss ausschließen.
Ad Skizze 3:
Wenn im laufenden Betrieb mit einem 3cm Drahtstück Pin7 berührt wird, dann startet TuWas() bei ca. jeder 2. Berührung. Am Multimeter ist keine Spannungsänderung zu erkennen.
Wenn das Multimeter2 von Pin7 getrennt(!) wird dann startet TuWas() bei ca. jeder 3. Trennung.
Ich habe alle Messungen mit unterschiedlichen Spannungsversorgungen durchgeführt.
Spannungsversorgungen: Schaltnetzteil 12V 8,5A; 12V BleiAkku( voll geladen); PC USB Buchse. Egal was angeschlossen war, der Fehler war immer wieder reproduzierbar. Bei Versorgung über die USB Buchse war nur die Spannung zwischen Pin7 und Gnd geringer.
Oszi habe ich leider keines. Bei den Ideen geht es mir ähnlich.
Okay, die Messungen sagen eigentlich aus das alles in Ordnung sein sollte. So wie ich das sehe liegt eigentlich in der Hardware kein Fehler vor und da es bei mir mit dem gleichen Programm einwandfrei läuft (eben nochmal gestestet) muss es wohl am Arduino liegen?!
Hast du es einfach mal mit einem externen Pullup versucht? Das wäre die letzte Idee die mir noch kommt. Möglicherweise nen anderen Pin und dazu nen externer Pullup-Widerstand. Wenns dann immernoch passiert bin ich mit meinem Latein am ende.
Ansonsten bleibt wirklich nur das Oszilloskop und dann so lange die Spannung am Pin7 verfolgen bis das Programm auslöst. Mit dem Multimeter kann man das auch mal versuchen, aber da die Dinger recht langsam sind wird man nur nen Fehler finden können, wenn die Spannung am Pin7 nach und nach bis unter den Schwellwert fällt, nicht aber wenn es warum auch immer nen kurzen Zusammenbruch der Spannung gibt.
jetzt habe ich es aufgegeben. Ich werde nur noch mit PullDown auf 5V schalten um etwas zu starten.
Ich habe mit einem 2. Duemilanove die Spannung am TasterPin gemessen und auf einem kleinen Grafikdisplay ausgegeben. Die Spannung war immer HIGH also „1023“. Außer ich hatte den Taster gedrückt oder einen Widerstand dazwischen gehängt da waren die Werte dann entsprechend.
Beim Berühren des Pins wie oben beschrieben, hat TuWas() immer wieder gestartet. Bei den Werten war jedoch keine Änderung erkennbar. Ich glaube eigentlich nicht, dass die Messungen zu langsam waren, Ich habe nur alle 100 ms Daten ausgegeben. Und da den niedrigsten Wert der Messungen dazwischen.
Dann habe ich eine Fernbedienung für TuWas() entdeckt! Ein Bunsenbrenner mit Piezozündung im Abstand von 10 – 15 cm. Und TuWas() startet (wie oben bei jeder 2., 3. Zündung). Dabei waren außer der Spannungsversorgung keine Kabel eingesteckt.
Danach Test mit externem PullUp. Ergebnis: etwas weniger Starts von TuWas() aber immer noch Fehler.
Danach Test mit PullDown auf Masse und Prüfung auf HIGH. Das erste Mal kein Fehler!!
Auch nicht wenn ich den Abstand verringere. Ist fast zu schön um wahr zu sein. Ich werde das irgendwann weiter Testen. Ein Plasmaschneider sollte genügend Störungen erzeugen?
Sieht so aus als werden Deine Störungen über die Spannungsversorgung eingeschleppt. Hast Du schon einmal einen zusätzlichen Kondensator um die 100nF parallel zum Controller (direkt in der Nähe des Controllers) probiert?
Wie ist eigentlich Deine Spannungsversorgung zum Arduino geführt? Einzelleiter oder ein Kabel?
Die Spannungsversorgung war bei den letzten Tests eine 12V Bleibatterie.
Ursprünglich war es ein 2-poliges Lautsprecherkabel mit ca 1mm2. Zum Schluss 30cm Einzelkabel mit Krokoklemmen.
Nachdem ich mir ein Board gekauft habe, habe ich mich überhaupt nicht damit beschäftigt. Also sollte ich ein 22nF Kerko zwischen Pin7 und Pin8 des Atmega328? (natürlich sind nicht die Arduinopins sondern die Pins des Atmega gemeint)
Ja, auf jeden Fall. So wie ich das verstehe ist Deine Spannungsversorung in Reihe mit einer "Spule mit 1 Windung" und ziemlich großer eingeschlossener Fläche --> sowas ist gar nicht gut. Das schreit danach Störungen einzufangen. Du könntest zusätzlich auch versuchen Masse zu erden.
Ich habe jetzt 2 10nF Kerkos parallel an die Besprochenen Pins gelötet. (kein 22nF mehr vorhanden. Wäre ein 100nF besser gewesen?)
Ergebnis: es dauert etwas länger den Fehler auszulösen. Jedoch tritt er immer noch auf.
Danach habe ich die Masse der Batterie geerdet. Keine Verbesserung.
TasterPin habe ich auch wieder geändert.
Spannungsversorung in Reihe mit einer "Spule mit 1 Windung" und ziemlich großer eingeschlossener Fläche
Ok, das verstehe ich nicht. Vorallem (wie) kann man das ändern? Erstmalig ist das Problem auf übrigens einem freien Platz(30m) aufgetaucht.
Kann dies theoretisch bei PullDown auf Masse und Prüfung auf HIGH auch passieren?
Solange Du die Ursache nicht kennst kann alles mögliche passieren. Das die Kondensatoren Linderung bringen deutet - wie vermutet - auf Probleme mit der Spannungsversorgung hin. Dann nimmst Du eben noch größere Kondesatoren. Ich hätte mit 100nF oder 220nF angefangen. Du hast ja schon Probleme, dann gilt viel hilft viel. Nur einen Elko würde ich nicht nehme wg. möglicherweise hohem ESR. Ein 1uF Keramikkondensator wäre vermutlich noch besser
ich habe in der Zwischenzeit zumindest einen Pin vom 328-er geschrottet. Neuer ist schon bestellt. Größerer Kerko auch.
Also wenn es auf ein Problem mit der Spannungsversorgung hindeutet, meinst Du damit die Bereitstellung der 5V für den Arduino über den Spannungswandler auf dem Board, oder die Spannungsversorgung?
Warum tritt dieses Problem aber auch dann auf, wenn ich über die USB Buchse oder über eine 12V Batterie die Spannung bereitstelle?
Oder kann es ein Problem von z.B. Leitungen im Gebäude sein?
Aktuell habe ich ein Problem mit einem Arduino Mega Board. Die Peripherie habe ich leider schon vor den Problemen gebaut. Also wieder interne Pullups und LOW Prüfung. Leitungslänge 10cm zum Optokoppler. Spannung via ATX Netzteil, verbaut in alten PC Tower
Wenn ich ca. 20 Meter davon entfernt Schweiße, dann reagiert der Mega so, als ob der Optokoppler schaltet und den Pin auf Low zieht.
Ich habe einen 2. Mega (USB betrieben, Gnd gekoppelt) via Analogpins angeschlossen, um die Spannungen zu messen. (5V, 3,3V und Pin)
Alle Werte waren leider normal.
Beim Mega tu ich mir schwer einen Kerko anzulöten. Welche Bohrungen wären zu empfehlen?
Hat niemand anderer ähnliche Probleme?
Übrigens: Tipp, wenn ihr ein Sensor Shield für den Mega in China bestellt, achtet auf Pin vierzehn --> GND.
Und Du wunderst Dich daß Du Störungen hast.
Schweißgerät, Erdungsschleifen (über Masse des PC Netzteils des ersten Arduinos und der Masse der USB schnittstelle des zweiten Arduinos).
Grüße Uwe