概要
初投稿です。Nyanyanと申します。私はスピードキューブ(ルービックキューブ等立体パズルの速解き)を趣味としていて、ある日、ルービックキューブのタイム計測用のタイマーを作ろうと思いたちました(これには諸事情がありますがそれはTwitterで#nyantimerのタグでも探してみてください)。
キューブ(立体パズル)の大会では計測に一貫して「スタックタイマー」というものを使い、これは信号出力ができます。この信号の内容について日本語の記事を見かけないのでここに書いておきます。なお、本記事は私のタイマー製作の経験に基づいたものであるだけで、どこかのデータシートを見たとかいう話ではないので動作は自己責任でお願いします。
ちなみにこの製作中のタイマーについて気になる方は以下をご覧ください。
https://github.com/Nyanyan/NyanTimer
英語が読めるのであれば参照すべきところ
私自身ここを大いに参考としました。
https://github.com/fw42/atmel/tree/master/stackmat
信号の概要
概要は以下です。
- 信号はRS232C
- 1200bps
- 一連の信号は約9Hz(111.4ms毎)で送る(諸説あり。この数値は私が測定したもの)
- データビットは8つ(内容はステータス、時刻、チェックサム)
- パリティビットなし
- 終了ビットは
一つ(LF)2つ(LFCR)(オシロスコープでじっくり調べたら何故か常識の斜め上を行くLFCRでした。嘘だろ…)2023/09/04追記: 改行コードはCRLFですが、スタックタイマーがリトルエンディアンを採用しているようで、そのためにバイト列はLFが先で、CRが後に来るようです。
送る内容
データはASCIIコードで送ります。1文字ずつ解説していきます。
1: ステータスのデータ('I', 'A', 'S', 'L', 'R', 'C', ' ')
2-7: 時刻のデータ(1:23.456なら‘123456’)
8: チェックサム(ASCIIコードで64+タイムの各数字の和, 上の例ならASCII10進で64+21=85='U')
9: CR(ASCIIコード0x0D) LF(ASCIIコード0x0A)
10: LF(ASCIIコード0x0A) CR(ASCIIコード0x0D)
2023/09/04追記: 改行コードはバイトごとに書いてますが、(実態は変わりませんが)CRLFをリトルエンディアンで送っているのだと思います。
1番目、ステータスのデータは、
‘I’: タイマー初期化(リセットされた状態)
‘A’: タイマースタート直前(パッドを手で押さえて、離したらスタートできる状態)
‘ ’: 計測中
‘S’: タイム計測完了
‘L’: 左パッドが覆われている状態
‘R’: 右パッドが覆われている状態
‘C’: 両方のパッドが覆われている状態
ちなみに個人的には'C'はあまり意味を持った情報とは言えないと思っていて、自作のタイマーにも実装していません。
注意点
Arduinoなどを念頭にUARTでシリアル通信をする機器でこの信号を実装したいときは信号のHIGHとLOWの反転が必要になります。この際、回路は以下のようにすると良いです。
なお、本家スタックタイマーでは専用ディスプレイにつないだときに信号電圧が1.1V程度まで下がる現象が確認されています。これを再現するためにプルアップ抵抗(R2)は2.2kΩが良いでしょう。
2023/09/04追記: これはUARTの実装上の問題だと思います。ArduinoではアクティブHIGH (ビットが立っているときにHIGHになる) なのですが、スタックタイマーはアクティブLOW (ビットが立っているときにLOWになる) のようです。ですから、何らかのNOT回路を入れて出力すれば良いと思います。ただ、微かな記憶によると、スタックタイマーをディスプレイに繋いだときの信号電圧の変化が結構大事だった気がするので、他の回路で必ずしもうまくいくかというと、わかりません。
まとめ
今回は需要がなさそうですがスタックタイマーの信号について日本語で書いてみました。
この情報はタイマー本体を作る場合にも、タイマーにつなぐディスプレイを作るのにも使えると思いますので、もし機会があってお役に立てれば幸いです。
2023/09/04追記: 誰得記事だと思って書いたのですが、役に立っているという情報をいただけたので、少しわかりやすく追記しました。大変嬉しいです。