这篇文章来源于DevicePlus.com英语网站的翻译稿。
今天我们将会在Sense HAT上测试六个板载传感器!如果您不熟悉Sense HAT,那么您可以点击以下链接查看上一篇文章:用于Raspberry Pi的Sense HAT附加板——LED显示屏操作!
这一次我们会继续按照Raspberry Pi官网上的教程进行操作。紧接上次,这里从第4章开始!
Sense HAT有一个8×8 RGB LED矩阵,一个五键操纵杆,并且包含以下传感器:
- 陀螺仪
- 加速度计
- 磁力计
- 温度传感器
- 气压传感器
- 湿度传感器
您可以看到,Sense HAT配备了六种类型的传感器。让我们利用这些传感器来获取相关数据吧!
气压 · 温度 · 湿度
首先,我们从压力、温度和湿度传感器开始。这些传感器位于Sense HAT的右侧。湿度传感器标有“HUMIDITY”字样;其下方是气压传感器,用“PRESSURE”标记。湿度传感器还负责测量温度。
每个传感器都有各自的函数,所以我们可以很轻松地获取这些数值!
从湿度传感器获取当前温度,单位摄氏度。
从压力传感器获取当前压力,单位毫巴。
从湿度传感器获取相对湿度百分比。
让我们使用示例代码来获取相应数值:
Env.py
from sense_hat import SenseHat
sense = SenseHat()
while True:
t = sense.get_temperature()
p = sense.get_pressure()
h = sense.get_humidity()
t = round(t, 1)
p = round(p, 1)
h = round(h, 1)
msg = "Temperature = %s, Pressure=%s, Humidity=%s" % (t,p,h)
sense.show_message(msg, scroll_speed=0.05)
即使在命令行中删除这条语句也不会有问题,但是如果在系统运行时强制终止,那么LED可能会一直处于点亮状态。(LED不会自动关闭,会一直保持终止时的状态)。我们建议您的程序不是无限循环或不会从IDLE中删除该语句。
视频1
如上述视频所示,LED矩阵显示如下字符串:“Temperature = 33.4,Pressure = 1010.8,Humidity = 33.8”。因此我获取的结果如下:温度33.4 °C;气压1010.8 hPa;湿度33.8%。
由于Raspberry Pi产生的热量,传感器感测到的温度超过了30度。虽然该数值与实际温度存在很大偏差,但是不失为针对热散逸的一种对策(测量主体温度)。
Scrolling_env.py
from sense_hat import SenseHat
sense = SenseHat()
while True:
t = sense.get_temperature()
p = sense.get_pressure()
h = sense.get_humidity()
t = round(t, 1)
p = round(p, 1)
h = round(h, 1)
if t > 18.3 and t < 26.7:
bg = [0, 100, 0] # green
else:
bg = [100, 0, 0] # red
msg = "Temperature = %s, Pressure=%s, Humidity=%s" % (t, p, h)
sense.show_message(msg, scroll_speed=0.05, back_colour=bg)
视频2
上面的代码会警告您国际空间站的温度是否异常。没有问题时(18.3℃至26.7℃),温度数值的显示背景为绿色;出现异常时,温度数值的显示背景为红色。在上面的视频中,温度传感器显示温度数值为34.2度,因此显示在红色背景中。
陀螺仪·加速度传感器·磁传感器
湿度和压力传感器旁边有一个“惯性测量单元(IMU:加速度计、陀螺仪、磁力计)”。
陀螺仪是一个旋转轮子或圆盘,其旋转轴线可以是任意方向。(它是检测物体的角度(姿态)、角速度或角加速度的仪器或设备。)
加速度计是一种可以测量正确加速度的装置。(小型加速度计(加速度传感器)通过MEMS技术制造。MEMS加速度计广泛用于汽车安全气囊、汽车导航/倾斜仪、游戏控制器等领域)
在物理学中,加速度是物体的速度相对于时间的变化率。根据牛顿第二定律,物体的加速度是作用在物体上的所有力的最终结果。加速度是矢量(它们有大小和方向)。
磁力计是一种测量磁性的仪器,比如铁磁体这种磁性材料的磁化,或者某个特定位置上磁场的方向、强度或相对变化。
我发现角速度、角加速度和加速度这几个概念掌握起来比较困难。角速度是指物体旋转的速度;角加速度是转速的变化率(角速度);加速度是速度随方向的变化率(速度)。
关于磁场,让我们来看看指南针如何在Sense HAT中工作。到目前为止,我并不清除指南针如何使用,但是我们试着来运行一个示例代码。
首先,我将使用陀螺仪来获取Raspberry Pi的方向。要处理这个传感器,您需要了解以下三个术语:Pitch(俯仰)、Roll(翻滚)和Yaw(偏航)。
视频3
飞行中的飞机拥有三个自由旋转维度:俯仰,绕机翼之间的轴线上抬或下降;偏航,绕竖直轴线向左或向右摆动;翻滚,绕机头至机尾之间的轴线旋转。
上图展示了Sense HAT中的轴。
调用上文的get_orientation_degrees。
get_orientation_degrees
利用飞机的俯仰、翻滚和偏航主轴获取当前方向,单位为度。
get_orientation函数会获取Raspberry Pi(Sense HAT)相对于水平面倾斜的数值。
这些数值返回到Python字典中。在其他语言中,这与关联数组类似。
代码示例
pitch, roll, yaw = sense.get_orientation().values()
print("pitch=%s, roll=%s, yaw=%s" % (pitch,yaw,roll))
这三个变量的赋值方法请点击这里,参见官网。我对多变量赋值并不是很熟悉。
代码示例
orientation = sense.get_orientation()
print("p: %s, r: %s, y: %s" % (orientation["pitch"],orientation["roll"],orientation["yaw"]))
代码越长,更容易了解发生了什么,即使是Python初学者也是如此。
Orientation2.py
代码示例
from sense_hat import SenseHat
import time
sense = SenseHat()
while True:
orientation = sense.get_orientation()
p=round(orientation["pitch"], 0)
r=round(orientation["roll"], 0)
y=round(orientation["yaw"], 0)
print("p: %s, r: %s, y: %s" % (p,r,y))
time.sleep(1)
视频4
我尝试向各个方向倾斜Raspberry Pi,同时以1秒的间隔输出Pitch、Roll和Yaw的数值。您可以看到数值正在改变,如上图所示。如果将Raspberry Pi边对边地翻转,那么Pitch的值会发生变化。如果您把它倒置,Roll的数值会发生变化;如果您水平旋转Pi,Yaw数值会变化。
我注意到即使我没有移动Pi,数值也会发生轻微变化。难道是周围有什么东西造成了数值变化吗…?
获取原始x轴、y轴和z轴的加速度数据。
Acceleration.py
代码示例
from sense_hat import SenseHat
sense = SenseHat()
while True:
acceleration = sense.get_accelerometer_raw()
x = acceleration['x']
y = acceleration['y']
z = acceleration['z']
x=round(x, 0)
y=round(y, 0)
z=round(z, 0)
print("x=%s, y=%s, z=%s" % (x, y, z))
视频5
如上面的示例代码所示,获取x、y、z的数值还有另外一种方法。看起来该程序利用加速度计来获取数据。在上面的视频中,倾斜Raspberry Pi时,您会看到数值发生变化。
我能够理解用陀螺仪可以获得方向,但是通过加速度计也能获取方向吗?
什么是加速度计?– atmarkIT
加速度计还可以检测由于重力产生的地面方向的加速度,而从加速度传感器获得的加速度总是用户施加到装置的加速度和重力加速度的合力。
如下所示,加速度计检测到的加速度可以作为以装置为中心的三维空间中每个空间轴的分量获取。
实际上,我们已经在之前的教程 使用带有部件和传感器的Arduino平台–加速度计第1部分中研究过智能手机中的加速度计。
虽然没有在Raspberry Pi官方网站上发布,但是我还是决定尝试使用磁性传感器获取数据!
调用set_imu_config禁用陀螺仪和加速度计,然后通过磁力计获取北向,单位为度。
图5显示了以1秒为间隔获得的数值。我能够获得这些数值,但是这些数字意味着什么呢?尽管方向发生了变化,但是我看不到数字有多大变化。难道附近有东西在干扰传感器吗?(如果您能够成功获取数据,请与我们分享您是如何做到的!)
Sense HAT的航空箱!
Astro Pi:3D打印自己的航空箱– Raspberry Pi
所以我试图做一个类似于Astro Pi航空箱的箱子!
航空箱有多种不同的版本。我通过3D打印机打印了全部4个部件(SECTION_1至SECTION_4)。
3D打印的Astro Pi航空箱|Raspberry Pi学习资源
有关如何制作航空箱的更多细节请查看以上链接。文中详细说明了所需零件、连接方法及装配方法。
这就是我制作的航空箱!首先,我打印了SECTION_2和SECTION_3并将其放在一起,组成箱子主体。由于没有使用螺丝,两部分并没有贴紧,所以您会看到有许多小缝隙…
刚开始我觉得这个箱体很大,但实际上它正好容下本体和Sense HAT。箱体还有安装按钮的空间。当然了,您还可以放置摄像头。
接下来,我打印了SECTION_1和SECTION_4。为了更好地展示这个结构,我改变了盖子和散热器的颜色。我的3D打印出现了一个小错误,因此无法完美对齐/组装整个外壳…
请务必遵守 官网描述的步骤。您一定能够组装一个如图8所示的漂亮航空箱。另外,请确保使用正确的材料,以尽量减少任何变形。
我们成功从Sense HAT的六个板载传感器获取到了相关数值!
对于温度传感器,如果您分别连接Raspberry Pi本体和Sense HAT,那么就可以避免上述讨论的过热问题(即本体发热会影响实际数据)。
下一次我们将会描述如何使用Sense HAT操纵杆作为输入!