Arduino entkoppeln / vor Spannungseinflüssen sichern

Hallo currymuetze !

Die Analog-Eingänge werden von den Digital-Ausgängen beeinflusst.
Die Digital-Ausgänge ( besonders wenn sie gerade hoch-ohmig sind ) sind empfänglich für EMV-Shit.
Versuche das: Die ( verwendeten ) Digital-Ausgänge mit 100 kOhm an Masse legen. Zieht fast keinen Strom, und sorgt für definierte Pegel. Bei mir hat's geholfen.
Ansonsten bleibt dir nur noch die Kabel-Abschirmung.

MfG

Hallo Gurkengräber,
momentan ist mir alles ein Versuch wert, hauptsache das Ding krieg ich stabil.
Betrifft aber nur die Digitalen, nicht die analogen AUSgänge?

Welche Kabel sollte ich alternativ abschirmen?
Das Kabel zum LCD Display?
Das Kabel zu den Schaltern?
Das Kabel vom 24v Netzteil?
Oder alle?
Wie abschirmen? Mittels Klappferrit?

Gruß
Thorsten

Ausgänge sind nie hochohmig. Hochohmige Eingänge sind aber IMMER ein Problem. Alle unbenutzten Pins müssen entweder als Ausgang geschaltet werden oder von außen auf definierte Pegel. Der Vorschlag alles mit 100k an Masse zu ziehen ist nicht der schlechteste. Kann aber gut sein, daß Du Deine Probleme woanders hast.

Was mir noch einfällt: Du könntest per Watchdog immerhin erzwingen, daß der Prozessor nach einem Absturz wenigstens durchstartet. Das ist zwar überhaupt keine schöne Lösung aber in Deinem Umfeld vieleicht ausreichend.

http://www.mikrocontroller.net/articles/Watchdog

Es ist aber auf jeden Fall besser das eigentliche Problem zu verstehen und zu beheben als per WDT das Problem zu verstecken.

Hallo Udo,

ja, an einen Watchdog habe ich auch schon mal gedacht, allerdings bislang noch kein gutes Tutorial für mich gefunden.
Werd das aber mal in Angriff nehmen, das ist in jedem Fall wichtig.

Ausgänge sind nie hochohmig. Hochohmige Eingänge sind aber IMMER ein Problem. Alle unbenutzten Pins müssen entweder als Ausgang geschaltet werden oder von außen auf definierte Pegel. Der Vorschlag alles mit 100k an Masse zu ziehen ist nicht der schlechteste. Kann aber gut sein, daß Du Deine Probleme woanders hast.

Ok, das betrifft nur die digitalen Ein/Ausgänge? Was ist mit den analogen Inputs, die freien kann ich getrost ignorieren?
Das sollte ja kein Problem sein, die digitalen alle als Ausgang schalten.

Ansonsten:
Was haltet ihr (zunächst bzgl. der Steuerung für die Dosierpumpen) von dieser Schaltung? (siehe Anhang).
Könnte das helfen Spannungspeaks zu vermeiden und somit einen Absturz zu verhindern?

Gruß

Du hast nicht wirklich vor, 6 (!) Netzteile zu verwenden ?
Das sollte zwangsläufig zu Problemen führen.
Mit einem DC/DC Wandler kannst Du den Arduino direkt aus den 24V betreiben und die restlichen Spannungen lassen sich daraus auch sicherlich erzeugen.
Ein kompletter Schaltplan wäre (auch für Dich) erstmal angebracht und hilfreich.

Hi Sascha,

ja, will/muss ich leider.
Für die LED Lampe habe ich drei Netzteile. Ein entsprechendes Netzteil mit 24v und 15A habe ich leider nicht gefunden.
Für die Strömungspumpen würde ich halt das beiliegende 12V/1A Netzteil nutzen. Theoretisch könnte ich sicherlich auch dafür mein 24v Netzteil nutzen, aber dann würde ich wieder einen Spannungswandler benötigen, k.A. wie aufwendig das ist. Außerdem weiss ich nicht, ob ich noch die 2A "übrig habe", da ich insgesamt 17 KSQs betreibe.

Ich werd mich am Wochendende mal hinsetzen und einen Schaltplan aufzeichnen. Da ich mit Powerpoint besser umgehen kann, als mit Eagle, hoffe ich, dass das für euch ok ist wie ich meine "Schaltpläne" mache.

Gruß

Die freien "analogen" Inputs sind auch digitale Inputs. Die betrifft das genauso.

Hallo Udo,
ich steh grad irgendwie aufm schlauch:
Habe jetzt die digitalen PINS 1-13 alle auf Output gesetzt: pinMode(13, OUTPUT); etc
Jetzt versteh ich dich so, dass ich die als analogIn gekennzeichneten Eingänge auch auf Output setzen sollte, sofern sie nicht gebraucht werden.

Die freien "analogen" Inputs sind auch digitale Inputs. Die betrifft das genauso.

Frag mich allerdings grad wie ich das mache? Die gehen ja auch von 1-13.....

Wie gesagt...ich galub ich steh grad nur aufm Schlauch aber bitte gib mir nen Tipp.

Gruß

Ein (digitaler) Pin hat aus Sicht des Prozessors 4 Ausgabezustände:

  1. Output Low
  2. Ouput High
  3. Input Low == High Z
  4. Input High == Pullup aktiviert

Unbenutzte Analogpins sind wie Digitalpins zu behandeln.

Zustand (3) ist nur sinnvoll wenn ein Pin von außen beschaltet ist. Ansonsten "schwebt" der Pin. Schwebende Pins verursachen jede Menge merkwürdige Effekte. Dazu gehören unter umständen auch erhöhter Stromverbrauch oder merkwürdige Abstürze. Deshalb sollst Du alle unbenutzten Pins entweder auf ein festes Potential legen oder die Pullups aktivieren. Da festbinden der Pins zu Zerstörung der Ausgänge führen kann wenn man Mist programmiert würde ich im Zweifelsfall immer für die Pullups votieren, also (4).

von Udo Klein:

Ausgänge sind nie hochohmig.

  1. Input Low == High Z

'High Z' oder 'Z3-State' ist weder Input noch Output.
Der Z3-State ( hochohmig ) tritt auf, wenn der Pin nicht vom Programm definiert ist. Nach dem Einschalten des Arduino sind alle alle Digital-Pins hochohmig, bis sie vom Programm definiert werden. Wie lange das dauert, kann ich nicht messen.

Schwebende Pins verursachen jede Menge merkwürdige Effekte.

Mein Reden !
Schließe ich eine Transistor-Basis über einen 1 kOhm Widerstand direkt an den Digital-Ausgang an, ist dieser Transistor nach dem Einschalten zufällig an oder aus. Darum habe ich Pull-Down-Widerstände ( 100 kOhm vom Ausgang nach Masse ) angeschlossen, damit die Transistoren standardmäßig aus sind. Bei Pull-Up-Widerständen ( 100 kOhm vom Ausgang nach Plus ) wäre der Transistor dann standardmäßig eingeschaltet.

MfG

@currymuetze:

Du könntest auch versuchen, einen "sternförmigen Massepunkt" zu setzen. Also einen Massepunkt dicht am Arduino. Und von diesem gehen die Masseleitungen zum LCD, den Sensoren, den Schaltern etc.

MfG

Hi,
bin nun verwirrt:
Udo, du schreibst erst

Alle unbenutzten Pins müssen entweder als Ausgang geschaltet werden oder von außen auf definierte Pegel.

und dann

ich im Zweifelsfall immer für die Pullups votieren, also (4). (=Input High)

Also wie jetzt?

Also so wie ich es jetzt verstanden habe würde ich alle unbenutzten digitalen PINs so schalten:
pinMode(x, INPUT);
digitalWrite(x, HIGH);
und alle unbenutzen analogen Eingänge so:

pinMode (Ax, INPUT);
digitalWrite (Ax, HIGH);

Passt das?

Gruß

Jein. Du behandelst einfach ALLE unbenutzten Pins wie Digitalpins. Du musst dazu nur wissen, daß A0-A6 die DigitalPins 13-19 sind. D.h. falls alle Pins unbenutzt wären würdest Du einfach

For (uint8_t pin=0; pin<20; ++pin) {
    pinMode(pin, INPUT);
    digitalWrite(pin, HIGH);
}

schreiben. Das könntest Du auch einfach immer am Anfang von setup schreiben und danach die benutzten Pins initialisieren. Das Arduino will das nicht per Default umstellen weil sie Angst haben bestehende Sketches damit inkompatibel zu beeinflussen. Kann ich verstehen, ist aber immer eine beliebte Falle.

Hi Udo,
da ich das Mega board nutze, muss ich dass dann auf pin<53 anpassen?
Was ist das eigentlich für eine variable uint8_t??
Ist ja schön kurz, mein code sieht so aus:

/*******PINS auf PULLUP schalten*******************/
   pinMode(0, INPUT);
   digitalWrite(0, HIGH);
   pinMode(1, INPUT);
   digitalWrite(1, HIGH);
   pinMode(5, INPUT);
   digitalWrite(5, HIGH);
   pinMode(6, INPUT);
   digitalWrite(6, HIGH);
   pinMode(7, INPUT);
   digitalWrite(7, HIGH);
   pinMode(13, INPUT);
   digitalWrite(13, HIGH);   
   pinMode(14, INPUT);
   digitalWrite(14, HIGH);
   pinMode(15, INPUT);
   digitalWrite(15, HIGH);
   pinMode(16, INPUT);
   digitalWrite(16, HIGH);
   pinMode(22, INPUT);
   digitalWrite(22, HIGH);
   pinMode(23, INPUT);
   digitalWrite(23, HIGH);
   pinMode(24, INPUT);
   digitalWrite(24, HIGH);
   pinMode(25, INPUT);
   digitalWrite(25, HIGH);   
   pinMode(26, INPUT);
   digitalWrite(26, HIGH);
   pinMode(27, INPUT);
   digitalWrite(27, HIGH);   
   pinMode(28, INPUT);
   digitalWrite(28, HIGH);
   pinMode(29, INPUT);
   digitalWrite(29, HIGH);
   pinMode(30, INPUT);
   digitalWrite(30, HIGH);
   pinMode(31, INPUT);
   digitalWrite(31, HIGH);  
   pinMode(32, INPUT);
   digitalWrite(32, HIGH);
   pinMode(33, INPUT);
   digitalWrite(33, HIGH);
   pinMode(34, INPUT);
   digitalWrite(34, HIGH);
   pinMode(35, INPUT);
   digitalWrite(35, HIGH);   
   pinMode(36, INPUT);
   digitalWrite(36, HIGH);
   pinMode(37, INPUT);
   digitalWrite(37, HIGH);   
   pinMode(38, INPUT);
   digitalWrite(38, HIGH);
   pinMode(39, INPUT);
   digitalWrite(39, HIGH);
   pinMode(40, INPUT);
   digitalWrite(40, HIGH);
   pinMode(41, INPUT);
   digitalWrite(41, HIGH);   
   pinMode(42, INPUT);
   digitalWrite(42, HIGH);
   pinMode(43, INPUT);
   digitalWrite(43, HIGH);
   pinMode(44, INPUT);
   digitalWrite(44, HIGH);
   pinMode(45, INPUT);
   digitalWrite(45, HIGH);   
   pinMode(46, INPUT);
   digitalWrite(46, HIGH);
   pinMode(47, INPUT);
   digitalWrite(47, HIGH);   
   pinMode(48, INPUT);
   digitalWrite(48, HIGH);
   pinMode(49, INPUT);
   digitalWrite(49, HIGH);
   pinMode(50, INPUT);
   digitalWrite(50, HIGH);
   pinMode(51, INPUT);
   digitalWrite(51, HIGH);    
   pinMode(52, INPUT);
   digitalWrite(52, HIGH);
   pinMode(53, INPUT);
   digitalWrite(53, HIGH);  
   pinMode(A0, INPUT);
   digitalWrite(A0, HIGH);   
   pinMode(A1, INPUT);
   digitalWrite(A1, HIGH);
   pinMode(A2, INPUT);
   digitalWrite(A2, HIGH);
   pinMode(A3, INPUT);
   digitalWrite(A3, HIGH);
   pinMode(A4, INPUT);
   digitalWrite(A4, HIGH);
   pinMode(A5, INPUT);
   digitalWrite(A5, HIGH);
   pinMode(A6, INPUT);
   digitalWrite(A6, HIGH);
   pinMode(A7, INPUT);
   digitalWrite(A7, HIGH);
   pinMode(A8, INPUT);
   digitalWrite(A8, HIGH);
   pinMode(A9, INPUT);
   digitalWrite(A9, HIGH);
   pinMode(A10, INPUT);
   digitalWrite(A10, HIGH);
   pinMode(A11, INPUT);
   digitalWrite(A11, HIGH);
   pinMode(A12, INPUT);
   digitalWrite(A12, HIGH);   
   pinMode(A13, INPUT);
   digitalWrite(A13, HIGH);
   pinMode(A14, INPUT);
   digitalWrite(A14, HIGH);
   pinMode(A15, INPUT);
   digitalWrite(A15, HIGH);

A0, A1, ... sind doch irgendwelche Konstanten. Schau Dir mal die Inhalte an. In WProgram.h steht bei mir:

#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
const static uint8_t A0 = 54;
const static uint8_t A1 = 55;
const static uint8_t A2 = 56;
const static uint8_t A3 = 57;
const static uint8_t A4 = 58;
const static uint8_t A5 = 59;
const static uint8_t A6 = 60;
const static uint8_t A7 = 61;
const static uint8_t A8 = 62;
const static uint8_t A9 = 63;
const static uint8_t A10 = 64;
const static uint8_t A11 = 65;
const static uint8_t A12 = 66;
const static uint8_t A13 = 67;
const static uint8_t A14 = 68;
const static uint8_t A15 = 69;
#else
const static uint8_t A0 = 14;
const static uint8_t A1 = 15;
const static uint8_t A2 = 16;
const static uint8_t A3 = 17;
const static uint8_t A4 = 18;
const static uint8_t A5 = 19;
const static uint8_t A6 = 20;
const static uint8_t A7 = 21;
#endif

Man beachte, daß "normale" Arduinos 8 analoge Pins unterstützen. Leider sind bei den PTH Gehäusen nur 6 davon nach außen geführt. D.h. korrekterweise müsste mein Code die auch noch festsetzen, also so:

For (uint8_t pin=0; pin<22; ++pin) {
    pinMode(pin, INPUT);
    digitalWrite(pin, HIGH);
}

also wenn ich das richtig verstehe sind A0 und folgende eigentlich Ausgang 54-69?(BeimMega?)
ruft denn jeder sketch wprogramm.h auf? Ist bei mir nicht extra definiert.

Also mach ichs einfach so:

For (uint8_t pin=0; pin<69; ++pin) {
    pinMode(pin, INPUT);
    digitalWrite(pin, HIGH);
}

Und danach belege ich die einzelnen Ausgänge und eingänge, die bestückt sind?

Korrekt so?

Ja, genau so. WProgram.h wird nicht aufgerufen sondern immer eingebunden. D.h. das passiert schon beim Compilieren und nicht erst wenn das Program läuft.

Hallo currymuetze,

war das Festlegen der übrigen Pins am Ende der entscheidende Hinweis, um Deinen Arduino vor Spannungseinflüssen abzukoppeln?
Ich kämpfe mich gerade durch ein ähnliches Problem (LED spinnt gelegentlich, Relaiskarte bringt Arduino [und LED] zum Absturz).

Grüße

da krammst aber nen alten Thread aus :wink:
Soweit ich mich erinnern kann, war das Problem bei der Motorschaltung, welche ich durch zusätzliche 0.1uF Caps und Dioden abgesichert habe.
Aber genau weiß ich es nicht mehr, da ich mittlerweile einige Updates der Platine hinter mir habe.
Mach am besten einen eigenen Thread mit der Fehlerbeschreibung auf, das wird zielführender sein.

Viel Erfolg