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
}