今天我們將會在Sense HAT上測試六個板載感測器!如果您不熟悉Sense HAT,那麼您可以點擊以下連結查看上一篇文章: 用於Raspberry Pi的Sense HAT附加板——LED顯示幕操作!
這一次我們會繼續按照 Raspberry Pi官網上的教程 進行操作。緊接上次,這裡從第4章開始!
Sense HAT有一個8×8 RGB LED矩陣,一個五鍵操縱杆,並且包含以下感測器:
您可以看到,Sense HAT配備了六種類型的感測器。讓我們利用這些感測器來獲取相關資料吧!
首先,我們從壓力、溫度和濕度感測器開始。這些感測器位於Sense HAT的右側。濕度感測器標有“HUMIDITY”字樣;其下方是氣壓感測器,用“PRESSURE”標記。濕度感測器還負責測量溫度。
每個感測器都有各自的函數,所以我們可以很輕鬆地獲取這些數值!
從壓力感測器獲取當前溫度,單位毫巴。
Get_temperature_from_humidity
從濕度感測器獲取當前溫度,單位攝氏度。
從壓力感測器獲取當前壓力,單位毫巴。
從濕度感測器獲取相對濕度百分比。
讓我們使用示例代碼來獲取相應數值:
Env.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
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中刪除該語句。
如上述視訊所示,LED矩陣顯示如下字串:“Temperature = 33.4,Pressure = 1010.8,Humidity = 33.8”。因此我獲取的結果如下:溫度33.4 °C;氣壓1010.8 hPa;濕度33.8%。
由於Raspberry Pi產生的熱量,感測器感測到的溫度超過了30度。雖然該數值與實際溫度存在很大偏差,但是不失為針對熱散逸的一種對策(測量主體溫度)。
Scrolling_env.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
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) |
上面的代碼會警告您國際空間站的溫度是否異常。沒有問題時(18.3℃至26.7℃),溫度數值的顯示背景為綠色;出現異常時,溫度數值的顯示背景為紅色。在上面的視訊中,溫度感測器顯示溫度數值為34.2度,因此顯示在紅色背景中。
濕度和壓力感測器旁邊有一個“慣性測量單元(IMU:加速度計、陀螺儀、地磁計)”。
陀螺儀是一個旋轉輪子或圓盤,其旋轉軸線可以是任意方向。(它是檢測物體的角度(姿態)、角速度或角加速度的儀器或裝置。)
加速度計是一種可以測量正確加速度的裝置。(小型加速度計(加速度感測器)通過MEMS技術製造。MEMS加速度計廣通用於汽車安全氣囊、汽車導航/傾斜儀、遊戲控制器等領域)
在物理學中,加速度是物體的速度相對於時間的變化率。根據牛頓第二定律,物體的加速度是作用在物體上的所有力的最終結果。加速度是向量(它們有大小和方向)。
磁力計是一種測量磁性的儀器,比如鐵磁體這種磁性材料的磁化,或者某個特定位置上磁場的方向、強度或相對變化。
我發現角速度、角加速度和加速度這幾個概念掌握起來比較困難。角速度是指物體旋轉的速度;角加速度是轉速的變化率(角速度);加速度是速度隨方向的變化率(速度)。
關於磁場,讓我們來看看指南針如何在Sense HAT中工作。到目前為止,我並不清除指南針如何使用,但是我們試著來運行一個示例代碼。
首先,我將使用陀螺儀來獲取Raspberry Pi的方向。要處理這個感測器,您需要瞭解以下三個術語:Pitch(俯仰)、Roll(翻滾)和Yaw(偏航)。
飛行中的飛機擁有三個自由旋轉維度:俯仰,繞機翼之間的軸線上抬或下降;偏航,繞豎直軸線向左或向右搖晃;翻滾,繞機頭至機尾之間的軸線旋轉。
上圖展示了Sense HAT中的軸。
調用上文的 get_orientation_degrees。
get_orientation_degrees
利用飛機的俯仰、翻滾和偏航主軸獲取當前方向,單位為度。
get_orientation函數會獲取Raspberry Pi(Sense HAT)相對於水平面傾斜的數值。
這些數值返回到Python字典中。在其他語言中,這與關聯陣列類似。
代碼示例
1 2 |
pitch, roll, yaw = sense.get_orientation().values() print("pitch=%s, roll=%s, yaw=%s" % (pitch,yaw,roll)) |
這三個變數的賦值方法請點擊這裡,參見官網。我對多變數賦值並不是很熟悉。
代碼示例
1 2 |
orientation = sense.get_orientation() print("p: {pitch}, r: {roll}, y: {yaw}".format(**orientation)) |
下面的代碼(API參考)顯示了一種將字典保持原樣並將變數單獨設定為輸出的方法。
代碼示例
1 2 |
orientation = sense.get_orientation() print("p: %s, r: %s, y: %s" % (orientation["pitch"],orientation["roll"],orientation["yaw"])) |
代碼越長,更容易瞭解發生了什麼,即使是Python初學者也是如此。
Orientation2.py
代碼示例
1 2 3 4 5 6 7 8 9 10 11 12 |
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) |
我嘗試向各個方向傾斜Raspberry Pi,同時以1秒的間隔輸出Pitch、Roll和Yaw的數值。您可以看到數值正在改變,如上圖所示。如果將Raspberry Pi邊對邊地翻轉,那麼Pitch的值會發生變化。如果您把它倒置,Roll的數值會發生變化;如果您水平旋轉Pi,Yaw數值會變化。
我注意到即使我沒有行動Pi,數值也會發生輕微變化。難道是周圍有什麼東西造成了數值變化嗎…?
獲取原始x軸、y軸和z軸的加速度資料。
Acceleration.py
代碼示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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)) |
如上面的示例代碼所示,獲取x、y、z的數值還有另外一種方法。看起來該程式利用加速度計來獲取資料。在上面的視訊中,傾斜Raspberry Pi時,您會看到數值發生變化。
我能夠理解用陀螺儀可以獲得方向,但是通過加速度計也能獲取方向嗎?
什麼是加速度計? – atmarkIT
加速度計還可以檢測由於重力產生的地面方向的加速度,而從加速度感測器獲得的加速度總是使用者外加到裝置的加速度和重力加速度的合力。
如下所示,加速度計檢測到的加速度可以作為以裝置為中心的三維空間中每個空間軸的分量獲取。
實際上,我們已經在之前的教程使用帶有零件和感測器的Arduino平台–加速度計第1部分中研究過智慧型手機中的加速度計。
雖然沒有在Raspberry Pi官方網站上發佈,但是我還是決定嘗試使用地磁感測器獲取資料!
調用set_imu_config禁用陀螺儀和加速度計,然後通過磁力計獲取北向,單位為度。
圖5顯示了以1秒為間隔獲得的數值。我能夠獲得這些數值,但是這些數位意味著什麼呢?儘管方向發生了變化,但是我看不到數位有多大變化。難道附近有東西在干擾感測器嗎?(如果您能夠成功獲取資料,請與我們分享您是如何做到的!)
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操縱杆作為輸入!