はじめに
突然ですが、みなさん朝起きられていますか?
平日や用事のある日は起きられるけど、例えば日曜日など「できることなら早く起きて何かしたいけど、疲れが溜まって起きられない」という方は多いのではないでしょうか?
かくゆう僕もそのクチで、平日はなんとか起きられていますが、休日はアラームを設定したスマホの電源を落として遅くまで寝てしまい、皺寄せが平日に来る、という悪い習慣が着いてしまっています。
そんな状況を改善するために、今回は確実に起床しなければ停止することができないアラーム(条件付き)を作成しました!
注意点として、この制作は「電子工作でなんか作りてえなあ、、、」という動機から出発しているので、自分で見返してみてもtoo muchであったり色々とツッコミどころのある解決策に行き着いてしまっていると思います。
もっとシンプルな方法があるよ!という方がいればぜひコメントなどで教えてください!
制作したもの
まずは、今回制作したもの画像を掲載します!

(画像1. 左上: モバイルバッテリー、右下: RaspberryPi Zero WH、左下: USBスピーカー)
主な使用物品は以下のようになります。
- Raspberry Pi Zero WH
- ¥ 3500~
- microSD 32GB
- ¥ 1500~
- USB OTG変換ケーブル(USB-A to microB)
- ¥ ~500
- USBスピーカー
- ¥ 1000~
- モバイルバッテリー
- ¥ 1500~
- USB-A to USB-C (モバイルバッテリー給電用)
- プライスレス
- USB-A to MicroB (RaspberryPi給電用)
- プライスレス
全物品合わせて¥10,000といったところでしょうか。RaspberryPiの値上げが凄まじいというのもありますが、コストが高すぎる感は否めません。
画像では外箱の蓋が空いていて内部へ簡単にアクセスできるようになっていますが、本来は物品のほとんどが箱の中に密閉されていて、外部からアクセスできるのはモバイルバッテリー給電用ケーブルのみとなる想定です。
モバイルバッテリーはパススルー給電対応機種であり、普段は以下のように接続されています。
この時、外部からアクセスできるのはAのモバイルバッテリー給電用ケーブルのみです。
たとえケーブルAを抜いたり給電を止めても、自動的にモバイルバッテリー駆動に切り替わり、電源が遮断されることはありません。(画像1では条件付き)1
少なく見積もっても一時間程度はRaspberryPiをバッテリー駆動で動かせるはずなので、現実的にアラームの電源を切ることは難しいだろうという理屈です。
これとは別に、アラームを止めるためのデバイスとして普段使いのスマホと専用アプリを使用します。
こちらを踏まえて実際にアラームを使用している動画をご覧ください。
停止用のスマホのアプリを介してアラームの停止方法と時刻を指定し、アラームが鳴ったら停止用のスマホを持ち出してアラームを停止する、という流れになっています。
歩行を検知したらアラームを一時停止する仕組みを導入しており、アプリを起動して指定位置に持っていくだけで全ての動作が完結するようになっている点が推しポイントです。
一応ソフトウェアのリンクも貼っておくのですが、現時点では試作段階であり、第三者の方に使用していただくことは難しいといった状況になっております。もし興味を持っていただけた方は今後の展望をご覧ください。
ここからは、このアラームを作成する過程で考えたことや検討したことを記します。
問題点
まずは想定使用者の状況を整理します。
- タスクが簡単すぎると二度寝してしまう
- タスクを難しくしすぎると電源を消してしまう
タスクはアラームを停止する方法のことで、クリックや数学問題、QRコードなどに相当します。
単純に二度寝しないようにするだけなら、非常に難しいタスクを設定すれば良いです。しかし、今回の状況では難しすぎるタスクを設定してしまうと電源を消してしまう、というジレンマがあるので、
電源を物理的に消せないようにして難しいタスクを無理やり解かせる
という脳筋ソリューションをとることにしました。
検討
上記を踏まえて作成するアラームに必要な機能をまとめます
- タスクによって確実に起床できること
- アラームを停止しなければ電源を切れないこと
1を実現するためには様々な方法があると思いますが、今回は考えうる限り最も難しく、確実に起床できるであろう、位置情報ベースのタスクを使用することにしました。あらかじめ指定しておいた位置までスマホを持っていかないとアラームを停止できないやつですね。
1の実現は既存アプリの存在もあるように難しくありませんが、問題は2の実現です。
電源を切ることができないデバイスを構築するために、幾つかの方法を考えました。以下はボツ案とその理由です。
① スマホを開けることが難しい箱などに密閉し、物理的に電源を切れなくする。アラームの停止には位置情報などを使用できる既存アプリを使用するか自作し、画面操作がなくてもアラームを停止できるようにする
- スマホを確実に密閉しつつ充電端子は使用可能といった条件の外箱を選定することが難しいor自作する必要がある
② Android端末をroot化し、電源ボタンからの入力をソフトウェア的に拒否する
- root化の方法に端末依存があり、第三者に配布することが難しい
- 多くの端末は電源ボタンをある程度長押しするとハードウェア的に電源が遮断されるようになっている(claude調べ)
③ 電源を切ることができないオレオレデバイスを電子工作で完全自作する
- 技術的難易度や制作コストが高い
- 実現可能ではあるが、完成度の高いものを作成し第三者に配布することが難しい
①の方法はかなりシンプルかつ安価で良い方法に思えるのですが、個人的に箱に密閉してゴツくなってしまったスマホをいちいち持ち出さなければならなかったり、普段から持ち出しやすい状態で充電しておかなければならない点がスマートでないと考えボツにしました。また、どれも電源を切断できないようにするという条件は満たせているものの、スピーカーを塞ぐなどの方法で対策できてしまうという問題点もあります。
これらを踏まえ、最終的に以下の方法で構築することにしました。冒頭の写真や動画にて示した構成です。
- アラームを鳴らすデバイスとアラームを止めるデバイスを分離し、アラームを鳴らすデバイスのみ電源を切れないようにする
- パススルー給電対応のモバイルバッテリーを使用し、いかなる状況でもアラームを鳴らすデバイスへの給電が継続されるようにする
- 給電ケーブル以外は開けることが難しい箱に密閉し、給電ケーブルのみを外部に露出する
もちろん箱を開けてモバイルバッテリーとRaspberryPi間のケーブルを抜いてしまえば電源を切断できますが、そこはネジ付きの箱を使用することで、箱を開けるコストよりアラームを止めるコストの方が小さくなるようにバランスをとる、というスタンスです。2
アラームを鳴らすデバイス(RaspberryPi)とアラームを止めるデバイス(スマホ)を分けることで、アラームを鳴らすデバイスを例えばエアコンの上に配置することなどができるようになり、スピーカーを塞がれる可能性も排しています。
使用技術
スマホのアラームアプリの方はなんの変哲もないPWAですが、アラームデバイス(Raspberry Pi Zero WH)の方は少し複雑です。
アラーム停止用のスマホを外へ持ち出すことになるため、アラームデバイスは外部のデバイスからの通信を待ち受ける必要があります。
これを実現するにはDDNS, VPNなど様々な方法が考えられますが、今回はIoTデバイス向けのメッセージングプロトコルであるMQTTを使用しました。
こちらのプロトコルではブローカーと呼ばれる中継サーバーのようなものを介して、閉じたネットワーク内のデバイスとも非同期に双方向通信することができます。軽量で特定用途に特化したtailscaleのようなものですね。
ブローカーには無料枠を提供してくださっているHiveMQを使用しました。
アラームアプリからはMQTTのクライアントを使用してアラームデバイスとの通信を行っています。
まとめると、全体の構成は以下のようになります。
今後の展望
自分の求めていた機能は実現できたのですが、実際にデバイスを使用してみていくつか問題点や改善点も見えてきました。
PWAアプリの制約
アラーム停止用のPWAアプリでは歩行を検知してアラームを一時停止しているのですが、PWAアプリはバックグランドで動作させることができないため、常に画面をつけたまま持ち運ぶ必要があり、ポケットに入れていると意図しない操作が入ってしまうことがありました。ネイティブアプリへの移行が必要です。
再現性が低い
はんだ付けや基板作成といったガチの電子工作要素はないため、一応第三者でも再現できる構成になってはいると思いますが、それでも多少の工作要素が必要だったり、必要物品が多くコストが高い、という問題点があります。
後になって気づいたのですが、アラームデバイスを構成する
- RaspberryPi Zero WHなどのWi-Fiを備えたSBC
- パススルー給電対応のモバイルバッテリー
- スピーカー
は、普通のスマホが当たり前に備えている要素です。
そのため、今後は機能そのままにアラームデバイスを
- 中古のAndroid端末
- 市販品の箱
で置き換え、このアラームをより簡単、安価に構築できるようにすることを目標としています。
こちらは第三者の方にも使っていただきやすい形で公開+記事にしようと思っているので、興味のある方はぜひブックマークいただけると嬉しいです。
-
実は画像のモバイルバッテリーはパススルー給電対応ではあるものの、電源供給からバッテリー供給へ切り替わる際に一瞬電源が切れるタイミングがあり、その度にRaspberryPiが再起動するようになってしまっています。無論、再起動したとしてもアラームが停止しないようにはなっているので、割り切ってそのまま使用しています。このようにパススルー給電対応のモバイルバッテリーをUPS的に運用しようとしている人は、機種の選定に注意が必要ですね。 ↩
-
ネジつきの箱に密封して手の届かない場所に配置しておくだけで十分だと考えているのですが、それでも不十分な場合はねじの数を増やした箱を3Dプリンタなどで自作するか、テープでぐるぐる巻きにしておくといったことまでする必要があるかもしれませんね。 ↩