树莓派论坛

 找回密码
 立即注册

GPIO music box

teddy2017 发表于 2017-8-17 22:20:36 | 显示全部楼层 |阅读模式
GPIO music box
210194c475687be6


GPIO music box.png
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
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()

成功播放后,就可以接线了,以下是GPIOGeneral Purpose Input/Output)引脚,GPIO是用于发送和接受外部电路开关信号,例如LED,马达,按钮等:
GPIO.png
连接多个按钮可以按如下方式:
GPIO WIRE.png
我们要使用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。
·       最后代码可在:https://github.com/teddypeng/GPIO-music-box.git 查看。
W

X微信可关注:

Wechat .jpg

716155497549380526.jpg
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版 | Archiver | 树莓派论坛 ( 粤ICP备15075382号-1 )