树莓派推出没多久,一系列的配套硬件开始出现。这里介绍的一款名为 PiZero cluster 的东西是一个能将多个Zero组合起来玩的扩展硬件。包括统一的电源系统、显示输出、USB、网口等,便于玩家把16个树莓派Zero组合成计算机集群。
树莓派Zero以其出众的性价比和极小的尺寸,将使创客们获得更大的想象力和创造力。
一个码农的自留地
树莓派推出没多久,一系列的配套硬件开始出现。这里介绍的一款名为 PiZero cluster 的东西是一个能将多个Zero组合起来玩的扩展硬件。包括统一的电源系统、显示输出、USB、网口等,便于玩家把16个树莓派Zero组合成计算机集群。
树莓派Zero以其出众的性价比和极小的尺寸,将使创客们获得更大的想象力和创造力。
一、困惑
作为一个 Python 初学者,我在包管理上感到相当疑惑(嗯,是困惑)。主要表现在下面几个方面:
这几个包管理工具有什么不同? distutils setuptools distribute disutils2 distlib pip 什么时候该用pip,什么时候该用 setup.py ,它们有关系么? easy_install 、 ez_setup.py 、 setup.py 、 setup.cfg 分别都是干啥的? wheel 和 pip 的关系? Egg 和 whl 的关系? 如何发布自己的模块(发布到PyPI)? 如何进行模块的私有发布(不发布到PyPI)?
为了弄清这些问题,我找了许多资料。最后发现最好的资料还是 python 的官方文档。
下面是阅读了所有我找到的资料后的一个总结,希望能帮到几个月后又把这些全部忘光的那个自己。
二、python 包管理工具大乱斗
我用时间顺序来描述乱斗过程。
1. distutils
distutils 是 python 标准库的一部分,2000年发布。使用它能够进行 python 模块的 安装 和 发布。
setup.py 就是利用 distutils 的功能写成,我们可以看一个简单的 setup.py 的例子。
在这里可以看到关于 setupt.py 格式的所有详细描述:Writing the Setup Script。
要安装一个模块到当前的 python 环境中,可以使用这个模块提供的 setup.py 文件:
python setup.py install
下面的代码会发布一个 python 模块,将其打包成 tar.gz 或者 zip 压缩包:
python setup.py sdist
甚至能打包成 rpm 或者 exe 安装包:
python setup.py bdist_rpm python setup.py bdist_wininst
2. setuptools 和 distribute
setuptools 是一个为了增强 distutils 而开发的集合,2004年发布。它包含了 easy_install 这个工具。
ez_setup.py 是 setuptools 的安装工具。 ez 就是 easy 的缩写。
简单的说,setuptools 是一个项目的名称,是基础组件。而 easy_install 是这个项目中提供的工具,它依赖基础组件工作。
为了方便描述,下面文章中提到的 setuptools 被认为与 easy_install 同义。
使用 setuptools 可以自动 下载、构建、安装和管理 python 模块。
例如,从 PyPI 上安装一个包:
easy_install SQLObject
下载一个包文件,然后安装它:
easy_install http://example.com/path/to/MyPackage-1.2.3.tgz
从一个 .egg 格式安装:
easy_install /my_downloads/OtherPackage-3.2.1-py2.3.egg
distribute 是 setuptools 的一个分支版本。分支的原因可能是有一部分开发者认为 setuptools 开发太慢了。但现在,distribute 又合并回了 setuptools 中。因此,我们可以认为它们是同一个东西。事实上,如果你查看一下 easy_install 的版本,会发现它本质上就是 distribute 。
# easy_install –version distribute 0.6.28
3. Eggs
Eggs 格式是 setuptools 引入的一种文件格式,它使用 .egg 扩展名,用于 Python 模块的安装。
setuptools 可以识别这种格式。并解析它,安装它。
想要详细了解,可以看看这篇:The Quick Guide to Python Eggs。
Eggs are to Pythons as Jars are to Java..
4. pip
注意,从此处开始, easy_install 和 setuptools 不再同义。
pip 是目前 python 包管理的事实标准,2008年发布。它被用作 easy_install 的替代品,但是它仍有大量的功能建立在 setuptools 组件之上。
pip 希望不再使用 Eggs 格式(虽然它支持 Eggs),而更希望采用“源码发行版”(使用 python setup.py sdict 创建)。这可以充分利用 Requirements File Format 提供的方便功能。
pip 可以利用 requirments.txt 来实现在依赖的安装。在 setup.py 中,也存在一个 install_requires 表来指定依赖的安装。它们的区别在哪里?可以看这篇文章:setup.py vs requirements.txt (中文版)。
pip 支持 git/svn/hg 等流行的 VCS 系统,可以直接从 gz 或者 zip 压缩包安装,支持搜索包,以及指定服务器安装等等功能。
pip vs easy_install 详细介绍了两者的不同。它们可以说是各占胜场,但 pip 明显优势更大。
5. wheel
wheel 本质上是一个 zip 包格式,它使用 .whl 扩展名,用于 python 模块的安装,它的出现是为了替代 Eggs。
wheel 还提供了一个 bdist_wheel 作为 setuptools 的扩展命令,这个命令可以用来生成 wheel 包。
pip 提供了一个 wheel 子命令来安装 wheel 包。当然,需要先安装 wheel 模块。
setup.cfg 可以用来定义 wheel 打包时候的相关信息。
Wheel vs Egg 详细介绍了 wheel 和 Eggs 格式的区别,很显然,wheel 优势明显。
Python Wheels 网站展示了使用 Wheels 发行的 python 模块在 PyPI 上的占有率。
pypip.in 也支持 wheel。
6. distutils2 和 distlib
distutils2 被设计为 distutils 的替代品。从2009年开发到2012年。它包含更多的功能,并希望以 packaging 作为名称进入 python 3.3 成为标准库的一部分。但这个计划 后来停滞了 。
distlib 是 distutils2 的部分,它为 distutils2/packaging 提供的低级功能增加高级 API,使其便于使用。
这里 介绍了 distlib 没有进入 python 3.3 标准库的一些原因。
因此,可以暂时不必了解这两个工具,静观其变即可。
三、工具选择
如果仔细看过上面的乱斗内容,我相信你已经清楚当前应该如何选择了。
对于我这样刚刚开始的新手来说,自然是使用 pip 而不使用 easy_install 了。
如果发布模块,当然是使用 wheel 格式。
四、发布自己的模块
对于 python3 程序员来说,当然应该先看这一篇:Distributing Python Modules。
另外,Tutorial on Packaging and Distributing Projects 也足够详细和官方。
而 Python2 程序员则应该看这篇 Distributing Python Modules 。
当然,setuptools 的官方文档也是不错的教程:Building and Distributing Packages with Setuptools 。
这篇教程可以用来入门:Sharing Your Labor of Love: PyPI Quick and Dirty
至于如何发布自己的模块到 PyPI 或者搭建自己的私有包管理服务器,上面的文章已经讲得非常清楚了。
五、引用
上面提到的大部分资料,都是在这里找到,或者是提到:Python Packaging User Guide。
感谢这篇文章,让我不再纠结,然后又下决心写了本文继续纠结:Differences between distribute, distutils, setuptools and distutils2? 。
这篇文章也比较碎:关于python中的setup.py,而且比本文范例更多。
转自 http://zengrong.net/post/2169.htm
按照计划,今年12月份,来自英国的欧洲航天局宇航员Tim Peake将会携带2个特制树莓派(Astro Pi,不知道可不可以译为:太空派)进入国际空间站执行为期6个月的任务。Astro Pi是增加了特殊定制外壳和配件的树莓派版本,其拥有6063级航空标准铝质外壳,配置有一个8×8彩色LED矩阵和5个控制按钮操纵杆;
当然还有大量的传感器,其中包括:陀螺仪、加速度计、磁力计、温度传感器、大气压力传感器、湿度传感器。此外,Astro Pi还配置了可见光相机和远红外相机。
据悉,针对太空坏境设计的Astro Pi的主要目的是为了教育;这两个即将进入太空的树莓派将运行学生所开发的Python程序,其所采集到的所有数据都将通过空间回传回地球供所有人观看和使用。
Tim Peake前几天在自己的Twitter上晒出了自己与Astro Pi的合影
据树莓派基金会的博客介绍,最近已经确定这两个特制的树莓派计划将在格林尼治时间12月3日22:38随联盟号(Soyuz)运载火箭一起发射升空,并随Orbital Sciences的Cygnus飞船一起和宇航员前往国际空间站。整个发射过程将通过NASA TV和Orbital Sciences的渠道进行直播。
虽然前往国际空间站的树莓派只有两个,但目前树莓派基金会已经打造了8个Astro Pi,相信树莓派基金会后面还有更大的计划。
一、组件介绍
大家好,我是Sunny。今天将给大家带来系列教程《树莓派小车系列》,先给大家介绍介绍我这次使用到的一些组件。
1、树莓派
2、小车底盘
3、小车车轮(马达)
4、L298N电机驱动模块
5、超声波测距模块、杜邦线
6、电池盒
7、无线网卡
二、模块接线
首先树莓派要安装好系统和python的一些模块。这个小车最主要部分就是L298N模块的控制,控制住了L298N这个模块就控制住了我们整个小车,这里我弄一张图片,大家可以看到每一个地方是干嘛的。然后就是跟树莓派的对接。
L298N的每个接口负责的功能如下图
下面是树莓派和l298n接线图
把马达接到L298N上面,然后把电池盒的正极接到12v接口,负极接到接地接口(中间那个),然后第三个接口需要一个5v的输入,我就从树莓派的GPIO2取。
in1、in2、in3、in4分别接树莓派GPIO的11、12、13、15这几个口。这张图大家应该能理解到上面in1到in4的接法了,还有电源的接法。
三、马达转动
上面讲了我们如何把树莓派和l298n和马达接线连接起来。既然连起来了,我们就应该来试试如何用树莓派通过python来控制这个马达的转动。
首先我们需要安装python的gpio模块,可以通过pip安装也可以通过下载源代码安装。
sudo vim xiaoche.py
#导入gpio的模块 import RPi.GPIO as GPIO import time #设置gpio口的模式 GPIO.setmode(GPIO.BOARD) #定义信号接口gpio口 INT1 = 11 INT2 = 12 INT3 = 13 INT4 = 15 #设置gpio口为输出 GPIO.setup(INT1,GPIO.OUT) GPIO.setup(INT2,GPIO.OUT) GPIO.setup(INT3,GPIO.OUT) GPIO.setup(INT4,GPIO.OUT) #这里参考上一节模块接线的L298N模块的控制图 GPIO.output(INT1,GPIO.HIGH) GPIO.output(INT2,GPIO.LOW) GPIO.output(INT3,False) GPIO.output(INT4,False) #延时2秒之后执行cleanup释放GPIO接口 time.sleep(2) GPIO.cleanup()
代码写到之后我们保存退出,接着执行一下观看马达有没有转动。
sudo python xiaoche.py
四、底盘安装
五、小车跑起来
下面是 xiaoche.py 完整的代码。
import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BOARD) IN1 = 11 IN2 = 12 IN3 = 13 IN4 = 15 def init(): GPIO.setup(IN1,GPIO.OUT) GPIO.setup(IN2,GPIO.OUT) GPIO.setup(IN3,GPIO.OUT) GPIO.setup(IN4,GPIO.OUT) def qianjin(sleep_time): GPIO.output(IN1,GPIO.HIGH) GPIO.output(IN2,GPIO.LOW) GPIO.output(IN3,GPIO.HIGH) GPIO.output(IN4,GPIO.LOW) time.sleep(sleep_time) GPIO.cleanup() def cabk(sleep_time): GPIO.output(IN1,GPIO.LOW) GPIO.output(IN2,GPIO.HIGH) GPIO.output(IN3,GPIO.LOW) GPIO.output(IN4,GPIO.HIGH) time.sleep(sleep_time) GPIO.cleanup() def left(sleep_time): GPIO.output(IN1,False) GPIO.output(IN2,False) GPIO.output(IN3,GPIO.HIGH) GPIO.output(IN4,GPIO.LOW) time.sleep(sleep_time) GPIO.cleanup() def right(sleep_time): GPIO.output(IN1,GPIO.HIGH) GPIO.output(IN2,GPIO.LOW) GPIO.output(IN3,False) GPIO.output(IN4,False) time.sleep(sleep_time) GPIO.cleanup() init() cabk(10)
本文所介绍的内容基于树莓派瑞士军刀扩展板(SAKS),由于 SAKS 基于树莓派通用的 GPIO 设计,文中的原理和代码也适用于其他情况。
本文由树莓派实验室创作,遵循CC协议(署名-非商业性使用-禁止演绎-相同方式共享),欢迎树莓派爱好者们遵循协议内容转载传播。谢绝不遵守协议的转载和抄袭。
本节将介绍如何基于 PWM 来实现呼吸灯。当检测到后台有下载进程(wget)正在运行的时候,呼吸灯闪烁,而进程如果运行结束,则停止闪烁保持常亮状态。
本例程中涉及到的 SAKS 扩展板引脚编号如下:
功能 注释 BOARD
编码 BCM
编码 wiringPi
编码 LED排灯 LED-D6 第5个LED(绿) 27 0 30
先实现一个不用监控进程的呼吸灯效果,程序代码如下:
import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM) GPIO.setup(0, GPIO.OUT) pwm = GPIO.PWM(0, 50) pwm.start(0) pause_time = 0.01 try: while True: for i in xrange(0, 101, 1): pwm.ChangeDutyCycle(i) # off time.sleep(pause_time) time.sleep(1) for i in xrange(100, -1, -1): pwm.ChangeDutyCycle(i) # on time.sleep(pause_time) except KeyboardInterrupt: # stop the white PWM output pwm.stop() # clean up GPIO on CTRL+C exit GPIO.cleanup()
保存为breathinglight.py,运行这段程序代码,将看到绿色的呼吸灯渐强渐弱,缓慢闪烁。其中 GPIO.PWM(0, 50) 表示在BCM编号为0的IO脚设置一个频率为50HZ的PWM实例。pwm.start(0)用来设定占空比,0表示没有波动。PWM的具体用法可以参考 https://shumeipai.nxez.com/2014/11/13/rpi-gpio-module-pwm-basic-function.html
sudo python breathinglight.py
下面将加入对下载进程的监控。首先要了解当系统进程中有 wget 命令在运行时,表示存在文件的下载。当然,任何进程都可能出现下载数据的可能,而我们只打算检测 wget 命令方式的下载。
读取系统进程列表,如果发现 wget 命令,则返回 TRUE。将这段逻辑加入上面呼吸灯的代码中。
import RPi.GPIO as GPIO import time import subprocess GPIO.setmode(GPIO.BCM) GPIO.setup(0, GPIO.OUT) # 默认点亮LED表示正在检测进程 GPIO.output(0, GPIO.LOW) pwm = GPIO.PWM(0, 50) pwm.start(0) pause_time = 0.01 def process_exist(): proc = subprocess.Popen(“ps aux | grep wget”, stdout = subprocess.PIPE, stderr = subprocess.PIPE, shell = True) stdout = proc.communicate() for line in stdout: if line.count(‘http’) > 0: print(line) return True return False try: while True: if process_exist(): for i in xrange(0, 101, 1): pwm.ChangeDutyCycle(i) # off time.sleep(pause_time) time.sleep(1) for i in xrange(100, -1, -1): pwm.ChangeDutyCycle(i) # on time.sleep(pause_time) else: time.sleep(pause_time * 10) except KeyboardInterrupt: # stop the white PWM output pwm.stop() # clean up GPIO on CTRL+C exit GPIO.cleanup()
运行之后,如果系统中没有尚未执行完的 wget 进程,绿色 LED 将常亮。
screen sudo python breathinglight.py
再 Crtl-A 接着按下 D 键切换出终端,并手动运行一个 wget 命令,下载一个较大的文件测试下,此处的文件 URL 请自己替换。
wget http://xxx.xxx.xxx.xxx/test.exe
此时绿色的 LED 将开始闪烁。
这个功能将让你通过 SAKS 扩展板的 LED 了解对大文件的下载完成情况。也可以稍加改变,检测其他进程的运行情况。
我们后面将介绍更多基于 SAKS 扩展板的有趣的内容,欢迎持续关注!
本文属于《树莓派瑞士军刀扩展板(SAKS)DIY 教程》系列文章,查看系列文章目录,请访问:https://shumeipai.nxez.com/swiss-army-knife-shield-for-raspberry-pi-diy-tutorials
本文所介绍的内容基于树莓派瑞士军刀扩展板(SAKS),由于 SAKS 基于树莓派通用的 GPIO 设计,文中的原理和代码也适用于其他情况。
本文由树莓派实验室创作,遵循CC协议(署名-非商业性使用-禁止演绎-相同方式共享),欢迎树莓派爱好者们遵循协议内容转载传播。谢绝不遵守协议的转载和抄袭。
本节将通过 DIY 一个简单的警报器,来介绍 SAKS 扩展板上蜂鸣器的使用。设定一个时间,比如每到整点,蜂鸣器警报响起,同时黄色 LED 闪烁。之前的章节中已经对 SAKS 扩展板上 LED 的使用做了介绍。SAKS 扩展板上的蜂鸣器和 LED 同样,都是低电平开启。
需要说明的是,SAKS 扩展板上的蜂鸣器是有源蜂鸣器,操作简便,但只能发出一种频率的鸣叫声。而另有一种无源蜂鸣器,则需要通过方波来驱动其发声,可以控制方波的频率实现不同音阶的鸣叫声。
本例程中涉及到的 SAKS 扩展板引脚编号如下:
功能 注释 BOARD
编码 BCM
编码 wiringPi
编码 蜂鸣器 BUZZER-B1 有源蜂鸣器 23 11 14 LED排灯 LED-D8 LED(黄) 26 7 11
下面是实现上述功能的代码,同样够简单。
#!/usr/bin/env python # -*- coding: utf-8 -*- import RPi.GPIO as GPIO import time import sys PIN_NO_BEEP = 11 PIN_NO_LED = 7 GPIO.setmode(GPIO.BCM) GPIO.setup(PIN_NO_BEEP, GPIO.OUT, initial=GPIO.HIGH) GPIO.setup(PIN_NO_LED, GPIO.OUT, initial=GPIO.HIGH) # 单次哔声和LED发光 def beep(seconds): GPIO.output(PIN_NO_BEEP, GPIO.LOW) GPIO.output(PIN_NO_LED, GPIO.LOW) time.sleep(seconds) GPIO.output(PIN_NO_BEEP, GPIO.HIGH) GPIO.output(PIN_NO_LED, GPIO.HIGH) # 多次哔声和LED发光封装函数,输入参数分别为“占空时间”以及重复次数 def beepAction(secs, sleepsecs, times): for i in range(times): beep(secs) time.sleep(sleepsecs) while True: # 以下代码获取系统时间、时、分、秒、星期的数值 t = time.localtime() h = t.tm_hour m = t.tm_min s = t.tm_sec w = time.strftime(‘%w’,t) #print h,m,s,w time.sleep(0.3) # 判断是否为整点 if m == 0 and s == 0: # 以下注释部分用于让报时的脚本跳过周六和周日(睡个懒觉放松下不容易) #if w==0 or w==6: # continue # 以下代码判断当时间在晚间22点至早间8点期间不报时以免影响睡眠 if h > 22 or h < 8: continue # 小时数N大于12点的情况下,哔N-12次 if h > 12: h = h – 12 beepAction (0.3, 0.5, h) time.sleep(1) # 判断是否为30分 if m == 30 and s == 0: if h > 22 or h < 8: continue # 快节奏哔2声 beepAction (0.05, 0.05, 2) time.sleep(1) 代码说明参看注释即可秒懂。将完整代码保存为 chime.py 接下来运行。 sudo python chime.py 后面我们后面将开始介绍如何基于 SAKS 扩展板 DIY 各种有趣、实用的东西,欢迎持续关注! 本文属于《树莓派瑞士军刀扩展板(SAKS)DIY 教程》系列文章,查看系列文章目录,请访问:https://shumeipai.nxez.com/swiss-army-knife-shield-for-raspberry-pi-diy-tutorials
原文连接:http://elinux.org/RPi_config.txt
由于树莓派并没有传统意义上的BIOS, 所以现在各种系统配置参数通常被存在”config.txt”这个文本文件中.
树莓派的config.txt文件会在ARM内核初始化之前被GPU读取.
这个文件存在引导分区上的.对于Linux, 路径通常是/boot/config.txt, 如果是Windows (或者OS X) 它会被识别为SD卡中可访问部分的一个普通文件.
如果想要编辑配置文件, 请查看介绍编辑树莓派配置文件.
你可以使用下列命令去获取当前激活的设置:
– 列出指定的配置参数.
– 例如: vcgencmd get_config arm_freq
vcgencmd get_config
– 列出所有已设置的整形配置参数(非零)
vcgencmd get_config int
– 列出所有已设置的字符型配置参数(非零)
vcgencmd get_config str
文件格式
当值是整形时格式为”属性=值”. 每行只指定一个参数. 注释使用’#’井号作为一行开头.
注意: 在新版的树莓派里每行都有#注释, 要想使用该行参数只需移除#.
下面是示例文件
# Set stdv mode to PAL (as used in Europe) sdtv_mode=2
# Force the monitor to HDMI mode so that sound will be sent over HDMI cable
hdmi_drive=2
# Set monitor mode to DMT
hdmi_group=2
# Set monitor resolution to 1024×768 XGA 60Hz (HDMI_DMT_XGA_60)
hdmi_mode=16
# Make display smaller to stop text spilling off the screen
overscan_left=20
overscan_right=12
overscan_top=10
overscan_bottom=10
这是另一个示例文件, 包含了各种功能的扩展文档.
内存
disable_l2cache 禁止ARM访问GPU的二级缓存. 相应的需要在内核中关闭二级缓存. 默认为0
gpu_mem GPU内存以兆为单位. 设置ARM和GPU之间的内存分配. ARM会获得剩余所有内存. 最小设为16. 默认为64
gpu_mem_256 对于有256MB内存的树莓派的GPU内存设置. 512MB的派请忽略. 会覆盖gpu_mem. 最大设为192. 默认不设置
gpu_mem_512 对于有512MB内存的树莓派的GPU内存设置. 256MB的派请忽略. 会覆盖gpu_mem. 最大设为448. 默认不设置
disable_pvt 禁止每500毫秒调整一次RAM的刷新率 (RAM温度测量).
CMA – 动态内存分配
自2012年11月19号, 固件和内核开始支持CMA, 这意味运行时可以动态管理ARM和GPU之间的内存分配. 这儿有相关config.txt示例.
cma_lwm 当GPU可用内存低于cma_lwm所设值, 将会向ARM请求一些内存.
cma_hwm 当GPU可用内存高于cma_hwm所设值, 将会向ARM释放一些内存.
要启用CMA,下面的参数需要添加到cmdline.txt文件里:
coherent_pool=6M smsc95xx.turbo_mode=N
视频
视频模式选项
sdtv_mode 为复合信号输出设置视频制式(默认为0)
sdtv_mode=0 NTSC
sdtv_mode=1 日本版NTSC – 无基座
sdtv_mode=2 PAL
sdtv_mode=3 巴西版PAL – 副载波为525/60而不是625/50
sdtv_aspect 为复合信号输出设置宽高比(默认为1)
sdtv_aspect=1 4:3
sdtv_aspect=2 14:9
sdtv_aspect=3 16:9
sdtv_disable_colourburst 禁止复合信号输出彩色副载波群. 图片会显示为单色, 但是可能会更清晰
sdtv_disable_colourburst=1 禁止输出彩色副载波群
hdmi_safe 使用”安全模式”的设置去尝试用HDMI最大兼容性启动. 这和下面的组合是一个意思: hdmi_force_hotplug=1, config_hdmi_boost=4, hdmi_group=2, hdmi_mode=4, disable_overscan=0
hdmi_safe=1
hdmi_ignore_edid 如果你的显示器是天朝产的垃圾货, 允许系统忽略EDID显示数据
hdmi_ignore_edid=0xa5000080
hdmi_edid_file 当设为1时, 将会从edid.dat文件中读取EDID数据,而不是从显示器.
hdmi_edid_file=1
hdmi_force_edid_audio 伪装成支持所有音频格式播放, 即便报告不支持也允许通过DTS/AC3.
hdmi_force_edid_audio=1
hdmi_force_edid_3d 伪装成全部CEA模式都支持3D, 即便EDID并不支持.
hdmi_force_edid_3d=1
avoid_edid_fuzzy_match 禁止去模糊匹配EDID中描述的模式. 即便遮蔽错误, 也选用匹配分辨率和最接近帧率的标准模式.
avoid_edid_fuzzy_match=1
hdmi_ignore_cec_init 不发送初始化激活源消息. 避免在重启时使(启用CEC)TV结束待机并切换频道.
hdmi_ignore_cec_init=1
hdmi_ignore_cec 伪装成TV不支持CEC. 将不会支持任何CEC功能.
hdmi_ignore_cec=1
hdmi_force_hotplug 伪装成HDMI热插拔信号被检测到, 出现HDMI显示器被接入
hdmi_force_hotplug=1 即便没有检测到HDMI显示器也要使用HDMI模式
hdmi_ignore_hotplug 伪装成HDMI热插拔信号没有被检测到, 出现HDMI显示器未接入
hdmi_ignore_hotplug=1 即便检测到HDMI显示器也要使用混合模式
hdmi_pixel_encoding 强制像素编码模式. 默认情况下会使用EDID请求的模式, 所以不需要修改.
hdmi_pixel_encoding=0 default (limited for CEA, full for DMT)
hdmi_pixel_encoding=1 RGB limited (16-235)
hdmi_pixel_encoding=2 RGB full ( 0-255)
hdmi_pixel_encoding=3 YCbCr limited (16-235)
hdmi_pixel_encoding=4 YCbCr limited ( 0-255)
hdmi_drive 选择HDMI还是DVI模式
hdmi_drive=1 DVI模式 (没声音)
hdmi_drive=2 HDMI模式 (如果支持并已启用将有声音输出)
hdmi_group 设置HDMI类型
不指定组, 或者设为0, 将会使用EDID报告的首选组.
hdmi_group=1 CEA
hdmi_group=2 DMT
hdmi_mode 设置在CEA或DMT格式下的屏幕分辨率
当hdmi_group=1 (CEA)时,下列值有效
hdmi_mode=1 VGA
hdmi_mode=2 480p 60Hz
hdmi_mode=3 480p 60Hz H
hdmi_mode=4 720p 60Hz
hdmi_mode=5 1080i 60Hz
hdmi_mode=6 480i 60Hz
hdmi_mode=7 480i 60Hz H
hdmi_mode=8 240p 60Hz
hdmi_mode=9 240p 60Hz H
hdmi_mode=10 480i 60Hz 4x
hdmi_mode=11 480i 60Hz 4x H
hdmi_mode=12 240p 60Hz 4x
hdmi_mode=13 240p 60Hz 4x H
hdmi_mode=14 480p 60Hz 2x
hdmi_mode=15 480p 60Hz 2x H
hdmi_mode=16 1080p 60Hz
hdmi_mode=17 576p 50Hz
hdmi_mode=18 576p 50Hz H
hdmi_mode=19 720p 50Hz
hdmi_mode=20 1080i 50Hz
hdmi_mode=21 576i 50Hz
hdmi_mode=22 576i 50Hz H
hdmi_mode=23 288p 50Hz
hdmi_mode=24 288p 50Hz H
hdmi_mode=25 576i 50Hz 4x
hdmi_mode=26 576i 50Hz 4x H
hdmi_mode=27 288p 50Hz 4x
hdmi_mode=28 288p 50Hz 4x H
hdmi_mode=29 576p 50Hz 2x
hdmi_mode=30 576p 50Hz 2x H
hdmi_mode=31 1080p 50Hz
hdmi_mode=32 1080p 24Hz
hdmi_mode=33 1080p 25Hz
hdmi_mode=34 1080p 30Hz
hdmi_mode=35 480p 60Hz 4x
hdmi_mode=36 480p 60Hz 4xH
hdmi_mode=37 576p 50Hz 4x
hdmi_mode=38 576p 50Hz 4x H
hdmi_mode=39 1080i 50Hz reduced blanking
hdmi_mode=40 1080i 100Hz
hdmi_mode=41 720p 100Hz
hdmi_mode=42 576p 100Hz
hdmi_mode=43 576p 100Hz H
hdmi_mode=44 576i 100Hz
hdmi_mode=45 576i 100Hz H
hdmi_mode=46 1080i 120Hz
hdmi_mode=47 720p 120Hz
hdmi_mode=48 480p 120Hz
hdmi_mode=49 480p 120Hz H
hdmi_mode=50 480i 120Hz
hdmi_mode=51 480i 120Hz H
hdmi_mode=52 576p 200Hz
hdmi_mode=53 576p 200Hz H
hdmi_mode=54 576i 200Hz
hdmi_mode=55 576i 200Hz H
hdmi_mode=56 480p 240Hz
hdmi_mode=57 480p 240Hz H
hdmi_mode=58 480i 240Hz
hdmi_mode=59 480i 240Hz H
H表示16:9比例(正常是4:3).
2x表示双倍像素(即更高的像素时脉, 每个像素重复两次)
4x表示四倍像素(即更高的像素时脉, 每个像素重复四次)
当hdmi_group=2 (DMT)时,下列值有效
警告: 根据这篇帖子所述
像素时脉是有限制的, 最高支持的模式是1920×1200 @60Hz with reduced blanking.
hdmi_mode=1 640×350 85Hz
hdmi_mode=2 640×400 85Hz
hdmi_mode=3 720×400 85Hz
hdmi_mode=4 640×480 60Hz
hdmi_mode=5 640×480 72Hz
hdmi_mode=6 640×480 75Hz
hdmi_mode=7 640×480 85Hz
hdmi_mode=8 800×600 56Hz
hdmi_mode=9 800×600 60Hz
hdmi_mode=10 800×600 72Hz
hdmi_mode=11 800×600 75Hz
hdmi_mode=12 800×600 85Hz
hdmi_mode=13 800×600 120Hz
hdmi_mode=14 848×480 60Hz
hdmi_mode=15 1024×768 43Hz DO NOT USE
hdmi_mode=16 1024×768 60Hz
hdmi_mode=17 1024×768 70Hz
hdmi_mode=18 1024×768 75Hz
hdmi_mode=19 1024×768 85Hz
hdmi_mode=20 1024×768 120Hz
hdmi_mode=21 1152×864 75Hz
hdmi_mode=22 1280×768 reduced blanking
hdmi_mode=23 1280×768 60Hz
hdmi_mode=24 1280×768 75Hz
hdmi_mode=25 1280×768 85Hz
hdmi_mode=26 1280×768 120Hz reduced blanking
hdmi_mode=27 1280×800 reduced blanking
hdmi_mode=28 1280×800 60Hz
hdmi_mode=29 1280×800 75Hz
hdmi_mode=30 1280×800 85Hz
hdmi_mode=31 1280×800 120Hz reduced blanking
hdmi_mode=32 1280×960 60Hz
hdmi_mode=33 1280×960 85Hz
hdmi_mode=34 1280×960 120Hz reduced blanking
hdmi_mode=35 1280×1024 60Hz
hdmi_mode=36 1280×1024 75Hz
hdmi_mode=37 1280×1024 85Hz
hdmi_mode=38 1280×1024 120Hz reduced blanking
hdmi_mode=39 1360×768 60Hz
hdmi_mode=40 1360×768 120Hz reduced blanking
hdmi_mode=41 1400×1050 reduced blanking
hdmi_mode=42 1400×1050 60Hz
hdmi_mode=43 1400×1050 75Hz
hdmi_mode=44 1400×1050 85Hz
hdmi_mode=45 1400×1050 120Hz reduced blanking
hdmi_mode=46 1440×900 reduced blanking
hdmi_mode=47 1440×900 60Hz
hdmi_mode=48 1440×900 75Hz
hdmi_mode=49 1440×900 85Hz
hdmi_mode=50 1440×900 120Hz reduced blanking
hdmi_mode=51 1600×1200 60Hz
hdmi_mode=52 1600×1200 65Hz
hdmi_mode=53 1600×1200 70Hz
hdmi_mode=54 1600×1200 75Hz
hdmi_mode=55 1600×1200 85Hz
hdmi_mode=56 1600×1200 120Hz reduced blanking
hdmi_mode=57 1680×1050 reduced blanking
hdmi_mode=58 1680×1050 60Hz
hdmi_mode=59 1680×1050 75Hz
hdmi_mode=60 1680×1050 85Hz
hdmi_mode=61 1680×1050 120Hz reduced blanking
hdmi_mode=62 1792×1344 60Hz
hdmi_mode=63 1792×1344 75Hz
hdmi_mode=64 1792×1344 120Hz reduced blanking
hdmi_mode=65 1856×1392 60Hz
hdmi_mode=66 1856×1392 75Hz
hdmi_mode=67 1856×1392 120Hz reduced blanking
hdmi_mode=68 1920×1200 reduced blanking
hdmi_mode=69 1920×1200 60Hz
hdmi_mode=70 1920×1200 75Hz
hdmi_mode=71 1920×1200 85Hz
hdmi_mode=72 1920×1200 120Hz reduced blanking
hdmi_mode=73 1920×1440 60Hz
hdmi_mode=74 1920×1440 75Hz
hdmi_mode=75 1920×1440 120Hz reduced blanking
hdmi_mode=76 2560×1600 reduced blanking
hdmi_mode=77 2560×1600 60Hz
hdmi_mode=78 2560×1600 75Hz
hdmi_mode=79 2560×1600 85Hz
hdmi_mode=80 2560×1600 120Hz reduced blanking
hdmi_mode=81 1366×768 60Hz
hdmi_mode=82 1080p 60Hz
hdmi_mode=83 1600×900 reduced blanking
hdmi_mode=84 2048×1152 reduced blanking
hdmi_mode=85 720p 60Hz
hdmi_mode=86 1366×768 reduced blanking
overscan_left 左侧跳过像素数
overscan_right 右侧跳过像素数
overscan_top 顶部跳过像素数
overscan_bottom 底部跳过像素数
framebuffer_width 控制台framebuffer宽度, 以像素为单位. 默认是显示器宽度减去超出扫描.
framebuffer_height 控制台framebuffer高度, 以像素为单位. 默认是显示器高度减去超出扫描.
framebuffer_depth 控制台framebuffer深度, 以位为单位. 默认是16位. 8位也是有效的, 但是默认RGB调色板会导致屏幕不可读. 24位效果更好 ,但是2012年6月15号发现有显示混乱问题. 32位没有混乱问题, 但是需要设置framebuffer_ignore_alpha=1, 并在2012年6月15号发现颜色显示错误.
framebuffer_ignore_alpha 设为1将禁用alpha通道. 仅对32位有效.
test_mode 允许在启动时做声音与图像测试.
disable_overscan 设为1将禁用超出扫描.
config_hdmi_boost 设置HDMI接口的信号强度. 默认为0. 如果出现HDMI干扰问题可以试试设为4. 最大为7.
display_rotate 顺时针旋转屏幕显示 (默认为0) 或者翻转显示.
display_rotate=0 正常
display_rotate=1 90度
display_rotate=2 180度
display_rotate=3 270度
display_rotate=0x10000 水平翻转
display_rotate=0x20000 垂直翻转
注意: 旋转90度或者270度额外需要GPU内存, 所以在GPU只分配到16M的时候旋转会无效. 可能的原因:
Crashes my RPI before Linux boots if set to “1” — REW 20120913.
哪些值对我的显示器有效?
你的HDMI显示器可能只支持一部分设置. 想要找出支持哪些设置, 可以使用下面的方法.
把输出格式设为VGA 60Hz (hdmi_group=1 hdmi_mode=1) 然后启动树莓派
输入下列命令可以获取CEA支持模式的列表
/opt/vc/bin/tvservice -m CEA
输入下列命令可以获取DMT支持模式的列表
/opt/vc/bin/tvservice -m DMT
输入下列命令可以获取当前设置状态
/opt/vc/bin/tvservice -s
输入下列命令可以从显示器获取更多详细信息
/opt/vc/bin/tvservice -d edid.dat /opt/vc/bin/edidparser edid.dat
使用默认HDMI模式去排除问题时, edid.dat文件同样会提供信息
许可的解码器
你可以购买绑定树莓派CPU序列号的证书来使用额外的硬件解码器.
decode_MPG2 可开启MPEG-2硬解的序列号.
decode_MPG2=0x12345678
decode_WVC1 可开启VC-1硬解的序列号.
decode_WVC1=0x12345678
可在多台树莓派间共享SD卡的序列号. 同时最多8个证书.
decode_XXXX=0x12345678,0xabcdabcd,0x87654321,…
启动
disable_commandline_tags 在启动内核前, 通过改写ATAGS (0x100处的内存)来阻止start.elf
cmdline (string) 命令行参数. 可用来代替cmdline.txt文件
kernel (string) 加载指定名称的内核镜像文件启动内核. 默认为”kernel.img”
kernel_address 加载kernel.img文件地址
kernel_old (bool) 为1时, 从0x0处加载内核
ramfsfile (string) 要的加载的ramfs文件
ramfsaddr 要加载的ramfs文件地址
initramfs (string address) 要加载的ramfs文件及其地址 (就是把ramfsfile+ramfsaddr合并为一项).
注意: 这项使用与其他项不同的语法 – 不要在这用”=”号. 正确示例:
initramfs initramf.gz 0x00800000
device_tree_address 加载device_tree的地址
init_uart_baud 初始化uart波特率. 默认为115200
init_uart_clock 初始化uart时序. 默认为3000000 (3Mhz)
init_emmc_clock 初始化emmc时序. 默认为100000000 (100MHz)
boot_delay 在加载内核前在start.elf等待指定秒. 总延迟=1000 * boot_delay + boot_delay_ms. 默认为1
boot_delay_ms 在加载内核前在start.elf等待指定毫秒. 默认为0
avoid_safe_mode 如果设为1, 将不以安全模式启动. 默认为0
超频
注意: 设置任何参数来超频树莓派都会在芯片中永久的储存一个保修位, 用于检测你的树莓派是否超频过. 如果设备超频过保修就无效了. 自2012年9月19号,你可以自由超频而不影响保修了.
最新的内核有一个默认开启”ondemand”调速器的cpu频率内核驱动. 未开启超频并不会有任何影响. 一旦你开超频, ARM频率将随处理器负载而变化. 只有在调速器需要时才会使用非默认值. 你可以使用*_min配置选项来调整最低值, 或者使用force_turbo=1来禁用动态超频.
当芯片温度达到85°C运行时会关闭超频及超压, 直到冷却. 即使在25°C环境温度下使用最高设置, 也不要让温度达到极限.
超频选项
参数 说明
arm_freq ARM频率,以MHz为单位. 默认为700
gpu_freq 同时设置core_freq, h264_freq, isp_freq, v3d_freq. 默认为250
core_freq GPU处理器核心频率,以MHz为单位. 由于GPU要驱动二级缓存, 对ARM性能会造成影响. 默认为 250
h264_freq 视频硬解模块频率,以MHz为单位. 默认为250
isp_freq 图像传感器管道模块频率,以MHz为单位. 默认为250
v3d_freq 3D模块频率,以MHz为单位. 默认为250
avoid_pwm_pll 不要把锁相环用在PWM音频. 这会略微降低模拟音频的效果. 空闲的锁相环允许从剩余GPU独立设置core_freq, 这将会比超频有更多权限. 默认为0
sdram_freq SDRAM频率,以MHz为单位.默认为400
over_voltage ARM/GPU核心电压调节. [-16,8]用0.025V步进等同于[0.8V,1.4V]. 默认为0 (1.2V). 只有在指定 force_turbo或current_limit_override时 (会设置保修位), 才允许数值在6以上
over_voltage_sdram 同时设置over_voltage_sdram_c, over_voltage_sdram_i, over_voltage_sdram_p
over_voltage_sdram_c SDRAM控制器电压调节. [-16,8]用0.025V步进等同于[0.8V,1.4V]. 默认为0 (1.2V)
over_voltage_sdram_i SDRAM I/O电压调节. [-16,8]用0.025V步进等同于[0.8V,1.4V]. 默认为0 (1.2V)
over_voltage_sdram_p SDRAM phy电压调节. [-16,8]用0.025V步进等同于[0.8V,1.4V]. 默认为0 (1.2V)
force_turbo 关闭动态CPU频率驱动及下面的最小设置. 开启h264/v3d/isp超频. 默认为0. 会设置保修位.
initial_turbo 在启动时以指定秒数 (上限为60) 或者以CPU频率来开启急速模式. 如果已经超频, 能对SD卡错误问题有改善. 默认为0
arm_freq_min 设置动态时序的最小arm_freq. 默认为700
core_freq_min 设置动态时序的最小core_freq. 默认为250
sdram_freq_min 设置动态时序的最小sdram_freq. 默认为400
over_voltage_min 设置动态时序的最小over_voltage. 默认为0
temp_limit 过热保护. 当芯片达到指定温度就把时序和电源切换会默认值. 把此值设高于默认值将影响保修. 默认为85
current_limit_override 当设为”0x5A000020″时, 禁止SMPS限流保护. 在超频过高无法重启时设置此项会有所帮助. 会设置保修位.
force_turbo模式
force_turbo=0
开启对ARM核心,GPU核心和SDRAM的动态时序及电压. 在忙的时候ARM频率会提高到”arm_freq”并在闲的时候降低到”arm_freq_min”. “core_freq”, “sdram_freq”和”over_voltage”的行为都一样. “over_voltage”最高为6 (1.35V). h264/v3d/isp部分的非默认值将被忽略.
force_turbo=1
关闭动态时序, 因此所有频率和电压会保持高值. h264/v3d/isp GPU部分的超频也会开启, 等同于设置”over_voltage”为8 (1.4V).
时序关系
GPU核心, h264, v3d和isp共享一个锁相环, 因此需要相关联的频率. ARM, SDRAM和GPU有各自独有的锁相环, 因此可以设为没有关联的频率.
当设了”avoid_pwm_pll=1″下列设置就没必要了.
pll_freq = floor(2400 / (2 * core_freq)) * (2 * core_freq)
gpu_freq = pll_freq / [偶数]
有效的gpu_freq会自动四舍五到到最接近的整型偶数, 所以请求core_freq为500, gpu_freq为300,算一下2000/300 = 6.666 => 6 ,结果就是333.33MHz.
已测试过的超频设置
下表显示了一些成功的超频尝试, 这些可以指导你进行超频. 这些设置不一定能在每台树莓派上都成功, 并且会缩短高通芯片的寿命.
arm_freq gpu_freq core_freq h264_freq isp_freq v3d_freq sdram_freq over_voltage over_voltage_sdram
800
900 275 500
900 450 450
930 350 500
1000 500 500 6
1050 6
1150 500 600 8
这是一个表明Hynix产的RAM在超频上表现不如三星产的RAM的报告.
超频时SD卡使用
设置SD卡: http://elinux.org/RPi_Easy_SD_Card_Setup
超频时使用6速或10速的SD卡(SHDC/SHDX)会导致在一些天后树莓派读取SD卡文件系统不稳定.
不管是ext4 , NTFS 或其他格式都一样.
不管是哪家SD卡生产商都一样.
不管是哪个版本的树莓派都一样.
这与SD卡容量无关 – 实际验证出现在16G或更大的SD卡上.
! 关键是你何时让树莓派功率不足,也就是低于树莓派的基本设置需求 !
popcornmix发表在https://github.com/raspberrypi/linux/issues/280:
“超频会导致SD卡错误.这情况往往是与板子相关(就是说有些树莓派超频后SD卡没事,有些不行).
我认为通常都是core_freq导致的SD卡问题(和arm_freq,sdram_freq比)”
在2013年4月写这个提示的时候在树莓派官方论坛上一共有137个有关于SD的问题, 绝大部分与超频有关.
如果你使用6速或10速SD卡, 还想要树莓派稳定运行: 不要尝试超频,否则很可能会丢失数据
监测温度及电压
要检测树莓派的温度, 看: /sys/class/thermal/thermal_zone0/temp
要检测树莓派当前的频率, 看: /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq
要检测树莓派电源装置的电压, 你需要一个万用电表, 接上电源测试点, 或者扩展头.
通常来说要保持核心温度低于70度, 电压高于4.8V. (另外请注意, 不要用那种便宜的USB电源, 那基本上是4.2V的, 这是因为那本来就是为充3.7V锂电池设计的, 根本无法为树莓派提供稳定的5V电压). 此外, 用散热片也是个好主意, 尤其是你把树莓派装到了壳子里. 一个合适的散热器是自带不干胶栅格状的 14x14x10 mm 散热片.
超频稳定性测试
大多数超频问题立马就会出现启动问题, 但还是会随时间而出现文件系统问题. 这是一个对系统,特别是SD卡进行压力测试的脚本. 如果脚本执行完成, dmesg中不提示任何错误, 你做的超频设置可能会比较稳定.
如果系统崩溃了, 在重启时按住shift键, 这会临时性关闭所有超频. 同样, 注意SD卡问题通常由core_freq造成,不要在raspi-config预设的高速(950 MHz)和超速(1 GHz)里来个大跳越(从250 MHz飞到500 MHz).
#!/bin/bash
#Simple stress test for system. If it survives this, it’s probably stable.
#Free software, GPL2+
echo “Testing overclock stability…”
#Max out the CPU in the background (one core). Heats it up, loads the power-supply.
nice yes >/dev/null &
#Read the entire SD card 10x. Tests RAM and I/O
for i in `seq 1 10`; do echo reading: $i; sudo dd if=/dev/mmcblk0 of=/dev/null bs=4M; done
#Writes 512 MB test file, 10x.
for i in `seq 1 10`; do echo writing: $i; dd if=/dev/zero of=deleteme.dat bs=1M count=512; sync; done
#Clean up
killall yes
rm deleteme.dat
#Print summary. Anything nasty will appear in dmesg.
echo -n “CPU freq: ” ; cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq
echo -n “CPU temp: ” ; cat /sys/class/thermal/thermal_zone0/temp
dmesg | tail
echo “Not crashed yet, probably stable.”
树莓派基金会今日发布了一款新的代号为树莓派零(Raspberry Pi Zero)的版本。令人振奋的是,该版本售价定在5美元,远低于之前版本20-35美元的定价区间。该版本在威尔士制造,将包含以下特性以及参数:
博通 BCM2835 芯片 1GHz ARM11 core (比树莓派1代快 40%)
512MB LPDDR2 SDRAM
一个 micro-SD 卡槽
一个 mini-HDMI 接口,支持 1080p 60hz 视频输出
Micro-USB 接口用于供电和数据传输
1个 40Pin 的 GPIO 接口,同树莓派A+、B+、2B版本一样(引脚空置,需要自己焊接,这样在不需要使用到GPIO的时候会显得更加小巧更容易封装)
空置的视频接口(用于连接电视输出视频,需要自己焊接)
有史以来最小的树莓派尺寸,65mm x 30mm x 5mm
树莓派零可以运行 Raspbian 以及任何你喜欢的应用,包括 Scratch, Minecraft 和 Sonic Pi等,现已在英国发售,相信很快能通过国内的授权经销商购买到。另外您可能需要配以如下配件来使用树莓派零,40Pin 排针和、OTG 线缆和 mini-HDMI To HDMI 转接头。
本文所介绍的内容基于树莓派瑞士军刀扩展板(SAKS),由于 SAKS 基于树莓派通用的 GPIO 设计,文中的原理和代码也适用于其他情况。
本文由树莓派实验室创作,遵循CC协议(署名-非商业性使用-禁止演绎-相同方式共享),欢迎树莓派爱好者们遵循协议内容转载传播。谢绝不遵守协议的转载和抄袭。
本节将介绍如何通过 SAKS 扩展板 DIY 一个具有闹钟功能的数字时钟。
由于我们已经开始基于 SAKS SDK 开发(了解 SAKS SDK 发布的信息请阅读这里),本例程中涉及到的 SAKS 扩展板引脚编号我们根本不需要再关心。
要将 SAKS 扩展板的数码管改造成数字时钟,首先要了解数码管的使用方法。在 SAKS SDK 中,已经对数码管做了封装,如下:
# 将显示“1234”4位数字,并且每一位右下角的小点点亮 SAKS.digital_display.show(“1.2.3.4.”) # 将显示“1234”4位数字,并且数字2后面的小点点亮 SAKS.digital_display.show(“12.34”) # 在第4位数码管显示“1”,其他3位数码管不显示 SAKS.digital_display.show(“###1”)
一、显示时间
要让 SAKS 扩展板上的4位数码管,每一位都显示不一样的数字,需要采用动态扫描的方法。同 LED 一样,用低电平进行段选和位选。由于动态扫描程序涉及到编码等逻辑,较为复杂。有了以上SDK封装的通用方法为基础,让数码管按照固定的格式显示时间就很容易了。程序代码如下:
SAKS.digital_display.show((“%02d%02d” % (h, m)))
其中“%02d”表示一个2位数字,当h、m不足2位时前面补0,例如3会显示03。h表示小时,m表示分钟,整体效果是显示“hhmm”。
二、实现闹钟
实现闹钟需要的是在程序中设定好时间,类似整点报时,当时间一到,就调用蜂鸣器哔声鸣叫、黄色LED闪烁。
当然,还需要加入一个轻触开关,来取消闹铃。而如果30秒依然没有手动取消闹铃,则自动终止闹铃。这里需要有几个关键变量:
# 闹钟当前状态 __alarm_beep_status = False # 当前哔鸣次数 __alarm_beep_times = 0 # 在这里设定闹钟定时时间 __alarm_time = “18:10:00”
结合之前本系列对 SAKS 轻触开关的使用介绍,我们的闹钟完整的程序逻辑如下:
#!/usr/bin/env python # -*- coding: utf-8 -*- from sakshat import SAKSHAT import time #Declare the SAKS Board SAKS = SAKSHAT() __dp = True __alarm_beep_status = False __alarm_beep_times = 0 # 在这里设定闹钟定时时间 __alarm_time = “18:10:00″ #在检测到轻触开关触发时自动执行此函数 def tact_event_handler(pin, status): ”’ called while the status of tacts changed :param pin: pin number which stauts of tact is changed :param status: current status :return: void ”’ global __alarm_beep_status global __alarm_beep_times # 停止闹钟响铃(按下任何轻触开关均可触发) __alarm_beep_status = False __alarm_beep_times = 0 SAKS.buzzer.off() SAKS.ledrow.items[6].off() if __name__ == “__main__”: #设定轻触开关回调函数 SAKS.tact_event_handler = tact_event_handler SAKS.buzzer.off() SAKS.ledrow.items[6].off() while True: # 以下代码获取系统时间、时、分、秒、星期的数值 t = time.localtime() h = t.tm_hour m = t.tm_min s = t.tm_sec w = time.strftime(‘%w’,t) #print h,m,s,w print “%02d:%02d:%02d” % (h, m, s) if (“%02d:%02d:%02d” % (h, m, s)) == __alarm_time: __alarm_beep_status = True __alarm_beep_times = 0 if __dp: # 数码管显示小时和分,最后一位的小点每秒闪烁一次 SAKS.digital_display.show((“%02d%02d.” % (h, m))) # 判断是否应该响起闹钟 if __alarm_beep_status: SAKS.buzzer.on() SAKS.ledrow.items[6].on() __alarm_beep_times = __alarm_beep_times + 1 # 30次没按下停止键则自动停止闹铃 if __alarm_beep_times > 30: __alarm_beep_status = False __alarm_beep_times = 0 else: SAKS.digital_display.show((“%02d%02d” % (h, m))) if __alarm_beep_status: SAKS.buzzer.off() SAKS.ledrow.items[6].off() __dp = not __dp time.sleep(0.5) input(“Enter any keys to exit…”)
将上面的程序源码保存为 main.py 接下来如果要运行,请注意程序开头的 from sakshat import SAKSHAT,需要导入 SAKS SDK 模块。为此我们需要将 SAKS SDK 模块的相关文件和 main.py 放在一起才能正确执行 main.py 程序。我们准备了一个包含 main.py 和 SAKS SDK 的包并在 Github 上提供下载:https://github.com/nxez/SAKS-tutorials/tree/master/digital-clock
接下来在终端运行:
git clone https://github.com/nxez/SAKS-tutorials.git cd SAKS-tutorials cd digital-clock sudo python main.py
由于显示算法基于动态扫描的方式,所以在树莓派CPU占用波动较大时会出现一定程度的闪烁,属于正常现象。如果你觉得你对闹钟的需求比较复杂,甚至需要一个配置文件来对闹钟进行配置。也可以在本程序基础上稍加完善,通过读取配置文件的方式动态加载闹钟设定。
后面我们后面将开始介绍如何基于 SAKS 扩展板 DIY 各种有趣、实用的东西,欢迎持续关注!
本文属于《树莓派瑞士军刀扩展板(SAKS)DIY 教程》系列文章,查看系列文章目录,请访问:https://shumeipai.nxez.com/swiss-army-knife-shield-for-raspberry-pi-diy-tutorials
距离出上一个瑞士军刀扩展板 SAKS 的教程已经过去很久了,在这期间我们在思考一个问题——既然 SAKS 的设计定位于上手快、DIY可能性多,那么为何不做得彻底一点?之所以觉得之前的教程有某些“不够彻底”,是因为当遇到较复杂的需求时,创客们不得不用代码重复去实现一些数码管动态扫描、开关检测、传感器状态读取等硬件的操作逻辑。终于我们决定开发一套SDK,将以上需要重复造的轮子进行科学封装,从而达到让创客们集中精力专心实现功能,而不用为关注底层的操控逻辑而分心。
终于我们完成了这个 SDK 并在此基础上实现了SAKS的SDK,基于Python语言用面向对象的方法实现(由于封装程度高,即便你没有系统学习过面向对象的开发方法也完全不用担心不会使用)。接下来我们会通过既定的一些例程(例如树莓派 SAKS 扩展板实用应用 之 CPU 温度显示和警报),介绍如何基于 SAKS SDK 实现例程中的功能。
树莓派瑞士军刀扩展板 SAKS SDK 已经通过 Github 开源(GPL v2.0 许可方式)并提供下载:
https://github.com/nxez/SAKS-SDK
也可通过以下命令下载。
git clone https://github.com/nxez/SAKS-SDK.git
(树莓派瑞士军刀扩展板购买请移步此处)
随后我们将陆续完善开发文档并推出更多教程,敬请关注。同时我们非常期待有兴趣的创客、树莓派学习者深度参与进来,基于此SDK创造自己的作品、完善SDK本身!
树莓派实验室 QQ 群号 339050109
本文所介绍的内容基于树莓派瑞士军刀扩展板(SAKS),由于 SAKS 基于树莓派通用的 GPIO 设计,文中的原理和代码也适用于其他情况。
本文由树莓派实验室创作,遵循CC协议(署名-非商业性使用-禁止演绎-相同方式共享),欢迎树莓派爱好者们遵循协议内容转载传播。谢绝不遵守协议的转载和抄袭。
本节以 SAKS 扩展板为硬件基础,实现将树莓派的 CPU 或 GPU 的温度显示在数码管上。当温度超过阀值时,自动触发 SAKS 扩展板上的蜂鸣器响起警报。
由于我们已经开始基于 SAKS SDK 开发(了解 SAKS SDK 发布的信息请阅读这里),本例程中涉及到的 SAKS 扩展板引脚编号我们根本不需要再关心。
可能你还不知道,树莓派内置了一个传感器你可以用来获取树莓派的CPU和GPU温度。这对于保护你的设备非常有用,这样就可以在树莓派温度过高的时候关掉树莓派或者在温度过热的时候报警。
首先,要获取树莓派 CPU 和 GPU 的温度,我们封装了以下方法:
import commands def get_cpu_temp(): tempFile = open( “/sys/class/thermal/thermal_zone0/temp” ) cpu_temp = tempFile.read() tempFile.close() return float(cpu_temp) / 1000 #如果你想使用华氏温度,打开注释 #return float(1.8*cpu_temp)+32 def get_gpu_temp(): gpu_temp = commands.getoutput( ‘/opt/vc/bin/vcgencmd measure_temp’ ).replace( ‘temp=’, ” ).replace( ‘\’C’, ” ) return float(gpu_temp) #如果你想使用华氏温度,打开注释 # return float(1.8* gpu_temp)+32
这里面有两个方法:get_cpu_temp 和 get_gpu_temp。它们俩都返回一个float型的摄氏温度值。(如果你想使用华氏温度,打开里面的两行注释)。现在,让我们把所有信息输出到 SAKS 扩展板的数码管上吧。
下面直接调用SAKS SDK的方法来让数码管和蜂鸣器工作(这里只定义了CPU温度获取,如果你希望显示GPU温度,加入上文中的方法定义并修改调用即可)。
#!/usr/bin/env python # -*- coding: utf-8 -*- #导入 SAKS SDK 模块 from sakshat import SAKSHAT import time import commands #Declare the SAKS Board,定义一个SAKS对象 SAKS = SAKSHAT() #返回浮点型的CPU温度 def get_cpu_temp(): tempFile = open( “/sys/class/thermal/thermal_zone0/temp” ) cpu_temp = tempFile.read() tempFile.close() return float(cpu_temp) / 1000 #如果你想使用华氏温度,打开注释 #return float(1.8*cpu_temp)+32 #主程序入口 if __name__ == “__main__”: while True: t = get_cpu_temp() #如果你希望实时温度的数值输出在屏幕上请取消下面的注释 #print(“%.2f” % t) #调用SAKS的数码管对象(digital_display),让他按照指定格式显示(show)温度数值 SAKS.digital_display.show(“%.2f” % t) #这里暂时设定为50度警报响起 if t > 50: #调用SAKS的蜂鸣器对象(buzzer),让他按照按照一定的频率发出警报(beepAction),下面的参数是以2毫秒的间隔鸣响30次 SAKS.buzzer.beepAction(0.02,0.02,30) time.sleep(1) input(“Enter any keys to exit…”)
其中 “%.2f” 格式化字符串表示显示的数值保留2位小数。由于数码管的 show 方法已经封装了数码管的逻辑,因此任何时候调用数码管显示数值,只需要调用这个方法,把数值作为参数提供即可。将上面的程序源码保存为 main.py 接下来如果要运行,请注意程序开头的 from sakshat import SAKSHAT,需要导入 SAKS SDK 模块。为此我们需要将 SAKS SDK 模块的相关文件和 main.py 放在一起才能正确执行 main.py 程序。我们准备了一个包含 main.py 和 SAKS SDK 的包并在 Github 上提供下载:https://github.com/nxez/SAKS-tutorials/tree/master/CPU-temperature-display
在终端运行:
git clone https://github.com/nxez/SAKS-tutorials.git cd SAKS-tutorials cd CPU-temperature-display sudo python main.py
CPU 温度数值实时显示在了 SAKS 扩展板上。有了这样的保护之后,你大概可以安心地超频了吧!
后面我们后面将开始介绍如何基于 SAKS 扩展板 DIY 各种有趣、实用的东西,欢迎持续关注!
本文属于《树莓派瑞士军刀扩展板(SAKS)DIY 教程》系列文章,查看系列文章目录,请访问:https://shumeipai.nxez.com/swiss-army-knife-shield-for-raspberry-pi-diy-tutorials
树莓派官方在上周放出了 Raspbian 8 Jessie 镜像文件下载。这是 Raspbian Wheezy 2015.5.5 之后的一次更新版本,核心版本升级到了 4.1。而老的 Wheezy 版本也可以通过简单的步骤升级到 Raspbian Jessie 8 且不用重新刷写镜像。下面将介绍如何升级,要知道,升级有可能会破坏现有系统,在此之前请一定注意备份好老的系统(你可以用镜像读写工具备份现有系统)。如果你对之前的系统做的更改越小,升级将会越顺利。
1. 建议:
移除非必要的包
完整升级当前系统
备份数据
虽然用SSH操作问题不大,但还是建议直进入终端来操作
2. 升级当前系统
在当前的 Wheezy 下运行:
apt-get update apt-get upgrade apt-get dist-upgrade
sed -i ‘s/wheezy/jessie/g’ /etc/apt/sources.list
注释掉 archive repository. 最终变更为如下:
deb http://mirrordirector.raspbian.org/raspbian jessie main firmware contrib non-free #deb http://archive.raspberrypi.org/debian jessie main
4. 更新到 Raspbian Jessie
一旦进入升级,会需要选择手动重启当前运行的所有服务。建议选择手动重启服务(如SSH服务),这也将保证当你用SSH操作时连接不会被中断。建议检查并确保 SSH 没有禁用 root 登录。
一切就绪之后初始化系统并升级到 Raspbian Jessie:
apt-get update apt-get upgrade apt-get dist-upgrade
重启系统:
reboot
升级成功后,用 hostnamectl 可以看到当前 Raspbian 系统版本是 Raspbian GNU/Linux 8 (jessie):
hostnamectl Static hostname: pi Icon name: computer Chassis: n/a Machine ID: e8b0569e6af846b7b3c9911191e2da9a Boot ID: 273f90ee3a014119a948afa3a3aa95f3 Operating System: Raspbian GNU/Linux 8 (jessie) Kernel: Linux 3.18.0-trunk-rpi Architecture: arm
本文所介绍的内容基于树莓派瑞士军刀扩展板(SAKS),由于 SAKS 基于树莓派通用的 GPIO 设计,文中的原理和代码也适用于其他情况。
本文由树莓派实验室创作,遵循CC协议(署名-非商业性使用-禁止演绎-相同方式共享),欢迎树莓派爱好者们遵循协议内容转载传播。谢绝不遵守协议的转载和抄袭。
本节以 SAKS 扩展板为硬件基础,实现所在城市PM2.5指数显示,并用三色LED配合蜂鸣器警报来提示环境状态。由于要监测当前环境的PM2.5需要专用传感器,气象发布机构已经对每个城市做了空气指数的采集,我们可以利用他们发布的数据显示出来,即可满足日常对PM2.5的关注需求。
由于我们已经开始基于 SAKS SDK 开发(了解 SAKS SDK 发布的信息请阅读这里),本例程中涉及到的 SAKS 扩展板引脚编号我们根本不需要再关心。
首先,要获取互联网上的PM2.5数据,可以搜索一下专业机构的API,下面的例子使用的是和风天气的API。要使用他们的API,需要简单注册一下,会得到一个字符串Key,在下面的例子中填入这个Key就可以调用他们的数据了。另外需要找到自己所在城市对应的编码替换“CN101020100”这一段代码。注意,并不是所有的城市下辖的区域都有PM2.5数据,因此在选择城市的时候尽量选择有PM2.5数据的区域。
用 Python 实现获得PM2.5指数的程序,这个方法返回一个PM2.5数值,如果返回-1,表示数据获取失败:
”’ cityid 和 key 需要根据实际情况替换 参考 http://www.heweather.com/documents/api http://www.heweather.com/documents/cn-city-list ”’ weather_url = ‘https://api.heweather.com/x3/weather?cityid=CN101020100&key=xxx’ def get_pm25(): global weather_url req = urllib2.Request(weather_url) resp = urllib2.urlopen(req) content = resp.read() if(content): weatherJSON = json.JSONDecoder().decode(content) #print(content) try: if weatherJSON[‘HeWeather data service 3.0’][0][‘status’] == “ok”: if weatherJSON[‘HeWeather data service 3.0’][0].has_key(‘aqi’): print(weatherJSON[‘HeWeather data service 3.0’][0][‘aqi’][‘city’][‘pm25’]) return int(weatherJSON[‘HeWeather data service 3.0’][0][‘aqi’][‘city’][‘pm25’]) else: return -1 else: return -1 except: return -1
下面直接调用SAKS SDK的方法来让LED和蜂鸣器工作。
if __name__ == “__main__”: while True: pm25 = get_pm25() if pm25 == -1: time.sleep(30) continue #严重污染,红灯亮蜂鸣器Beep if pm25 >= 250: SAKS.ledrow.off() SAKS.ledrow.items[7].on() SAKS.buzzer.beepAction(0.05,0.05,3) #重度污染,红灯亮 if pm25 < 250: SAKS.ledrow.off() SAKS.ledrow.items[7].on() #中度污染,红灯亮 if pm25 < 150: SAKS.ledrow.off() SAKS.ledrow.items[7].on() #轻度污染,黄灯亮 if pm25 < 115: SAKS.ledrow.off() SAKS.ledrow.items[6].on() #良,一个绿灯亮 if pm25 < 75: SAKS.ledrow.off() SAKS.ledrow.items[4].on() #优,两个绿灯亮 if pm25 < 35: SAKS.ledrow.off() SAKS.ledrow.items[4].on() SAKS.ledrow.items[5].on() #print (("%4d" % pm25).replace(' ','#')) #数码管显示PM2.5数值 SAKS.digital_display.show(("%4d" % pm25).replace(' ','#')) time.sleep(1800) input("Enter any keys to exit...") 上面加入了每30分钟读取一次PM2.5指数并刷新数码管的逻辑。由于数码管的 show 方法已经封装了数码管的逻辑,因此任何时候调用数码管显示数值,只需要调用这个方法,把数值作为参数提供即可。 SAKS.ledrow.items[7].on() 表示第8个LED亮,SAKS.ledrow.off() 表示所有LED熄灭。SAKS SDK 已经将瑞士军刀的操作作了封装,只用知道如何应用即可,当然有兴趣也可以下载 SDK 的源码研究。 将上面的程序源码保存为 main.py 接下来如果要运行,请注意程序开头的 from sakshat import SAKSHAT,需要导入 SAKS SDK 模块。为此我们需要将 SAKS SDK 模块的相关文件和 main.py 放在一起才能正确执行 main.py 程序。我们准备了一个包含 main.py 和 SAKS SDK 的包并在 Github 上提供下载:https://github.com/nxez/SAKS-tutorials/tree/master/pm25-display 在终端运行: git clone https://github.com/nxez/SAKS-tutorials.git cd SAKS-tutorials cd pm25-display sudo python main.py PM2.5指数显示在了 SAKS 扩展板上,数码管下方的LED同时显示了空气质量状态。 后面我们后面将开始介绍如何基于 SAKS 扩展板 DIY 各种有趣、实用的东西,欢迎持续关注! 本文属于《树莓派瑞士军刀扩展板(SAKS)DIY 教程》系列文章,查看系列文章目录,请访问:https://shumeipai.nxez.com/swiss-army-knife-shield-for-raspberry-pi-diy-tutorials
世界创客大会在上周末的纽约皇后区举行。在科学馆底层的中庭里,你会见到这样一个有趣的圆柱体:表面“贴”满了半透明的荧光绿电路板不停地摇动,就像一片片风中的机器树叶。这个设备叫做“See More(多看)”,是一台256节点计算机集群,由艺术家Sam Blanchard和弗吉尼亚理工学院的科学家Kirk Cameron合作而成。
它的名字和Seymour Cray谐音,旨在向这位超级计算机之父致敬。See More的表面有256枚树莓派计算机,它们一同合作,“解析一个搜索数据库”。
每个树莓派都与一个90度旋转的马达相连接,而它的形态则表明了它的状态:如果和地面保持垂直,意味着它处于空闲状态;而一旦它翻转起来,说明它正在工作——计算数据以完成任务。而任务完成之后,计算机都会恢复原来的样子。
制造See More的目的很简单,用Blanchard的话来说,就是“物理演示数据变化的可视化形态”,旨在向普通民众展示并行计算工作原理的跨学科合作。
【科普时间】并行计算,或称平行计算是相对于串行计算来说的。它是一种一次可执行多个指令的算法,目的是提高计算速度,及通过扩大问题求解规模,解决大型而复杂的计算问题。其实并行计算离我们并不遥远,搜索引擎带来的结果、Siri响应给予用户回答,都是并行计算的体现。
然而对于公众而言,理解并行计算的运作原理还是有些难度,Cameron决定开发一个项目,直观地让大家了解它是什么。
那么See More都在找些什么呢?设计者把它用于检索市政在线记录(顾名思义),比如公交故障列表、监禁统计、性传播疾病感染率等等。当See More得到一个关键词,它便开始工作并返回结果。
举个例子,如果输入了某个地铁站站点,那么该站点附近的所有数据都会被检索出来,有点类似于地图里的“附近”功能,剧院、餐馆、图书馆,办公楼,都会被检索出来。Blanchard表示,“所有的匹配都会呈现,这和我们搜索互联网的处理能力和规模是类似的。”
那么未来的See More会是什么样的?Blanchard和Cameron还没有仔细考虑,但前者希望能够提升和观众的互动性。“我在会场上看到有人会尝试挥舞手臂,以为设备能够因此做出反应,”Blanchard表示,“不过它并不是这样的,但这是个好想法,我们也会尝试在未来实现类似的功能。”
本文所介绍的内容基于树莓派瑞士军刀扩展板(SAKS),由于 SAKS 基于树莓派通用的 GPIO 设计,文中的原理和代码也适用于其他情况。
本文由树莓派实验室创作,遵循CC协议(署名-非商业性使用-禁止演绎-相同方式共享),欢迎树莓派爱好者们遵循协议内容转载传播。谢绝不遵守协议的转载和抄袭。
本节以 SAKS 扩展板为硬件基础,实现一个数字温度计,显示实时室温。利用 SAKS 扩展板预留的 DS18B20 的排座,直插一个 DS18B20 温度传感器用于感知温度。再将温度显示在数码管上。
由于我们已经开始基于 SAKS SDK 开发(了解 SAKS SDK 发布的信息请阅读这里),本例程中涉及到的 SAKS 扩展板引脚编号我们根本不需要再关心。
一、读取 DS18B20 温度值
2012年12月之后的 Raspbian 系统已经能够支持 DS18B20 单总线温度传感器。这种传感器由半导体包裹的头和三个引脚组成,它是一种精确地数字设备。DS18B20 传感器可以以非并行连接接入,这一点几乎与其他市售的传感器都不同!所有传感器共享相同的针脚,SAKS 扩展板已经在 VCC 脚和数据脚之间加入一个 4.7k 欧的电阻。用于拉高数据输出脚的电压,保持数据输出的稳定。
要注意 DS18B20 插入 SAKS 扩展板排座的方向,弧形的一边如图所示。如果你接反了,有可能会烧坏传感器。
DS18B20 插入示意图
为了验证 DS18B20 插入之后是否正常工作,在终端输入以下命令:
sudo modprobe w1-gpio
sudo modprobe w1-therm
cd /sys/bus/w1/devices
ls
执行到这里时,如果 “devices” 目录下出现了以 “28-” 开头的目录,就表示 DS18B20 被正确识别了。
注意:假如到了这一步,无法看到“28-” 开头的目录,请先确认一下你是否使用了2015-02-16之后的Raspbain系统,如果是,则建议按照如下方法修改配置:
sudo nano /boot/config.txt
在最后一行手动添加这个,保存并重启树莓派。
dtoverlay=w1-gpio-pullup,gpiopin=4
根据官方的说法,在2015-02-16之后的Raspbain版本,为了防止GPIO的冲突,使用了新的dt策略,查看 /boot/overlay/readme
cd 28-xxxx(XXX换成实际的传感器编号)
cat w1_slave
执行到这里就能看到两行文字,第一行末尾都会有一个YES或NO,如果是YES,那第二行紧接着就是温度,以1/1000摄氏度为单位。
所以在上面的例子中,实际读取到的温度是25.75摄氏度。
二、显示温度
要将从传感器读取到的温度数值显示在 SAKS 扩展板的数码管上,首先要了解数码管的使用方法。在 SAKS SDK 中,数码管的 show 方法已经封装了数码管的逻辑,因此任何时候调用数码管显示数值,只需要调用这个方法,把数值作为参数提供即可。如果你有兴趣了解数码管具体是如何被驱动工作的,可以在 SDK 源码中找到相关的部分。其次,DS18B20温度的读取,SDK中同样做了封装,提供了方便快捷的方法来获取。好了,要显示温度数值就简单了。程序代码如下:
from sakshat import SAKSHAT import time #Declare the SAKS Board SAKS = SAKSHAT() if __name__ == “__main__”: while True: #从 ds18b20 读取温度(摄氏度为单位) temp = SAKS.ds18b20.temperature #返回值为 -128.0 表示读取失败 if temp == -128.0 : #10秒后再次尝试 time.sleep(10) continue print ((“%5.1f” % temp).replace(‘ ‘,’#’)) #数码管显示温度数值,5位(含小数点)、精确到小数点1后1位 SAKS.digital_display.show((“%5.1f” % temp).replace(‘ ‘,’#’)) time.sleep(5) input(“Enter any keys to exit…”)
将上面的程序源码保存为 main.py 接下来如果要运行,请注意程序开头的 from sakshat import SAKSHAT,需要导入 SAKS SDK 模块。为此我们需要将 SAKS SDK 模块的相关文件和 main.py 放在一起才能正确执行 main.py 程序。我们准备了一个包含 main.py 和 SAKS SDK 的包并在 Github 上提供下载:https://github.com/nxez/SAKS-tutorials/tree/master/temperature-display-ds18b20
在终端运行:
git clone https://github.com/nxez/SAKS-tutorials.git cd SAKS-tutorials cd temperature-display-ds18b20 sudo python main.py
温度数值实时显示在了 SAKS 扩展板上。
后面我们后面将开始介绍如何基于 SAKS 扩展板 DIY 各种有趣、实用的东西,欢迎持续关注!
本文属于《树莓派瑞士军刀扩展板(SAKS)DIY 教程》系列文章,查看系列文章目录,请访问:https://shumeipai.nxez.com/swiss-army-knife-shield-for-raspberry-pi-diy-tutorials