DIY Arduino Drahtauslöser

Kleines „Quick and Dirty“ DIY-Arduino-Projekt für einen Drahtauslöser, der mithilfe eines Servomotors eine mechanische Auslösebewegung erzeugt. Das System verfügt über Tasten zur Einstellung der Auslösedauer in Sekunden sowie eine Start- und Reset-Taste. Eine 7-Segment-Display zeigt die eingestellte Zeit an. Während des Betriebs signalisieren zwei LEDs den Status des Systems. Der Servomotor bewegt sich entsprechend der eingestellten Zeit und kehrt dann in die Ausgangsposition zurück. Das Projekt bietet eine Möglichkeit, analoge Kameras und Verschlüsse für eine bestimmte Zeit im Bulbmodus auszulösen. Je nach den eigenen Bedürfnissen kann das Projekt angepasst werden. Der nächste Schritt liegt im ätzen einer Platine und der Verwendung von eines kleineren Microcontroller, dieser Blogartikel wird daher Schritt für Schritt erweitert.

Teileliste:

  • 1x Mikrocontroller wie beispielsweise einen Arduino UNO oder einen Clone
  • 4x Taster
  • 2x LEDs mit entsprechenden Vorwiderständen
  • 1x Servermotor
  • 1x TM1637 Display
  • 1x Batterieanschluss 9V Blockbatterie
  • 4x Entprellwiderstände
  • Verbrauchsmaterial wie Kabel, Platinenmaterial, usw.

Anbei der Code:

#include <Servo.h>

#include <TM1637Display.h>

// Programmcode Rainer Leyk

// Pin für die Taster

const int plusTastePin = 2;

const int minusTastePin = 3;

const int startTastePin = 4;

const int resetTastePin = 5;

// Pin für den Servomotor

const int servoPin = 9;

// Pin für die rote LED

const int redLedPin = 13;

// Pin für die grüne LED

const int greenLedPin = 10;

// 7-Segment-Display

#define CLK 6 // Clock Pin

#define DIO 7 // Data Pin

TM1637Display display(CLK, DIO);

Servo servoMotor;

int dauer = 0; // Startdauer des Motorlaufs

bool motorAktiv = false; // Variable zur Verfolgung, ob der Motor aktiv ist

unsigned long motorStartzeit = 0; // Zeitpunkt, zu dem der Motor gestartet wurde

unsigned long previousMillis = 0; // Variable zur Speicherung der letzten Millisekunden für das Blinken

void setup() {

  // Initialisierung der Taster-Pins

  pinMode(plusTastePin, INPUT);

  pinMode(minusTastePin, INPUT);

  pinMode(startTastePin, INPUT);

  pinMode(resetTastePin, INPUT);

  // Initialisierung des Servomotors

  servoMotor.attach(servoPin);

  servoMotor.write(0); // Setze den Motor in die Ausgangsposition

  // Initialisierung der LED-Pins

  pinMode(redLedPin, OUTPUT);

  pinMode(greenLedPin, OUTPUT);

  // Initialisierung des 7-Segment-Displays

  display.setBrightness(0x0f); // Helligkeit einstellen (0x0f ist die maximale Helligkeit)

}

void loop() {

  // Überprüfung, ob die Plus-Taste gedrückt wurde

  if (digitalRead(plusTastePin) == HIGH) {

    dauer++; // Erhöhe die Laufzeit um 1 Sekunde

    delay(200); // Entprellzeit

  }

  // Überprüfung, ob die Minus-Taste gedrückt wurde

  if (digitalRead(minusTastePin) == HIGH) {

    dauer = max(0, dauer – 1); // Verringere die Laufzeit um 1 Sekunde, aber mindestens 0 Sekunden

    delay(200); // Entprellzeit

  }

  // Überprüfung, ob die Start-Taste gedrückt wurde

  if (digitalRead(startTastePin) == HIGH && !motorAktiv) {

    // Wenn die Start-Taste gedrückt wurde und der Motor nicht bereits aktiv ist

    digitalWrite(redLedPin, HIGH); // Aktiviere die rote LED

    digitalWrite(greenLedPin, LOW); // Deaktiviere die grüne LED

    servoMotor.write(90); // Bewege den Motor auf 90 Grad

    motorAktiv = true; // Setze den Motorstatus auf aktiv

    motorStartzeit = millis(); // Speichere den Zeitpunkt, zu dem der Motor gestartet wurde

    previousMillis = millis(); // Setze die Variable für das Blinken

  }

  // Überprüfung, ob der Motor aktiv ist und die Zeit abgelaufen ist

  if (motorAktiv && (millis() – motorStartzeit >= dauer * 1000)) {

    // Wenn der Motor aktiv ist und die Zeit abgelaufen ist

    servoMotor.write(0); // Setze den Motor in die Ausgangsposition zurück

    digitalWrite(redLedPin, LOW); // Deaktiviere die rote LED

    digitalWrite(greenLedPin, HIGH); // Aktiviere die grüne LED

    motorAktiv = false; // Setze den Motorstatus auf inaktiv

  }

  // Überprüfung, ob die Reset-Taste gedrückt wurde

  if (digitalRead(resetTastePin) == HIGH) {

    // Wenn die Reset-Taste gedrückt wurde, setze die ausgewählte Zeit zurück

    dauer = 0;

    delay(200); // Entprellzeit

  }

  // Überprüfung, ob die LED blinken soll

  unsigned long currentMillis = millis();

  if (motorAktiv && currentMillis – previousMillis >= 500) {

    // Wenn der Motor aktiv ist und genug Zeit vergangen ist

    previousMillis = currentMillis; // Aktualisiere die Zeit für das nächste Blinken

    digitalWrite(redLedPin, !digitalRead(redLedPin)); // Ändere den Zustand der roten LED (blinken)

  }

  // Anzeigen der gewählten Zeit auf dem 7-Segment-Display

  int minutes = dauer / 60; // Berechnung der Minuten

  int seconds = dauer % 60; // Berechnung der Sekunden

  int time = minutes * 100 + seconds; // Kombinieren von Minuten und Sekunden für die Anzeige

  display.showNumberDecEx(time, 0b01000000, true); // Anzeigen der Zeit im Minuten-Sekunden-Format

}

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert