Arduino entkoppeln / vor Spannungseinflüssen sichern

Hallo,

durch mein LCD Display bin ich auf folgende Problematik gestoßen:

  1. In dem Moment, wo ich ein 24V Netzteil anschließe, um meine Dosierpumpen zu steuern (über einen ULN 2003, siehe Thread http://arduino.cc/forum/index.php/topic,63225.0.html) stürzt mein DIsplay ab.
  2. Die Pumpe soll über einen Schalter ein/ausgeschaltet werden. Den Schalter habe ich über einen 10kOhm PullUp Widerstand angeschlossen. (nicht intern). Wenn ich nur den 9V Block am Arduino hängen habe, kann ich schalten wie ich will, das hat keinen Einfluss auf das Display oder den Code. Sofern ich das 24V Netzteil angeschlossen habe, habe ich zum einen Probleme mit dem DIsplay, zum anderen schmiert mir der Arduino nach einer Weile ab.

Ich bin eigentlich ziemlich sicher, dass das kein Softwareproblem mehr ist. Dennoch hier der Code:

#include <WProgram.h>
#include <Wire.h>
#include <DS1307.h> // written by  mattt on the Arduino forum and modified by D. Sjunnesson
#include <LiquidCrystal.h>
LiquidCrystal lcd(39, 41, 43, 45, 47, 49); 
int buttonPin=46;
int buttonState; 
int lcdmillis=0;
int pumpe1=35;

void setup()
{
  pinMode(13, OUTPUT);
  pinMode(buttonPin, INPUT); 
  pinMode(pumpe1, OUTPUT);
        digitalWrite(pumpe1, HIGH);  

/*
  RTC.stop();
  RTC.set(DS1307_SEC,10);        //set the seconds
  RTC.set(DS1307_MIN,01);     //set the minutes
  RTC.set(DS1307_HR,15);       //set the hours
  RTC.set(DS1307_DOW,4);       //set the day of the week
  RTC.set(DS1307_DATE,25);       //set the date
  RTC.set(DS1307_MTH,6);        //set the month
  RTC.set(DS1307_YR,11);         //set the year
  RTC.start();*/
  lcd.begin(20, 4);

}

void loop()
{
if (millis() - lcdmillis > 1000) {
  lcd.clear();
lcd.setCursor(0,0);
  lcd.print(RTC.get(DS1307_HR,true)); //read the hour and also update all the values by pushing in true
  lcd.print(":");
  lcd.print(RTC.get(DS1307_MIN,false));//read minutes without update (false)
  lcd.print(":");
  lcd.print(RTC.get(DS1307_SEC,false));//read seconds
  lcd.print("  ");                 // some space for a more happy life
  lcd.print(RTC.get(DS1307_DATE,false));//read date
  lcd.print("/");
  lcd.print(RTC.get(DS1307_MTH,false));//read month
  lcd.print("/");
  lcd.print(RTC.get(DS1307_YR,false)); //read year 
  lcdmillis=millis();
}
buttonState = digitalRead(buttonPin);
if (buttonState == LOW) {     
     digitalWrite(pumpe1, LOW);  
  } 
  if (buttonState == HIGH){
    digitalWrite(pumpe1, HIGH); 
  }

}

Ich habe auch verschiedene Anschlüsse des Arduinos ausprobiert: 9v Batterie, USB, 9v Netzteil. Immer das gleiche.
(Langfristig soll es eh über das 9v Netzteil betrieben werden, welches im gleichen Stromkreis (Mehrfachstecker) wie die anderen Netzteile steckt.)

Jetzt die Frage: Was kann bzw muss ich machen, um die Schaltungen untereinander von einander zu trennen?
Nur mal ganz kurz, welche Stromversorger und Verbraucher angeschlossen werden:

  1. Arduino mit 9V Netzteil
  2. 3 24V Netzteile für die LED Beleuchtung (per PWM über den TLC 5940 werdn 17 KSQs gesteuert, siehe: http://arduino.cc/forum/index.php/topic,57342.msg466767.html#msg466767)
  3. Ebenfalls über eines der Netzteile die o.g. Pumpensteuerung
  4. 2* 12v Netzteile für die Steuerung meiner Strömungspumpen (siehe: http://arduino.cc/forum/index.php/topic,62193.msg453693.html#msg453693)
  5. LCD Display
  6. OnBoard Batterie für die RTC DS1307
  7. 2* Funkfernbedienungen zum Schalten von 230v Geräte (siehe: http://arduino.cc/forum/index.php/topic,51650.msg459126.html#msg459126)

Ich hoffe, ihr könnt mir helfen.
Ich bin u.a. auf diesen Beitrag gestoßen, aber wirklich schlau werd ich nicht daraus:
http://arduino.cc/forum/index.php/topic,59752.0.html
und im englisch sprachigen Bereich hierauf:
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1277934223/all
Demnach kann man hier mit Elkos und Kondensatoren etwas erreichen, aber für mich als Laien nicht ganz verständlich.

Bitte helft mir ein wenig weiter.

Gruß
Thorsten

ANbei mal 2 Bilder von meiner gelöteten Platine, damit ihr euch mal ein Bild machen könnt:

Die Standardlösung zum sicheren Entkoppeln ist:

1) Galvanische Trennung der Stromkreise

2) Vorzugsweise per Optokoppler + ausreichend dicke Transistoren dahinter 2b) Ansonsten Relais

Hi Udo,

vielen Dank für Deine Antwort. So ganz schlau werde ich daraus aber nicht, ist mir auch irgendwie zu allgemein und zu wenig auf mein Problem bezogen.
Wenn doch, sorry, bin halt zu sehr Laie und bräuchte dann ein paar mehr Hilfestellungen. Bin ja froh, dass ich überhaupt mal sone Platine hinbekommen habe.
Wäre aber doof, wenn das Projekt daran scheitert, dass ich mit irgendwelchen Abstürzen wodurch auch immer verursacht, zu kämpfen habe.

Sind die Infos, die ich liefere ausreichend für euch, um überhaupt mein Problem zu verstehen? Bzw: Habe ich mein Problem überhaupt richtig identifiziert oder liegt der Fehler woanders?
Was ich (meiner EInschätzung nach) doch erreichen muss, ist dass irgendwelche Spannungsspitzen durch andere Netzteile/Bauteile kurzfristig meinen Arduino irgendwo “flachlegen”?

Wenn ein Relais oder Optokoppler die Lösung ist, dann müsste ich mal Schaltung für Schaltung durch gehen, angefangen hiermit: http://arduino.cc/forum/index.php/topic,63225.0.html
Habe die Schaltung hier noch mal im Anhang, wüsste jetzt aber nicht, wie ich da genau die Stromkreise so durch ein Relais oder Optokopller trenne, dass die Schaltung mit dem Bauteil als solches uneingeschränkt funktioniert.

Hoffe auf weitere Hilfe seitens der Profis hier :wink:
Gruß und Danke
THorsten

Gruß

Was genau ist an der Standardschaltung http://de.wikipedia.org/wiki/Optokoppler für Dich nicht zu verstehen?

Wenn ich das richtig sehe ist ein Optokoppler ein Relais, also ein oder aus. Passt vielleicht zu den Dosierpumpen, die ich ein oder aus schalte. Aber ich steuer über den ULN, und die hängen auch am 24v Netzteil, noch Lüfter und 0,5mm LEDs über PWM. Geht das auch damit? Dann sei so nett und erklär mir doch mal genau wo ich den Optokoppler in meiner Schaltung oben einbaue? Da haperts leider schon bei mir.

Außerdem möchte ich eigentlich nicht die ganze schaltung umbauen. Habe das ja alles schon verlötet ;( Gibts denn noch andere Möglichkeiten? Kann es sein, dass wenn ich die Pumpen einschalte und der 24v Strom fließt, die Spannung irgendwo lang läuft wo sie nicht alng sollte? Das könnte man doch über ne normale Diode verhindern?

Oder habe ich im Moment der Schaltung sehr hohe Spannungsspitzen? Kann man das nicht über einen Keramikkondensator oder einen Elko abfangen? Entschuldigt wenn das Quatsch ist was ich schreibe, versuche nur ein paar Gedanken in den Raum zu schmeißen.

Gruß Thorsten

Die Probleme die Deine Schaltung hat kann man ohne Glaskugel aus der Ferne nicht finden. In der Regel nimmt man ein Oszilloskop und schaut nach. So wie Du fragst hast Du aber sicher keins.

Der Optokoppler ist sozusagen ein elektronisches Relais und entkoppelt beide Seiten komplett voneinander. Du brauchst nicht einmal eine gemeinsame Masse. Eine Seite ist wie eine Leuchtdiode anzuschliessen, d.h. Vorwiderstand und fertig. Die andere Seite ist ein Transistor (bzw. es geht auch anders, aber Du nimmst einen mit Transistor). Die Transistoren von Optokopplern sind in der Regel nicht sehr stark, etwas so wie die Arduino Ausgänge. Die Schaltung ist also so: alle Ausgänge die entkoppelt werden sollen bekommen zunächst Leuchtdioden + Vorwiderstand (um zu schauen ob alles so tut wie es soll). Dann Leuchtdiode weg und Optopkoppler stattdessen. Die Optokoppler nimmt man dann um Treibertransistoren anzusteuern. Achtung: wenn man nicht aufpasst sind die Signale plötzlich verkehrt herum.

Bei Eingängen ähnlich nur kommt dann der Transistor an den Arduino und der Eingang auf die andere Seite. Das ist nicht sehr schwer.

Wenn Du die Beschreibung nicht kapierst, dann bestellt Dir irgendwo ein paar von den Teilen schliesse ein Ohmmeter am Ausgang an und den Eingang über einen 330 Ohm Widerstand an einen Arduino Ausgang und schaue was passiert.

Und für die Zukunft: sowas probiert man zuerst auf dem Steckbrett aus. Wenn alles verlötet ist, dann ist sowas wirklich ärgerlich.

Hallo Udo,

habe die Einzelschaltungen alle aufm Steckbrett getestet. Aber der Fehler ist mir erst jetzt wo auch das Display angeschlossen ist aufgefallen.

Oszilloskop ist leider nicht vorhanden, Glaskugel leider auch nicht. Ich hätte allerdings gedacht, dass das vielleicht ein häufigeres Problem ist, weil ich doch sicherlich nicht der erste bin, der eine Schaltung mit 2 unterschiedlichen Netzspannungen baut.

Ob das die Lösung meines Problems ist, wirst du mir vermutlich (ohne Glaskugel) auch nicht sagen können richtig? Also gilt hier probieren über studieren? Kannst du mir einen sinnvollen Optokoppler für folgende Anwendungen empfehlen? - 3 x Dosierpumpe digital (HIGH/LOW) hinter ULN2003 - 16 x zwischen TLC5940 und meiner KSQ (muss ich hier was beachten? Schaltung siehe Beitrag #71 http://arduino.cc/forum/index.php/topic,57342.60.html) - 1 x LED + 2 x Lüfter analog PWM hinter ULN2003 - 2 x Pumpensteuerung 12v Motorshield

wäre dieser passend? http://www.reichelt.de/Optokoppler/PC-847X/index.html?;ACTION=3;LA=444;GROUP=A55;GROUPID=3046;ARTICLE=44681;START=0;SORT=artnr;OFFSET=16;SID=314gkqFawQAR8AAAywayYf9390196e81ea05f2096e628fc5497f4

es gibt 6-polige udn 4-polige, welchen brauch ich denn genau?

Gruß

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.

3) 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ß