チーム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分の最終警告アラームを鳴らすことができます。
これらを踏まえて、よくある動作を解説すると、
30分経った→No
右に傾いている→Yes
小ハートが表示
「ド」が鳴る
繰り返し終了
その下の条件を確認
30分経った→No
これは、「ド」が連続で鳴ります。これは、右に傾いているという条件のループの中だけでループしているのではなく、重要なのは、必ず「ド」がなった後に30分経ったかを確認しているということです。これが、優先順位を持って動作を行なっている原理となります。
全体として説明しましたが、「寝たら起こしてくれる装置」は、30分経ったら不快な音がなり、30分経ってない時に、寝ている動きを検知したら警告してくれる装置となりました。
また、図2に載っている不快な音、通称最終警告アラームは、https://www.youtube.com/watch?v=QPsXm5RWbkU を元に再現しました。この絶望感をとても感じるBGMならば、冨樫だけではなく、全ての人が起きられるでしょう。
その他工夫した箇所は、
・必ずプログラムを開始しようとした時に、押して欲しいAを表示するようにしたこと。
・何か条件が成立したときに、大ハートや小ハートを表示させるようにして、どのプログラムが実行されているのか可視化したこと。
・寝ている動作を検知する「ド」を1/2節にし、ドの時間を短くすることで、30分の確認をするループの速度を早めたこと。
・最終警告アラームを何回か作り直したこと。
・冨樫のあらゆる寝ている動作を検知するため、様々なパターンを入れて「ド」を鳴りやすくしたこと。
・冨樫に聞くと、最終警告アラームは、2回聞いたら起きるらしいので、念入りに2倍の4回繰り返すようにしたこと。
動作
動画の通り、右に傾けたり、左に傾けたりすると寝ている動作を検知し、「ド」が鳴りまくります。そして、一定時間(30分)経つと最終警告アラームが鳴ります。
不具合について
不具合は全て解消しましたが、経験した不具合は、
・寝ている動作を検知した時に、例えば右にずっと傾いたままだと30分経っても「ド」しかならなくなってしまうこと→繰り返し終了を入れることで解決
でした。
最後に
図4:夢の実現
ということで夢を実現できました。