記事内に広告が含まれています

Arduinoで多機能学習タイマーを自作してDigikeyコンテストにチャレンジ

ARDUINO

はじめに

試験勉強でモチベーションが上がらず集中力が続かないという子供のために学習タイマーを作成してみました。試験時間に合わせて勉強時間を設定し休憩をはさむなどタイマーで時間管理を行って学習に集中できれば良いですね。沢山の市販品もありますが「作る意味あるの?」「買ったほうが安い!」は無しでお願いします。

今回の記事以外にプロトペディアのサイトにも登録しています。本記事とは異なった目線で内容を書いていますのでよろしければこちらも覗いてみて下さい。本作品でDigiKey Make ONE Challenge 2026に応募してみました。

ハードウェア構成

メインマイコンにArduino Uno Mini LEを使用してプロトタイプ製作の見方Groveモジュールを使用して構成しています。

システムイメージ図に記載しているSeeed社が発売しているGroveモジュールを使用しています。これらのGroveモジュールのうちでGPSモジュールはDigiKeyでは取り扱い終了しているようですが、DigiKeyのmylistに部品リストを登録していますので品番などを参考にして頂き、ご興味ありましたら購入して手元に持っておくと、いざという時に使い道があるかもしれませんよ。

接続イメージ図

学習タイマーの心臓部、Uno Mini LEはGroveコネクタを備えておらず直接Groveモジュールを接続する事ができないのでUno Mini LEのコネクタに接続して使用するオリジナルのシールド基板を作成しました。下の写真のように8個のGroveコネクタを実装できる基板です.

自作Uno mini LE用Groveシールド基板

この基板に1.27㎜ピッチのピンヘッダとGroveコネクタ(HY2.0-4P)を半田付けします。1.27㎜ピッチは意外と端子間隔が狭いので横の端子とのショートが気になりますが、上の写真のように、半田付けランドパターンを細長い形状にしておけば、半田付けが容易で、かつ、隣接する端子とのショートも避けることができます。

なお、今回の学習タイマーではGroveモジュールを5V駆動で使用していますが、何か別の用途に使う場合ことができるように、ジャンパで3.3V駆動との切り替えができるようにしてみました。

内部実態写真

3Dプリントで作製した筐体の内側側面にGroveモジュールをタッピングネジでねじ止めしています。Groveモジュールのサイズは20㎜角や20×40㎜といったサイズで大きいものでは無いのですが、手のひらサイズの筐体に収めるにはそれなりの大きさが必要となっており、内部はケーブルの配線もあり結構パンパンです。

学習タイマー内部の様子

ソフトウェア構成

今回のプログラムはMicrosoftのCopilotを使って作成しました。Seeed社のGroveシステムはWEBサイトやGithubに公開されているサンプルプログラムが充実しているおかげて、AIへは比較的簡単な指示で生成することができました。ちなみに、上の「接続イメージ図」もCopilotで生成していて、下のフローチャートもCopilotで生成しています。完成したプログラムを読み込ませて生成させていますが、間違えた出力がされているかもしれませんよ(笑)

モノづくり好きにとっては、自分で作製した達成感が少なく味気ない気もしますが、ちょっとしたドキュメント類はAI生成で十分かもしれません。AIが進化すると本当に人間の介在する作業がなくなってくるのかもしれませんね。ただし、AIが生成した成果物が正しいのか、間違えているのかを見極める力量・判断能力はこれからも必要となりますよね。AIは便利な反面ネガティブな考え方をすると、自分が理解できないものを鵜呑みにして使用してしまうと、こっそりとトラップを仕掛けられていることに気が付かず大変なことになるかもしれません。

プログラム全体の長さはコメント文が少し入った状態で1200行ぐらいのプログラムになっています。具体的な完全版Arduino SketchはGitHubにアップしていますのでこちらをご参照下さい。

メインループ

キー入力の状態変化を検出 → 長押し or 短押しを判定 → モードごとの処理を実行

  1. キーの状態を読む
  2. 押した瞬間を検出して記録
  3. 押し続けている間は 2 秒を超えたら長押し処理
  4. 離した瞬間は短押し処理(2 秒未満の場合)
  5. 最後にモードごとの処理を実行して画面やLEDを更新
flowchart TD

L_START([loop 開始]) --> L_READ
L_READ[メカニカルキー読み取り] --> L_EDGE

%% 押した瞬間
L_EDGE[押下状態の変化] -->|押した| L_PRESS_START
L_EDGE -->|変化なし| L_PRESS_HOLD

L_PRESS_START[押した瞬間 pressTime記録 longPressHandled=false] --> L_NEXT

%% 押し続け
L_PRESS_HOLD --> L_HOLDCHK
L_HOLDCHK[押し続けか] -->|YES| L_HOLDTIME
L_HOLDCHK -->|NO| L_RELEASECHK

L_HOLDTIME[長押し時間計算] --> L_LONG
L_LONG[2秒以上か] -->|YES| L_MODECHANGE
L_LONG -->|NO| L_NEXT

L_MODECHANGE[モード切替 LED更新 ビープ] --> L_NEXT

%% 離した瞬間
L_RELEASECHK[離したか] -->|YES| L_RELEASE
L_RELEASECHK -->|NO| L_NEXT

L_RELEASE[離した瞬間処理] --> L_SHORTCHK
L_SHORTCHK[短押しか] -->|YES| L_SHORTPRESS
L_SHORTCHK -->|NO| L_NEXT

%% 短押し処理(モード別)
L_SHORTPRESS --> L_MODEBRANCH

L_MODEBRANCH[現在のモード判定] -->|CLOCK| L_CLOCK_SHORT
L_MODEBRANCH -->|STOPWATCH| L_SW_SHORT
L_MODEBRANCH -->|TIMER| L_TM_SHORT

L_CLOCK_SHORT[時計モード短押し処理] --> L_NEXT
L_SW_SHORT[ストップウォッチ短押し処理] --> L_NEXT
L_TM_SHORT[タイマー短押し処理] --> L_NEXT

%% モード別処理
L_NEXT --> L_MODELOOP

L_MODELOOP[モード別処理へ] -->|CLOCK| L_CLOCK
L_MODELOOP -->|STOPWATCH| L_SW
L_MODELOOP -->|TIMER| L_TM

L_CLOCK[loopClockMode 実行] --> L_START
L_SW[loopStopwatchMode 実行] --> L_START
L_TM[loopTimerMode 実行] --> L_START

クロックモード

時刻を更新 → 表示を更新 → 必要なら情報サイクル → 必要なら設定モード処理

  1. GPS/RTC から時刻を読む
  2. 短押しがあれば情報サイクルを進める
  3. 現在の情報状態に応じて表示を描画する
  4. 長押しがあれば時刻設定モードへ入る
  5. 設定モード中は専用 UI を処理する
  6. ループに戻って繰り返す

フローチャート

flowchart TD

C_START([CLOCK MODE 開始]) --> C_READ
C_READ[5方向スイッチ読み取り] --> C_MUTE
C_MUTE[ミュート長押し判定] --> C_CENTER

%% CENTER 判定
C_CENTER[CENTER シングル/ダブル判定] --> C_DBL
C_CENTER --> C_SGL

C_DBL[ダブルクリック?] -->|YES| C_SET_START
C_DBL -->|NO| C_SGL

C_SGL[シングルクリック?] -->|YES| C_INFO_START
C_SGL -->|NO| C_MAIN

%% 設定モード
C_SET_START[設定モード開始] --> C_SET

C_SET[設定モード] --> C_PAGE_MOVE
C_PAGE_MOVE[LEFT/RIGHT ダブル→ページ移動] --> C_CURSOR
C_CURSOR[LEFT/RIGHT 短押し→桁移動] --> C_EDIT
C_EDIT[UP/DOWN→数値変更] --> C_SET_DONE
C_SET_DONE[CENTER→設定完了] --> C_MAIN

%% 情報サイクル
C_INFO_START[情報サイクル開始] --> C_INFO
C_INFO[年→月日→曜日] --> C_MAIN

%% 通常時計表示
C_MAIN[GPS/RTC 同期→HH:MM or MM:SS 表示] --> C_START

タイマーモード

入力処理 → 設定中か実行中か停止中かを判断 → 表示更新 → 終了判定

1.現在の状態(SETTING / RUNNING / STOPPED / END)を確認

2.5‑way 入力を読み取る(150ms クールダウン)

3.SETTING

  • 桁移動・数字変更
  • ダブルクリックで MM:SS ↔ HH:MM
  • CENTER で RUNNING

4.RUNNING

  • 1 秒ごとに残り時間を減らす
  • 0 になったら END

5.STOPPED

  • メカニカルキー短押しで再開

6.END

  • 白高速点滅
  • メカニカルキー短押しでリセットして SETTING

7.状態に応じた LED/表示を更新してループ終了

フローチャート

flowchart TD

TM_START([タイマー開始]) --> TM_READ
TM_READ[5方向スイッチ読み取り] --> TM_MUTE
TM_MUTE[ミュート長押し判定] --> TM_SETTING

%% 設定モード
TM_SETTING[設定モードか] -->|YES| TM_LED
TM_SETTING -->|NO| TM_RUN

TM_LED[LED青点滅] --> TM_CURSOR
TM_CURSOR[左右でカーソル移動] --> TM_EDIT
TM_EDIT[上下で数値変更] --> TM_CLAMP
TM_CLAMP[MM:SSクランプ] --> TM_BLINK
TM_BLINK[桁点滅表示] --> TM_SET_DONE

TM_SET_DONE[CENTER短押し] -->|YES| TM_APPLY
TM_SET_DONE -->|NO| TM_END

TM_APPLY[設定完了 残り時間再構築 LED青] --> TM_END

%% 動作モード
TM_RUN[動作中か] -->|YES| TM_DEC
TM_RUN -->|NO| TM_STOPPED

TM_DEC[残り時間減算] --> TM_ZERO
TM_ZERO[残り時間ゼロか] -->|YES| TM_FINISH
TM_ZERO -->|NO| TM_SHOW

TM_FINISH[終了状態 LED高速点滅 ビープ3回] --> TM_END
TM_SHOW[残り時間表示] --> TM_END

%% 停止モード
TM_STOPPED[終了状態か] -->|YES| TM_FIN_BLINK
TM_STOPPED -->|NO| TM_IDLE

TM_FIN_BLINK[終了点滅表示] --> TM_END
TM_IDLE[待機 LED青] --> TM_END

TM_END([END])

ストップウォッチモード

入力処理 → 経過時間の更新 → 表示更新 → 上限判定

  1. 状態(STOPPED / RUNNING / LIMIT_BLINK)を確認
  2. キー入力を処理(短押し・長押し)
  3. RUNNING 中は millis() から経過時間を計算
  4. 99:59 を超えたら LIMIT_BLINK へ
  5. STOPPED は白固定表示
  6. LIMIT_BLINK は緑点滅
  7. 状態に応じて表示を更新してループ終了

フローチャート

flowchart TD

SW_START([ストップウォッチ開始]) --> SW_READ
SW_READ[5方向スイッチ読み取り] --> SW_MUTE
SW_MUTE[ミュート長押し判定] --> SW_TIME

SW_TIME[経過時間計算] --> SW_LIMIT
SW_LIMIT[99分59秒に到達したか] -->|YES| SW_LIMIT_HIT
SW_LIMIT -->|NO| SW_NORMAL

SW_LIMIT_HIT[上限到達 停止 LED緑 ビープ3回 点滅開始] --> SW_END

SW_NORMAL[通常表示処理] --> SW_BLINK
SW_BLINK[上限点滅中か] -->|YES| SW_BLINKING
SW_BLINK -->|NO| SW_SHOW

SW_BLINKING[500ms点滅表示] --> SW_END
SW_SHOW[時間表示] --> SW_END

SW_END([END])

基本操作方法

学習タイマーに実装した機能をボタンや方向キーの操作と合わせてマニュアル的に列記してみました。

モード切替

  1. メカニカルキー長押し(2 秒) → CLOCK → STOPWATCH → TIMER → CLOCK … と循環
  2. モード切替時は LED が 落ち着いた緑 に変化し、状態がわかるようになっています。

表示色の意味

  1. :動作中(時計表示・計測中・カウント中)
  2. :タイマー MM:SS 設定
  3. :タイマー HH:MM 設定
  4. :ストップウォッチ上限到達(99:59)

CLOCK モード(時計)

5-Wayキー 短押し

表示情報を切り替えます。

  1. 通常表示(HH:MM)
  2. 年(YYYY)
  3. 月日(MM/DD)
  4. 曜日(MON/TUE…) 一定時間で自動的に通常表示へ戻ります。

5-Wayキー 長押し(2 秒)

時刻設定モードへ入ります。

時刻設定モード

  1. LEFT / RIGHT:桁移動
  2. UP / DOWN:数字変更
  3. CENTER:設定完了
  4. 選択中の桁は点滅します。

STOPWATCH モード(ストップウォッチ)

メカニカルキー(短押し)

  1. 停止中 → 計測開始
  2. 計測中 → 停止

メカニカルキー(1 秒長押し)

  • リセット(00:00)

メカニカルキー(2 秒長押し)

  • CLOCK モードへ戻る

特殊動作

  • 99:59 に到達すると
    • 計測停止
    • 表示が 緑点滅
    • LED も緑
    • CENTER 短押しで停止状態へ戻る
    • CENTER 長押しでリセット

TIMER モード(タイマー)

状態一覧

  1. SETTING(時間設定)
  2. RUNNING(カウント中)
  3. STOPPED(一時停止)
  4. END(終了 → 白高速点滅)

SETTING(時間設定)

操作
  1. UP / DOWN:数字変更
  2. LEFT / RIGHT:桁移動
  3. CENTER(短押し):設定完了 → RUNNING
表示
  • 選択中の桁が 青/橙でゆっくり点滅

サウンド仕様(ブザー)

  1. ミュート切替時: → 3 段階 × 3 ビープ(固定パターン)
  2. タイマー終了時: → 白高速点滅 + 3 段 × 3 ビープ

LED の色と点滅まとめ

状態点滅
CLOCK 通常落ち着いた緑なし
STOPWATCH RUNNINGなし
STOPWATCH LIMITゆっくり点滅
TIMER SETTING青/橙ゆっくり点滅
TIMER RUNNINGなし
TIMER STOPPED青/橙なし
TIMER END高速点滅

おわりに

7セグメント、LED付きメカニカルキー、5-way Switchを使用することで「見やすい表示」「直感的な操作」「色と点滅による状態把握」を出来るだけ重視して設計しています。

ハードウェアはGroveモジュールを使用することで手っ取り早く作成することができ、ソフトウェアはAIの力で手っ取り早く作成できる世の中になりましたね。AI コーディングに頼り切ってはいけないですが、1つの道具として便利に活用していきたいと思います。

コメント

タイトルとURLをコピーしました