本記事の内容
パソコン仕事の集中しすぎ防止のため、一定時間デスクに座り続けると休憩のタイミングを知らせてくれるアラームをMicroPythonで作成しました。
仕事デスクに置いても怪しくないように、人体赤外線センサはぬいぐるみの中に隠しこんでいます。さらに、世界最小マイコンボード「Seeeduino xiao」を活用して、業界初(??)ぬいぐるみのIoT化を実現させました。(要するに、ただのロボット?)
そもそもマイコンボードとは何?
マイコンボードとは、プログラム開発に最低限必要なハードウェアを組み込んだ基盤です。強引に例えるなら、ロボットの外身です。
WindowsやMacのパソコンを使用してマイコンボードにプログラムコードを書き込むことで、所定の反応と動作を命じることができます。すなわち、ロボットへの命令書き込みです。
今回は、マイコンボードに人体赤外線センサを取り付け、1時間以上パソコンの前に居続けると、赤LEDの点滅でアラートを発するプログラムコードを作成しました。人体赤外線センサはぬいぐるみの中に組み込んでいますので、怪しさはゼロになっています。。。
必要なもの
- Seeeduino xiao:790円(もしくは、Raspberry Pi Pico:580円)
- 人体赤外線センサHC-SR501:200円
- 100均のぬいぐるみ:110円(写真は既に人体赤外線センサHC-SR501埋め込み済です)
当初はマイコンボードをぬいぐるみの中に入れようと考えていましたが、ぬいぐるみの内部が意外と狭かったため諦めました。
そのため、Seeeduino xiaoより大きなRaspberry Pi Picoでも一応は問題ありません。ただし、Seeeduino xiaoの方が標準LEDで表現できる色が豊富なため、今回はxiaoを使用していきます。
Seeeduino xiaoのセットアップ
Seeeduino xiaoのセットアップかLED点灯までの手順は、前回の記事を参照ください。よくあるPC上で認識されない落とし穴にはまらないよう、丁寧に解説しています。
人体赤外線センサHC-SR501との接続
Seeeduino xiaoと人体赤外線センサHC-SR501の接続は、以下の配線の通りです。
Seeeduino xiao | HC-SR501 |
5V | Power |
P3 | High/Low Output |
GND | GND |
人体赤外線センサHC-SR501の真ん中ピン「High/Low Output」は、Seeeduino xiaoのその他空いているピンでも問題ありません。今回はSeeeduino xiaoのピンヘッダを片面のみの実装で済むように、使用するピンを全て右側にするべく、P3を使用しています。
プログラムコードの作成
私のPython下手なおかげで、今回一番悩ませたのが、プログラムコードについてでした。まず、人体赤外線センサHC-SR501を使用したからには、人がいる/いないを検知して、LEDで出力する必要があります。
着席判定
- 検知あり(着席状態)⇒ LED(黄)
- 検知なし(離席状態)⇒ LED(青)
また、着席状態が一定時間続いた際は、アラートを発する必要があります。今回はアラートをLED(赤)の点滅で表現することとしました。
アラート判定
- 着席状態が一定時間以上 ⇒ LED(赤)
- 上記以外 ⇒ LED消灯
上記2種類の判定を交互に繰り返して、「最後に3分以上の休憩を取得してから、60分以上着席状態(離席3分未満は判定外)となった」際にLED(赤)が点滅する仕様としました。下図では上段が着席判定で、下段がアラート判定です。
人体赤外線センサHC-SR501は人が発する赤外線の光量変化を取得するため、着席中でもじっとしていると検知しません(離席状態と判定される)。そのために、このように煩雑な仕組みになっています。
上記の仕様をフローとしてまとめると、以下のようになります。これまた厄介なフローが完成しました。。。
そのようなフローをMicroPythonで作成すると、以下のようなコードになります。
from ws2812 import WS2812
from machine import Pin
import utime
import machine
power = machine.Pin(11,machine.Pin.OUT)
power.value(1)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
YELLOW = (255, 150, 0)
GREEN = (0, 255, 0)
CYAN = (0, 255, 255)
BLUE = (0, 0, 255)
PURPLE = (180, 0, 255)
WHITE = (255, 255, 255)
led = WS2812(12,1)#WS2812(pin_num,led_count)
pir = Pin(3, Pin.IN, Pin.PULL_DOWN)
stay = 0 #maximum 3600s
rest = 0 #resttime 180s
def RestCheck(stay,rest):
if rest > 180:
return 0
else:
return stay
while True:
print("stay is "+str(stay)+",rest is "+str(rest))
if stay < 3600:
led.pixels_fill(BLACK)
led.pixels_show()
utime.sleep(1)
stay += 1
if pir.value() > 0:
rest = 0
led.pixels_fill(YELLOW)
else:
rest += 2
led.pixels_fill(BLUE)
stay = RestCheck(stay,rest)
else:
led.pixels_fill(RED)
led.pixels_show()
utime.sleep(1)
stay += 1
if pir.value() > 0:
rest = 0
led.pixels_fill(RED)
else:
rest += 2
led.pixels_fill(BLACK)
stay = RestCheck(stay,rest)
led.pixels_show()
utime.sleep(1)
stay += 1
プログラムとしては非常に複雑ですが、LEDの表示は非常にシンプルで分かりやすいです。以下のように青、黄、赤の三色のみで全て表現でき、赤ならアラートで「要休憩」、青の離席状態が3分続けばアラート解除となります。
LED(青) | 離席状態、人体赤外線センサ検知なし |
LED(黄) | 着席状態、人体赤外線センサ検知あり |
LED(赤) | アラート状態、離席状態が3分続けば解除 |
ぬいぐるみへの組み込み
最後に人体赤外線センサHC-SR501をぬいぐるみの中に隠して完成です。お腹部分からセンサがポコッと出ています。
これならノートパソコンと並べても、違和感がありません。ぬいぐるみのIoT化による、お仕事休憩アラートの出来上がりです。
まとめ
Seeeduino xiaoと人体赤外線センサHC-SR501を活用して、仕事中に役立つお仕事休憩アラートを作製しました。
MicroPythonのプログラムにはまだまだ改善余地がありますが、ひとまず動作することは確認できました。
コメント