はじめに
試験勉強でモチベーションが上がらず集中力が続かないという子供のために学習タイマーを作成してみました。「買ったほうが安い!」無しでお願いします。
今回はプロトペディアのサイトに登録しているのでそちらも覗いてみて下さい。
ハードウェア構成
メインマイコンにArduino 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つの道具として便利に活用していきたいと思います。

コメント