新しいものづくりがわかるメディア

RSS


それ、ラズパイでつくれるよ

それ、ラズパイでつくれるよ——落下の危険性も伝えられるよ!

「Raspberry Pi」の活用例を紹介する連載企画「それ、ラズパイでつくれるよ」。 第9回は気圧センサーを用いて相対高度を計算し、高いところから落ちたときに受けるダメージを表示してみよう。

飛び降りたときに受けるダメージってありますよね

「落下ダメージ」という言葉を聞いたことはあるだろうか? シューティングゲームなどによく登場する、一定の高さ以上から飛び降りたときにプレイヤーが受けるダメージのことだ。私は友人たちと一緒に住んでいるのだが、そのうちの一人が「Fortnite」というゲームにどハマりしている。そんな彼は毎週末リビングのテレビの前にどっしりと構え、深夜まで夢中でゲームを続けている。

我が家リビングの週末の様子 我が家リビングの週末の様子

Fortniteにも落下ダメージが存在するのだが、そんな彼がある日ボソッと呟いているのを聞いた。
「今ここから落ちたら何ダメージ食らうんだろう」
なんと彼は実生活の中での落下ダメージを気にし始めてしまったのだ。そんな彼のために、ラズパイを使って今いる高さから落下したときのダメージを常に表示してあげることにした。

高さを測る

スマホに標準搭載されている健康管理アプリが、私が1日に登った階段の数を計算してくれている。その高さは気圧を使って計算しているそうである。

4000歩ほどしか歩いていないのに16階分登っている生活を送っている。 4000歩ほどしか歩いていないのに16階分登っている生活を送っている。

そこで今回高さを測るために気圧センサーを用いることとした。オムロン製のMEMS絶対圧センサー「2SMPB-02E」を搭載して、ラズパイとの配線の面倒がないGroveのコネクターが付いた「絶対圧センサ評価モジュール」を使用する。

高さが分かれば落下ダメージの計算である。Fortniteでは大体高さ15m辺りから落下ダメージを受ける。15mというとビル4階くらいの高さになる。私は3階から飛び降りて無事でいられる気がしないが、落下ダメージはFortniteとほぼ同じになるように計算した。

ラズパイの準備

ハードウェアは以下のものを用意する。

過去に作ったノートPCが活躍します。 過去に作ったノートPCが活躍します。

Raspberry Piの設定でI2Cインターフェースを利用可能に設定していない場合は、

$ sudo raspi-config

で設定しておく。Grove Pi+の初期設定はターミナルで以下のコマンドを実行し、再起動すれば完了だ。

$ sudo curl -kL dexterindustries.com/update_grovepi | bash
$ sudo reboot

再起動後、Grove Pi+を取り付け、

センサーをI2Cと書かれたコネクターにつなぐ。

I2Cと書かれたコネクターならどこでも良い。 I2Cと書かれたコネクターならどこでも良い。
全て取り付けたところ。 全て取り付けたところ。

ターミナルで、

$ sudo i2cdetect –y 1

を実行して、「04」と「56」が表示されることを確認しておこう。「04」がGrove Pi+、「56」が気圧センサーにあたる。

次に体力ゲージを表示するために、普通は処理の進行状況を明示するために使うプログレスバーをターミナルに表示させるPythonライブラリをインストールする。

$ sudo pip3 install light-progress

最後に気圧センサーのPythonライブラリをダウンロードして準備完了だ。

$ git clone https://github.com/omron-devhub/2smpb02e-grove-raspberrypi.git

Pythonスクリプトで動作させる

以下のようにpythonスクリプトを作成し、動作させる。
Pgroundは地面の高さでの気圧なので、測りたい場所の1階などでサンプルプログラムを動作させて事前に変更しておく。作成したスクリプトはダウンロードした気圧センサー用のライブラリと同じディレクトリに保存しよう。私はfalling.pyとして保存した。

import time
import datetime
import grove_2smpb_02e
from light_progress.commandline import ProgressBar
from light_progress import widget

Pground = 1010.3 
P0 = 1013.25
pow = 1.0 / 5.256

sensor = grove_2smpb_02e.Grove2smpd02e()

widgets = ['..HP..', widget.Num(), widget.Bar()]
hitpoint = ProgressBar(100, widgets=widgets)

def cal_height():
  press, temp = sensor.readData()
  height = ((P0 / press)**pow - (P0 / Pground)**pow) * (temp + 273.15) / 0.0065

  return height

def cal_damage(height):
  if height < 9:
    damage = 0
  elif height < 10:
    damage = 12
  elif height < 11:
    damage = 17
  elif height < 12:
    damage = 21
  elif height < 13:
    damage = 36
  elif height < 14:
    damage = 44
  elif height < 15:
    damage = 52
  elif height < 16:
    damage = 77
  elif height < 17:
    damage = 91
  else:
    damage = 100

  return damage

def HitpointBar(damage):
  hitpoint.start()
  hitpoint.update(100 - damage)
  hitpoint.finish()

def main():
    print("start")
    while True:
        height = cal_height()
        # print("height = %.1f[m]" % (height))
        damage = cal_damage(height)
        HitpointBar(damage)
        time.sleep(1)

if __name__ == '__main__':
  main()

ターミナルから以下のコマンドで実行する。

$ sudo python3 falling.py

するとターミナルに体力ゲージが1秒ごとに表示される。階段を登っていけば受ける落下ダメージがどれだけになるか直感的に分かるだろう。

ダメージがない高さでの体力ゲージ ダメージがない高さでの体力ゲージ
ある程度高い位置での体力ゲージ ある程度高い位置での体力ゲージ

早速同居人の元へ持っていき落下ダメージを体感してもらった。

満足(?)そうな同居人 満足(?)そうな同居人

飛び降りてはいけない高さを認識できるようになり、なんだかうれしそうだ。

今回は気圧センサーを用いて高さを測り、落下ダメージを計算した。落下ダメージが分かれば、一見飛び降りても平気そうな場所から飛び降りてしまうことが減るかもしれない。くれぐれも実生活では落下ダメージを受けないように気を付けてほしい。

※このコーナーでは、みなさんの「それ、ラズパイでつくれるよ」をお待ちしています。問い合わせフォームからドシドシご応募ください。

取材協力:
オムロン

参考リンク:
Grove Pi+の初期設定
気圧センサーのpythonライブラリ
気圧から相対高度を計算する

ニュース

編集部のおすすめ

連載・シリーズ

注目のキーワード

もっと見る