できること

第44回「ラズベリーパイ専用アドオンボード Sense HATで遊ぼう!(1)LEDディスプレイの操作」

raspberrypi44_main
ラズベリーパイ専用のアドオンボード、Sense HAT!ラズベリーパイ公式サイトを見るたび気になっていたのですが、ついに買ってもらいました!Astro Piプロジェクトのために開発されたということで、宇宙空間で使うことを想定した面白い機能が盛りだくさんです!

公式サイトのチュートリアルを参考に、じっくり使い方をマスターしていきましょう。第1回目の今回は、Pythonの開発環境である「IDLE」の使い方を勉強しながら、Sense HATのLEDディスプレイで遊びます!

 

Sense HATとは?

Sense HAT – Raspberry Pi
The Sense HAT is an add-on board for Raspberry Pi, made especially for the Astro Pi mission – it’s going to the International Space Station in December 2015 – and is now available to buy.
The Sense HAT has an 8×8 RGB LED matrix, a five-button joystick and includes the following sensors:

  • Gyroscope
  • Accelerometer
  • Magnetometer
  • Temperature
  • Barometric pressure
  • Humidity

We’ve also created a Python library providing easy access to everything on the board.

ラズベリーパイ公式サイトの解説ページです。
Sense HATは、「Astro Pi」という、宇宙ステーションでラズベリーパイを動かそうというプロジェクトのために作られたアドオンボードです。8×8フルカラーLEDディスプレイ、ジョイスティックの他に、6種類ものセンサが組み込まれています。

Sense HAT Python Library
Sense HAT用のPythonライブラリが用意されているので、手軽に導入できそうです!

Raspberry Pi Sense Hat – SWITCH SCIENCE
Raspberry Pi 2/A+/B+用のHAT(拡張基板)です。8×8の16ビットLEDを使ったディスプレイとさまざまなセンサが載っていて、特に宇宙科学分野における環境条件の学習に最適です。
Pythonのライブラリや、サンプルプログラムが用意されています。

  • 8×8、16ビットLEDディスプレイ
  • 慣性測定ユニット(IMU:加速度、ジャイロ、磁力)
  • 気圧センサ
  • 温度センサ
  • 湿度センサ
  • 4方向+1方向ジョイスティック(上下左右+押し込み)

仕様については、SWITCH SCIENCEさんのページが分かりやすいです。聞き慣れない単語も登場していますが、使ってみるときにその都度調べていきましょう。
そして、ここで重要な一文を発見しました。

当製品をRaspberry Piに搭載するには、別途8本のM2.6ねじと、4本の高さ11 mmスペーサーが必要です。

GPIOのピンのみでは使えないか試してみたところ、40ピンもあるので力強く支えてはくれるのですが、反対側が浮いてしまうのでやはり不安定……このままではジョイスティックの使用は危険です。

raspberrypi44_img01

図1

パーツが届くまで待てないと判断したわたしは、3Dプリンターで作りました!
支える部分だけの簡易的なものなので、あまりオススメはできませんが……応急処置ができたので、この状態で進めていきましょう。

raspberrypi44_img02

図2

ラズベリーパイの電源を入れると、Sense HATの白い部分がカラフルに光ります!
起動時の電力消費が多いようで、起動中に抜き差しすると電源が落ちてしまうことがあるので注意しましょう。

 

Pythonライブラリをインストール!

今回は、本体はRaspberry Pi 3を、OSはRaspbian Jessie(2016年5月27日リリース版)を使用します。

Sense HAT用のPythonライブラリのインストール方法はこちらのページに記載されていますが、今回使用する2016年5月27日リリースのRaspbianでは、なんとプリインストールされていました!

raspberrypi44_img03

図3

インストールコマンドを実行すると、すでに最新版がインストール済みと表示されました。OSが古い場合はインストールされていない可能性もあるので、確認も兼ねて下記のコマンドを実行しておきましょう。

インストールコマンド
sudo apt-get install sense-hat

 

Sense HATを動かしてみよう!

Worksheet – Getting Started with the Sense HAT | Raspberry Pi Learning Resources
ラズベリーパイ公式サイトにあるチュートリアルに沿って進めていきます。
このチュートリアルでは、Python用の総合開発環境である「IDLE」を使用しています。

※こちらのページはエミュレータを使った内容に変更されています(2019年7月現在)

25.5. IDLE – Python 3.5.1 ドキュメント
IDLEについてはこちらの日本語ドキュメントがとても参考になります。

raspberrypi44_img04

図4

IDLEの起動は、右上のメニューから。「Python 2」と「Python 3」の2種類あるので、3の方を選びましょう。

raspberrypi44_img05

図5

図5は初期画面。4行目>>>」に続けて、プログラムを入力していきます。コピー&ペーストは可能ですが、1行ずつの実行になります(複数行貼り付けたい場合の手順はのちほど)。

from sense_hat import SenseHat
sense = SenseHat()
sense.show_message("Hello my name is Tim Peake")

3行目のコードを入力し、[Enter]キーを押したタイミングで、Sense HATのLEDディスプレイに文字が流れます!
このように、引数で渡した文字列をLEDディスプレイ上に文字を表示してくれるのが、show_message関数です。

show_message
Scrolls a text message from right to left across the LED matrix and at the specified speed, in the specified colour and background colour.

show_message関数のパラメータは3種類。
「scroll_speed」は、文字の流れるスピードの設定です。デフォルト値は0.1で、大きくなるほど遅くなります。
「text_colour」は文字色、「back_colour」は背景色です。RGBをそれぞれ0~255までの値で指定します。フルカラーLEDと同じで、デフォルトは白文字(255,255,255)、背景色なし(0,0,0)です。

sense.show_message("sample text", scroll_speed=0.05, text_colour=[255,255,0], back_colour=[0,0,255])

たとえば上記の1行を実行すると、デフォルトの倍のスピード(0.05)、黄色文字、青背景で再生されます。
再生が終わっても、背景色はそのまま残ってしまうので、clear関数を使ってリセットしましょう。

clear
Sets the entire LED matrix to a single colour, defaults to blank / off.

sense.clear()

ここからは、ソースコードが複数行を一気にコピー&ペーストできた方が便利なので、IDLEの設定を少々変更します。[Options]-[Configure IDLE…]から、設定画面を開きましょう。

raspberrypi44_img06

図6

「General」タブの一番上の項目「Startup Preferences」から、起動時のエディタの状態を変更できます。デフォルトでは右側の「Open Shell Window」が選択されていますが、「Open Edit Window」に変更すると、その名の通りエディタのように、複数行打ち込むことができるようになります。

raspberrypi44_img07

図7

設定は、次回起動時から反映されます。また、Pythonファイルを[File]-[open]から開いた場合は、設定が「Open Shell Window」のままでもこのウィンドウが表示されます。

ウィンドウをよく見ると、メニューの内容が少し変わっています。「Shell」と「Debug」の代わりに「Format」と「Run」が追加されました。「Format」はエディタ内での編集(インデントやコメントアウトなど)に関するメニュー、「Run」はソースコードの実行に関するメニューです。

ソースコードを実行するには、メニューから[Run]-[Run Module…]を選択するか、キーボードの[F5]キーを押下します。実行にはファイルの保存が必要になるため、また保存されていない場合はここでポップアップが表示されます。

raspberrypi44_img08

図8

実行中は、図8のようにIDLEのシェルウィンドウが自動で開きます。すでにシェルウィンドウが開いている場合は、そのウィンドウにフォーカスが移動して、処理が開始されます。

使い勝手が良くなったところで、チュートリアルのサンプルをどんどん実行してみましょう!

/home/pi/sensehat/while.py

from sense_hat import SenseHat
sense = SenseHat()
while True:
    sense.show_message("Astro Pi is awesome!!", scroll_speed=0.05, text_colour=[255,255,0], back_colour=[0,0,255])

上記は、while文で繰り返し処理を加えたサンプルです。このまま実行すると無限ループになってしまいますが、シェルウィンドウを閉じることで、強制的に停止できます。LX Terminalと同じように、[Ctrl]+[C]キーで強制終了もできました。

次は、show_letter関数を使ったサンプルです。

/home/pi/omg.py

from sense_hat import SenseHat
import time

sense = SenseHat()

sense.show_letter("O",text_colour=[255, 0, 0])
time.sleep(1)
sense.show_letter("M",text_colour=[0, 0, 255])
time.sleep(1)
sense.show_letter("G",text_colour=[0, 255, 0])
time.sleep(1)
sense.show_letter("!",text_colour=[0, 0, 0], back_colour=[255, 255, 255])
time.sleep(1)
sense.clear()

show_letter
Displays a single text character on the LED matrix.

show_letter関数は、指定した一文字をディスプレイに表示します。表示する秒数はsleep関数を使って指定しています。このあたりは、Sonic Piと似ていますね!

/home/pi/random_omg.py

from sense_hat import SenseHat
import time
import random

sense = SenseHat()

r = random.randint(0,255)
g = random.randint(0,255)
b = random.randint(0,255)
sense.show_letter("O",text_colour=[r, g, b])
time.sleep(1)

r = random.randint(0,255)
g = random.randint(0,255)
b = random.randint(0,255)
sense.show_letter("M",text_colour=[r, g, b])
time.sleep(1)

r = random.randint(0,255)
g = random.randint(0,255)
b = random.randint(0,255)
sense.show_letter("G",text_colour=[r, g, b])
time.sleep(1)

sense.show_letter("!", text_colour=[0, 0, 0], back_colour=[255, 255, 255])
time.sleep(1)
sense.clear()

最後はrandom関数を使って、文字色をランダムに変更できるようにしたサンプルです。色の変化が分かりやすいように、RGBそれぞれの値をすべてランダムに設定できるように調整してみました。

 

絵を描く

LEDディスプレイに表示できるのは文字だけではありません。各LEDに個別に色を設定することで、絵を描くことも可能なんです!

raspberrypi44_img09

図9 ラズベリーパイ公式サイトより(「Sense HAT LED matrix coordinates 」タブ内)

LEDは、左上を基点とした座標で指定していきます。たとえば図9のように光らせるのであれば、ソースコードは次のようになります。

/home/pi/sensehat/set_pixel.py

from sense_hat import SenseHat

sense = SenseHat()

sense.set_pixel(0, 2, [0, 0, 255])
sense.set_pixel(7, 4, [255, 0, 0])

set_pixel
Sets an individual LED matrix pixel at the specified X-Y coordinate to the specified colour.

パラメータは、横の座標(図9 X軸の座標)、縦の座標(図9 Y軸の座標)、色(RGB)の順に、カンマ区切り指定します。

/home/pi/sensehat/simple_image.py

from sense_hat import SenseHat

sense = SenseHat()
sense.clear()
sense.set_pixel(2, 2, [0, 0, 255])
sense.set_pixel(4, 2, [0, 0, 255])
sense.set_pixel(3, 4, [100, 0, 0])
sense.set_pixel(1, 5, [255, 0, 0])
sense.set_pixel(2, 6, [255, 0, 0])
sense.set_pixel(3, 6, [255, 0, 0])
sense.set_pixel(4, 6, [255, 0, 0])
sense.set_pixel(5, 5, [255, 0, 0])
raspberrypi44_img10

図10

サンプルのソースと違うのは、3行目に「clear」を入れたところ。set_pixel関数は、指定した座標の位置のLEDを点灯させるだけなので、指定しなかったLEDは実行前の状態が残ったままになってしまいます。set_pixel関数を使う場合はおまじない的に入れておいたほうが良さそうです。

でもこれ、正直、ちょっと面倒です……そんなときに便利なのが、set_pixels関数!「s」が付いて複数形になったということで、すべてのLEDの値を一気に設定できます!

set_pixels
Updates the entire LED matrix based on a 64 length list of pixel values.

/home/pi/sensehat/rainbow.py

from sense_hat import SenseHat

sense = SenseHat()

r = [255,0,0]
o = [255,127,0]
y = [255,255,0]
g = [0,255,0]
b = [0,0,255]
i = [75,0,130]
v = [159,0,255]
e = [0,0,0]

image = [
e,e,e,e,e,e,e,e,
e,e,e,r,r,e,e,e,
e,r,r,o,o,r,r,e,
r,o,o,y,y,o,o,r,
o,y,y,g,g,y,y,o,
y,g,g,b,b,g,g,y,
b,b,b,i,i,b,b,b,
b,i,i,v,v,i,i,b
]

sense.set_pixels(image)

5~12行目でRGBの値を格納した変数を用意し、14行目のimageの中で64個すべてのLEDの値を2次元配列にセットしています。8個ごとに改行を入れて記述すると、LEDディスプレイと同じ配置で見られるので分かりやすいですね。
そして最後にset_pixels関数で、すべてのLEDに色を設定しています。こちらの関数であれば、光らせない部分(上記のソースでは変数eで指定しているところ)も設定するので、clearをかけなくても不都合なく扱うことができますね。

raspberrypi44_img11

図11

 

「向き」を変える

Sense HATでは、ディスプレイ表示の「向き」も制御することができます。

set_rotation
If you’re using the Pi upside down or sideways you can use this function to correct the orientation of the image being shown.

角度を変えてくれるのが、set_rotation関数。デフォルトの状態を0度として、90度間隔で角度を変えることができます。

flip_h
Flips the image on the LED matrix horizontally.

flip_v
Flips the image on the LED matrix vertically.

角度を変えるだけでなく、ディスプレイ表示を反転させることもできます。縦方向の場合はflip_h関数、横方向の場合はflip_v関数を使います。

 

まとめ

はじめてのSense HAT工作、第1回目はLEDディスプレイ編をお送りいたしました!
なんといっても、GPIOポートに差し込むだけという、導入の手軽さが魅力ですね!配線の必要が無いので、電子工作初心者でも気軽にスタートできます。

LEDディスプレイは、便利な関数がたくさん用意されているので、8×8の64ドットという制限を感じさせないくらい、自由度が高いように感じました。また、フルカラーLEDということで、単に情報表示のためだけでなく、遊び心も取り入れつつ、工作を楽しむことができますね!ゲームを作ったりするのも楽しそうです!

続きは次回!Sense HATに内蔵されているセンサを使って計測値の取得に挑戦です!

アバター画像

プロフィール:プログラミング暦通算4年、最近IT業界に舞い戻ってきたプログラマーです。女子です。

NHK学生ロボコン2016 出場ロボット解剖計画