GPIO music box210194c475687be6
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微信可关注: