Raspberry Pi 樹莓派套件_Sense HAT|奧斯丁國際有限公司 OURSTEAM Internationl
icon教學資源
2022/02/07

Raspberry Pi 樹莓派套件_Sense HAT

介紹

製作項目

Sense HAT 是 Astro Pi 基本組成的一部分。可讓樹莓派探測周圍的環境,測量溫度、濕度、壓力、方向等,也可使用內建的 LED 矩陣輸出訊息。
 

 
 
在此專案中,將學習如何操控 Sense HAT 的 LED 矩陣及收集感測器獲取的數據,並將某些小項目與想法結合。
 
學習項目

在接下來的學習資源中,藉由樹莓派及 Sense HAT 將可學習到:
  • 使用 Sense HAT 及 Python 通訊
  • 訪問 Sense HAT 的輸出
  • 對 Sense HAT 的輸入進行編程
  • 使用 Sense HAT 顯示訊息和圖像
  • 使用變數儲存感測器數據
  • 使用循環重複運行
此資源涵蓋了以下 Raspberry Pi Digital Making Curriculum 內提及的元素:

所需項目

硬體
  • 樹莓派
  • Sense HAT
軟體

您需要最新版的 Raspbian ,其中也包含了下列軟體:
  • Python 3
  • Sense HAT for Python 3

如果需要手動安裝,請按照以下說明操作:

在樹莓派上安裝所需軟體

您的樹莓派需連線才能安裝軟體。安裝軟體前,請先更新和升級操作系統 Raspbian。
  • 打開終端視窗輸入下列指令:
 
 
 
  • 現在您可以在終端視窗中輸入 install ,安裝所需的軟體。下圖示範 Sense HAT 的安裝方法:
 

輸入下列指令安裝 Sense HAT:
 
 

Sense HAT

安裝 Sense HAT

安裝外接元件時,請確保連接的樹莓派已關機。
  • 拆開包裝,取出 Sense HAT 和零件。
 
 
  • 使用兩顆螺釘將螺柱先固定到樹莓派上,如下圖:
注意:上述步驟可省略
  • 然後小心地將 Sense HAT 推到 Raspberry Pi 的引腳上,用剩餘的螺釘固定。
 
 
注意:在 Raspberry Pi 3 的無線天線旁邊使用金屬支架會降低其性能和範圍。可選擇省略這個支架或改用改用尼龍支架和尼龍螺絲。
 
 
小提示:取下 Sense HAT 時要小心,因為 40 針黑色接頭容易卡住。

如果無法使用 Sense HAT,也可以使用模擬器。

使用 Sense HAT 模擬器

線上 Sense HAT 模擬器

您可以在瀏覽器中使用線上模擬器編寫和測試 Sense HAT 的程式碼。

 
 

樹莓派上的 Sense HAT 模擬器

樹莓派的 Raspbian 操作系統中可找到 Sense HAT 模擬器(Sense HAT Emulator)

 
 
  • 在主選單中,選擇 Programming > Sense HAT emulator 打開模擬器視窗。
  • 如果您使用的是這版本的模擬器,程式必須從 sense_emu 導入,取代 sense_hat
 
 
如果之後想在實體的 Sense HAT 上運行編碼,只需要更改導入列,如下圖所示:
 
 

顯示文本
 
  • 在 Sense HAT 的 LED 螢幕上顯示文字「Astro Pi is awesome」
在 Sense HAT 上顯示訊息

確保您的 Python 程序中有以下代碼行可設定與 Sense HAT 的連接,此步驟只需做一次。

 
 
  • 新增此代碼讓訊息顯示在 Sense HAT 的 LED 矩陣上。
 

「Hello world」會在 LED 螢幕上滾動顯示。
  • 更改引號 ("") 中的文字,顯示不同的訊息吧!

我們可以在 show_message 指令句中新增參數改變訊息的顯示方式。

scroll_speed:影響訊息在螢幕上移動的樹速度。預設值為 0.1。數字越大,速度越低。
 
text_colour:改變文字的顏色。由紅色、綠色、藍色定義,也稱為 RGB 值。

查看下列說明了解更多關於 RGB 數值的資訊:

在 Sense HAT 上顯示顏色
  • 在 Python 文件中,輸入以下代碼:
  • 儲存並運行編碼。LED 矩陣會變為亮白色。
  • 變數 rg b 表示紅色、綠色和藍色。這些數值定義了每一種顏色的亮度;每一個數值可介於 0 255 之間。上面的代碼顯示每種顏色都使用了最大值,所以結果呈現白色。
  • 另外也可以用下列代碼定義:
  • 更改其中一個顏色的數值後再次運行。您看到了什麼?
  • 您能做出其它顏色嗎?

用數字表示顏色

物體的顏色取決於光的反射及發射。光有不同的波長,顏色是由光的波長所定。光的顏色根據其波長會顯示如下圖:



人類之所以能看到顏色,是因為我們眼睛裡有特殊的細胞。這些細胞被稱為視錐細胞。我們有三種類型的視錐細胞,每種類型都會檢測紅光、藍光或綠光。因此我們看到的所有顏色都只是紅色、藍色和綠色的混合。


在加色混合中,三原色(紅色、綠色和藍色)用於製作其它顏色。在上圖中有三個亮度相同的聚光燈,每種顏色一個。在沒有任何顏色的情況下,結果是黑色;如果將三種顏色混合,則結果為白色;當紅色和綠色結合時,結果是黃色;當紅色和藍色結合時,結果是洋紅色;當藍色和綠色結合時,結果是青色。透過改變所使用的三種原始顏色的亮度,可以製作出比這更多的顏色。

電腦將所有內容存儲為 1 和 0。這些 1 和 0 通常被組織成 8 個一組,稱為字節(byte)

一個字節可代表 0 至 255 間的任何數字。

當我們想在程序中表示顏色時,可以透過定義構成該顏色的紅色、藍色和綠色的數值來實現。這些數值通常存儲為單個字節,因此使用 0 到 255 之間的數字。

 
紅色 Red綠色 Green藍色 Blue 顏色
25500
02550
00255
2552550
2550255紅紫
0255255藍綠

可參考:colour picker to play with at w3schools

back_colour:改變背景顏色,執行方式與 text_colour 相同。
  • 在訊息列前新增代碼,定義變數 blue(0, 0, 255)

在 Python 中建立變數

變數讓您可在程式中無存數據。變數由一個名稱或一個數值組成。
此變數的名稱為 animal,值為 cat




此變數的名稱為 score,值為 30



建立變數必須為其命名,名稱在等號左邊,數值在右,所以下列代碼是錯誤的:

  • 新增一行變數 yellow 定義為 (255, 255, 0)
  • 在指令中加入參數 show_message,以藍底黃字顯示。

解決方案

要新增的部分已藍框顯示。


  • 新增參數 scroll_speedshow_message 指令中,並設定速度為 0.05 加快訊息滾動的速度。
  • 將滾動訊息加入循環(While True)重複播放。

Python 中的 While True 循環

While 循環在條件為 True 會一遍遍地重複代碼。這也是 while 循環有時會被稱為條件控制循環的原因。
下列所示範例為 while 的無限循環。此循環會永遠執行,因為條件為 True


注意:while 指令句說明了循環條件print 代碼稍微往右靠,稱為縮進,藉以表示此指令在循環內,循環內的任何代碼都會重複執行。


無限循環在您想持續運行的時候很好用。例如:檢查感測器的數值。像這樣的循環會無限地執行下去,也代表在循環後的編碼都不會執行,稱為阻塞(blocking)-程序阻止了其它代碼的執行。

解決方案




顯示單一字符
 
  • 在 Sense HAT 的 LED 螢幕上顯示字母「A」。

在 Sense HAT 上秀出字母

請確保您的程序中有下列代碼,用於與 Sense HAT 連接。此代碼只需新增一次。
from sense_hat import SenseHat
sense = SenseHat()

 
  • 加入此代碼,在 LED 矩陣上顯示字母:
sense.show_letter("Z")
 
運行此代碼,字母「Z」會出現在螢幕上。您可以更改引號 ( "") 中的字母來變更想顯示的字母。

 
我們可以用在 show_message 指令中用過的兩個參數變更字母顯示方式: text_colourback_colour。字母不滾動,因此不使用 scroll_speed 參數。
  • 在白色背景上顯示紅色字母「J」。
  • 使用 sleep 函數顯示您的名字拼音,每個字母以不同顏色顯示,字母間有一秒的停頓。

使用 Python 的 sleep 指令

您可以使用 sleep 函數暫停 Python 程式。
  • 在您的程式上方新增下列代碼,導入 sleep 函數。
  • 想暫停程式,請調用 sleep 函數。 括號中的數字代表想暫停的秒數。


也可暫停半秒鐘。



解決方案

 
  • 使用 randint,將三原色 RGB 值中的每個顏色輸入介於 0 255 間的數值,隨機生成一種顏色。

Python 中的隨機功能

random 模組是 Python 中的一種標準模組。您可以使用它建立編碼中的隨機數。

randint
可使用此函數 randint 在兩個值之間生成隨機整數。下列代碼示範生成介於 0 至 10 (包含) 之間的整數。




uniform
如果您想要隨機浮點數(floating-point number),可使用 uniform 函數。下列示範代碼會產生等於或大於 0 但小於 10 的隨機浮點數。




choice
如果您想從列表中選擇一個隨機項目,可使用 choice 函數。




解決方案

 
  • 在程式碼的最後使用 sense.clear() ,清除 LED 矩陣。


顯示圖像
 
您可以使用 clear,清除所選的顏色,讓 LED 矩陣顯示單一色彩。

在 Sense HAT 上顯示顏色
  • 在 Python 文件中,輸入下列代碼:
  • 儲存並運行編碼。LED 會變為亮白色。
  • 變數 rg、和 b 各代表紅色、綠色和藍色。它們的值定義了每種顏色的亮度;數值設定介於 0 255 間。在上圖的大代碼中,每種顏色都使用了最大值,結果會呈現白色。
  • 您也可使用單行指令定義 RGB 值:


設定單格像素
 
LED 矩陣不僅可以顯示文字,還能單獨控制每顆 LED 創造圖像。

Sense HAT LED 座標

Sense HAT 的 LED 矩陣使用帶有 x 軸和 y 軸的坐標系。 兩軸的編號從左上角的 0 (不是 1)開始 。每個 LED 都可作為圖像的一格像素,使用 x, y 標示相對應位置。




藍色像素座標位於 0, 2
紅色像素座標位於 7, 4

您可以使用 set_pixel() 單獨設定每格像素(LEDs)。

需要的程式碼如下:

  • 依照您選擇的顏色點亮矩陣的四格角落的像素(LEDs)。

你能猜出下列這段編碼會創造出什麼嗎?

  • 改變編碼製作不同的像素圖片吧!

設定多個像素
 
設定單個像素很簡單;設定多格像素可能會變得相當複雜。set_pixels 指令可一次更改所有像素。
  • 使用 set_pixels 在 LED 矩陣上顯示圖像。
在 Sense HAT 上設定多格像素

您可以嘗試重複使用 set_pixel 指令在 Sense HAT 的 LED 矩陣上繪製圖像;而 set_pixels 指令則是可以一次改變 64 格 LED!


例如:在 LED 矩陣上繪製苦力怕(Minecraft creeper)的臉:

 
您也可以使用兩種以上的顏色。下圖以 Minecraft 的 Steve 為例:



設定方向

目前為止,文字與圖像都是以相同的方式顯示,兩者都是藉由底部的 HDMI 端口連接。但在某些情況下您可能會需要改變 LED 矩陣的方向(尤其是在外太空)。

旋轉 Sense HAT 的 LED 螢幕

您可以改變 Sennse HAT 上 LED 矩陣的顯示方向。使用 set_rotation() 以四種不同的角度旋轉螢幕:0、90、180、或 270 度。
  • 例如:螢幕旋轉 180 度可使用此代碼:
  • 還可以水平翻轉螢幕上的圖像:
  • 垂直翻轉:
  • 在連接 Sense HAT 的編碼中,可加入旋轉螢幕的代碼,更改上一步驟中的像素圖片的方向:
 
您可以藉由反覆翻轉圖像創作簡單的動畫:


感測環境

Sense HAT 有一系列的環境感測器,可用於檢測周遭環境;測量壓力、溫度或濕度。
讀取壓力值

使用 Sense HAT 讀取壓力值
  • 在 Python 文件中,輸入下列編碼:
  • 運行程序時,應該會看到下列內容:


檢測溫度

Sense HAT 有兩個可讀取環境溫度的感測器:濕度感測器和壓力感測器。 get_temperature_from_humidity 從濕度感測器讀取溫度(get_temperature 是簡短版的指令)。
get_temperature_from_pressure 則是從壓力感測器中讀取溫度。

 
  • 在 Python 文件中,輸入下列編碼:
  
from sense_hat import SenseHat

sense = SenseHat()
sense.clear()

temp = sense.get_temperature()
print(temp)

 
 

 
  • 可看到以下內容:
  28.6293258667 
 

偵測濕度
  • 在 Python 文件中,輸入以下代碼:
  • 運行程序時,應該會看到以下內容:
34.6234588623
  • 創建跑馬當,讓大家知道目前的壓力、溫度及濕度。您可以使用前面做過的「Displaying text」步驟來製作跑馬燈。

解決方案



根據 線上檔案,國際太空站會將下列的數值維持在一定的水平:

溫度:攝氏 18.3-26.7 度

壓力:979-1027 豪巴

濕度:約 60%
  • 定義變數為綠色(0, 255, 0)及紅色(255, 0, 0)。
  • 在編碼中使用 if 語法檢查溫度是否介於攝氏 18.3 至 26.7 度。

Python 條件中的布林運算(Boolean operators)
  • 在 Python 中,標準的 if 語法檢查單一條件,例如:
  • 若想檢查多個條件,可在編碼中使用邏輯運算。
  • and 可同時檢查兩個條件,例如:
  • 只要 x 是數字組 1,2,3,4,5,6,7,8,9 內的任何數,條件為真。
 
  • 可使用 or 運算,撿查其中的任一條件是否為真。
  • 在此例中,只要  x 大於 0 或小於 10 ,則條件為真。 
  • 如果溫度在此正常範圍內,以綠色背景滾動顯示訊息;否則以紅色背景顯示。

解決方案
 
  • 新增更多 if 語法檢測正常壓力和濕度條件。

偵測運動

Sense HAT 具有 IMU(慣性測量元件 Inertial Measurement Unit)晶片,包含了一組偵測運動的感測器:
  • 陀螺儀(偵測電路板的方向)
  • 加速度計(偵測運動)
  • 磁力計(偵測磁場)

何謂 IMU?

IMU 是 Sense HAT 的一個運動感測器,可測量所經歷的運動類型。IMU 的全名為 Inertial Measurement Unit,由三種感測器組成:
  • 陀螺儀:測量運動及旋轉
  • 加速度計:測量加速度力,確認重力方向
  • 磁力計:測量地球磁場,類似指南針

為什麼運動感測器很重要?當您身處外太空的無重力空間時,有件很重要的事是您必須要知道的:我現在是在哪個方向?

如果您不知道方向會有大麻煩!因此,許多載人或無人的航空器上都裝有類似 Sense HAT 搭載的 IMU 感測器,追蹤運動並確認其方向。即使是很早之前的航空器也有喔--可以問問您的祖父母是否還記得阿波羅任務(Apollo mission),人類史上第一次登陸月球表面。

上圖是阿波羅的 IMU 感測器。您可以注意到,相比 Astro Pi 上的迷你黑方塊,它大了許多 — 這就是 1975 年與 2015 年間技術的區別。Astro Pi IMU 可能不如阿波羅一號(Apollo one)準確;但是便宜一萬倍!

認識俯仰、翻滾和偏擺

我們都知道地球是以北極和南極連成一線的軸心自轉。所有的物體皆具有三軸運動的特性,分別是:
  • 俯仰 — 想像飛機起飛的狀態
  • 翻滾 — 想像飛機做出勝利翻滾的樣子
  • 偏擺 — 想像以開車的方式開飛機
如果您知道物體的三軸各旋轉了多少,便可知道物體的指向。

觀看此短片 video ,指出飛機相對應的三軸,試著想像飛機在外太空隨機呈現某個方向,接著將三軸各以不同的數值旋轉,將飛機呈現特定的方向。

下圖以 Sense HAT 呈現三軸位置:


  • 編寫程序用於檢測當前的俯仰、翻滾及偏擺方向;運行程序改變 Sense HAT 的運動。觀察數值如何隨著 Sense HAT 的移動而變化。

使用 Sense HAT 檢測俯仰、翻滾及偏擺

Sense HAT 具有可偵測俯仰、滾動及偏擺的方向感測器。執行以下操作獲取數值。
  • 在 Python 文件中,輸入下列編碼:
  • 運行程序時可看到以下內容:
 pitch 356.35723002363454  roll 303.498660298494  yaw 339.19880231669873 
 
注意:使用運動感測器時,需要經常讀取數據。如果讀取數值太慢會導致奇怪的結果,例如:在循環中寫入 time.sleep(0.5)。 這是因為程式碼需大量測量數值才能成功組合來自陀螺儀、加速度計和磁力計的數據。

往哪個方向?

sense.get_accelerometer_raw() 敘述了作用在三軸(x、y、z)的 G 力大小;假如其中一軸的數值為 ±1G,那麼該軸指向下方。

在此範例中,取用三軸的重力加速度數值,四捨五入取整數:


 
  • 旋轉 Sense HAT,您應該會看見 x y 的數值在 -1 1 之間變換;如果將其平放或上下顛倒,可看見 z 軸的數值由 1 變成 -1 
使用獲取的資訊設定 LED 矩陣顯示的方向
  • 在之前的程式碼中的 while 循環加入之前已學過的 show_letter ,可在 LED 矩陣上顯示字母「J」。
  • 在獲取三軸的 G 力值代碼後,新增 if 語法檢查 Sense HAT 的指向;可使用之前所學的 set_rotation 更新顯示的方向。以下為示範代碼:
 If  the  axis has  -1  G,  rotate   180  degrees
 Else if  the  axis has  G,  rotate   90  degrees
 Else if  the  axis has  -1  G,  rotate   270  degrees
 Else   rotate   0  degrees
 
解決方案



搖晃板子

如果只旋轉板子,任何方向都會有 1G 的加速度;搖晃則可讓感測器測得超過 1G 的力量,才有辦法檢測到快速運動並做出回應。

在此專案中會介紹 abs() 函數,屬於 Python 標準語法的一種,並非 Sense HAT 專用。abs() 會給出一個絕對值,忽略該值的正負 — 例如 abs(1) abs(-1) 皆會回傳。此函數對我們幫助很大;因為我們只需要知道物件被搖動了,不需要知道感測器搖動的方向。




此模擬會有點小困難,所以實際用 Sense HAT 來嘗試會比較好。如果發現程序運行過於敏銳(程式認為 Sense HAT 一直在搖晃),請嘗試將 1 改為更大的值,提高定義「shake」的閾值。

使用操縱桿

您可以檢測 Sense HAT 的操縱桿五個不同的方向是否被按住或鬆開:上、下、左、右和中間。

使用 Sense HAT 偵測操縱桿的運動

Sense HAT 的操縱桿可對應到鍵盤上的四個方向鍵;中間位置則對應到 Return 鍵,這代表使用操縱桿或按鍵盤是相同的效果。請記得 HDMI 端口朝下為向下的方向。


  • 在 Python 文件中,輸入下列編碼:
from sense_hat import SenseHat
sense = SenseHat()

while True:
for event in sense.stick.get_events():
print(event.direction, event.action)

 
此編碼可以秀出按下或鬆開操縱桿的方向。

  • 當運行程序及以各個方向移動操縱桿時,您應該會在終端視窗看見下列內容。在 trinket 模擬器中,您也可以使用鍵盤的方向鍵。
('up', 'pressed')
('up', 'released')
('down', 'pressed')
('down', 'released')
('left', 'pressed')
('left', 'released')
('right', 'pressed')
('right', 'released')
('middle', 'pressed')
('middle', 'released')
 
  • 根據操縱桿按下的按鈕,在 LED 矩陣上顯示單一字母 U、D、L、R 或 M。

解決方案
 

您還可以在 Sense HAT 的操縱桿向特定方向移動時調用函數。

使用 Sense HAT 操縱桿啟動函數調用 

Sense HAT 操縱桿可回應移動,作為調用函數的觸發器。
  • 您可以告訴程式持續「監聽」特定事件,例如:操縱桿向上推(direction_up),觸發函數(此範例調用 pushed_up)。
  • 事件觸發的函數可以沒有參數,也可以將事件作為參數。在下面的範例中,簡單地打印事件。
  • 此函數會印出事件的時間點、操縱桿移動的方向以及具體操作。輸出類似如下:
InputEvent(timestamp=1503565327 .399252, direction=u' up',action=u' pressed'
  • 另一個實用的範例為 direction_any
  • 如果您使用該範例中的方法,操縱桿的任何事件都可觸發 do_thing 函數。例如:您可以定義 do_thing 函數,它會以簡單的英語報告確切的事件。
  • 創建函數,以四種不同的顏色填滿 LED 矩陣。針對操縱桿每個可能按下的方向,新增觸發器調用函數 。

解決方案
 


挑戰:結合應用

現在您已探索了大部分 Sense HAT 的功能,可以將它們全部結合起來創建新專案。此範例為一款反應遊戲,可用來測驗太空人的反應:
 

旋轉板子使箭頭朝上。如果您及時配對正確,箭頭會變成綠色,分數會增加;反之箭頭會變成紅色,遊戲結束。遊戲會不停地出現新方向的箭頭直到遊戲結束,每一輪都會增加速度。

此想法結合了:
  • 在 LED 矩陣上顯示訊息及圖像
  • 設定及偵測方向
  • 使用變數、隨機、迭代和選擇的功能
由於此程序比之前的專案資源更為複雜,因此需要利用偽代碼中計畫接下來的步驟:
  1. Import 所需的資料庫(sense_hattimerandom
  2. 創建 Sense HAT 的對象
  3. 定義顏色所需的變數(白、綠、紅、空白)
  4. 創建三個不同的箭頭(白色、綠色、紅色)
  5. 設定變數 pause 為 3 (變換箭頭的初始時間) 
  6. 設定變數 score angle
  7. 調用變數 play True (之後會用於停止遊戲)
  8.  while   play == True 
  9. 選擇新的 random 角度
  10. 顯示白色箭頭
  11.  Sleep  設定暫停的間隔
  12.  If 檢測方向與箭頭相符...
  13. 設定將箭頭變成綠色
  14. 反之,使用 False 設定箭頭變成紅色
  15. 稍微縮短暫停的時間
  16. 在下一個箭頭出現前暫停
  17. 退出循環時,顯示分數

解決方案
 


挑戰:創意無限

現在您已經有了關於 Sense HAT 的基礎知識,您可能會想要研究其它相關的事情:
  • 用 LED 螢幕講笑話。
  • 假如 Sense HAT 有連接網路,您可使用 Twitter API 資料庫顯示推文通知。
  • 使用 LED 矩陣製作自己的圖像。
  • 您可以使用不同圖像交替製作動畫嗎?歡迎觀看此影片 Geek Gurl Diaries,獲得更多靈感吧。
  • 製作一款類似這種的電子模具。晃動觸發骰子滾動。
  • 製作簡單的圖形溫度計,根據溫度顯示不同的顏色或圖案。
  • 編寫可在螢幕上顯示箭頭的(或其它符號)的程式碼;符號可以設定為指出哪邊是向下,讓無重力的太空人可以辨認出地球的方向。
  • 使用加速度計感測微小的運動 — 可作為遊戲、警報系統甚至是地震感測器的一種。
  • 利用濕度感測器偵測呼吸並根據濕度顯示顏色。
logo
iconiconiconiconicon
icon  電話:04-2375-3535
icon  傳真:04-2256-9949
icon  統編:90386785
icon  E-mail:service@oursteam.com.tw
icon  LINE ID:@oursteam
Inspire every child to create