http://www.freemindworld.com/blog/tag/%E6%A0%91%E8%8E%93%E6%B4%BE
2015-04-21更新:原始的rpi-source项目已经由PeterOGB 接手维护,所以无须再用我下文中提到的我改过的rpi-source脚本,直接用原始的就可以了。其它文中提到的背景知识都仍然有效。
即把第一个命令改为:
$ wget https://raw.githubusercontent.com/notro/rpi-source/master/rpi-source
&& chmod a+x rpi-source
2015-07-29更新:Raspbian的内核版本已经升级到4.x,rpi-source还不能正确处理,需要进行以下额外的工作:
1. rpi-source需要获取的/proc/config.gz默认不存在了,需要额外加载模块来实现:
$ sudo modprobe configs
2. rpi-source在4.x内核下无法正确检测gcc版本,运行rpi-source时请加–skip-gcc选项。
《在Linux下使用“360随身WiFi 2”》一文的留言区中,曾经有人问过,为什么编译出来的模块insmod/modprobe时报“Exec format error”,我不假思索的回复,请他检查编译模块时用的内核头文件与实际运行的内核是否完全匹配。这个答案倒也不算错,不过其实并没有解决问题,因为遇到的这个问题的人一般都已经用了“正确”的方式去编译他的模块,就算再重新做几遍,还是会遇到一样的问题。
最近我给Raspberry Pi 2编译内核模块时,遇到了一样的问题,花了很多时间才真正解决,在这里总结一下。以下描述的方法和内容,对Raspberry Pi (A/A+/B/B+)和Raspberry Pi 2都适用。
准备编译模块需要的内核树的方法(适用于Raspbian):
&& chmod a+x rpi-source
2. 运行rpi-source
$ ./rpi-source
3. 好了,可以进入模块源代码的目录进行模块编译了。
疑难排解:
编译模块时报找不到arch/armv6l或arch/armv7l目录
尝试在make命令前加ARCH=arm参数,或尝试把/lib/modules/uname -r
/build/arch中的arm软链为armv6l或armv7l后再编译。
背景知识:
Raspbian的内核包
不要按照使用Debian的习惯去找什么linux-image、linux-source之类的包,Raspbian的内核包是raspberrypi-bootloader,里面包含了内核、模块和一些启动文件,但没有Module.symvers和头文件。
uname -r
/build和/lib/modules/uname -r
/source对应的软链建好,从/proc/config.gz获取当前内核配置,去raspberrypi/firmware仓库中获取对应的Modules.symvers跟内核代码放在一起,然后make modules_prepare准备好编译模块所需要的内核树。LIRCD_ARGS=”–uinput”
…
DRIVER=”default”
…
DEVICE=”/dev/lirc0”
让lirc学习一下你遥控器上的按键,在我的例子中,请至少学习5个按键,分别做为上(up)、下(down)、左(left)、右(right)、选择(sel):
sudo /etc/init.d/lirc stop
irrecord -n -d /dev/lirc0 ~/lircd.conf
sudo mv ~/lircd.conf /etc/lirc/lircd.conf
sudo /etc/init.d./lirc start
配置完后,可以用irw命令测试遥控器是否工作正常。
配置~/.lircrc.conf文件,把按键与需要触发的行为进行关联:
begin
prog = lcdmenu
button = up
config = up
end
begin
prog = lcdmenu
button = right
config = right
end
begin
prog = lcdmenu
button = left
config = left
end
begin
prog = lcdmenu
button = down
config = down
end
begin
prog = lcdmenu
button = sel
config = sel
end
为Raspberry Pi添加液晶屏控制菜单,我参考了Github上的RaspberryPiLcdMenu,这个项目实现了使用一个带五个小按钮的液晶屏套件作为硬件基础来显示与操作一个菜单的系统,我没有这个套件,而且我是用红外遥控器而不是小按钮来操作,所以需要重写跟按钮有关的代码,通过lirc提供的接口去获取遥控器的按键信息,很容易,可以参考我已经实现好的代码,在Buttons.py中:
git clone https://github.com/lifanxi/rpimenu.git
RaspberryPiLcdMenu项目提供了一个很灵活的菜单配置系统可以很方便的添加新的菜单项,我给它添加了遥控fmd播放豆瓣FM的菜单功能项(参考lcdmenu.xml)。
一切就绪,启动lcdmenu.py程序:
sudo python lcdmenu.py
如果你的配置没有问题,这时就可以在液晶屏上看到定制后的菜单,并可以用遥控器来遥控操作了,按上下键选项不同的菜单项,向右键进入子菜单,向左退回上一级菜单,选择键用于根据屏幕提示确定某些特定的操作。
添加了Douban.fm的菜单
添加了Douban.fm的菜单
豆瓣FM播放中,可以显示曲名和播放进度
豆瓣FM播放中,可以滚动显示曲名和播放进度
一切调试完成后,您还可以把加载lirc_rpi模块和启动lcdmenu.py的命令加到Raspberry Pi的启动脚本中,这样系统一启动就可以让液晶显示和菜单自动生效,菜单操作中已经预设了关机、重启、设置IP地址等功能,这对于headless使用Raspberry Pi的同学来说,是一件非常方便的事情。
参考资料:
红外遥控器lirc配置
RaspberryPiLcdMenu
lirc_rpi项目
用Raspberry Pi打造真正的“豆瓣FM”
发表在折腾 | 标签有GPIO、lirc、Raspberry Pi、TSOP1838、树莓派、液晶屏、电路、红外、豆瓣、遥控 | 10条回复
打造增强型Raspberry Pi-液晶屏篇
发表于2013-03-10
42
对我来说,Raspberry Pi最吸引人的地方不是它的体积、功耗、性能之类的,而是它有两排很好用的接口,可以把软件和一些简单的硬件结合起来做点好玩的东西。对于学过做过单片机的同学来说,这些东西太小儿科了,可是对我来说还是一件非常新鲜的事情,在这里分享一下心得。
目标:为Raspberry Pi加上一个简易的液晶显示屏,可以用来显示Raspberry Pi的一些状态信息,也可以显示一个菜单,用红外线遥控器去操作菜单指挥Raspberry Pi执行相关的操作。
警告:任何时候,电流的速度都比你的反应要快,所以,在实验过程中,不正确的接线、不正确的程序、意外的短路、过载等都可能在瞬间烧掉你的Raspberry Pi或其它外围的硬件。Raspberry Pi的GPIO接口全都是没有保护电路的,一旦短路或输入过高电压,主芯片会马上被烧掉,基本上没有维修的可能性。
需要的硬件:
一块面包板和若干连接线,用于组装电路。连接RPi与面板的线是母头转公头的,面包板上的连接线是两个公头的
一块LCD1602液晶显示屏。如果你不会焊接,那就买一块预先焊好针脚的
10K电位器一个
所需硬件
所需材料(其中红外接收管和遥控器这次用不上,下回要用)
面包板的使用方法:
可以把元件或接线直接插在面包板上连通电路,无需焊接。面包板上每一行的一组五个插孔之间是相互连通的,同一行上如果有两组五个插孔,则两组之间是断开的,适合插接集成电路或开关。面包板上行与行之间都是断开的。面包板两侧的如果有供电线插孔,则同一条供电线上的所有插孔都是连通的。
连接液晶屏:
LCD1602液晶屏提供了16列x2行的ASCII字符显示能力,工作电压5V,提供4位数据与8位数据两种工作模式,Raspberry Pi的GPIO口数量很有限,所以我们使用4位数据模式。
LCD1602液晶屏模块提供了16个引脚,我们只需接其中的12个即可:
1. VSS,接地,RPi PIN 6
2. VDD,接5V电源,PRi PIN 2
3. VO,液晶对比度调节,接电位器中间的引脚
4. RS,寄存器选择,接GPIO 14,RPi PIN 8
5. RW,读写选择,接地,表示写模式,PRi PIN 6
6. EN,使能信号,接GPIO 15,RPi PIN 10
7. D0,数据位0,4位工作模式下不用,不接
8. D1,数据位1,4位工作模式下不用,不接
9. D2,数据位2,4位工作模式下不用,不接
10. D3,数据位3,4位工作模式下不用,不接
11. D4,数据位4,接GPIO 17,RPi PIN 11
12. D5,数据位5,接GPIO 18,RPi PIN 12
13. D6,数据位6,接GPIO 27,RPi PIN 13
14. D7,数据位7,接GPIO 22,RPi PIN 15
15. A,液晶屏背光+,接5V,RPi PIN 2
16. K,液晶屏背光-,接地,RPi PIN 6
注意:
请注意GIPO引脚编号与Raspberry Pi上P1扩展口的PIN编号的区别,别搞混了。
如果你的液晶屏没有背光,则15,16脚可能不会引出,也就不用接线。
LCD1602工作电压是5V,而RPi的GPIO口工作电压是3.3V,所以RW脚请确保接地进入写模式,否则尝试从LCD1602读取数据可能会烧掉RPi。
VO脚接的是电位器,电位器的另外两个脚分别接5V和地。通过调节这个电位器,可以调节液晶屏的对比度。
Raspberry Pi有Rev 1和Rev 2两个版本,它们对于PIN 13的定义是不同的。市面上现在大部分都是Rev 2版本,PIN 13对应GPIO 27。如果你的RPi是老的Rev 1版本,PIN 13对应是GPIO 21,你需要调整程序中的参数,把27改为21。
获取程序:
git clone https://github.com/lifanxi/rpimenu.git
测试液晶屏:
Raspberry Pi通电后,正常情况下液晶屏会初始化。上面一行显示黑色方块,下面一行空白。如果屏幕一片空白或一片黑,可以尝试调节一下电位器,看看对比度是否合适。
直接以root权限运行程序包中的Adafruit_CharLCD.py,LCD上会显示两行字符:LCD 1602 Test, 123456789ABCDEF,这样就说明液晶屏已经工作正常了。
如果你想让液晶屏显示些别的东西,可以参考lcdmenu.py代码和Adafruit_CharLCD.py中所暴露的接口。
LCD1602液晶屏测试
LCD1602液晶屏测试(右上角的红棕两根线是预留给红外接收管的,目前插在那里相当于悬空,没用)
下期预告:
下期会介绍如何把红外线接收管接上去,并配置LIRC去接收遥控器的信号,从而实现用遥控器控制Raspberry Pi的目的。
参考资料:
面包板的使用
Drive a 16×2 LCD with the Raspberry Pi
Raspberry Pi GPIO接口信息
题外话:
细心的同学在上图中可以发现我的Raspberry Pi的电源口附近有一个体积和样子都很违和的电解电容。这里原本是一个给电源滤波用的贴片电解电容C6(15V, 220μF),但是我在给Raspberry Pi接线时,轻轻的在上面借了一点力,它就掉下来了……
根据Raspberry Pi官网Wiki的说法,C6掉了是常见病。只要你的电源质量不非常差,C6有没有都无所谓。所以,如果你的C6也掉了,除非你是焊接熟练工,或者跟我一样手贱,那可以找个相似型号的电容焊上去(电解电容,一定要注意极性),不然的话,不去管它是一个更好的选择。
发表在折腾 | 标签有LCD1602、Raspberry Pi、树莓派、液晶屏、电路 | 42条回复
用Raspberry Pi打造真正的“豆瓣FM”
发表于2013-02-18
98
想用床头的收音机收听豆瓣FM吗?如果你有一台Raspberry Pi,这个愿望就可以满足。
Raspberry Pi,中文名树莓派,是一台廉价的单板机,ARM架构,可以运行Linux操作系统,它由英国的树莓派基金会开发,目的是以低价硬件及自由软件促进校园中的计算机科学教育。是的,它设计初衷其实是给小朋友们学电脑用的,不是给你们这些Geek来折腾玩的。
用Raspberry Pi搭建一个豆瓣FM的调频广播台其实并不是一件很困难的事情,为实现这个目标,要解决的两个问题是:
从豆瓣FM网站上下载MP3音乐码流并解码
把音频信号调制成调频信号发射出去
造轮子的事情不要自己做,这两个问题其实已经都解决了:Github上的fmd项目实现了一个通过本地声卡播放豆瓣FM的服务器;这篇文章则介绍了如何写程序对音频信号进行调制并控制Raspberry Pi的GPIO端口把信号发送出去。所以剩下的事就是把它们组合起来就可以了。
组合代码这种脏活累活我也给大家做好了,可以从Github上获取。嗯,这份代码目前的质量是It just works,各位make一下就好,没事就不要vim它了……
git clone git://github.com/lifanxi/fmd.git
代码下载后在Raspberry Pi上可以直接make编译,如果缺少依赖,可能需要安装libcurl4-openssl-dev, libjson0-dev, libmpg123-dev, libao-dev这些依赖包(我用的是Raspbian发行版)。
fmd的使用方法可以参考Github上的说明,我所实现的扩展就是在fmd.conf配置文件中可以把driver配成”pifm”,然后把device配成88MHz~108MHz之间的某个指定的调频发射频率值(这是大多数国家调频收音机所支持的频率范围,如果你有别的无线电接收设备,这个值也可以设成是<250的任意值)来实现FM广播的发射。当driver配成pifm而不是默认的alsa时,fmd就会工作在FM广播模式。
注意,由于FM发射的代码需要直接mmap /dev/mem设备,所以把driver配成pifm让fmd工作在FM广播模式时,需要以root权限来执行fmd。以root权限运行fmd时,注意HOME目录可能会变成/root,所以相关配置文件也得改放到/root/.fmd中。
fmd运行起来后,按照文档的说明,可以telnet到127.0.0.1:10098上或用fmc执行play命令开始广播,把收音机(带收音功能的手机当然也可以)调到device参数所指定的频率上就可以收听了。
如果你的收音机离你的Raspberry Pi太远,收音效果不好,可以在Raspberry Pi主板上的GPIO 4口上插一根20cm左右长的杜邦线做天线,广播范围和信号强度就会大大提高了。
Raspberry Pi正在102.4 MHz上播放豆瓣FM的音乐
Raspberry Pi正在102.4 MHz上播放豆瓣FM的音乐
目前这个豆瓣FM广播台还有两个大问题需要解决:
立体声调频广播:现在实现的版本是单声道的,理论上应该也可以把音频调制成立体声的。这需要一些我所不具备的调频广播的知识,待我有空再钻研钻研。
CPU占用率:现在的版本在做调制和发射时,对CPU的占用率比较高。如果Raspberry Pi正在忙于做别的事情的话,你可能会听到一些杂音或者是唱机/磁带机没电了的时候的音响效果。
其实吧,这样收听豆瓣FM可真是多此一举。直接把耳机插在Raspberry的耳机插孔用fmd播放不就完事了么……天行健,君子以折腾不息!