こちらラズパイ工作室

ラズパイ+Skywriter HAT。マイクラを3Dジェスチャーでピョンピョン動かす

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

 イギリスPimoroni製の「Skywriter HAT」ボードは、静電容量を利用した3Dジェスチャー・タッチを検出できるセンサーボードだ。

 Skywriter HATに指を近づけると、X/Y/Zの座標を取得したり、フリックやタップなどのジェスチャーを簡単に取得したりできる。また、Z座標は高さ5cmくらいから位置を取得可能だ。

 プログラミングは、Pimoroniによって用意されたPythonを使用すれば、Python言語でかんたんにはじめられるようになっているので、プログラミングの経験が浅い人でも取っつきやすいだろう。

 今回はSkywriter HATを使用して、人気のゲーム「Minecraft」のRaspberry Piバージョンを指で操作しながら空からマップを眺めることができるプログラムを作成してみた。

購入方法

 「Skywriter HAT」はイギリス所在のPimoroniから個人輸入できるが(約16英ポンド+送料)、日本国内で電子部品の販売などを行なっているスイッチサイエンスから購入することも可能だ。スイッチサイエンスでの価格は2,084円で、送料は150円。送料は合計金額が3,000円以上で無料となる。

インストール方法

 Skywriter HATは完成された状態で販売されているため、購入後は以下の写真のようにすぐにRaspberry Piに取りつけて使用できる。

Raspberry Pi 3 Mobel Bへの取り付け

 Raspbian(デスクトップ版)を用意して、Skywriter HATを取りつけたRaspberry Piを起動したら、以下のコマンドでPythonライブラリ・ソフトウェアの一式をインストールを実行しよう。

curl -sS https://get.pimoroni.com/skywriter | bash

Minecraft Pi Editionと組み合わせてみよう

Skywriter HATでマインクラフトを操作

 Raspberry PiにバンドルされているMinecraft Pi Editionは、Pythonスクリプトでワールド内を自由に操作したり、情報を取得したりできる。ちょうど、Minecraftの位置情報もX/Y/Zの座標で指定できるので、Skywriter HATと組み合わせるにはちょうどよいテーマだと考えた。

 そこで、Minecraftのマップを空から見下ろしながら自由にカメラを移動させられるような以下のようなスクリプトを組んでみた。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# skymcpi.py

import skywriter
import signal
from mcpi.minecraft import Minecraft

mc = Minecraft.create()
touch = 0

@skywriter.move()
def move(x, y, z):
  global touch
  if touch:
    # MinecraftのZに相当
    mx = x * 256 - 128.5
    # MinecraftのXに相当
    my = y * 256 - 128.5
    # MinecraftのYに相当
    mz = 36
    # 高さも操作したいときはコメントアウトをはずす
    # mz = z * 40
    mc.camera.setPos(my, mz, mx)

@skywriter.touch()
def touch(position):
  global touch
  if touch:
    touch = 0
    mc.postToChat("set camera mode to normal")
    mc.camera.setNormal()
  else:
    touch = 1
    mc.postToChat("set camera mode to fixed")
    mc.camera.setFixed()

signal.pause()

 スクリプトを適当な場所に配置して、Minecraft Pi Editionを起動し、ワールドのなかに入った後でスクリプトを実行しよう。

$ python /home/pi/skymcpi.py

 スクリプトの起動直後は通常どおりプレイでき、タッチすると空から見下ろした状態になる。再度タッチすると通常のMinecraftに戻る。見下ろした状態でカメラの位置を移動するには、Skywriter HATの空中で指を動かそう。

 なお、本体を反時計回りに90度回した状態で操作すると、画面との位置関係が合うようになっている。また、カメラはプレイヤーとは別の視点となるため、うまく移動させればマップ上にプレイヤーを見つけることもできるだろう。

Skywriter HATでMinecraft Pi Editionを操作

スクリプトの解説

 MinecraftとSkywriter HATではX/Y/Z座標の扱いが異なる。各座標は以下のように対応する。

【表】MinecraftとSkywriter HATの座標の扱いの違い
MinecraftSkywriter HAT
XY
YZ
ZX

 Skywriter HATのmoveイベントでは、各軸の値は小数点付きの0〜1の間で取得できる。一方、MinecraftのX/Zの座標は-128〜128であるため、取得した値を256倍した後に128.5を引く必要がある。これは、ライブラリではプレイヤーの座標を指定するplayer.setPos()と、カメラの座標を指定するcamera.setPos()があり、前者は128を、後者は128.5を引く必要があるからだ。

 MinecraftのY座標は-64〜64だが、0から下は地面のため何も見えず、64以上では地表が見えなくなってしまう。そのため、取得した値を40倍して地面〜空中を移動できる程度とした。

 ただし、人によっては画面酔いしてしまう可能性もあるため、コメントアウトして36で固定としてある。興味がある人はぜひコメントアウトをはずして遊んでみてほしい。

サンプルスクリプトも動かしてみよう

 Skywriter HATのインストールスクリプトを実行すると、サンプルスクリプトが「/home/pi/Pimoroni/skywriter/examples」以下にインストールされる。プログラミングをはじめるときの参考になるので、こちらもひととおり試してみることをおすすめする。

 なお、各スクリプトの実行には追加のパッケージやPythonライブラリをインストールする場合があるため、必要に応じて同ディレクトリのなかにあるREADME.mdを参照してインストールしよう。

テストスクリプト

 test.pyは、Skywriter HATでできる操作についてひととおり記述されたスクリプトになる。以下の内容が取得できる。

  • 移動
  • フリック
  • ホイール
  • ダブルタップ
  • タップ
  • タッチ

キーボードのサンプル

 keyboard.pyは、フリック動作でキーボードカーソルを操作して、タップすると改行を実行できるスクリプトだ。テキストエディターを起動して適当な文字列を入力した後に操作してみると良いだろう。

マウスのサンプル

 mouse.pyとumouse.pyはそれぞれマウスの代わりに使用できるスクリプトだ。ただし、ノートPCのタッチパッドほど精度の良い動作はできず、指の動きから少し遅れ気味にマウスカーソルがグニャグニャと追従するような挙動をする。

テルミンのサンプル

 syhnth.pyは、テルミン(世界初の電子楽器)のような音を奏でることができる。指を置く高さで音程を変えたり、上下左右で音量や音の鳴り方を調節できる。Raspberry Pi本体の3.5mmオーディオ端子にイヤフォンやスピーカーを接続して音を鳴らしてみよう。

まとめ

 Skywriter HATの上で指を動かしてみると、細かい動きを検出するのが難しいことに気づいた。位置の検出に精度が必要なアプリケーションの作成には向かないかもしれない。一方、テルミンのような楽器的なアプリケーションはしばらくさわっていても楽しめたので、楽器として使うのは良さそうだ。また、ジェスチャー検出を利用してリモコンなどを作成してみても良いだろう。

著者紹介

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