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

RSS


はじめての電子工作にピッタリ

テレワーク過労、集中力低下を防止! パフォーマンス最適化グッズを作ろう

新型コロナウイルス感染症対策の影響で、リモートワークが以前よりも定着してきました。リモートワークが盛んに取り入れられた頃は、良さばかり取り上げられてきましたが、徐々に課題も見えてきました。その一つが、体調への影響です。

自室で一人黙々と仕事をして、ついつい同じ体勢のまま長時間働いてしまいがちです。私もリモートワーク導入直後は、集中して休憩を取らずに働いてしまったり、ミーティングが増えて、減ってしまった作業の遅れを取り戻すために、長時間・同じ体勢で働いてしまうということが多くありました。

オフィスで複数の人と同じ空間を共有していた頃は、良くも悪くも声をかけられたり、ミーティングルームへの移動で、適度に体を動かす機会がありましたが、リモートワークになり、作業もミーティングもパソコンの前で済んでしまうことで、新たに働く人自身が意識的に休憩を取るということが必要になってきました。

また、広いオフィスは換気が十分に行き届いていましたが、自宅の個室は意識して換気を行わないと、二酸化炭素濃度がすぐに高くなってしまいます。

二酸化濃度は、通常400ppm〜1000ppmほどが適切で、1000ppmを越えてしまうと集中力の低下や眠気など、仕事の効率を著しく低下させる原因となります。

このような時代になったからこそ、体調管理にフォーカスし、体調を最適化させるガジェットが必要です。

そこで、「M5Stack」と呼ばれるディスプレー、スピーカーが内蔵になったマイコンを使用し、二酸化炭素を計測できるCO2センサーや、人が着席した状態かを認識できる超音波センサーを使ってテレワーク過労や眠気を防止し、テレワーク中でもハイパフォーマンスを維持するガジェットが作れないか考えてみました。

まずは動画をみてください。

実際にリモートワークで取り入れてみた感想ですが、1時間に1回の休憩は割とメリハリが出やすいと感じました。

また、二酸化炭素濃度は殆どアラートが出ることがありませんでしたが、濃度の変化が目で見え、すこし高い時はリフレッシュのため、自ら換気をするようになりました。

一方で少し課題だったのがアラーム音の音量です。Zoom等のミーティング中に鳴ってしまうと、ミーティングに参加したメンバーがびっくりしてしまうこともありました。

M5Stack内の設定でボリューム音を調整できるとのことだったのですが、私の環境では動かないため、M5Stackのスピーカー部分にテープを貼り、物理的に音量調整しました。

photo

最初はモニターの下にデバイスを設置したのですが、光るキーボードを使用していると超音波が光にあたってしまうようです。そのため人がいないのにも関わらず、人がいる状態でプログラムが動いてしまいました。

photo

そのため、モニターの上に設置することで、正常に計測できるようになりました。

設置する際に、個人の環境によって適切な配置がありますが、設置場所さえ決まればUSBケーブルで給電するだけです。

システム構成と制作手順

photo

パソコンの前でずっと座ったままの状態かどうかをチェックするために超音波距離センサーを利用します。

超音波距離センサーとは超音波を計測したい対象に向けて発信し、対象にぶつかり反射する時間で距離を求めるセンサーです。この超音波距離センサーを使い定期的に超音波を発信し、「座り続けている状態」かをチェックし、長時間座ったままの状態ならディスプレーに休憩を促すメッセージを表示します。

また、ガスセンサーユニットという空気中の二酸化炭素濃度を測れるセンサーを使い、二酸化炭素濃度が800ppm以上になると換気を促すメッセージを表示します。

二酸化濃度が1000ppm以上になると脳の認知機能が低下し、思考や集中力に影響が出るそうです。

センサーを取り付けるマイコンはM5Stackを使用します。
M5Stackは通常電子工作で使用するマイコンよりも初心者向きです。

通常、電子工作で使われるマイコンは、センサーやパーツを取り付けられるように基板がむき出しで、必要なセンサーやパーツは1つ1つユーザーが取り付けます。

M5Stackは、ディスプレー、microSDカードスロット、スピーカー、内蔵バッテリー、Wi-Fi、Bluetoothなどが標準で実装されています。

M5Stack M5Stack

また、M5Stackが製造・販売しているセンサーを利用すれば比較的簡単に、さまざまなアイデアを形にすることが可能です。

プログラムの開発環境

M5Stackのプログラム開発環境は、M5Stackが提供しているUIFlow、Visual Studio Code というエディターで開発が可能なPlatformIO、Arduinoなどのプログラム開発が可能なArduinoIDE、Arduino Web Editorや、ESP-IDFなどの開発環境が使用できます。

ここでは、初心者でも使いやすいArduino Web Editorを利用します。

Arduino Web EditorとArduino IDEは同じC/C++を元に開発されたArduino言語でプログラムを作成します。Arduino Web EditorはWebブラウザを使いプログラムを開発するWebブラウザ版で、Arduino IDEは、ソフトウェアをパソコンにインストールしてプログラミングを行うインストール版です。

インストール版は、オフラインで利用が可能です。また各作業環境(ライブラリのバージョンを下げたり)など柔軟な開発ができます。しかし一方でライブラリに起因するトラブルが多く、解消しないとビルドが通らなくなったり、ビルドが通っていたプログラムでもライブラリをアップデートしたことで、通らなくなったりするトラブルが発生しやすいです。

Webブラウザ版は、オフラインでは利用できません。また、古いバージョンのライブラリを使うこともできません。

しかし、ライブラリのバージョン違いなどでエラーになることはありません。

今回は、以上の理由からWebブラウザ版でプログラムを行います。

はじめてのマイコンプログラム

初めて利用する方は、簡単なプログラムをM5Stackに書き込んでみましょう。

すでにArduino Web Editorまたは、Arduino IDEを利用したことがある方はスキップして頂いて大丈夫です。

https://store.arduino.cc/digital/createにアクセスし「GET STARTED FOR FREE」をクリックしてアカウントを作成します。

photo

※無料プランでプログラムの作成は可能ですが、プログラム作成容量100MB、コンパイルが1日200秒などの制約があります。今後継続的に利用されたい方は有料プランをおすすめいたします。

アカウントを作成後Webエディタに遷移します。
https://create.arduino.cc/editor

photo

画面左側はメニューエリアで、プログラムの保存やライブラリなどを開くことができます。
画面上部がプログラムの検証、書き込みとボードを設定するエリアです。
画面中央の白いエリアがプログラミングを行うエリアです。
画面下部黒いエリアはプログラムの書き込み状況や、プログラムエラーが表示されるエリアです。

M5Stack用のサンプルプログラムを表示します。画面左側の「Libraries」をクリックし、検索エリアに“M5Stack”と入力します。

M5Stack用のライブラリが表示されます。

photo

「Examples」をクリックし「Display」から「All_Free_Fonts_Demo」をダブルクリックしてプログラミングエリアに表示させます。

photo

サンプルプログラムにエラーはありませんが、念のためプログラムに問題がないか、プログラムの検証を行います。上部の「✓」ボタンをクリックします。

問題がなければページ下部の黒いエリアに緑の帯で“Success”と表示されます。

photo

必ずプログラムを書き込む前に、このように検証しプログラムに問題がないことを確認します。

書き込みと実行

プログラムの記述に問題がなければM5Stackに書き込みましょう。

M5StackをUSBケーブルでパソコンに接続します。Arduino Web Editorに戻りボードの設定を行います。

画面上部の「Arduino Due」をクリックして表示される「Select Other Board & Port」をクリックします。

photo

BOARDSの検索エリアに“M5Stack”を入力するとM5製品のボードが絞り込まれるので「M5Stack-Core-ESP32」をクリックして選択します。

PORTSは、現在M5Stackが接続されているポートを選び、「OK」をクリックして設定画面を閉じます。

※ポートが複数見つかりM5Stackが接続されているポートがどれかわからない場合は、接続している周辺機器をはずしM5Stackのみにしてみてください。

photo

正常にポートが認識されれば、画像のようになります。

photo

「→」ボタンをクリックしてM5Stackに書き込みます。問題なく終了すると、緑の帯に“Success”と表示されます。

photo

M5Stackにプログラムが書き込まれると、自動的にプログラムを実行します。

ディスプレーにさまざまなフォントが表示されるプログラムです。

photo

使用するセンサーの取り付け

TVOC/eCO2 ガスセンサユニット(SGP30)をM5Stackに接続します。M5StackはGrove端子と呼ばれる4つの端子がセットになったコネクターが実装されており、互換性のあるセンサーであれば差し込むだけで接続ができます。

TVOC/eCO2 ガスセンサーユニット(SGP30)は、差し込むだけで接続できます。

photo

接続する超音波距離センサー(HC-SR04)をM5Stackと接続します。

超音波距離センサーとM5Stackは直接接続することができません。ジャンパワイヤーと呼ばれる接続部品を使用します。

ジャンパワイヤーには、USB端子と同じ様にオスとメスが存在しています。

超音波距離センサーとM5Stackを接続するために使用するジャンパワイヤーは、片側がメス、片側がオスのものを使用します。

photo

ジャンパワイヤーのメスと超音波距離センサーのピンを接続します。

photo

それぞれどの線とM5Stackのどこを接続するのかは、図を参考に接続してください。

photo

写真のように接続ができれば完成です。

photo

配線をまとめてテープで留めてみました。超音波距離センサー部分がロボットの顔のようにみえますね。

photo

プログラムの作成

サンプルのプログラムを基に、一部書き加えます。

「Libraries」で再度“M5Stack”を検索し、Examplesから「Unit」→「TVOC_SGP30」を選択しダブルクリックします。

開いたプログラムは、TVOC/eCO2 ガスセンサーユニット(SGP30)のサンプルプログラムです。この状態でM5Stackにプログラムを書き込んでもTVOC/eCO2 ガスセンサーユニットだけであれば動きます。このプログラムに超音波距離センサーでの処理を追加していきます。

キーボードの「Ctrl」キーを押しながら「S」キーを押します。Macの場合はキーボードの「command」キーを押しながら「S」キーを押します。

名前を「Remote_Work_Item」と付け直し「OK」をクリックします。

超音波距離センサーのプログラムを追加します。

全てのプログラムは下記になります。

#include <M5Stack.h>
#include "Adafruit_SGP30.h"//SGP30センサー用ライブラリ
#define echoPin 16 // 超音波距離センサーEchoピン
#define trigPin 17 // 超音波距離センサーTrigger Pinピン

Adafruit_SGP30 sgp;
long last_millis = 0;

double Duration = 0; //受信した間隔
double Distance = 0; //距離
double count = 0;//着席状態の時間を保存

void setup() {
  M5.begin();
  M5.Lcd.setTextSize(2);
  pinMode( echoPin, INPUT );
  pinMode( trigPin, OUTPUT );
  if (!sgp.begin()){//SGP30センサー初期化
    M5.Lcd.println("Sensor not found");
    while (1);
  }
  M5.Lcd.println("\nInitialization...");
}
 
void loop() {
  static int i = 15;
  digitalWrite( trigPin, HIGH ); //超音波を出力
  delayMicroseconds(10); //超音波出力時間
  digitalWrite( trigPin, LOW ); //超音波停止
  Duration = pulseIn( echoPin, HIGH ); //センサーからの入力
  Duration = Duration/2; //パルスの長さを半分に分割
  Distance = Duration*340*100/1000000; // cmに変換

    while(i > 0) {
    if(millis()- last_millis > 1000) {
      last_millis = millis();
      i--;
      M5.Lcd.fillRect(20, 120, 60, 30, BLACK);
      M5.Lcd.drawNumber(i, 20, 120, 2);
    }
  }
  if (! sgp.IAQmeasure()) {
    Serial.println("Measurement failed");
    return;
  }
  
  if (Distance >= 0 && Distance < 100) {//0以上100未満なら通過
    M5.Lcd.setTextSize(2);
    M5.Lcd.clear(BLACK);
    M5.Lcd.setCursor(10, 10);
    M5.Lcd.print("Distance: ");
    M5.Lcd.print(count);
    M5.Lcd.setTextSize(3);    
    M5.Lcd.setCursor(10, 60);
    M5.Lcd.printf("TVOC:%d ppb\n",sgp.TVOC); //TVOCを表示
    M5.Lcd.setCursor(10, 100);
    M5.Lcd.printf("eCO2:%d ppm\n",sgp.eCO2); //eCO2を表示
    count = count+1;
    delay(1000);//取得間隔1秒

    if(count == 3600) {//もしこの状態が1時間経過したらアラート表示
      M5.Lcd.setTextSize(3);
      M5.Lcd.clear(BLACK);
      M5.Lcd.setCursor(10, 80);
      M5.Lcd.print("Please\n take a break");
      M5.Speaker.beep();//ビープ音開始
      delay(1000);
      M5.Speaker.mute();//ビープ音終了
      delay(9000);
      count = 0;
    }
    if (sgp.eCO2 > 800) {//co2濃度が800を越えたら
      M5.Lcd.setTextSize(3);
      M5.Lcd.clear(BLACK);
      M5.Lcd.setCursor(10, 80);
      M5.Lcd.print("Please ventilate");
      M5.Speaker.beep();//ビープ音開始
      delay(500);
      M5.Speaker.mute();//ビープ音終了
      delay(500);
      M5.Speaker.beep();//ビープ音開始
      delay(500);
      M5.Speaker.mute();//ビープ音終了
      delay(9000);
    }
  } else {
    count = 0;
    M5.Lcd.setTextSize(3);
    M5.Lcd.clear(BLACK);
    M5.Lcd.setCursor(10, 80);
    M5.Lcd.print("During a break");
    delay(5000);
  }
}

簡単にプログラムの説明です。超音波が反応する範囲を、0以上100未満としています。

if (Distance >= 0 && Distance < 100) {//0以上100未満なら通過

これは、実際に数値をとってみると超音波が上手く返らないことがあり何度か0になってしまうことがありました。

例えば座っている状態でも、物を落として一瞬だけ超音波の照射位置にいなかったり、服などの影響で正しく超音波が戻らないなどが考えられます。

また、4.5m以上障害物がなくても同様に0になることは想定されますが、今回は4.5mも障害物がない部屋はあまりないと考え、計測不可の0も着席状態としています。

もし、自宅ではなく障害物のない広いオフィスで使用する場合は、プログラムまたはセンサー自体を変える必要があります。

また、M5Stackのスピーカーからビープ音を出すプログラムを追加していますが、デフォルトの音が大きめに設定されていますので、はじめに実行する場合は気をつけてください。

M5.Speaker.beep();//ビープ音開始
delay(1000);
M5.Speaker.mute();//ビープ音終了

eCO2については、800以上でお知らせするようにプログラムを作成しています。

if (sgp.eCO2 > 800) {…

起動後eCO2の表示は大体400程度で表示されます。起動後しばらくしてからの方が安定するようです。

作成したプログラムを「✓」をクリックして検証します。

photo

エラーがでなければ、「→」をクリックしてM5Stackに書き込みます。

動作の確認

電源を入れると、TVOC/eCO2 ガスセンサーユニットの初期化が始まります。

photo

初期化が終了すると、座った状態が何秒続いているか、VOC(揮発性有機化合物)数値と、eCO2(二酸化炭素濃度相当値)が表示されます。

超音波距離センサーが自分の体に当たるようにモニターの上下など、必ず体に超音波が当たる位置に起きます。

座っている状態を判定する範囲は1mです。それ以上離れる場合は、プログラムを修正してください。

また、座っている位置のすぐ後ろに、本棚や壁がある場合、超音波距離センサーが誤認識する可能性があります。

photo

もし1時間座ったままの体制が続けば休憩を促すビープ音と共に「Please take a break(休憩してください)」が10秒間表示されます。

photo

もしeCO2が800を越えた場合は、換気を促すビープ音と共に「Please ventilate(換気してください)」が10秒間表示されます。

photo
photo

このアイテムでパフォーマンスを最適化し、仕事をバリバリこなしましょう!

おすすめ記事

 

コメント

ニュース

編集部のおすすめ

連載・シリーズ

注目のキーワード

もっと見る