Sound (WAV) in wiringPi-Schleife abspielen

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Moin,
    Es geht bei mir eigentlich nur um eine einfache Programmierung.
    Ich möchte Relais schalten und in diesem Ablauf auch einen Sound abspielen.
    Dieses soll in Schleife geschehen.

    Ich habe nun ein Programm mit wiringPi am laufen und es schaltet so vor sich hin.
    Ich bekomme nur den Sound nicht mit in die Schleife.
    Den Sound einfach so abspielen klappt schon mal. ( sudo aplay cannon.wav )
    Wie bekomme ich nun diesen Befehl mit in die Schleife ?

    Ich bin noch sehr neu auf dem Gebiet und habe nicht so die Ahnung was Programmieren angeht.
    Denke es ist nur eine Kleinigkeit.

    Hab mich dumm gesucht :s

    Vielleicht hat jemand von euch eine schnelle Lösung ?

    Danke schon mal

    mfg
    suti3112

  • Müsste das so nicht gehen ?

    _______________

    // WiringPi-Api einbinden
    #include <wiringPi.h>

    // C-Standardbibliothek einbinden
    #include <stdio.h>

    int main() {

    // Starte die WiringPi-Api (wichtig)

    if (wiringPiSetup() == -1)
    return 1;

    pinMode(0, OUTPUT);
    pinMode(1, OUTPUT);
    pinMode(2, OUTPUT);
    pinMode(3, OUTPUT);
    pinMode(4, OUTPUT);
    pinMode(5, OUTPUT);

    // Dauerschleife
    while(1) {
    digitalWrite(0, 1); //Kanone raus
    delay(4000);
    digitalWrite(1, 1); //Nebel1 an
    digitalWrite(2, 1); //Nebel2 an
    delay(100);
    PlaySound("cannon.wav", NULL, | SND_ASYNC);
    delay(1000);
    digitalWrite(1, 0); //Nebel1 aus
    digitalWrite(2, 0); //Nebel2 aus
    delay(3000);
    digitalWrite(0, 0); //kanone rein
    delay(3000);
    }
    }


    __________________________


    mfg
    suti3112

  • Wie waer's mit Compilieren vor dem Posten ?

    Das geht sicher nicht so durch den Compiler, weil der Operator fuer das Binaere OR zwei Operatoren braucht !

    Die Funktion PlaySound kommt mir hoechst verdaechtig vor: :s

    * Gibt's die wirklich unter Linux ?? Die kenne ich nur von Windows ...
    * Und wenn es sie gibt, braucht sie sicher einen entsprechenden Header

    - - - - -

    Ein Loesungsansatz koennte sein, aplay auszufuehren. Wenn ich aber den Code hier so
    ansehe, glaube ich nicht, dass das je zum laufen kommt.

    - - - - -

    Wenn das alles ist, was gemacht werden soll, und cannon.wav nicht zu lange dauert,
    wuerde ich ein Shellscript schreiben. Die GPIOs koennen naemlich recht gut mit
    einem Script gesteuert werden.

  • Die WAV dauert vll 2 sec. . Nebel muss aber nach 1 sec spätestens wieder aus. Ich habe schon herausgefunden, dass playsound nur unter Windows geht. Ich bin sehr selten am programmieren. Bin vollnoob. Danke schonmal für die Antwort. Über einen Lösungsansatz würde ich mich freuen .

  • Ich hab gerade nix an den GPIOs, aber so muesste es laufen:

    In einem File namens show speichern.

    Dann die benutzten GPIOs im Script angeben ! Dafuer sind die
    Definitionen ab Zeile 8. NUR DORT aendern.

    Daraufhin das File ausfuehrbar machen: chmod 755 show
    Und ausfuehren: sudo ./show

    - - - -

    Beim zweiten Start kommt die Meldung:
    ./show: Zeile 14: echo: Schreibfehler: Das Gerät oder die Ressource ist belegt.

    Das tritt auf weil die Pins schon als Ausgang definiert sind.
    Das wuerde man mit einer Abfrage sicher noch wegkriegen.

    Oder das Script aufteilen in zwei:
    * Initialisierung
    * Schleife

    Und die Initialisierung nur einmal ausfuehren

  • Vielen dank ! Werde es morgen direkt ausprobieren .


    UPDATE:
    ________________________

    Klappt soweit ganz gut!

    Leider muss der Nebel jetzt mindestens so lange wie der Sound spielt an bleiben?

    Somit würde ich mich noch über eine kleine Info freuen.

    Wie muss die Schleife aussehen, wenn ich aufgrund eines pins den Sound abspielen will?
    Also wenn ich pin X zu GND schalte soll der Sound abgespielt werden.

    Dann würde ich meinen Arduino für die ganze Sache nehmen und den Raspberry nur für den Sound.
    Der Arduino läuft jetzt bereits in der Wirkumgebung.

    mfg suti3112


    UPDATE 2:
    ____________Wo sind die Fehler?


    #!/bin/bash
    #
    # V0.01 11-FEB-2014 Tell
    #

    # Define the GPIOs to be used

    BAM=17

    # Export the GPIOs and set the mode to output

    echo "$BAM" > /sys/class/gpio/export
    echo "in" > /sys/class/gpio/gpio$BAM/direction
    chmod 666 /sys/class/gpio/gpio$BAM/direction
    chmod 666 /sys/class/gpio/gpio$BAM/value

    # The main loop

    while true;
    do
    VAL=$(cat /sys/class/gpio/gpio$BAM/value)
    if [[ $VAL == 0 ]]
    then
    aplay cannon.wav &
    else
    sleep 1
    fi
    done


    ______________________

    Ich habe scheinbar wirklich gar keine Ahnung.

    suti3112

    Einmal editiert, zuletzt von suti3112 (13. Februar 2014 um 14:52)

  • > Leider muss der Nebel jetzt mindestens so lange wie der Sound spielt an bleiben?
    Noeh, der Sound wird in einem unabhaengigen Prozess abgespielt (dafuer sorgt das &
    am Ende der Zeile). Er muss bloss kuerzer sein als die ganze Schleife.


    > if [[ $VAL == 0 ]]
    [font="Tahoma, Verdana, Arial, sans-serif"]if [ $VAL -eq 0 ][/font]

    [font="Tahoma, Verdana, Arial, sans-serif"]== ist ein Synonym fuer = und das wiederum ist ein Stringvergleich[/font]

    [font="Tahoma, Verdana, Arial, sans-serif"]Es koennte aber auch so gehen (ausprobieren !):[/font]

    [font="Tahoma, Verdana, Arial, sans-serif"]if [ "$VAL" == "0" ][/font]


    Und hier sicher KEIN & sonst werden tausende von Background-Prozessen gestartet !!

    - - - - -

    Da habe ich schon mal was aehnliches gepostet: Laerm so lange ein Input aktiv ist

    Einmal editiert, zuletzt von Tell (14. Februar 2014 um 00:47)

  • Tach auch, und keinen Applaus bitte :fies:

    also mit der Hintergrund-Verabeitung sollte auch gehen und wäre sogar sinnvoller.
    Du schriebst hier was von einer Sekunde ...

    Ich würde:

    Bedingung erfüllt?
    -> JA
    Starte APlay im Hintergrund
    player_fd = popen(aplay canon.wav &". ...
    Starte Nebel oder whatever.
    sleep(1);
    fclose ( player_fd ); // damit wird der Player abgewürgt
    ...


    -> NEIN
    Nix tun, loopen

    Salü,
    -ds-

  • Danke an alle. Habe beim testen gemerkt dass der Prozess im Hintergrund läuft . Soweit bin ich dann fertig. Autostart bekommt ich auch noch hin . Dann muss es nur noch den Dauertest bestehen .

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!