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

多機能学習タイマーの製作

ARDUINO

はじめに

試験勉強でモチベーションが上がらず集中力が続かないという子供のために学習タイマーを作成してみました。「買ったほうが安い!」無しでお願いします。

今回はプロトペディアのサイトに登録しているのでそちらも覗いてみて下さい。

ハードウェア構成

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

接続イメージ図

ここで、Uno Mini LEにGroveモジュールを直接には接続できないのでオリジナルのシールド基板を作成しました。こんな感じの基板です.

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

この基板に1.27㎜ピッチピンヘッダとGroveコネクタ(HY2.0-4P)を半田付けします。
なお、今回の学習タイマーではGroveモジュールを5V駆動で使用していますが、ジャンパで3.3V駆動との切り替えができるようにしています。

3Dプリントで作製した筐体の中にモジュールをねじ止めしています。内部は配線もあり結構パンパンです。

学習タイマー内部の様子

ソフトウェア構成

今回のプログラムはMicrosoftのCopilotを使って作成しました。Seeed社のGroveシステムはWEBサイトやGithubに公開されているサンプルプログラムが充実しているおかげて、AIへは比較的簡単な指示で生成することができました。ちなみに、上の「接続イメージ図」もCopilotで生成していて、下のフローチャートもCopilotで生成しています。
プログラム全体の長さはコメント文が少し入った状態で1200行ぐらいのプログラムになっています。

メインループ

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

クロックモード

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

タイマーモード

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])

ストップウォッチモード

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])

Arduino Sketch全体はGitHubにアップしていますのでそちらをご参照下さい。

おわりに

動作しているところです。

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

コメント

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