ArduinoでSTEM教育​ 実践編:かけっこタイム計測器

ArduinoでSTEM教育​ 実践編:かけっこタイム計測器

陸上競技のタイム計測機を模擬して作ります。「いちについて、よーい、どん」の音とともに、タイム計測を開始して、ゴールしたかどうかは赤外線センサーで検知します。Arduino機器はスタート地点とゴール地点にそれぞれ設置します。これまで紹介した、ZigBee通信、音再生、タイム計測などを組み合わせた作品です。

使用する部品

かけっこタイム計測器の概要

 完成品のイメージは、陸上トラック競技のゴールに置かれている計測器です。スタートの音でタイム計測を開始し、経過時間がディジタル表示で進んでいきます。ゴールした瞬間にタイマーのカウントアップを止めます。
 器械は2台作成します。1台はスタート地点において、スタート音を鳴らします。もう1台はゴール地点でタイマーをカウントアップして、ゴールとともにタイマーを止めます。

ピンアサイン

 スタートボタン用に2番ピンを割り当てます。このピンはプルアップに設定し、スイッチを接続します。スイッチが押されていないときはHighが入力され、スイッチが押されたときはLowが入力されます。詳細は、「ArduinoでSTEM教育​ 基礎編:プッシュスイッチ」を参照して下さい。

 圧電スピーカに出力する端子は3番ピンを割り当てます。これはPWMを出力する必要があるため、Arduino Uno 以外でコードを書く場合は、端子の仕様を確認して下さい。こちらについても、以前の記事で詳細を紹介していますので、「ArduinoでSTEM教育​ 基礎編:パッシブブザー」を参照して下さい。

リセットボタン用に8番ピンを割り当てます。リセットボタンは、スタートでフライングしたときに使用します。このボタンを押すことで初期状態(スタートボタンを押すのを待つ状態)に戻ります。

 スタート機の動作状態を視覚的にわかるように、LEDを接続します。LEDは赤・緑・青を5・6・7番ピンに接続します。詳細は「ArduinoでSTEM教育​ 基礎編:RGB-LED」を参照して下さい。

ステートマシン

スタート機の状態を管理するため、ステートマシンを使用します。ライブラリを使用するため、冒頭でFiniteStateMachine.hを読み込みます。ステートは5個定義します。”READY”は、スタートボタンが押されるのを待っている状態。”Cal”は、ゴール機の準備が完了するまで待っている状態。”Audio”は、スタート音源を再生している状態。”Measure”は、走っている時間を測定している状態。”Goal”は、ゴールしてリセットボタンかスタートボタンが押されるまで待っている状態です。 ステートとLEDの関係は以下のとおりです。LEDの制御はステートが変化するときのみ行います。

<スタート機/ゴール機ともに共通>
READY  :緑
CAL    :青
AUDIO  :青
MEASURE :赤
GOAL   :緑

スタート機とゴール機の間で通信する(READY, CAL)

スタート機のスタートボタンが押されると、スタート機は’S’を無線通信(ZigBee)で出力します。ゴール機はこの’S’を受信して、’CAL’ステートに移行します。’CAL’ステートでは、「よーい」と「どん」の間合いを何秒にするか、ランダム関数で生成し、また、ゴールを検知する赤外線センサーのキャリブレーションも行います。「randTime = random(0,999);」で0~1000msのランダム時間を生成します。「baseline = calSense(1000);」で赤外線センサーから得た電圧の 1000ms間平均値を取得します。そして、ゴール機は「Serial.print(randTime);」で生成した値を 無線通信(ZigBee)で出力します。 スタート機は、その値を「waitTime = Serial.read();」で受け取って、次のステート’AUDIO’に移行します。

<スタート機のプログラム>

<ゴール機のプログラム>

スタート音を再生する(AUDIO)

「位置について、よ~い、どん!」や「On your mark, get set, go!」というように、音を鳴らします。Arduinoで音を鳴らす方法については、以前の記事「ArduinoでSTEM教育​ 応用編:WAV音源をデータ変換して圧電スピーカから出力する」で説明しています。簡単に説明すると、今回使用する音の再生時間は短く、音質は悪くても問題ありません。走り出すタイミングが分かりさえすれば良いのです。したがって、SDカードを使うこと無く、音源をArduinoのメモリに置いて、圧電スピーカから再生することが出来ます。

音源は3種類用意します。「On your mark(いちについて)」、「Get set(よ~い)」、「Go(どん)」の3種類です。それぞれファイルを用意してプログラム冒頭で読み込みます。私は英語の音声が欲しかったので、 AudioJungle で音源を購入しましたが、まずは自分の声で試してみるのが良いと思います。音源は以下のように、データ変換してヘッダーファイルとして保存しておきます。

タイマーで時間を計測する(MEASURE)

時間の計測については、「ArduinoでSTEM教育​ 応用編:割り込みタイマーで時間を計測する」で説明した方法でやります。スタート機は、「よーい、ドン」の音声再生後、「Serial.print(‘G’);」で’G’を無線通信(ZigBee)で出力します。ゴール機は、 タイマーを ‘Audio’ステートで「MsTimer2::start();」で開始します。そして、無線通信で ‘G’ を受けると、timeCountを0にして、’Audio’ステートから’Measure’ステートに移動します。ゴールすると、タイマーのカウントアップを止めます。

ゴールしたことを認識する(GOAL)

ゴール機は’Measure’ステートに移動すると、「if(analogRead(sensePin) > threshold)」で赤外線センサがゴールする人を検知するまで、経過時間をLEDセグメントモジュールに表示させながら待ちます。検知すると、タイマーのカウントアップを止めます。検知するしきい値は、’CAL’ステートで決めています。先述したとおり、「baseline = calSense(1000);」で赤外線センサーから得た電圧の 1000ms間平均値を取得します。そして、人を検知するしきい値は、この値に150を加算します。150という値は、実際にセンサーの前を通り過ぎるときに、どれくらいになるかを試して、調整した値です。コードでは、「 threshold = baseline + 150;」と記述しています。

プログラム

スタート機のプログラム

ゴール機のプログラム

完成写真

スタート機

ゴール機

完成動画

Arduino実践編カテゴリの最新記事