[RISC-V技術ブログ連載第20回]Learn InventorでRISC-Vを始めよう②

SiFive技術ブログ・アイキャッチ画像 RISC-V

1.はじめに

 前回の技術ブログはいかがでしたでしょうか?今回も引き続き、ヒアーイーズしんばしが執筆していきますので、お付き合いいただければ幸いです。
 今年は史上最速の早さで梅雨が明け、暑さが厳しくなってきました。また、当事業所では、利用者さんに敷地内の草むしりをお願いする予定があり、炎天下での草むしり時の注意を喚起するために何か仕掛けが欲しいという話になりました。季節柄、熱中症に十分注意が必要であり、その予防にLearn Inventorボード(以下Inventor)を活用した熱中症対策デバイスを制作できないものか検討を始めることにしました。

2.熱中症対策にあたって

 熱中症対策を考えるうえで、「暑い」、「涼しい」、といったような個人の主観に頼るというのは、はなはだ危険であり、なんらかの客観的な指標を用いたいところです。そこで当初は、Inventorに内蔵される温度計機能を用いればよいのではないか?と考えましたが、調査を進めていくと温度のみで熱中症対策を行うには不十分であり、熱中症危険度の指標としては「暑さ指数(WBGT)」が広く用いられていることがわかりました(※1)。
 暑さ指数(WBGT)は、熱中症を予防することを目的に開発された指標です。気温、湿度、輻射熱(※2)をもとに計算されます。環境省では、熱中症対策の普及啓発を目的として、全国の暑さ指数(WBGT)の予測値及び実況値を、CSV形式にて提供するサービスを実施していることがわかりました(※3)。今回、Inventor上でこのCSV形式ファイルを取得、危険度レベルを表示することで、危険度レベルに応じた熱中症対策を講じることができるような活用方法を考えてみました。

※1 暑さ指数とは https://www.wbgt.env.go.jp/wbgt.php
※2 日射しを浴びたときに受ける熱や、地面、建物、人体などから出ている熱。温度が高い物からは多く出る 出典:環境省ホームページ https://www.wbgt.env.go.jp/wbgt_lp.php
※3 https://www.wbgt.env.go.jp/data_service.php

3.Life-izにおける熱中症対策

3.1. 熱中症対策方針の決定

 先述した環境省のサイトでは日常生活、運動、作業者の3つの指針が示されています。今回は、草むしりということなので、シンプルな表現がされている運動に関する指針を用いたいと思います。運動に関する指針の表では、WBGT値に対応した運動指針は、危険度レベル別に5段階に分かれています。その指針をもとに、当事業所では各危険度レベルのとき草むしり作業をどのように実施するかの指針を決定し、下表のように「Life-iz対応指針」として定義しました。

危険度レベルと対応指針

 続いて、Inventorの活用方法を検討していきます。横浜市内のWBGT予測値は環境省のサイトからスクレイピングで取得できます。その値に応じて、先述の表を根拠とした危険度レベルをLEDの色で示し、対応する熱中症対策指針の表を参照することで、草むしり作業者自身でどのような対策を取れば良いかわかりやすく判断できるように考えました。

3.2. 運用方法の決定

 3.1にてLife-iz対応指針を定義しましたので、次は草むしりを担当する作業者自身が熱中症対策方法を判断・実施できるような運用を決定しました。作業者においては、以下に示す運用を取ります。

・草むしり作業当日に熱中症対策デバイス(以下、本デバイス)を立ち上げておく
・草むしり作業開始直前に本デバイス上のAボタンを押すことで、最新のWBGT予測値に応じた危険度レベルを把握する
・危険度レベルに応じたLife-iz対応指針をもとに、草むしり作業の実施可否を判断し、実施可能と判断できる場合は、実施時間、休憩・水分補給の目安を守り、作業を実施する

4.熱中症対策デバイスの実現

 続いて、本デバイスの動作仕様を決定していきます。

4.1. デバイス動作仕様

・起動するとAボタン押下待ち状態となる
・Aボタンを押すたびに、その時点のWBGT予測値を取得
・WBGT予測値ファイルの作成時刻とWBGT予測値をPCモニタ上に表示、その値に対応した危険度レベルを表す色を5段階でInventor LED上に10秒間表示
なお、今回は例外処理、エラー処理は省きます。

4.2. ソースコード

 上記仕様に即した動作をするように、MicroPythonスクリプトを作成しました。

from hifive import *
import esp32
import neopixel # LEDの制御を行う

# 数値の定義の開始
# 熱中症アラートの危険度レベル定義
LV_1 = 21
LV_2 = 25
LV_3 = 28
LV_4 = 31

# Inventor上LEDへの表示時間(10秒に設定)
DP_TIME = 10000
# 数値の定義の終了

# 関数定義の開始
######### get_wbgt()関数 #########
# 環境省サイトから値を取得する関数
# 戻り値として整数値のWBGTを返す
##################################
def get_wbgt():
    host = "www.wbgt.env.go.jp"
    request = "/prev15WG/dl/yohou_46106.csv" # 横浜の地点番号が46106

    esp32.conn_open_ssl(host, 443)
    response = esp32.cip_send("GET {0} HTTP/1.1\r\nHost: {1}\r\nConnection: close\r\n\r\n".format(request, host))

    data = response[1].split('\n')

    START_CSV = 11 # CSVの開始行
    WBGT_VAL_V = 2 # 取得するWBGT値の位置(行)
    WBGT_VAL_S = 3 # 取得するWBGT値の位置(列)
    TIME_VAL = 2 # 時刻の取得

    csv_data = data[START_CSV:]

    wbgt_str = csv_data[WBGT_VAL_V - 1].split(',')
    wbgt_val = int(wbgt_str[WBGT_VAL_S - 1]) / 10
    time_current = (wbgt_str[TIME_VAL - 1])

    print(time_current)
    print(wbgt_val)

    return wbgt_val

########### eval_wbgt(val)関数 #############
# WBGT値から危険度レベルを表示させる
############################################
def eval_wbgt(val):
    if  val >= LV_4:
        np.fill_all((255, 0, 0))
    if LV_3 <= val < LV_4:
        np.fill_all((255, 100, 0))
    if LV_2 <= val < LV_3:
        np.fill_all((255, 255, 0))
    if LV_1 <= val < LV_2:
        np.fill_all((0, 255, 255))
    if val < LV_1:
        np.fill_all((0, 0, 255))

    sleep(DP_TIME)
    np.fill_all((0, 0, 0))
# 関数定義の終了

esp32.set_wifi_mode(1)

wifi_name = "Your SSID"
password = "Your PASSCODE"
esp32.connect(wifi_name, password)

np = neopixel.NeoPixel(pin6, 48)

while True:
    if button_a.is_pressed():
        WBGT = get_wbgt()
        eval_wbgt(WBGT)

 今回利用するモジュールとしては3種類あります。前回のRISC-V技術ブログ連載第19回でも用いたhifiveモジュール、通信を制御するesp32モジュール、LEDへの出力を行うneopixelモジュールの3つです。ここで、ソースコード中で核となってくるユーザ定義関数get_wbgt()について簡単に説明します。get_wbgt()関数は引数を取らず、横浜市の最新のWBGT予測値を取得し、それを返り値として返す処理を行っています。
get_wbgt()関数の中で、特筆すべき箇所を3点に絞ってご説明します。

response = esp32.cip_send("GET {0} HTTP/1.1\r\nHost: {1}\r\nConnection: close\r\n\r\n".format(request, host))

 まず、cip_send()という関数を使って取得したいCSV形式ファイルのあるURLへHTTPのGetメソッドを送っています。HTTPのリクエストなので、CSV形式ファイル以外の情報も含んだ形でresponse変数に情報を取得します。

data = response[1].split(‘\n’)
csv_data = data[START_CSV:]

 次に、split()関数を用いてデータを整形後、CSVデータのみをcsv_data変数に格納します。

wbgt_str = csv_data[WBGT_VAL_V - 1].split(',')
wbgt_val = int(wbgt_str[WBGT_VAL_S - 1]) / 10
time_current = (wbgt_str[TIME_VAL - 1])

 最後に、環境省の暑さ指数電子情報提供サービスサイト(※4)で示されるCSVのデータ形式を参考に、必要な情報を取得します。
 以上のように、一連のスクレイピングを行うことで、wbgt_val変数にWBGT予測値、time_current変数にWBGT予測値ファイルの作成時刻を取得することができました。

※4 https://www.wbgt.env.go.jp/data_service.php

4.3. 実行結果

 実際にスクリプトを実行し、下図のように期待した実行結果を確認できました。ここで、WBGT予測値は28.0、対応する危険度レベルはRGB(255, 100, 0)で示される橙色です。橙色を示していますので、先述した表記載の「Life-iz対応指針」により、草むしりを行わないと判断できます。よって、草むしりは見送りとなります。

実行結果

5.まとめ

 本デバイスが完成した7月19日現在、直近で草むしり作業の予定は入っていませんが、まだまだ暑い日は続くと予想され、本デバイスの今後の活躍が待たれるところです。
 いかがでしたでしょうか。第19回、第20回と2回に渡り、私たちLife-izが技術ブログの執筆を担当させていただきました。その中で、人に伝えることの難しさを痛感したりと色々苦労もありましたが、実際にRISC-V搭載ボードを使って、身近に役立つデバイスの開発にチャレンジできたことで、とても有意義な経験ができたと思っています。これを機に、今後RISC-V関連のイベント等にも積極的に参加し、RISC-Vの知見を深めていけたらと思っております。ここまでご覧いただき、ありがとうございました。


 本ブログについてのより詳しい内容へのご質問等ございましたら、ぜひお気軽にお問合せください。
 お問い合わせはこちら
   info-lsi@dts-insight.co.jp

著作権および商標
Linux は、Linus Torvalds の米国およびその他の国における登録商標です。
MacOSは、米国および他の国々で登録されたApple Inc.の商標です。
その他本ブログに記載する製品名は、一般に各開発メーカーの商標または登録商標です。
なお、本文中には™ および ® マークは表記していません。

■■DTSインサイトの「システムLSI設計ソリューションサービス」■■
 DTSインサイトでは、システムLSI/FPGA設計の受託も行っています。
 当社のノウハウを活かした、ソフトウェアの移行(マイグレーション)
 サービスも提供しておりますので、お気軽にご相談ください。

システムLSI設計ソリューションサービス紹介は こちら