Go Down

Topic: Steuerung von Ventilen und Kamera für TaT-Aufnahmen (Read 68638 times) previous topic - next topic

sth77

Die erste Version funktioniert nicht, weil du das was JKbastler, MaFu und ich sagten nicht umgesetzt hast.
Die zweite Version aktiviert den internen Pullup-Widerstand und funktioniert prinzipiell, allerdings musst du zum Auslösen den Knopf loslassen. :D Es liegt ja im ungedrückten Zustand ein High durch den Pullup an, du musst zum Auslösen also auf Low-Pegel reagieren.
Mein verwaister Arduino-Blog: http://www.sth77.de/ - letzter Eintrag: Diamex-ISP in der irgendwann mal aktuellen Arduino-IDE 1.6.4

obiwan

Der "BUTTON" ist ein Taster - also kein AN-AUS-SCHALTER.

Wenn ich da draufdrücke (und gleich wieder loslasse), dann soll die CAM auslösen - also quasi eine "verlängerter" Fernauslöser.

Bitte pass doch mal eine mein Sketch entsprechend an. MIt "Es liegt ja im ungedrückten Zustand ein High durch den Pullup an, ..." kann ich nix anfangen.

Es soll doch wenn ich drücke das HIGH da sein um die CAM auszulösen

:smiley-red:  :smiley-red:  :smiley-red:

sth77

Um in deinem Code zu bleiben, hier die wenigen Änderungen mit ein paar Kommentaren:

Code: [Select]

const int CAM = 8;
const int BUTTON = 13;

int VAR = 0;

void setup() {
  pinMode(CAM, OUTPUT);
  pinMode(BUTTON, INPUT_PULLUP);  // aktiviert den internen Pullup, zieht den Pin auf High-Pegel, wenn Taster nicht gedrueckt wird
}

void loop() {
  VAR = digitalRead(BUTTON);

  if (VAR == LOW) {  // Taster gedrueckt ---> Low-Pegel liegt an, also Pruefung auf Low
    digitalWrite(CAM, HIGH);  // Ausloesen durch High-Pegel am Optokoppler
    delay (50); // kleine Pause...
  } else {  // Taster nicht (mehr) gedrueckt
    digitalWrite(CAM, LOW);
  }
}
Mein verwaister Arduino-Blog: http://www.sth77.de/ - letzter Eintrag: Diamex-ISP in der irgendwann mal aktuellen Arduino-IDE 1.6.4

obiwan

Super, Danke! Und wozu ist die kleine Pause? Währe ohne diese Pause der "Impuls" zu schwach die CAM auszulösen?

sth77

Eine Pause ist die primitivste und nicht gerade eleganteste Lösung, um das Prellen des Tasters abzufangen. Mechanische Kontakte prellen, was in deinem Fall zu einer (theoretischen) Mehrfachauslösung führt - wenn die Kamera das geschwindigkeitstechnisch mitmacht.
Mein verwaister Arduino-Blog: http://www.sth77.de/ - letzter Eintrag: Diamex-ISP in der irgendwann mal aktuellen Arduino-IDE 1.6.4

obiwan

Och so, ja... deshalb hatte ich (u.a.) in einem vorherigem Sketch vor Auslösung eine Pause gesetzt, damit u.a. der Sketch auch erstmal "sauber" auf das Board gelang.
Könnte ich das auch so machen, wenn ich möchte dass erst 3sec. nach dem Tastendruck die CAM auslöst?:


  if (VAR == LOW)
  {
    delay(3000);
    digitalWrite(CAM, HIGH);
  }
    else
  {
    digitalWrite(CAM, LOW);
  }

sth77

Das kannst du so machen, aber überleg doch mal zusätzlich, wie lang dein Auslöseimpuls in dem Fall ist.
Mein verwaister Arduino-Blog: http://www.sth77.de/ - letzter Eintrag: Diamex-ISP in der irgendwann mal aktuellen Arduino-IDE 1.6.4

MaFu


Och so, ja... deshalb hatte ich (u.a.) in einem vorherigem Sketch vor Auslösung eine Pause gesetzt, damit u.a. der Sketch auch erstmal "sauber" auf das Board gelang.
Könnte ich das auch so machen, wenn ich möchte dass erst 3sec. nach dem Tastendruck die CAM auslöst?:


  if (VAR == LOW)
  {
    delay(3000);
    digitalWrite(CAM, HIGH);
  }
    else
  {
    digitalWrite(CAM, LOW);
  }


Wird so nicht funktionieren.
Nachdem Du vermutlich den Taster nicht 3 Sekunden drückst, kommt nach dem digitalWrite(CAM, HIGH) sofort das digitalWrite(CAM, LOW), der Impuls ist somit extrem kurz.
Die meisten Kameras lösen aber nicht aus, wenn der Impuls nicht mindestens 10 oder 20 Millisekunden dauert.
_______
Manfred

obiwan

Ok, also so:

if (VAR == LOW)
  {
    delay(3000);
    digitalWrite(CAM, HIGH);
    delay(20);
  }
    else
  {
    digitalWrite(CAM, LOW);
  }

Sheldor

Das mit dem Prellen des Tasters ist übrigens in dem Buch vin Erik Bartmann genau beschrieben.
Ist eines der ersten Projekte!

MaFu


Ok, also so:

if (VAR == LOW)
  {
    delay(3000);
    digitalWrite(CAM, HIGH);
    delay(20);
  }
    else
  {
    digitalWrite(CAM, LOW);
  }


Ja. Ich würds aber dann gleich so schreiben:
Code: [Select]
if (VAR == LOW)
  {
    delay(3000);
    digitalWrite(CAM, HIGH);
    delay(20);
    digitalWrite(CAM, LOW);
  }
_______
Manfred

obiwan

Und das währ dann der (für mich lesbare) Schaltplan zum Testen mit einer LED:

obiwan

Und hier nochmal der jetzt hoffentlich endgültige Sketch:

Code: [Select]
const int CAM = 8;
const int BUTTON = 13;

int VAR = 0;

void setup(
{
  pinMode(CAM, OUTPUT);
  pinMode(BUTTON, INPUT_PULLUP);  // aktiviert den internen Pullup (= HIGH wenn BUTTON nicht gedrueckt wird)
}

void loop()
{
  VAR = digitalRead(BUTTON);

  if (VAR == LOW)                // wenn BUTTON gedrückt wird ist VAR = LOW
  {
    delay(3000);                 // 3 Sekunden warten
    digitalWrite(CAM, HIGH);     // CAM durch HIGH auslösen
    delay(20);                   // Auslöseimpuls 20 Millisekunden
    digitalWrite(CAM, LOW);      // Verbindung trennen
  }
    else                         // wenn BUTTON nicht gedrückt wird ist VAR = HIGH
  {
    digitalWrite(CAM, LOW);
  }
}

sth77

#103
Apr 29, 2013, 03:18 pm Last Edit: Apr 29, 2013, 03:22 pm by sth77 Reason: 1

Und das währ dann der (für mich lesbare) Schaltplan zum Testen mit einer LED:

Die Beschaltung von Pin 3 und 4 des Optokopplers ist noch verkehrt. Ich glaube Gunther hat dir das bereits in einer Skizze verdeutlicht. Pin 4 geht auf Masse, Pin 3 zu Widerstand, LED und dann weiter auf die positive Versorgungsspannung. Polung der LED beachten, sonst leuchtet sie nicht.

[edit] Beitrag von guntherb: http://arduino.cc/forum/index.php/topic,162278.msg1219420.html#msg1219420
Mein verwaister Arduino-Blog: http://www.sth77.de/ - letzter Eintrag: Diamex-ISP in der irgendwann mal aktuellen Arduino-IDE 1.6.4

MaFu


Und hier nochmal der jetzt hoffentlich endgültige Sketch:

Code: [Select]
const int CAM = 8;
const int BUTTON = 13;

int VAR = 0;

void setup(
{
  pinMode(CAM, OUTPUT);
  pinMode(BUTTON, INPUT_PULLUP);  // aktiviert den internen Pullup (= HIGH wenn BUTTON nicht gedrueckt wird)
}

void loop()
{
  VAR = digitalRead(BUTTON);

  if (VAR == LOW)                // wenn BUTTON gedrückt wird ist VAR = LOW
  {
    delay(3000);                 // 3 Sekunden warten
    digitalWrite(CAM, HIGH);     // CAM durch HIGH auslösen
    delay(20);                   // Auslöseimpuls 20 Millisekunden
    digitalWrite(CAM, LOW);      // Verbindung trennen
  }
    else                         // wenn BUTTON nicht gedrückt wird ist VAR = HIGH
  {
    digitalWrite(CAM, LOW);
  }
}


Den else Zweig brauchst Du nicht.
_______
Manfred

Go Up