89
Raspberry Pi Sense HATの使い方

ラズベリーパイ センスハット

(画像提供:Tom's Hardware)

Astro Piプロジェクトでは、小学生が作成した実験を実際のRaspberry Piで実行します。Raspberry Piが地球上空の軌道上にある国際宇宙ステーションに設置されていると聞くと、あまり面白そうに思えないかもしれません。

2015年12月、プリンキピア計画によって文字通り打ち上げられたAstro Piは、英国の宇宙飛行士ティム・ピーク卿が、Raspberry Piの熱管理用に設計されたアルミ製シャーシに収められた2台のRaspberry Pi B+、Piカメラ、そしてSense HATアドオンボードをISSに持ち込んだことから始まりました。愛称IzzyとEdと呼ばれる2台のAstro Piコンピューターは、Sense HATに搭載された豊富なセンサーのおかげで、温度、湿度、気圧、方位、加速度を測定することができました。この2台のRaspberry Piは2015年以降、様々な実験に使用されていましたが、内部のB+モデルは少々古くなってきていました。

ラズベリーパイ センスハット

(画像提供:Tom's Hardware)

2021年、国際宇宙ステーション(ISS)はAstro Pi Mark IIへのアップグレードを受けます。旧モデルとの交換として、Raspberry Pi 4 8​​GBボード2台が送られます。お馴染みの6063グレードのアルミニウムケースの中には、Raspberry Pi 4、Sense HAT、そして2つの追加コンポーネントが入っています。公式Raspberry Pi HQカメラとGoogle Coral機械学習アクセラレーターです。Raspberry Pi 4は単体でも非常に高性能なマシンですが、Google Coralを活用することで、リアルタイム画像処理を含む機械学習プロジェクトの性能がさらに向上します。

地上に戻ったら、独自の実験を行い、Sense HAT をプロジェクトで使用する方法を学ぶことができます。それでは、新たな「素晴らしい」プロジェクトを開始する準備をしましょう。

Sense HATについて知る

ラズベリーパイ センスハット

(画像提供:Tom's Hardware)

Astro PiはSense HATを搭載しています。Sense HATは、HATに多数のセンサーを搭載したファーストパーティ製アクセサリです(おすすめのRaspberry Pi HATリストをご覧ください)。Sense HATには、温度、湿度、気圧など、多くのプロジェクトでよく使われる一般的なセンサーが搭載されています。しかし、Sense HATは加速度計、磁力計、ジャイロスコープを組み合わせたものです。ボード右下にあるジョイスティックは入力として使用され、キーボードのカーソルキーを模倣しています。Sense HATの最も注目すべき機能は、8 x 8のRGB LEDマトリックスです。これを使用して、テキストのスクロール、色の表示、基本的なアニメーションを作成できます。

これらの機能はすべてシンプルな Python ライブラリで制御でき、最も優れている点は、Raspberry Pi OS にプリインストールされており、すぐに使用できることです。

このプロジェクトは、入力、センサー、そしてRGBマトリックスのシンプルなテストです。ジョイスティックを使って4つのアクションのいずれかを開始する手段を作成します。そのうちの1つは、向きに応じてRGB LEDマトリックスの色を設定するアクションです。また、Sense HATを振るたびに、RGB LEDマトリックス上で現在の温度をスクロール表示します。

Tom's Hardware の最高のニュースと詳細なレビューをあなたの受信箱に直接お届けします。

1. Piの電源を切った状態で、 Sense HATを40本のGPIOピンすべてに接続します。Sense HATの前面を支えるために、M2.5スタンドオフを使用することをお勧めします。

2. Raspberry Pi の電源を入れます。

3.プログラミング メニューにあるThonny を開きます。

4. 3つのコードライブラリをインポートします。1つ目はSense HATの使用を可能にするもので、2つ目はコードに一時停止を追加するためのものです。最後のインポートでは、randomライブラリからランダム整数生成関数をインポートします。

from sense_hat import SenseHat
import time
from random import randint

5. Sense HATへの接続とRGB LEDマトリックスの色設定を行うためのオブジェクトを4つ作成します。SenseオブジェクトはSense HATハードウェアへの接続を容易にします。次に、RGB LEDのRGB値を含む3つのタプルを作成します。今回の場合は、白、赤、オフです。

sense = SenseHat()
white = (128, 128, 128)
red = (128,0,0)
off = (0,0,0)

6. RGB LEDマトリックス上で現在の湿度レベルをスクロール表示する「humidity」という関数を作成します。show_message関数を使って「Humidity:」で始まる文字列をスクロールし、sense.humidityを使って現在の湿度レベルを読み取ります。ただし、この関数はround()関数でラップされており、値を小数点第1位に丸め、float値を文字列に変換します。次に、テキストの色(colorの英国式スペルに注意)と背景色を設定し、最後にスクロール速度を設定します。

def humidity(): sense.show_message("Humidity: "+str(round(sense.humidity,1))+"%", text_colour=white, back_colour=off, scroll_speed=0.05)

ラズベリーパイ センスハット

(画像提供:Tom's Hardware)

7.次に作成する関数は「pressure」です。これは前の関数と同じように動作しますが、センサーデータの読み取りに sense.humidity を使用します。また、識別しやすいようにテキストと背景色を変更します。

def pressure(): sense.show_message("Pressure: "+str(round(sense.pressure,2))+" Millibar", text_colour=red, back_colour=off, scroll_speed=0.05)

ラズベリーパイ センスハット

(画像提供:Tom's Hardware)

8. forループを使ってRGBマトリックス内のLEDの色をランダムに変更する関数「disco」を作成してください。64回繰り返すforループを作成し、そのループ内にx、y、r、g、bの変数を作成します。これらの変数には、xとyについては0から7、r、g、bについては0から255までのランダムに生成された数値が格納されます。

def disco(): for i in range(64): x = randint(0,7) y = randint(0,7) z = randint(0,7) r = randint(0,255) g = randint(0,255) b = randint(0,255)

ラズベリーパイ センスハット

(画像提供:Tom's Hardware)

9. x、y、r、g、b変数に格納されている値を使用して、RGBマトリックス内のLEDを設定します。個々のピクセル(x,y)を色(r,g,b)に設定し、0.1秒間停止します。

 sense.set_pixel(x, y, (r, g, b)) time.sleep(0.1)

10.最後に、「flashlight」という関数を作成します。この関数は、ピッチ、ロール、ヨーの方向データを使用してRGBマトリックスの色を設定します。10回反復するforループを作成し、方向データを格納するオブジェクトoを作成します。

def flashlight(): for i in range(10): o = sense.get_orientation()

11. pitch、roll、yaw の 3 つの変数を作成し、各変数に関連データを格納します。返される最大値が 255 になるように 1.42 で割り、整数にフォーマットします。

 pitch = int(o["pitch"] / 1.42) roll = int(o["roll"] / 1.42) yaw = int(o["yaw"] / 1.42)

12. RGBマトリックスのx軸とy軸に2つのforループを挿入し、ピッチ、ロール、ヨーのデータを使ってLEDの色を設定します。色の変化を簡単に確認できるように、1秒間の一時停止を追加します。

for x in range(8): for y in range(8): sense.set_pixel(x, y, (pitch, roll, yaw)) time.sleep(1)

ラズベリーパイ センスハット

(画像提供:Tom's Hardware)

13.コードの本体を実行するための while True ループを作成します。

while True:

14.ループ内に、ジョイスティックの特定の方向が選択されたときに実行される4つのイベントを作成します。それぞれの方向に、4つの関数のいずれかを割り当てます。

 sense.stick.direction_up = humidity sense.stick.direction_down = disco sense.stick.direction_left = pressure sense.stick.direction_right = flashlight

15.オブジェクトを使用して加速度計の生データを保存し、各軸の生データを格納するための3つの新しいオブジェクトを作成します。このデータは、Sense HATが振られたことを検知するために使用します。

acceleration = sense.get_accelerometer_raw() x = acceleration['x'] y = acceleration['y'] z = acceleration['z']

16. Pythonのabs()関数を使うと、x、y、zオブジェクトに格納されている数値が正の数であることを確認できます。abs()関数は実際には、数値が0からどれだけ離れているかを示します。つまり、-2と2はどちらも2を返します。

 x = abs(x) y = abs(y) z = abs(z)

17. x、y、zに格納されている値をチェックする条件付きテストを作成します。これらの値が2より大きい場合、一連のコードがトリガーされます。

if x > 2 or y > 2 or z > 2:

18.以前の関数と同様に、RGB LED マトリックス全体で現在の温度をスクロールする for ループを挿入します。

for i in range(2): sense.show_message(str(round(sense.temperature,1))+" Celsius", text_colour=white, back_colour=off, scroll_speed=0.05)

ラズベリーパイ センスハット

(画像提供:Tom's Hardware)

19.条件テストの最後の部分、つまり Sense HAT が使用されていない場合に実行される else 文(「catch all」文)を作成します。この文は0.1秒ごとに画面にメッセージを表示します。

 else: print("Use the joystick, or shake the Pi") time.sleep(0.1)

20.コードを sense_test.py として保存します。

21. 「実行」をクリックしてコードを実行します。ジョイスティックの各機能をテストした後、Raspberry Piを軽く振って温度センサー機能をトリガーします。

完全なコードリスト

from sense_hat import SenseHat
import time
from random import randint
sense = SenseHat()
white = (128, 128, 128)
red = (128,0,0)
off = (0,0,0) def humidity(): sense.show_message("Humidity: "+str(round(sense.humidity,1))+"%", text_colour=white, back_colour=off, scroll_speed=0.05)
def pressure(): sense.show_message("Pressure: "+str(round(sense.pressure,2))+" Millibar", text_colour=red, back_colour=off, scroll_speed=0.05) def disco(): for i in range(64): x = randint(0,7) y = randint(0,7) z = randint(0,7) r = randint(0,255) g = randint(0,255) b = randint(0,255) sense.set_pixel(x, y, (r, g, b)) time.sleep(0.1) def flashlight(): for i in range(10): o = sense.get_orientation() pitch = int(o["pitch"] / 1.42) roll = int(o["roll"] / 1.42) yaw = int(o["yaw"] / 1.42) for x in range(8): for y in range(8): sense.set_pixel(x, y, (pitch, roll, yaw)) time.sleep(1) while True: sense.stick.direction_up = humidity sense.stick.direction_down = disco sense.stick.direction_left = pressure sense.stick.direction_right = flashlight acceleration = sense.get_accelerometer_raw() x = acceleration['x'] y = acceleration['y'] z = acceleration['z'] x = abs(x) y = abs(y) z = abs(z) if x > 2 or y > 2 or z > 2: for i in range(2): sense.show_message(str(round(sense.temperature,1))+" Celsius", text_colour=white, back_colour=off, scroll_speed=0.05) else: print("Use the joystick, or shake the Pi") time.sleep(0.1)

レス・パウンダーは、トムズ・ハードウェアのアソシエイトエディターです。クリエイティブテクノロジストとして、7年間にわたり、老若男女を問わず、教育と啓発のためのプロジェクトを手がけてきました。Raspberry Pi Foundationと協力し、教師向けトレーニングプログラム「Picademy」の執筆・提供にも携わっています。