チェス時計(対局時計)

2018.10 初版作成
2019.10 LED の電流制限用抵抗の値について追記

概要

将棋や囲碁をプレイするときに用いる対局時計です。 ボタンが 4 個あります。 ボタンA, B は大きなボタン、 C, D は小さなボタンです。

設定モードと対局モードがあり、以下のようにボタンを使います。

ボタン名称対局モード設定モード
ボタンAプレイヤーA 着手持ち時間 +1分
ボタンBプレイヤーB 着手秒読み +5秒
ボタンC一時停止(トグル)持ち時間 +5分
ボタンD短押し:リセット
長押し:設定モードへ
(プレイヤーAの設定)
1回目:プレイヤーBの設定へ
2回目:対局モードへ

ハードウェア

3 個の Arduino を使います。メイン Arduino は ボタンの検知と時間のカウントダウンを担当します。 2 個の表示用 Arduino は 4 桁 LED の制御用です。

以下のような構成です。

ボタン ----> メイン Arduino ---+----> 表示用 Arduino 1 ----> 4 桁 LED
                               +----> 表示用 Arduino 2 ----> 4 桁 LED

メイン Arduino と表示用 Arduino はシリアル通信で結びます。

ブレッドボード上で試作した状態は以下のような感じです。

表示用 Arduino のプログラムを 書き換えることは、まずないと思われるので、 ここ で示した方法を用いて自作基板の上に 実装します。こんな感じです。

メイン Arduino は機能拡張や改良のためにプログラムを 変更する可能性が高いので、Arduino の基板のまま実装します。

表示用 Arduino の電源はメイン Arduino から供給します。 メイン Arduino は「PC」あるいは「AC アダプタ」あるいは 「モバイルバッテリー」に USB ケーブルで接続して電源を 供給します。

アルミケースに実装した結果が以下です(製作は 2016 年入学の横谷滉平さん)。アルミケースの加工が 非常に大変だったそうです。

ボタンは左から順番に A, C, D, B です。 残り時間の表示は左側がプレイヤー A, 右側がプレイヤー B です。 設定モードのとき、左側のディスプレイが「分」 右側の ディスプレイが「秒」を表します。 中は以下のような感じです。


回路図を示します。

メイン Arduino (クリックすると PDF が開きます)

表示用 Arduino(クリックすると PDF が開きます)

完成してから気がついたのですが、LED の電流制限用抵抗の 値は 620 Ωが妥当です。このとき各エレメントを 流れる電流は 5.0 mA です。「数字の 8 を表示し、ピリオドも 点灯させる」場合、5 mA × 8 = 40 mA となります。 Atmega328P の 1 ピンあたりの最大電流は 40 mA なので、 ギリギリ一杯です。

作成時、Atmega328P の 1 ピンあたりの最大電流を 考慮していなかったため、470 Ωで作ってしまいました。 470 Ωのとき、各エレメントを流れる電流は 6.7 mA です。 8 個点灯するとき、6.7 mA × 8 = 53.6 mA となり、40 mA を 超えてしまっています。

ソフトウェア

メイン Arduino で時刻のカウントダウン、ボタンの検知を行います。

表示用 Arduino に対してシリアル通信で表示する文字を送ります。 フォーマットは以下の通りです。

#123451011.

命令は '#' ではじまり、'.' で終わります。改行記号 (0x0d, 0x0a) は 不要です。この例では '#' の次の '1' は ch を表します。 2 つの表示器は ch=1, ch=2 を割り当てます。 次の '2345' が 4 桁の数値(23分45秒)を表します。 次の '1011' がドットを表します。1 が消灯 0 が点灯です。

プログラムを以下に示します。

メイン Arduino のコード

表示用 Arduino のコード

どちらのプログラムも MsTimer2 というライブラリを使いますので、 コンパイルにはライブラリのインストールが必要です。 表示用 Arduino のコードの中にインストール方法が書いてあります。

表示用 Arduino の片方は #define CH '1' もう片方は #define CH '2' として コンパイルしてください。