3 ポイント 投稿者 GN⁺ 2025-03-30 | 1件のコメント | WhatsAppで共有
  • ESP32ベースの物理集中タイマーのリポジトリで、ePaperディスプレイとロータリーダイヤルを入力デバイスとして使い、ポモドーロ式の作業・休憩フローを実装
  • コードは一部のアセットとフォントが削除されているためそのままでは使えないが、必要に応じて自分の用途に合わせて修正できる
  • ハードウェアは ESP32、WaveShare 4.26インチ 800x480 e-Paper HAT、KY-040ロータリーエンコーダー、WS2812 LED、USB-Cコネクタ、3Dプリントケース、抵抗・コンデンサで構成
  • ePaperはバックライトがないため作業中の邪魔になりにくく、4.26インチモデルは部分リフレッシュ0.3秒に対応しており、リフレッシュ時の黒・白の点滅を避けられる
  • ソフトウェアは C++ と Arduinoフレームワーク、PlatformIO、GxEPD2ライブラリを使用し、プリセット選択・LED通知・休憩統計・長い休憩の繰り返しなどの機能を提供

プロジェクト概要

  • このリポジトリには、ESP32ベースの集中タイマー向けのコードと設計資料が含まれている
  • 入力にはロータリーダイヤルを使い、表示は ePaperディスプレイで処理する
  • リポジトリのコードは一部のアセットとフォントが削除されており、すぐに使える状態ではない
    • 必要であれば、コードを自分の要件に合わせて修正して使える
  • 完成品は MakerWorld でも確認できる

使用部品

  • 主な部品構成:
    • ESP32、例として AZDelivery ESP32 NodeMCU を使用
    • WaveShare 4.26inch e-Paper display HAT, 800x480
      • 他のディスプレイでも動作する可能性はあるが、UIはこの解像度に合わせて設計されている
    • KY-040ロータリーエンコーダーとボタン
    • WS2812 LED 1個
      • 単純なRGB LEDで代替可能
    • USB-Cコネクタ
      • 2線式USB-Cコネクタを使う場合、電源供給のためにUSB-A to USB-Cケーブルが必要になることがある
    • 3Dプリントケース
    • LED用抵抗、スイッチ用プルアップ抵抗、ロータリーエンコーダー信号を緩和するための0.1uFコンデンサ
    • オプション部品としてタイヤバランス用ウェイトとゴム足を使用可能

制作の動機と設計目標

  • プロジェクトは、友人のための集中タイマーを作る目的で始まった
  • 制作者は生産性テクニックを試すのが好きで、年に一度ほど、他人の役に立つプロジェクトに約1か月を費やす習慣がある
  • BambuLab X1C 3Dプリンタを購入後、それを活用したいと考えており、電子工学の見習いを終えたあとソフトウェアエンジニアリングに転向した経験から、物理的なデバイスを作りたいと思っていた
  • 設計目標は3つだった
    • 物理デバイスであること
    • 楽しいこと
    • 直感的に使えること
  • 既存プロジェクトである Focus Dial by Salim Benbouziyane のような例はあったが、最初から自分で作りたかった

部品選定の理由

  • ESP32

    • 久しぶりにマイクロコントローラーで何かを作る2回目の試みで、ESP32に慣れていたため再開しやすかった
    • ディスプレイ対応状況を確認するため、事前調査を行った
  • ePaperディスプレイ

    • ディスプレイの配線ガイドは docs/display_wiring.md にある
    • プロジェクトの主要目標の1つは、デバイスが作業フローを妨げないことで、そのためバックライトのないディスプレイを望んでいた
    • 机の上に置いても読める程度に大きな画面が必要だった
    • 複数の WaveShare ePaperディスプレイを注文して試したあと、4.26インチモデルを選んだ
    • 解像度が良い
    • サイズが適切
    • 部分リフレッシュに対応し、リフレッシュ時間は0.3秒
    • リフレッシュ中に邪魔になる黒・白の点滅がない
    • 当初は白黒・赤のディスプレイを使いたかったが、気に入ったモデルはリフレッシュ時間が16秒で、部分リフレッシュに対応していなかったため除外した
    • バックライトがないため、机が十分に明るくないと夜は画面を読みづらいが、これを「バグではなく機能」と捉えている
  • ロータリーエンコーダー

    • 入力デバイスとしてダイヤルを使うのが最も自然だと判断した
    • ダイヤル入力はメニュー設計をより複雑にし、入力デバウンスを適切に処理する必要がある
    • CLKとDTピンには、信号を緩和するために0.1uFコンデンサを追加した
  • LED

    • 初期の反復版にはLEDの計画はなかった
    • バックライトのないディスプレイでは、集中時間が終わったときに気づきにくすぎる可能性があった
    • 通知手段として複数の代替案を試した
    • ブザーはユーザーを驚かせてしまい、良い体験ではなかった
    • スピーカーは試した構成ではノイズと鳴きが多かった
    • WS2812 LEDはNeoPixelライブラリでアニメーションを作成でき、使いやすかった
    • WS2812 LEDは多数の出力ピンを使わずに済む利点があった
    • 最終的にLEDは複数の状態表示にうまく機能し、ケースにはLEDをより見栄えよくするための小さな遮光板と拡散レイヤーを追加した

ケースと物理設計

  • ケースはベースとふたの2つの部分で構成される
  • ディスプレイフレームをベースの一部として一体で出力した設計のため、出力中に上部の角が少し反る問題があった
  • ダイヤルを前面に配置した選択は惜しい点だった
    • 出力物と電子部品が軽いため、ダイヤルスイッチを押すとデバイス全体が後ろに押される可能性がある
    • 底面にゴム足とタイヤバランス用ウェイトを追加して解決した

ソフトウェア構成

  • ソフトウェアは**C++**で書かれており、Arduinoフレームワークを使用する
  • プロジェクト管理にはPlatformIOを使用する
  • ディスプレイはGxEPD2ライブラリに大きく依存している
  • リポジトリのコードは、締め切り内に完成させるためにコピー&ペーストや以前のコードの未整理部分が残っており、やや整理されていない状態
  • 一部のコードはプロジェクトの締め切りに合わせるため、AI、主にClaudeで生成された
  • 友人向けのプロジェクトだったため、イースターエッグや遊び要素も含まれている
    • 集中中の画面にランダムな事実を表示する機能が入っている

デバイスの使用フロー

  • デバイスが起動すると、設定を変更するか、プリセット選択モードに入ることができる
  • プリセットは3つのうち1つを選択する
  • タイマーが開始され、時間が終わるとLEDが点滅し、画面にメッセージが表示される
  • ユーザーは作業を続けることも、その後休憩を開始することもできる
  • 休憩中には統計を見ることができる
  • デフォルトでは4回ごとに、より長い休憩時間が与えられる

開発とカスタマイズ

  • 開発に必要なツール:
    • PlatformIO
      • VSCode拡張を使用
    • アセット再生成用の Python 3.13 以上
  • 画像、アイコン、フォントを準備するには generate_assets.py スクリプトを実行する必要がある
    • 画像サイズの変更
    • 正しい形式への変換
    • プロジェクトに含めるC++コードの生成
  • 実行例は次のとおり
uv sync

uv run scripts/generate_assets.py
  • プリセットは src/main.cpp に定義されている
  • デフォルトのプリセット例は Emails、Coding、Focus
    • Emails: 集中15分、休憩5分、長い休憩15分
    • Coding: 集中45分、休憩15分、長い休憩30分、繰り返し回数2
    • Focus: 集中25分、休憩5分、長い休憩20分

ピンマッピング

  • KY-040ロータリーエンコーダー:
    • CLK: 32
    • DT: 21
    • SW: 14
  • WaveShare 4.26インチ白黒ePaperディスプレイ:
    • BUSY: 4
    • RST: 16
    • DC: 17
    • CS: 5
    • CLK: 18
    • DIN: 23
  • WS2812 LED:
    • DIN: 25

1件のコメント

 
GN⁺ 2025-03-30
Hacker News のコメント
  • 物理的な Pomodoro タイマー: <https://upload.wikimedia.org/wikipedia/commons/3/34/Il_pomod...>
    • 美しく、自分で作ったものを使う楽しさを過小評価してはいけない。そういう小さな喜びが結局は積み重なる
      少なくとも自分には重要だ。ESP32 とフォトレジスタで電力量計の点滅を測定する装置を取り付けて、電力量計を「スマート化」したのだが、雑な作りでもちゃんと動いている。ガレージに行くたびに小さな装置が点滅しているのを見るとうれしくなり、次のプロジェクトを続けたくなる。何かを作ることができ、成功でき、生活を良くしていけるという確信を与えてくれる
      ばかげて聞こえるかもしれないが、元記事のプロジェクトもそう受け止めている
    • その通り。どんな タイマーでも十分
      先延ばし癖を直すために eInk ディスプレイとマイクロチップをプログラミングしているなら、そのプロジェクトは止めて物理タイマーを買い、やるべきことをやるべきだ
      作業前にタイマー選びで買い物したくなるなら、検索の手間を減らしてあげよう。これでも十分動く: https://www.amazon.com/dp/B07TLC9SFZ もちろんどんなタイマーでもいい
      行ってその作業をやれ。それだけの価値はある
    • もちろん、それが問題を解くより簡単な方法だ
      だが元記事には、友人のために何かを作りながら新しいツールを試すプロジェクトだとはっきり書かれている
      面白い ハッキングプロジェクトが、実際の市場需要を満たさなければならないわけではない。単に楽しくてもいい
    • 1つ星レビューを読むと笑える [0]。最近の 機械式タイマーは粗悪で、安心して使いにくいのが問題だ。今では高品質な機械式タイマーの作り方を誰も知らないようだ
      [0] https://www.amazon.com/product-reviews/B07H59ZL1L/ref=acr_se...
    • チクタク音に耐えられるなら問題ない ;)
      個人的にはこういう 円盤型タイマーのデザインが気に入っている: https://m.media-amazon.com/images/I/618WCXnyfXL.SL1500.jpg
  • このプロジェクトは本当にいい。UI が楽しく、細やかに設計されている感じがする。またひとつ、週末用、もしかすると数週間がかりの活動を見つけたようだ
    ハッカソン向けのプロジェクトを探しているなら、E-ink エコシステムはかなり成熟していてプログラミングしやすく、Claude のような AI も API の表面をよく把握している。たいていの人は何を見ているのか分からないので「Kindle みたいな画面」と説明する必要があるが、リビングにはバックライト付きディスプレイより e-ink 画面のほうが好まれるようだ。はるかに目障りでないからだ
    ちなみに E-ink [0] と Pomodoro [1] は、どちらも自分がかなり掘り下げているテーマだ
    [0] https://sambroner.com/posts/raspberry-pi-train
    [1] https://sambroner.com/posts/personal-analytics-2024
  • こういう「デバイス」系のプロジェクトはいつも興味深い。目標が単純でも、たいていそこが一番難しいからだ。プロダクトデザイン、電子回路、コードが交わる地点は素晴らしい遊び場だ
    画面の選択がとても気に入ったし、目的と使い勝手を考慮した内容が README によく説明されている点も良い
    物自体のデザインについていくつか考えがある。自分もこの部分は非常に難しいと感じていて、反復改善に多くの時間を使っている。つまみをデバイス上部に広く平たく置けば、画面を中央に配置してデバイスをより小さくでき、回すときに箱が押されて動く可能性も減る。面取りと角丸は完成度を大きく高めてくれる。鋭い角と丸い角の違いは小さなディテールなのに、かなり大きく感じられる
    メニューが常に3つなら、つまみの代わりに上部に目覚まし時計の「スヌーズ」のようなボタンを3つ置くのはどうだろう。操作が少なくなる。半透明フィラメントを使えば、格好いい「ライトパイプ」部品も作れる。たとえば LED ボックスを一体で作れば、80年代の計器盤のような雰囲気にできるかもしれない。あるいは画面の縁を出力してそこを光らせれば、もっとミニマルなデザインにもできる
    こういうことを考えるのが好きなので仕方ない。つまみはどう設計したのか気になる。OpenSCAD だった? ローレット加工が良く、プログラム的に作ったように見える
    • 良い質問だ
      つまみは、再設計するなら上側に移すと思う。このプロジェクト全体の期間は4週間で、重量の問題が起きたときにケースを作り直してプロトタイプを出力するほどの自信がなかったが、そうすれば確実に良くなっていただろう
      ほぼすべての角に角丸/面取りを入れ、最終ケースはより高級感が出るように fuzzy skin で出力した
      つまみはもともとタイマー時間を変える用途も念頭に置いていたので、ダイヤルが合っていると感じていた。結果的にそうはならなかったので、今のメニューにはボタン3つのほうが良い UX かもしれない。デバイスも小さくなるし
      遮光板はもともと光漏れを防ぐために始めたもので、後には拡散プラスチックフィルムと合わせて LED の拡散を少し高めるために白で再出力した。画面の端に LED ストリップを置くアイデアは気に入った。思いつかなかった
      普段は Blender をよく使うほうなので、Onshape でローレット加工するチュートリアルに従った。このツールはその程度のジオメトリをあまり好まないので作業中にもたつくが、README にリンクされている Onshape ファイルは自由に確認してもらって構わない
  • 単なる25分の集中時間ではなく、3つの ユースケースを正確に狙い、統計まで提供している点がすばらしい追加要素だ
    入門者向けに、Pomodoro がもともと回転式エンコーダ付きの物理タイマーに由来する名前だという点を記事に入れると良さそうだ

https://medium.com/@thejinxes/ditch-the-tomato-timer-d8bbf01...
いつか目標どおり赤い e-ink 画面を使うようになれば、Pepe の面白い代替になりそう

  • 素晴らしいプロジェクト。組み込み UI を作るためのグラフィックライブラリである LVGL [0] も確認してみることをおすすめする。使い方はかなりシンプルで、HTML に少し似た感じがある。ハードウェア通信の設定はもう少し難しいが、一度設定してしまえば、UI の作成と入力処理の流れが大きく改善される
    [0] - https://github.com/lvgl/lvgl
    • おお、かなり良さそう。始めるときに調査に少し時間をかけたけど、これは見ていなかった
  • とても興味深い。物理 Pomodoro タイマー、あるいは単に表示装置をどう作るかを考えてきたが、残り時間が正確には見えない円形画面の形を好んでいる。自分にとっては、それが気を散らし、不安を誘発するから
    Android スマートフォンで Visual Timer アプリ [0] を使ってきて、おおむね優れていたが、スマートフォンを片付けておけるなら当然そのほうがよい
    [0] https://play.google.com/store/apps/details?id=at.cwiesner.an...
    • 自分もその理由で 4 インチの円形 LCD を買ったが、結局 電子ペーパーディスプレイに替えた。あまり気が散らないように分単位だけを表示し、最後の 1 分は 10 秒間隔でだけ更新されるようにした
  • Pomodoro という概念自体が物理的なキッチンタイマーから来ていて、その形は予想どおりトマトだった
    自分の基準では、Pomodoro テクニックに最もよい UX はまさにその物理的なキッチンタイマーにある
    • 機能的には Focus Dial のほうが、私が作ったものよりはるかに優れた「製品」で、README にもリンクしたように、まさにその UX を維持している
      ただ、そういうものを作るには自分の知識と技術の限界に向き合う必要があったし、自分なりの方法でやってみたい気持ちもあった。さらに結局、その電子ペーパー画面が本当に気に入った
  • 組み立てることが楽しみの半分だというのは分かるが、画面とボタンのある汎用 ESP32 デバイスだけが必要なら M5Stack をおすすめする。安価で、プログラム可能で、広く使われている
  • 知り合いが以前、物理 Pomodoro タイマーで事業をやろうとしていた: https://www.indiegogo.com/projects/timechi-your-smart-produc...
    オフィスで使う人、または残り時間を見るために画面を見たくない人には、デバイス上部の LED インジケーターが役に立ちそう。きれいなライトバーの形で赤や緑を点灯させ、画面を見られない反対側の人にも、今邪魔してよいかどうか分かるようにするもの。望むなら進捗型のライトバーにもできる
  • 本当に良い。自分の生産性ツールも現実のデバイスに移してみたいと思わされる