こちらラズパイ工作室

用途はいろいろ。8×8ドットマトリクスボードをラズパイでピカピカ光らせる

「こちらラズパイ工作室」では、Japanese Raspberry Pi Users Group監修のもと、電子工作に精通したライター各人が、Raspberry Piを使った工作キットや拡張基板、おもしろい使い方などを紹介していきます。
Unicorn HAT

 今回はイギリスPimoroni製のボードシリーズ「Unicorn HAT」を取り上げていく。このボードには縦横8個ずつ合計64個のフルカラーLEDが搭載されており、簡単なPythonスクリプトで光らせてさまざまな表現を行なうことができる。

 Unicorn HATの姉妹品として、Raspberry Pi Zeroサイズに合わせて32個(4×8)のフルカラーLEDが搭載された「Unicorn pHAT」や、256個(16×16)ものフルカラーLEDを搭載し、高解像度化した「Unicorn HAT HD」がある。また、製品名は違うものの8個のフルカラーLEDがPIOポートを覆う程度のコンパクトな基板に収められた「Blinkt!」もあるが、これらについては機会があれば紹介したい。

 さて、今回はUnicorn HATとUSBのゲームパッドを使ったドット絵遊びプログラムを紹介する。

Unicorn HATの購入方法

 Unicorn HATが購入できるリンクを以下に示す。Pimoroni(イギリス)から個人輸入した場合は20英ポンド+送料で、日本のスイッチサイエンスから購入する場合は3,132円+送料となる。

Unicorn HATのドライバインストール方法

 Unicorn HATは完成された状態で販売されているため、購入後はすぐにRaspberry Piに取り付けてドライバをインストールすれば使いはじめることができる。

 Raspbian(デスクトップ版、LITE版どちらでも良い)を用意して、Unicorn HATを取り付けたRaspberry Piを起動したら、以下のコマンドでPythonライブラリの一式をインストールしよう。

pi@raspberrypi:~ $ curl -sS https://get.pimoroni.com/unicornhat | bash

 もしくは、aptコマンドでpimoroniパッケージをインストールすると、Pimoroniの各種製品のソフトウェアを簡単にインストールできるランチャーを利用できる。CUI環境の場合はpimoroni-dashboardコマンドで、GUI環境の場合はメニューから起動できる。

pi@raspberrypi:~ $ sudo apt update
pi@raspberrypi:~ $ sudo apt install pimoroni
pi@raspberrypi:~ $ pimoroni-dashboard

 どちらかの方法でインストールが済んだあとは、/boot/config.txtを任意のエディタで開き、hdmi_force_hotplug=1オプションが有効であることを確認しよう。このオプションが設定されていない場合、Unicorn HATを制御しようとしてもランダムに点滅するのみで正常に動作しないためだ。

USBゲームパッドと組み合わせてお絵かきツールを作ってみる

 8×8のドットマトリクスでいろいろな情報を表現をするためには、絵が必要になる場合もある。天気予報なら晴れ/曇り/雨/雪のイラスト(天気のイラストデータはサンプルスクリプトにも収録されている)だったり、メール通知なら手紙アイコンなどだ。通常ならペイントツールでドット絵を描いてからプログラムなどに落とし込むが、そのままUnicorn HATで作れるようなお絵かきツールを作成してみた。

 操作にはレトロゲーム風のUSBゲームパッドを使用した。ゲームパッドであるところに強いこだわりはないが、キーボード/マウス以外で操作できたほうが楽しいだろう。ここで使っているのは、イギリスのThe Pi Hutが販売する「Raspberry Pi Compatible USB Gamepad/Controller("SNES" Style)」で、日本への発送には対応していないが、似たようなものが秋葉原などで入手できる。

 スクリプトは少し長くなるため、GitHubで公開した(ソースコード)。

 動作させるには、USBゲームパッドと、それをPythonで扱うためのライブラリが必要になる。ライブラリは以下のコマンドでインストールする。

pi@raspberrypi:~ $ sudo pip inputs

 実行するには、管理者権限でスクリプトを実行する。

pi@raspberrypi:~ $ sudo python unicornpaint.py
起動直後
色の例

 操作方法は、十字キーでカーソルの移動、セレクトボタンでカーソルの色の変更、Aボタンで現在のカーソル位置にカーソルの色を配置、Bボタンで配置した色の消去、スタートボタンで全部クリアとなっている。

 以下は、チューリップを描いてみた例となる。花の色を変えることもかんたんだ。

Unicorn HAT用スクリプトの解説

 今回のスクリプトは、必要に応じてゲームパッドのキーの位置を調整したり、パレットの色を増やしたりといった改造ができるので、改造ポイントを紹介する。

 パレットの色については、スクリプトの冒頭にpaletteという配列変数が宣言されている。そのままの状態では0と255の組み合わせで8色が登録されており、最初の[0, 0, 0]はBボタンで消去したときのパレットとなる。[]のなかは[R, G, B]の順で、0〜255の範囲で値を指定する。いろいろな色を追加してみよう。

 ゲームパッドのキー入力を検知する部分は35行目以降となる。使用しているボタンには処理が記述されていて、使用していないボタンはそのボタンが押されたことを表示するだけになっている。機能を追加するときには、未使用のボタンに割り当ててもおもしろそうだ。

 また、ボタンとプログラムの挙動が一致しない場合は、98行目にある「押されたボタンを表示する」処理のコメントアウトを解除して、ボタンとコードの対応を確認しよう。なお、処理部分に関してはinputsライブラリのサンプルを参考にさせてもらった(ソースコード)。

 お絵描きした内容を記憶するのはuhmap変数だ。64個の配列変数となっていて、左上から右下までのドットを全部一列にした状態で管理している。配列変数にはパレットの配列番号が入っている。もし、左から4つ目、上から3つ目のドットの色を知りたいときはuhmap[3 * 8 + 4]といった具合でパレットの配列番号を取得できる。

 そのほか、カーソル位置と現在の色の管理はcx、cy、curpal変数で行なう。キーが押されたときにそれぞれ変化させる。

 最後に、Unicorn HATの制御について解説する。

 Unicorn HATでLEDを点灯させるには、set_pixel()で縦横の位置とRGBの色を指定して、show()で点灯させる。set_pixel()を複数実行してからshow()することで、まとめて表示することもできる。

 スクリプトの冒頭に記述されているbrightness()は、Unicorn HATの点灯の明るさを指定するものだ。0.0から1.0の間で指定できるが、0.2が推奨されており、初期値もこの値だ。1.0を指定した場合はたいへんまぶしく、目を痛めるおそれがあるため、十分に注意してほしい。

 Unicorn HATの関数はほかにもいろいろ用意されているため、Unicorn HATのドキュメントも合わせて参照しよう(Unicorn HATのドキュメント)。

Unicorn HATのサンプルスクリプト

 Unicorn HATのドライバをインストールしたときに同時にインストールされるサンプルスクリプトをいくつか紹介する。いずれもとてもきれいなのでぜひ一度は実行してみてほしい。

  • demo.py
    色がグラデーションしながら回転しているような動きをするスクリプト
  • rainbow.py
    虹色に光りながら色が流れるスクリプト
  • game_of_life.py
    ライフゲームをUnicorn HAT上で実行するスクリプト

まとめ

 Pythonで簡単にプログラミングできる8×8のLEDドットマトリクスボード「Unicorn HAT」のセットアップ方法とお絵かきプログラムの例を紹介した。

 冒頭で挙げた“プログラムなどに落とし込む”機能は実装していなかったので、ゲームパッドの未使用キーに実装するなどチャレンジしてみてほしい。また、カーソルキーでLEDのドットを動かせるという点を活かして、シューティングゲームや障害物よけゲームを作ってみても楽しそうだ。

 今回は紹介し切れなかったが、Unicorn HAT上に日本地図のようなものを描き、気象情報のAPIサービスを利用して、日本各地の天気を表示するスクリプトも公開している(ソースコード)。こういった情報と組み合わせた表示アプリを作ると実用的かもしれない。

天気表示の例

著者紹介

あっきぃ(@Akkiesoft)
Ejectコマンドユーザー会主宰。難しそうな電子工作を避けCD-ROMドライブを使ってIoT的な工作をしていたところ、2012年にRaspberry Piと出会う。Japanese Raspberry Pi Users Groupには立ち上げ時から参加し、イベントでの出展活動などをしている。