GPIO music box 210194c475687be6
What you will do
这次我们将按钮连接至树莓派GPIO引脚制作一个播放音乐的简单Python项目。
What you will learn· 使用pygame播放声音 · 连接GPIO引脚 · 在python中使用字典(dictionary)数据结构 What you will need
Hardware:
· 树莓派 · 杜邦线 · 面包板 Softdware: Python3 gpiozeropython 模块 · 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,马达,按钮等: 连接多个按钮可以按如下方式: 我们要使用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’) · 你还可以做一些挑战,比如,按按钮后,播放声音的同时闪烁LED。 W
X微信可关注:
|