背景介绍

听倦了每天早晨的起床铃声,从醒来的那一刻就想拥有不同的开始。就像高中时早餐伴随着英语听力,把从起床到出门的时间充分利用起来。因此利用手中的树莓派和小音箱,每天定时播放喜欢的内容。

方案概述

树莓派是一个运行着Linux系统的微型计算机主板,手中的是一代B型,2个USB接口、3.5mm音频输出以及GPIO接口。

树莓派图

在实际测试中发现,树莓派自带的3.5mm音频输出功率太小,虽然可以推动耳机,但外接到音箱上,即使把音箱声音开到最大,声音依旧很小,所以声音输出采用了PCM 2704USB声卡,测试后满足需求。

使用系统自带的定时任务,控制音箱的开闭,播放音频。蓝牙音箱,有外接音源输入接口,音箱的开关是个微动按钮,按下开启,再按下关闭。如果一段时间没有播放,会自动关机,所以要能够让树莓派控制音箱的开闭,需要对音箱的开关做一些改动。通过树莓派的GPIO口来控制音箱开关。

准备工具:
树莓派、洞洞板、音箱、电烙铁、继电器、焊锡、杜邦线、排针等。

实现过程

控制音箱

首先对音箱进行改造。拆开音箱,观察电源按钮,是个微动开关。

微动开关

三个引脚,一个脚是公共地端,另两个是开关的输入端。用万用表测量两个输入引脚之间的电压,约4v,是供电锂电池的电压。推测当按下电源键,处于关闭状态的音箱检测到这两端连通,则开机。处于开启状态的音箱检测到这两端连通,则关闭。所以树莓派控制音箱开闭的关键,就是控制这两个开关输入端的连接与断开。

清楚原理后,用导线将这两端引出到音箱外面。

引线图

通过树莓派的GPIO口来控制继电器,继而控制这两端的开闭,模拟手动按下电源键。

引线完成

继电器电路设计如下,2脚和5脚连接树莓派GPIO口(不区分正负极),用于控制继电器。1脚和3脚连接音箱的引线(不区分正负极),其通断被继电器控制。继电器原理图如下。

继电器图

不型号继电器有不同的开关电压值,我选择的是3v继电器。当2脚和5脚两端加上3v电压,继电器通电,继电器内电磁感应吸引簧片,被控端导通,1脚与3脚导通,模拟按键按下。当2脚和5脚两端无电压差,继电器断开,1脚与3脚断开,模拟按键松开。

树莓派GPIO口如下图所示。

物理引脚

为了能够驱动继电器,选择了13和14脚(对应表中物理引脚/BOARD引脚一栏,下同),当13脚置为高电平时,13脚14脚两端电压与继电器两端电压同为3.3v,此时继电器导通。当13脚置为低电平时,继电器两端电压0v,此时继电器断开。完成一次模拟电源键按下导通,松开断开的过程。

树莓派使用python来控制GPIO口,安装库RPi.GPIO,命令:

wget https://pypi.python.org/packages/source/R/RPi.GPIO/RPi.GPIO-0.6.2.tar.gz
tar -zxf RPi.GPIO-0.6.2.tar.gz
cd RPi.GPIO-0.6.2
python setup.py install

控制程序:

#!/usr/bin/env python
import RPi.GPIO as GPIO
import time
import os

#GPIO 初始化
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)#使用板载引脚序号
GPIO.setup(13,GPIO.OUT)#设置13脚为输出模式

#13脚输出持续1秒的高电平,控制继电器闭合触电闭合
GPIO.output(13,GPIO.HIGH)
time.sleep(1)
GPIO.output(13,GPIO.LOW)

#执行mplayer命令播放mp3文件,播放完毕前程序会阻塞于此
os.system('mplayer ~/Music/*.mp3')

#播放完毕后关闭音箱
GPIO.output(13,GPIO.HIGH)
time.sleep(1)
GPIO.output(13,GPIO.LOW)

树莓派声音输出

由于树莓派自带的3.5mm音频输出推力不够,因此使用PCM 2704 USB 声卡输出音频。声卡通过USB与树莓派连接,免驱动,可直接识别,声卡的输出端有光纤,3.5mm和同轴,用一根3.5mm-3.5mm音频线连接声卡与音箱。命令alpay -l来查看当前声卡设备信息。

声卡图

图上可以看到USB声卡是card 1,修改~/.asoundrc文件,把默认的声音输出设置为PCM 2704声卡,如果无该文件则新建,内容如下:

pcm.!default {
    type hw
    card 1
}
ctl.!default {
    type hw
    card 1
}

card 1为USB声卡在本机识别到的序号。设置好后,查看默认声卡:

alsamixer

alsamxier

上图左上角显示默认声卡为USB DAC,设置成功。
到此,所有的连线均已完成,总连接图如下。

total

播放内容:

连接好后,使用mplayer播放器测试音箱是否正常播放。mplayer是Linux下常用的媒体播放器,安装方法:

sudo apt-get install mplayer

将MP3文件复制到树莓派中,播放命令:

mplayer music.mp3

播放过程中,/控制音量减,*控制音量加,左右方向键快退快进10秒,q或ESC退出播放。

树莓派定时任务

为了每天早晨定时开启音箱并播放声音,需要让树莓派定时执行python脚本。可以用系统的定时任务来实现。新增调度任务:
编辑文件/etc/crontab,配置格式字段:

|Minute|Hour|Day|Month|Dayofweek|user|Command| |-| |分钟|小时|天|月|天每星期|用户|命令|

字段解释:

Minute:每个小时的第几分钟执行该任务
Hour:每天的第几个小时执行该任务
Day:每月的第几天执行该任务
Month:每年的第几个月执行该任务
User:执行命令的用户
DayOfWeek:每周的第几天执行该任务
Command:指定要执行的程序

在这些字段里,除了Command是每次都必须指定的字段以外,其它字段皆为可选 对于不指定的字段,要用“*”来填补其位置,字段之间空格隔开。

比如我要在每天早晨7点执行python脚本,则/etc/crontab文件可以这样配置:

0 7 * * * pi ~/Projects/SmartHome/main/goodMorning.py

效果与总结

每天早晨定时播放选定的内容,播放完后关闭音箱。完成了当初的设想,但还有很多改进点,例如不仅能够播放本地媒体,还可以播放网络在线内容。连线比较混乱,裸露电线在外面,导致外观看起来不一体。 最后要注意使用定时任务时,树莓派的系统时间是否与当地时间相同,树莓派联网后,默认会同步系统时间与网络时间一致。配置的时区是否正确(中国为+8时区)。