チームKcarの山下です。今回は冨樫の夢を叶える「寝たら起こしてくれる装置」を作りました。
夢を決める背景
夢を決める会議で、冨樫が寝たら起こしてくれる装置が欲しいなとつぶやいていました。どうやら、冨樫は課題をやっている途中に寝てしまうから課題を提出することができないようです。つまり、この夢の装置を実現することができたら、、、冨樫は毎回、どんな授業であっても必ず課題を提出することができ、期日までに提出できなくなることがなくなるに決まってます。
まず、冨樫にどのような状況で寝てしまうのかインタビューしました。すると、二つのことがわかりました。
30分経ったら寝てしまう。
そもそも、やっている途中に、気づかずに寝てしまう。
つまり、私たちが作るべき装置は、30分経ったらアラームが鳴り、姿勢が崩れたら、警告がなる装置です。(頭に乗せる)
フローチャート

図1:フローチャート
フローチャートは、至ってシンプルです。micro:bitプログラミング(13) 3分間タイマーを作ろうを参考にし、そこに寝ている動きを検知する動作を加えてフローチャートを考えました。Aボタンが押されると30分計測されるようにしたいので、
Aと表示
Aが押される
もし30分経っていたら、不快な音がなる
Aと表示させ終了
経っていなかったら、冨樫の寝ている動きを検知
動きがあれば警告をし、30分経ったかど検知する
ようになっています。これが、この装置の基本的なフローチャートです。
プログラム

図2:プログラムの全体像
プログラムが長過ぎたので、少し分けて説明します。(時間ループの中身を後で説明)
全体像の説明としてはまず、
開始
Aと表示
Aが押されると次の行に進む
ハートが出て消える(プログラムがちゃんと動いているかの確認)
変数timeに電源が入ってからの時間を代入
電源が入ってからの時間―変数timeが30分を超えるまで、ループを繰り返す。
ループ中、寝ている動きを検知したら警告(図3のプログラムを時間ループに入れる)
30分を超えたら、次の行へ進む(ループ終了)
不快な音が4回鳴る
Aと表示
終了
となっています。
では、なぜこのプログラムで時間が測れるのかについて解説します。
このプログラムを考える上で、経過時間というものが重要になってきます。経過時間とは、電源が入ってからの時間です。
つまり、経過時間―変数time<30分を条件の元に例を出すと、
電源が入って3分後にAボタンが押される
変数timeを3分と定義
経過時間―変数time<30分→この瞬間の左辺は必ず0になる。
とすることができます。つまり、30分経たなければ、この下線部のループを抜け出すことができない、よって、Aボタンを押してからの30分を正確に計測することができます。
注意しなければならないのは、下線部の経過時間は、常に変化し続けますが、変数timeは、ボタンを押した時に定義されたものから変化しないということです。
そうすることでメリットがあります。それは、プログラム終了後再度Aボタンを押してプログラムを開始しても、下線部の左辺を0にすることができるので、そこからまた30分を計測することができるということです。

図3:時間ループの中の動作
では、全体像から省略した時間ループでの動作を説明します。(プログラムが長く見づらいために省略した)
図3は、30分経過しないまでに、寝ている動作を検知したら実行されるプログラムです。
動作としては、30分を測る動作を加え見てみると
30分たった→No
寝ている動作を検知した→Yes
小ハートが表示
「ド」がなる
繰り返し終了
その下の条件を確認
30分たった→No
となっており、
寝ている動作を検知した→Noであれば、何も起きません。(きっと真面目に課題をやっているだろうから)
ここでいう寝ている動作とは、右に傾いた、左に傾いた、ゆさぶられた、落とした、3G、6G、8Gです。(3G、6G、8Gは若干過剰すぎるが、プログラムが実行されやすいようにあえて入れている)
また、わざわざ繰り返し終了を挟んでいるのには理由があります。それは、条件に優先順位をつけるためです。あくまで最も重要なのは、30分経ってしまった時に最終警告が鳴ることです。もし、繰り返し終了を入れずに、装置が右に傾いていたら、「ド」が繰り返しなるだけで、30分のアラームを鳴らすことができません。ですから、繰り返し終了を入れることで、もし30分経って、装置が右に傾いていても、30分の最終警告アラームを鳴らすことができます。
これらを踏まえて、よくある動作を解説すると、