Raspi per Knopfdruck Musik abspielen lassen.

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
Blitzkid
User
Beiträge: 10
Registriert: Mittwoch 10. April 2019, 18:13

Hi :)

Ich bin ein Neueinsteiger in dem Bereich und bastle mir gerade mein erstes Projekt zusammen. Da ich noch nicht viel von Python und einer Linuxumgebung verstehe, habe ich bisher auf bereits geschriebenen Code zurückgegriffen und lediglich minimal verändert.

Nun zu meinem Projekt und dem damit verbundenen Problem :)

Mein Plan ist es einen Raspi zu starten und dieser soll nach dem Boot per Knopfdruck ein bestimmtes Lied abspielen können. Ich habe bereits einen Service über system.d erstellt und dieser funktioniert auch tatellos.
Auch die Musikwiedergabe funktioniert mit den angehängten Code wunderbar. Mein Problem besteht darin, dass ich den Button direkt an die GPIO-Pins anbinden möchte und somit auf ein Breadboard verzichten kann.

Code: Alles auswählen

#Code mit Breadboard
import time
import os
import board
import digitalio

print("Drück den Knopf!")

button1 = digitalio.DigitalInOut(board.23)
button1.direction = digitalio.Direction.INPUT
button1.pull = digitalio.Pull.UP

while True:
    if not button1.value:
        
        wave_obj = os.system('omxplayer /home/pi/Music/Shots/Shots.mp3 &')
        time.sleep(18)
        
    time.sleep(.25)
Wie kann ich der digitalio.DigitalInOut()-Funktion sagen, dass es kein board Pin sein soll, sondern einer, der direkt auf dem Raspi sitzt. In meinem Fall wäre es der BCM.21-Pin.

Ich habe mittlerweile wirklich einiges ausprobiert, allerdings immer nur Syntaxerror erhalten. Da ich noch nicht wirklich fit in der Marterie bin und somit das Troubleshooting verständlicherweise aufwendig ist, wende ich mich nun an euch. Ich denke es handelt sich lediglich um eine kleine Codeänderung...

Vielen Dank schonmal im Vorraus
Blitzkid
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das Breadboard hat doch mit deinem Problem nichts zu tun. Das ist doch reines elektromechanisches verbinden. Den Pin am PI den du benutzt kannst du doch direkt mit dem Knopf verbinden.
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und noch ein kurzer Nachtrag: ich wuerde - wenn es wirklich nur das sein soll - keinen PI nehmen. Sondern einen Arduino mit MP3-player. Der ist VIEL robuster.
Blitzkid
User
Beiträge: 10
Registriert: Mittwoch 10. April 2019, 18:13

Danke schonmal für die schnelle Antwort :)

Ich habe den Pin direkt mit dem Pi verbunden (Bild angehängt), allerdings bekomme ich es nicht im Code hin, dem Pi zu sagen, dass er "button1 = digitalio.DigitalInOut(gpio.21)" benutzen soll anstatt "button1 = digitalio.DigitalInOut(board.23)".

Bild

Ich habe den Raspi genommen, da ich damit in Zukunft noch andere Projekte machen möchte :)

Besten Dank
Blitzkid
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich weiss nicht, woher dieses board Modul kommt. Hast du dazu Dokumentation? Und grundsaetzlich hat es doch vorher auch geklappt, der Pin den du benutzt hast, der war dann eben ein anderer als der, den du jetzt nimmst - aber IRGENDEINER der verfuegbaren ist es ja. Ist doch egal, wo du das Kabel anklemmst, oder?
Blitzkid
User
Beiträge: 10
Registriert: Mittwoch 10. April 2019, 18:13

Die Anbindung vom Raspi an ein Breadboard über ein "40 Pin GPIO Extension Board" funktioniert. Darauf hatte ich einen Push-Button, der das Signal auf D23 gesendet hat, sobald er gedrückt wurde. Das ganze funktionierte über den Code "button1 = digitalio.DigitalInOut(board.D23)". Wenn ich jetzt aber das Extension Board vom Pi trenne und einen Button direkt an den Pin hänge, wie im Bild oben, dann findet "button1 = digitalio.DigitalInOut(board.D23)" ja nicht mehr D23 und es passiert nichts wenn ich den Knopf drücke.

Ich hoffe es ist jetzt verständlich was mein Problem ist :)
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nicht wirklich. Das Board kenne ich immer noch nicht. Und damit auch nicht die umnummerierung.

Du benutzt eine Bibliothek die ungewöhnlich ist. Wenn du stattdessen zb gpiozero benutzt, dann ist es dort sehr einfach dein Programm zu schreiben, und es ist gut dokumentiert welchen Pin man wie erreicht. Alternativ verrate bitte genau, welches Produkt du da verwendest, und woher der Code kommt.
Blitzkid
User
Beiträge: 10
Registriert: Mittwoch 10. April 2019, 18:13

Es handelt sich um einen raspberry pi 3 b und den Code hab ich folgendem Link entnommen: https://learn.adafruit.com/playing-soun ... i/overview

Ich werde mal versuchen die genannte Bibliothek zu verwenden und melde mich dann nochmals. Besten Dank :)
Blitzkid
User
Beiträge: 10
Registriert: Mittwoch 10. April 2019, 18:13

So ich melde mich wieder zurück mit erfreulichen Nachrichten :) Ich hab es endlich hinbekommen. Dein Hinweis, dass es auch noch andere GPIO Bibliotheken gibt, hat mich endlich zum Ziel geführt.

Anbei der Code:

Code: Alles auswählen

import pygame
from gpiozero import Button
import time

pygame.init()

def play_shots():
    print ("Shots!")
    shots.play
    time.sleep(18)
        
btn_audio = Button(23)
shots = pygame.mixer.Sound('/home/pi/Music/Shots/Shots.wav')

btn_audio.when_pressed = play_shots
Dadurch wird durch Buttondruck der Song gespielt und danach 18sec (Dauer der Wiedergabe) gewartet bevor der Button wieder betätigt werden kann.

Besten Dank nochmal :)
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wirklich? Ohne Klammern beim Play? Das wundert mich.

Aber schön wenn’s klappt.
Antworten