Go Down

Topic: Ausschaltverzögerung über fertiges Arduino Board möglich? (Read 1 time) previous topic - next topic

JohnJohn

Hallo,

wie der Titel erahnen lässt, möchte ich eine Spannungsquelle (max 10V, max 500mA) beim Unterschreiten eines gemessenen Spannungs- oder auch Stromwertes im Schaltkreis, zeitverzögert (5000ms) ausschalten.
(Im Schaltkreis befindet sich ein Draht, der an Dicke verliert und deshalb immer weniger Strom leitet, bis er schließlich abreißen würde (Kontakt also unterbrochen))

Selbst habe ich kein großes Wissen über Elektrotechnik, aber so weit ich weiß, würde man das mit Bauelementen über einen Komparator und einen Timer mittels NE555 machen. Ich würde es aber gerne digital umsetzen, also durch ein Programm geregelt und am Besten nur mittels fertig gekaufter Produkte.

Es wäre sehr freundlich, wenn mir jemand sagen könnte, ob so eine Schaltung mit einem fertigen Arduino Board (leicht) realisiert werden könnte.

Vielen Dank im Voraus,
Marcus
Solange die Größenordnung stimmt, ist alles gut!

uwefed

Ich nehme ean Du hast eine Konstantspannungsquelle.
Die Strommessung mußt Du über externe Elektronik machen. Ich weiß nicht ob es sinnvoll ist das Unterschreiten eines gewissen Stroms durch einen Komparator zu messen oder über einen analogeingang.

Den Rest macht Aurduino.

Grüße Uwe

JohnJohn

Danke für die schnelle Antwort.

Ja, als Netzteil habe ich bisher ein Voltcraft PS-1302 D verwendet. Wobei der Current maximal eingestellt war.

Wenn ich dich weiter richtig verstehe, dann brauche ich ein Teil, dass mir den Strom misst und mir das ganze dann als Output Signal liefert (um das an das Arduino Board anzuschließen).

Aber mit Aussicht auf Erfolg werde ich mich dann erstmal tiefer in Arduino einlesen.

Gruß,
Marcus
Solange die Größenordnung stimmt, ist alles gut!

marau

Hallo Marcus,

als Stromfühler kannst Du einen einfachen Widerstand nehmen.

Wenn in Deiner Anordnung z.B. 500mA Strom fliessen und Du möchtest bei Unterschreitung von 300mA abschalten, könntest Du einen 1-Ohm Widerstand nehmen und die darüber abfallende Spannung mit einem analogen Eingang messen.
Sobald Dein Grenzwert unterschritten wird, startest Du dann die Verzögerungszeit, und anschliessend schaltest Du den Strom durch Deinen Draht mit einem als Öffner angeschlossenen Relais ab.

Gruß

Martin

uwefed

Den Meßwiderstand schaltest Du zwischen Draht und Minus-Pol und verbindest den Minus-Pol mit der Masse des Arduinos und den anderen Anschluß des Meßwiderstandes über einen 1kOhm Widerstand an einem Analogeingang.

Grüße Uwe

JohnJohn

Hallo nochmal,

es ist einige Zeit vergangen, aber nun habe ich mein Projekt soweit realisiert. Allerdings habe ich noch ein Problem mit dem Einlesen der Spannung, um diese gegen einen Referenzwert zu vergleichen.

Dies wäre meine Schaltung:

http://www.fotos-hochladen.net/uploads/nanosteckplati76l38abne2.jpg

Dort wo im Bild eine LED ist, befindet sich in Wirklichkeit der Draht im Laugebad.

Was soll es tun:
Die angelegten 7,5V führen zu einem Strom, welcher über eine chemische Reaktion dazu führt, dass der Durchmesser des Drahtes kleiner wird. Der Widerstand ändert sich also. Nun soll Arduino über einen Messwiderstand die Spannung messen (und so indirekt den Widerstand des Drahtes) und im Falle U(eingang)<U(schwelle) das Relais anschalten. Dieses unterbricht den Kreis.

Wo ist das Problem:
Ich habe den schweren Verdacht, dass ich das nun falsch angeschlossen habe. Ich habe schon Uwe's Vorschlag probiert und auch noch mehr herumprobiert, aber ein Eingangssignal wurde wohl nie gemessen.
Das Programm an sich funktionniert aber und auch auch das Relais ist richtig angeschlossen, denn schalte ich das Relais von Anfang an auf HIGH, dann öffnet es auch brav den Kreis. Ich glaube also es ist eher ein Verkabelungsfehler, als ein Programmierfehler.

Hier noch mein Code:
Code: [Select]


const int analogOutPin = 9;  // Relais-Pin
const int analogInPin = A0;  // Drahtspannung einlese
float threshold = 15/256; // Schwellspannung von altem Roboter
int led = 13;  // Lampe auf Bord

void setup () {
  Serial.begin(9600);                    // bits per sec
  pinMode(analogOutPin, OUTPUT);         // Pin festlegen als Output
  pinMode (analogInPin, INPUT);          // Pin festlegen als Input
  pinMode(led, OUTPUT);                  // Lampe als Output, soll ja blinken
}


void loop () {
 
  int sensorValue = analogRead(analogInPin);  // Analog Read Eingangsspannung
  float voltage = sensorValue*(5.0/1023.0); // Eingangssignal in Spannung umrechnen 1024=Auflösung
 
  if(voltage < threshold) { 
    delay(5000);  // 5s warten und dann..
    digitalWrite(analogOutPin, HIGH); // Relais-Spannung anschalten
  }
else {
  digitalWrite(led, HIGH);   // Lampe an
  delay(100);                // warten
  digitalWrite(led, LOW);    // Lampe aus
  }
}


Für Vorschläge bin ich sehr dankbar, bestimmt ist mein Fehler relativ blöd, ich sehs wohl nur nicht.
Danke!
Marcus
Solange die Größenordnung stimmt, ist alles gut!

michael_x

1.
float threshold = 15/256;
könnte 0.0 sein, da 15 und 256 zwei Integer Zahlen sind...

8-bit µController können von sich aus keine Gleitkomma-Berechnungen, und meist kommt man auch als Mensch ganz gut ohne aus... ;)

2. Was misst du denn überhaupt ? Welchen Widerstand hat der Draht ( am Anfang, minimal / später ... )
Kannst du mit einem Messgerät die Spannung an deinem 82 Ohm Widerstand messen?

Da du den Arduino über USB mit Strom versorgst, kannst du sicher auch den SerialMonitor aus der IDE anschliessen und dir mit Serial.print  sagen lassen was passiert.


sth77

Erst mal dürfte es dich doch wundern, dass deine LED an Pin 13 dauerhaft leuchtet, oder? ;) Wenn man schon delay() benutzt, sollte man zwei Pausen einfügen: Einschalten-Pause-Ausschalten-Pause, ansonsten kommt gleich wieder die nächste Ausschalt-Anweisung.
Dann sollte dich interessieren, wie und ob sich voltage tatsächlich verändert. Ein Serial.begin hast du schon in der setup-Routine, mit Serial.print kannst du auch die sich ändernde Spannung ausgeben.
Zum Schaltplan: Sieht ein bisschen wirr aus, schaltest du das Relais tatsächlich direkt am Pin? Ist die Stromaufbnahme nicht zu groß? Hast du eine Löschdiode verbaut, die deinen Pin vor Spannungsspitzen schützt?
Du kannst zum Testen auch ein Poti mit 1000 Ohm einbauen (statt der LED ;)), um die Spannungsänderung zu simulieren.
Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

JohnJohn

Erstmal danke für die schnellen Antworten.

Ich teste eure Vorschläge durch und werde mir die Werte mal über den Serial ausgeben lassen. Habe den Messwiderstand schon über ein Multimeter mitgemessen, da fällt die Spannung wunderbar. Allerdings stimmt vielleicht mit der Umrechnung was nicht, denn auch wenn das Multimeter 0,02V anzeigt (Schwellenwert sollte 0,058V sein) unterbricht er nicht. Einen Transistor gegen Peaks habe ich (2N2222), nur war die Zeichnung schon "wirr" genug ;)

Danke soweit, ich teste weiter und frage nochmal, wenn ich weiter bin.
Solange die Größenordnung stimmt, ist alles gut!

guntherb


float threshold = 15/256;
könnte 0.0 sein, da 15 und 256 zwei Integer Zahlen sind...


Michel hat recht, das IST Null!
wenn, dann bitte:
float threshold = 15.0/256.0;
oder gleich
float threshold = 0.0586;

Ich denke, das ist auch das Hauptproblem.


Grüße
Gunther

michael_x


oder gleich
float threshold = 0.0586;

Ich denke, das ist auch das Hauptproblem.


const int threshold = 11; // compared to 0 .. 1023

würde das nächste "Problem" zeigen: Die float Zahlen verstecken, dass der Messbereich eher ungünstig gewählt ist...

JohnJohn

#11
May 17, 2013, 03:58 pm Last Edit: May 17, 2013, 04:10 pm by JohnJohn Reason: 1
Ihr hattet natürlich vollkommen recht, ich habe schon extra double hergenommen und dann schreibe ich aber einen Integer hin. My bad.

Habe die Werte ausgetauscht und lasse mir nun getaktet die Werte auf dem Serialmonitor ausgeben und alles klappt wunderbar - die Drähte sehen so aus, wie sie sollen.

Vielen Dank an alle :)
Solange die Größenordnung stimmt, ist alles gut!

Go Up