/*
Servo-Sequenzer mit SD-Karten-Speicherung
Dieses Arduino-Programm ermöglicht das Aufzeichnen und Abspielen von Sequenzen von Servomotorbewegungen.
Servo-Positionen werden mithilfe von Potentiometern gesteuert und auf einer SD-Karte aufgezeichnet.
Zwei Tasten werden zur Steuerung von Aufnahme und Wiedergabe verwendet, und LEDs zeigen den aktuellen Modus an.
Komponenten:
- Zwei Servomotoren, verbunden mit den Pins 6 und 9
- Zwei Potentiometer, verbunden mit den analogen Pins A0 und A1
- Zwei Tasten, verbunden mit den digitalen Pins 2 und 3 für Aufnahme und Wiedergabe
- Zwei LEDs, verbunden mit den digitalen Pins 4 und 5 zur Anzeige von Aufnahme und Wiedergabe
Anleitung:
1. Drücke die "Aufnahme"-Taste, um die Aufzeichnung der Servopositionen zu starten. Passe die Potentiometer an, um die Servos zu bewegen.
Drücke die "Aufnahme"-Taste erneut, um die Aufzeichnung zu stoppen.
2. Drücke die "Wiedergabe"-Taste, um die aufgezeichnete Sequenz abzuspielen.
3. Passe die Potentiometer während der Aufnahme an, um Servopositionen aufzuzeichnen.
4. Die "Aufnahme"-LED leuchtet während der Aufzeichnung, und die "Wiedergabe"-LED leuchtet während der Wiedergabe.
Hinweis: Stelle sicher, dass die SD-Karte ordnungsgemäß formatiert und angeschlossen ist.
Autor: Marvin Haselbach - Gruselhaus-Bellheim.de
Datum: 26.08.2023
*/
#include <Servo.h>
#include <SD.h>
#include <SPI.h>
Servo servo1;
Servo servo2;
int potPin1 = A0;
int potPin2 = A1;
int recordButtonPin = 2;
int playbackButtonPin = 3;
int recordLedPin = 4; // Pin für die Aufnahme-LED
int playbackLedPin = 5; // Pin für die Wiedergabe-LED
int potValue1 = 0;
int potValue2 = 0;
int servoPos1 = 0;
int servoPos2 = 0;
bool recording = false;
bool playback = false;
File dataFile;
void setup() {
servo1.attach(9);
servo2.attach(6);
pinMode(recordButtonPin, INPUT);
pinMode(playbackButtonPin, INPUT);
pinMode(recordLedPin, OUTPUT); // LED-Pin als Ausgang festlegen
pinMode(playbackLedPin, OUTPUT); // LED-Pin als Ausgang festlegen
// Initialisiere die SD-Karte
if (!SD.begin(10)) {
while (1) {
digitalWrite(recordLedPin, HIGH); // Aufnahme-LED blinkt
digitalWrite(playbackLedPin, HIGH); // Wiedergabe-LED blinkt
delay(500); // Kurze Pause zwischen den Blinkzyklen
digitalWrite(recordLedPin, LOW);
digitalWrite(playbackLedPin, LOW);
delay(500);
}
}
playbackSequence(); // Starte Wiedergabe der Sequenz beim Start
}
void loop() {
// Prüfe den Aufnahme-Taster
if (digitalRead(recordButtonPin) == HIGH) {
if (!recording && !playback) {
// Starte Aufnahme
recording = true;
digitalWrite(recordLedPin, HIGH); // Aktiviere Aufnahme-LED
eraseFile(); // Lösche die Datei zum Überschreiben
dataFile = SD.open("recordings.txt", FILE_WRITE);
} else if (recording) {
// Beende Aufnahme, starte Wiedergabe
recording = false;
digitalWrite(recordLedPin, LOW); // Deaktiviere Aufnahme-LED
if (dataFile) {
dataFile.close(); // Schließe Datei nach der Aufnahme
}
playback = true;
} else if (playback) {
// Beende Wiedergabe
playback = false;
}
delay(200); // Vermeide Tasterflattern
}
// Prüfe den Wiedergabe-Taster
if (digitalRead(playbackButtonPin) == HIGH && !recording) {
// Starte Wiedergabe
playback = true;
delay(200); // Vermeide Tasterflattern
}
if (recording) {
// Aufnahme-Modus
potValue1 = analogRead(potPin1);
potValue2 = analogRead(potPin2);
servoPos1 = map(potValue1, 0, 1023, 0, 180);
servoPos2 = map(potValue2, 0, 1023, 0, 180);
servo1.write(servoPos1);
servo2.write(servoPos2);
savePositionToSD(servoPos1, servoPos2);
delay(15); // Kurze Pause, um Flattern zu vermeiden
} else if (playback) {
// Wiedergabe-Modus
playbackSequence();
}
}
// Funktion zum Speichern der Servo-Positionen auf der SD-Karte
void savePositionToSD(int pos1, int pos2) {
if (dataFile) {
dataFile.println(pos1);
dataFile.println(pos2);
dataFile.flush(); // Daten auf SD-Karte schreiben
}
}
// Funktion zur Wiedergabe der aufgezeichneten Sequenz
void playbackSequence() {
if (SD.exists("recordings.txt")) {
dataFile = SD.open("recordings.txt");
while (dataFile.available()) {
int storedPos1 = dataFile.parseInt();
int storedPos2 = dataFile.parseInt();
servo1.write(storedPos1);
servo2.write(storedPos2);
delay(100); // Pause zwischen den Schritten
}
dataFile.close();
}
}
// Funktion zum Löschen der Datei auf der SD-Karte
void eraseFile() {
SD.remove("recordings.txt");
}