https://github.com/ma6174/fmpi
树莓派FM广播点歌系统
简介
前段时间有人发贴说用树莓派可以发射FM收音机信号, 于是便整来玩玩,发现效果还不错,于是想扩充一下功能。
网上实现的FM发射功能是有局限性的:
只能播放wav格式文件,并且wav文件必须是16 bit 22.5kHz Mono格式的。
只支持播放本地音频文件,或者使用-从终端读取音频
我设想的或已经实现的功能是这样的:
支持mp3格式
支持流媒体,或者说支持直接播放网络上的音乐
可以添加音乐,方便管理
可以批量添加歌曲
可以播放局域网内电脑上的音乐
自动根据歌名在线搜索歌曲并播放
有一个web页面,允许任何人添加自己喜欢的歌曲
web页面显示当前正在播放的歌曲和将要播放的歌曲列表
当播放列表里面没有歌曲的时候自动随机播放一首歌曲,保证连续播放
可以跳过正在播放的歌曲播放下一曲
安装我做的系统之后你就可以用树莓派做服务器, 发送广播,播放流行歌曲或者英语听力(或者法律允许播放的东西) 告诉亲朋好友一个网址,然后他们就能在上面点歌。 四六级没过的朋友可以添加四六级听力,模拟真实考试环境。 或者放到敬老院里面,给老年人播放戏曲。 除此之外,只要程序运行着,你就能用收音机听到音乐, 不用天天费神去网上找歌了。 这样也为你的手机节省好多存储歌曲的空间,因为有了树莓派和我的点歌系统, 你用手机上的收音机就能听到想听的歌曲。 我的系统不会给树莓派增加任何垃圾,所有网络歌曲不缓存, 不用担心歌曲过多而将存储卡填满。
关键技术与原理
因为树莓派只支持wav格式音乐,所以要将mp3格式转换成wav格式。
但是一般软件转换效率比较低,树莓派CPU比较差,转换时间更长。
后来我找到一个比较好的解决方案,用mpg123这个软件进行解码, 解码之后输出到终端上,这时就已经转换成wav格式了。 然后树莓派的pifm程序设置成从终端读取音频, 这样再通过一个管道将两个程序连起来,就能实现一边解码一边播放
另外,mpg123的功能比较强,支持直接播放网络音乐, 也就是说,只要给mpg123传递一个歌曲url,就能实现边下载边播放
上面的文字用一条命令总结就是:
mpg123 -m -C -q -s 歌曲地址或url | sudo pifm - 频率 歌曲采样率
例如
mpg123 -m -C -q -s /home/pi/aaa.mp3 | sudo pifm - 98.5 44100
mpg123 -m -C -q -s http://abc.com/123.mp3 | sudo pifm - 98.5 44100
上面的命令看起来很简单,费了半天劲才鼓捣好,因为命令的参数很多, 组合起来让他们协调工作就需要不断尝试!
解决了这个技术难题,下面的任务就简单了,对于pythoner来说, 下面提到的东西都不叫事!^_^
简单列一下:
歌曲是从搜狗mp3抓的,只要输入歌曲的名字,自动搜索,返回歌曲url
web管理界面用web.py实现,实时显示正在播放的歌曲和歌曲列表
数据库用sqlite3,用来保存用户输入的歌曲信息,方便日后数据分析
如果列表为空则从本地播放列表(文本文件)随机选一个播放
安装部署方法
为了简化安装部署,我专门写了一个安装脚本,就是setup.sh, 直接执行就能安装。(注意,本系统树莓派专用,请不要在电脑上执行此脚本)
wget https://github.com/ma6174/fmpi/archive/master.zip
unzip master.zip
cd fmpi-master
sudo bash setup.sh
这样就自动安装依赖的软件
使用方法
运行的话可以直接执行程序里面的start.sh:
sudo bash start.sh
然后在树莓派的GPIO4这个引脚上插上一根杜邦线当天线
用ifconfig命令察看你的ip地址,然后在浏览器上打开:http://树莓派IP:8000/, 可以看到正在播放的歌曲,然后你可以添加你想要收听的歌曲。
打开收音机,调到FM 98.5频道,你就能听到正在播放的歌曲了!
如果感觉这首歌不好听,可以直接按树莓派的键盘的q键,自动播放下一曲
想终止程序的话按Ctrl + c
可以修改config.py修改默认的98.5这个播放频率。
其他
对本系统感兴趣的话可以去github上查看源码,扩充系统功能: https://github.com/ma6174/fmpi
任何问题和建议可以留言或email联系我:ma6174#163.com
gtalk:ma617495#gmail.com
离线
下面是大神的讨论:
【活跃】XBOOT
https://github.com/ma6174/fmpi
【活跃】XBOOT 2018/1/30 14:15:55
这里有个有意思的开源工程
【活跃】XBOOT 2018/1/30 14:16:11
用树莓派的pwm管脚实现fm发射
14:16:40
【活跃】XBOOT 2018/1/30 14:16:40
估计得加个功率放大器吧
【吐槽】深圳-dgtg 2018/1/30 14:17:05
pwm口能发送FM ?
【活跃】XBOOT 2018/1/30 14:17:09
pwm管脚,扯个线是不是就能发射出去了
【吐槽】深圳-dgtg 2018/1/30 14:17:22
FM收音机那种哦?
【唠叨】书 2018/1/30 14:17:23
只要I/O频率足够,任何单片机都可以实现FM.
【活跃】XBOOT 2018/1/30 14:17:35
原理可以讲得通,调频而已
【活跃】XBOOT 2018/1/30 14:17:59
但是,发射需要开环
【吐槽】深圳-dgtg 2018/1/30 14:18:28
牛
【唠叨】书 2018/1/30 14:18:38
需要加个天线接口.
14:20:54
【冒泡】明月心惜 2018/1/30 14:20:54
玩过,接跟杜邦线,能发射个几米,效果还不错。
【活跃】XBOOT 2018/1/30 14:21:21
pwm加个杜邦线,就能发射?14:21:59
【唠叨】书 2018/1/30 14:21:59
用手指当天线都可以,就是发射距离近了点.
14:22:21
【活跃】XBOOT 2018/1/30 14:22:21
这功率估计得,0。001w吧
【冒泡】明月心惜 2018/1/30 14:22:37
没看怎么实现的,我只是把别人的代码跑了跑。射频没那么复杂,稍微有点天线它就发射出去了。
【活跃】XBOOT 2018/1/30 14:24:08
用数字方式实现调频控制,这背后没想象那么容易吧
【吐槽】。 2018/1/30 14:26:06
把吧杜邦线剪成你设定频率波长的四分之一
14:26:13
【吐槽】。 2018/1/30 14:26:13
发射距离还行
【冒泡】明月心惜 2018/1/30 14:27:07
发射频率都有100M io的响应速度需要更快,应该被作者优化过
【吐槽】坚定前行
擦,模拟的频率设定这么容易?
【吐槽】坚定前行 2018/1/30 14:29:43
在pwm的范围内65536分频?
【吐槽】坚定前行 2018/1/30 14:29:53
得怎么分啊
离线
直接用spi的clk和data组合如何,dma搬运数据
离线