Hilfe bei Programmierung - mechanisch animierter Schädel mit Soundausgabe

Guten Morgen alle zusammen …

Wir sitzen zur Zeit an einem Projekt. Es soll ein mechanisch animierter Kopf werden. Wir sind mitlerweile soweit, dass dieser Schädel den Kiefer per Tastendruck über einen Servo auf und zufahren lässt und dies solange in einer Funktion weiter macht bis der zweite Taster gedrückt wird und der Servo auf 0 Grad fährt und damit den Kiefer schließt.

Nun möchten wir über ein SD Karten Modul einen Ton abspielen und den Servo so programmieren, dass solange der Sound gespielt wird, sich der Kiefer bewegt und anschließend wieder in die Ausgangslage fährt.
Jedoch soll dennoch über den 2. Taster der Sound und der Servo abschaltbar sein.

Hier unser bisheriger Programmcode.

#include <Servo.h>
#define BUTTONMODE INPUT // use INPUT or INPUT_PULLUP
#define NUMBUTTONS 2
const byte buttonPins[NUMBUTTONS]= {2,3};
byte buttonState[NUMBUTTONS];
byte buttonPressed[NUMBUTTONS];

Servo myServo;
boolean servoActive;
unsigned long servoActiveSince;
int servoPos=0;

void input()
{
memset(buttonPressed,0,sizeof(buttonPressed)); // clear buttonPressed array
for (int i=0;i<NUMBUTTONS;i++)
{
byte currentState=digitalRead(buttonPins*);*

  • if (BUTTONMODE==INPUT) currentState=!currentState; // inverted logic with INPUT_PULLUP*
    if (currentState && !buttonState_) buttonPressed*=true;
    buttonState=currentState;
    }
    }
    void processing()
    {
    if (buttonPressed[0]) // first button is pressed ==> activate Servo*

    * {
    Serial.println(“Button pressed - Servo active”);
    servoActive=true;
    servoActiveSince=millis();
    servoPos=0;
    }
    if (buttonPressed[1]) // second button pressed ==> abort / deactivate Servo*

    * {
    Serial.println(“Cancel Button pressed”);
    servoActive=false;
    servoPos=0;
    }
    if (servoActive) // servo is currently active with rotating*

    * {
    long activeTime=millis()-servoActiveSince;
    #define DURATION 2000*

    * activeTime= activeTime%DURATION; // modulo arithmetik: activeTime alsways starts from 0 and counts up*
    servoPos= 180activeTime/DURATION; // rotate as time goes by_
    _ }
    else servoPos=00; // servo not active*

    }
    void output()
    {
    * static int oldServoPos=-1;
    if (servoPos==oldServoPos) return;
    oldServoPos= servoPos;
    myServo.write(servoPos);
    Serial.println(servoPos);
    }
    void setup() {
    Serial.begin(9600);
    Serial.println(“Good night and good luck!”);
    for (int i=0;i<NUMBUTTONS;i++)
    {
    pinMode(buttonPins, BUTTONMODE);
    }
    myServo.attach(8);
    }
    void loop() { // round-robin-scheduling of three tasks: input, processing, output
    input();
    processing();
    output();
    delay(5); // kleines Delay zur Verhinderung von Tasterprellen*

    }[/quote]
    Dies ist unser SD-Karten Modul:
    http://www.amazon.de/COM-FOUR®-Karten-Leser-Modul-Sockel-Arduino/dp/B00WE8BJ1K/ref=sr_1_2?ie=UTF8&qid=1435308562&sr=8-2&keywords=sd+karten+modul+arduino
    Ich bitte um eure Hilfe, da wir mit unserem Latein leider mitlerweile am Ende angelangt sind =)
    Würden uns sehr freuen
    Liebe Grüße
    Sören & Fred_

Irgendwie fehlt hier das Soundmodul! Für das Auslesen von Musikdateien auf einer SD Karte ist der Arduino nicht geeignet.

Es gibt Audiomodule, die können das sehr geschmeidig.

Schau mal hier, da hab ich was dazu geschrieben.

Danke für die schnellen Antworten.
Gibt es denn eine Möglichkeit dies ohne ein audiomodul zu bewerkstelligen?
Bzw. gibt es ein fähiges welches per Amazon Prime lieferbar ist? Wir wollen dieses Projekt nämlich bis kommenden Freitag beenden

Nein, ohne Audio Modul wird das nichts. Für sowas ist der Arduino nicht schnell genug. Ob nun Amazon oder wer anderes ist doch vollkommen egal. Die liefern alle mit Post/DHL, Hermes etc. Schau in der Bucht.

SoerenBrt:
Ich bitte um eure Hilfe, da wir mit unserem Latein leider mitlerweile am Ende angelangt sind =)

Für ein Animatronic-Projekt hättet ihr mal lieber ein anderes Wahlpflichtfach als Latein wählen sollen.

Um eine Animatronic zu bauen, wäre es nicht schlecht, einen Ingenieur und einen Informatiker im Team zu haben.

Und warum kauft ihr so ein beschissenes SD-Kartenmodul für so viel Geld? Das Teil hat nur einen Spannungswandler für die Betriebsspannung drauf, um das Ding an einem 5V Arduino zu betreiben, braucht ihr noch entweder einen Pegelwandler von 5V auf 3.3V für die Signalleitungen zusätzlich, oder wenigstens ein paar Widerstände, die als Spannungsteiler für die Signale vom Arduino zum Modul geschaltet sein müssen. Ist Euch die notwendige Beschaltung für das SD-Modul klar? Habt ihr das testweise bereits mit einem Sketch zum Laufen bekommen?

Wie lang (Dauer in Sekunden) soll denn der Sound sein, der gespielt wird? Direkt von einer SD-Karte könnt ihr sowieso nur 8-bit PCM-Soundsamples mit 8 kHz Samplingfrequenz abspielen. Der Sound belegt dann 8 kB pro Sekunde und ist von sehr bescheidener Qualität, wenn ihr kein richtiges Audio-Modul verwenden möchtet.

Falls der Sound nur maximal 3,5 Sekunden lang dauern soll, sagen wir mal Eure Animatronics soll nur kurz "Hasta la vista, Baby" sprechen können, könntet ihr das SD-Kartenmodul auch weglassen und das Soundsample als PROGMEM-Datenarray im Sketch mit unterbringen.

Habt ihr überhaupt einen geeigneten Lautsprecher zur Ausgabe von Ton, den ihr bereits mit der Arduino tone() Funktion erfolgreich getestet habt?