teddy2017 发表于 2017-8-17 22:20:36

GPIO music box

GPIO music box210194c475687be6

What you will do
这次我们将按钮连接至树莓派GPIO引脚制作一个播放音乐的简单Python项目。 What you will learn·       使用pygame播放声音·       连接GPIO引脚·       使用gpiozero库调用函数,更多方法及属性可查看:http://gpiozero.readthedocs.io/en/stable/recipes.html#gpio-music-box·       在python中使用字典(dictionary)数据结构What you will need
Hardware:·       树莓派·       杜邦线·       面包板Softdware:Python3gpiozeropython 模块·       libav-tools模块,可以按如下安装:sudo apt install libav-tools
What you will do
在raspbian系统中,有很多不同格式声音文件,我们可以在python中统一转换。首先,我们新建一个名为gpio—music-box文件夹,用于存储此项目的所有文件。mkdir gpio—music-boxcd 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 pygamefrom 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.playbtn_splash.when_pressed =splash.playbtn_cowbell.when_pressed =cowbell.playbtn_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。·       最后代码可在:https://github.com/teddypeng/GPIO-music-box.git 查看。W
X微信可关注:

页: [1]
查看完整版本: GPIO music box