2019の13日目の記事です。小ネタということで身近なテストツールであるストップウォッチにフォーカスします。ストップウォッチといえば開発者、テストエンジニア、QA問わず誰もが使い方を知っていて1,000円出せば1/100秒計測の機種が買えるとってもありふれた存在ですが一方で不便なところもあります。操作が手作業で自動化できない値の転記ミスのおそれが付いて回る計測時間をRS-232CやUSBで自動で読み出せるモデルが意外とない転記ミスもさることながらソフトウェアの改修のたびに同じチェックを繰り返すような場面で自動化できないのはとっても痛いです。スポーツのトレーニング向けの機種でPCにデータを転送できるものがありますが手動による転送のためニーズに合いません。そこで自動化システムに組み込めるようなコマンド操作のストップウォッチとデモを兼ねたテストランナーをサクッと作ります。ストップウォッチのプログラムは割り込みを使わずポーリングでぐるぐる回しているだけだし回路設計の計算も中学校で習うオームの法則だけ。品質技術開発の敷居は決して高くないので自分も始めてみようかなと思っていただけたら幸いです。数秒以下(ミリ秒オーダー)の計測はオシロスコープ(以下、オシロ)で行い、長時間の計測はテスト実行ログのタイムスタンプを使うこととし、オシロと実行ログの補完を目指します。利用シーンとして、ストップウォッチで測定を行うような数秒~数分程度の測定を想定します。Rev.3のシステムクロックCSTCE16M0V53-R0の周波数許容偏差は±0.50%以内です。±0.50%というと1秒に対して±5ミリ秒、200秒に対して±1秒、1時間に対して±18秒の誤差に相当しますので、この誤差を許容できるような用途でご使用ください。CI/CDや回帰テストに本システムを組み込んで処理時間がやけに長い(短い)といった異常をスクリーニングし、異常を検出したら改めて精密に調べるような使い方が向いていると思います。UARTのコマンド操作、の3種類を想定します。ストップウォッチの計測時間はUARTに出力します1。小ネタ縛りで以下の制約を入れます。ストップウォッチの製作Arduinoの組み込み関数でミリ秒単位のカウントを行うmillis()を利用します。2つの変数time_start、time_endを用意し、計測開始時にtime_startへ、計測終了時にtime_endへmillis()の値をストアし、time_endとtime_startの差分から経過時間を求めます。実体配線図Fritzingで描いた実体配線図を以下に示します。#2~#4の入力ポートのプルアップはAVRマイコンの機能を利用します。テスト対象の機器を線出しして接続する場合はプルアップの設定や電圧レベルは適宜合わせてください。LEDは極性があり足の長い方がアノード(+側)、短い方がカソード(-側)です。LEDの足をニッパーで切るときはアノード側をちょっと長くしておくと極性を迷わずに済みます。Pinの出力電圧は5V、LEDの順方向電圧Vfをざっくり2Vとすると電流制限抵抗Rの両端の電圧Vrは3Vとなります。LEDに流す電流Iを1mAとし、オームの法則から電流制限抵抗の値を求めます。=3kΩ$3kΩは許容差5%のE24系列にちょうどありますので3kΩを使用します。併せて抵抗Rが消費する電力Prも確認します。3mW$3kΩ(橙黒赤金)、誤差5%の一般的なカーボン抵抗で1/4Wや1/6Wなど入手しやすいものを用意すればOKです。今時のLEDは少ない電流でも明るく光るのでE12系列の3.3kΩを選定して電流をもうちょっと絞ってもよいかもしれません。・ヘルプメッセージをUARTへ出力UARTの通信速度は115200bpsを設定しています。スイッチのチャタリング除去として5msの待ち時間を設けています2。