如何使用树莓派制作一个GPIO音乐盒

树莓派音乐盒实验动漫

Introduction

这次我们将按钮连接至树莓派GPIO引脚制作一个播放音乐的简单Python项目。

What you will learn

What you will need

Hardware

  • 树莓派
  • 杜邦线
  • 面包板
  • 按钮

Softdware

  • Python3
  • gpiozero python 模块
  • libav-tools模块,可以按如下安装:
sudo apt install libav-tools

 

What you will do

在raspbian系统中,有很多不同格式声音文件,我们可以在python中统一转换。
首先,我们新建一个名为gpio—music-box文件夹,用于存储此项目的所有文件。

mkdir gpio—music-box

cd gpio—music-box

opt/sonic-pi/etc/samples.下有许多声音文件,我们将其复制到项目文件夹下:

cp opt/sonic-pi/etc/samples/* /home/pi/gpio-music-box/samples

Python无法播放.flac文件,所有我们需要转换成.wav文件。我们使用的是libav-tools:

sudo apt update && sudo apt install libav-tools -y

文件很多,要批处理这些文件则可使用for循环(需在目标目录下):

for f in *.flac; do avconv -i '$f' '${f%.flac}'.wav; done

使用Python3在项目文件夹下新建python文件,先导入pygame来播放一下声音:

import pygame
 pygame.init()

my_sound = pygame.mixer.Sound('samples/drum_tom_mid_hard.wav')

my_sound.play()

成功播放后,就可以接线了,以下是GPIO(General Purpose Input/Output)引脚,GPIO是用于发送和接受外部电路开关信号,例如LED,马达,按钮等:
连接多个按钮可以按如下方式:

树莓派音乐盒实GPIO接线图
树莓派音乐盒实GPIO接线图

我们要使用zerogpio中的按钮触发方法,如下举例用when.pressed = led.on 点亮led:

from gpiozero import Button, LED

btn = Button(17)
 led = LED(4)

btn.when_pressed = led.on

在此项目中我们可以将代码改为:

import pygame

from gpiozero import Button

pygame.init()

btn_drum = Button(2)

btn_splash = Button(3)

btn_cowbell = Button(4)

btn_cymbal = Button(5)

drum = pygame.mixer.Sound('samples/drum_tom_mid_hard.wav')

splash = pygame.mixer.Sound('samples/drum_splash_hard.wav')

cowbell = pygame.mixer.Sound('samples/drum_cowbell.wav')

cymbal = pygame.mixer.Sound('samples/drum_cymbal_closed.wav')

btn_drum.when_pressed = drum.play

btn_splash.when_pressed = splash.play

btn_cowbell.when_pressed = cowbell.play

btn_cymbal.when_pressed = cymbal.play

这份代码应该运行起来没有问题,只不过,当你一旦拥有一个代码原型之后,最好还是做一下整理工作或者升级一下脚本:

import pygame
 from gpiozero import Button

pygame.init()

button_sound = {
 Button(2) :pygame.mixer.Sound('samples/drum_tom_mid_hard.wav'),
 Button(3) : pygame.mixer.Sound('samples/drum_splash_hard.wav'),
 Button(4) : pygame.mixer.Sound('samples/drum_cowbell.wav'),
 Button(5) : pygame.mixer.Sound('samples/drum_cymbal_closed.wav')
 }

for button, sound in button_sound.items():
 button.when_pressed = sound.play

其中使用了字典(dictionary),属于python中的一种数据结构,包含键与值对,两者用‘:’区分,每组又用‘,’区分,例如:

band = {
 'john' : 'rhythm guitar',
 'paul' : 'bass guitar',
 'george' : 'lead guitar',
 'ringo' : 'bass guitar'
 }

有点需要注意的是,尽管你将键值对按顺序每组排好,实际上排列是无序的,所以,你不能依赖他在它能在指定位置出现。如果你想要知道ringo值,则可输入:
band(‘ringo’)

发表评论