つれづれなる備忘録

日々の発見をあるがままに綴る

TinkercadによるArduinoシミュレーション35 ~ ストップウォッチ風表示

1. カウント表示にストップ・再開・リセット機能

 前回の7セグディスプレイ2台を使って2桁のカウントを表示する方法に追加して、ストップボタンでカウントのストップ・再開を行い、リセットボタンでカウント数をリセットする機能を使いした例を紹介する。表題の通りストップウォッチ風の機能となっている。

atatat.hatenablog.com

2. 追加機能について

 押しボタンをArduinoの入力ピンに接続しloopごとに状態を読み出して、押された場合に処理を実行するという方法を今回は採用した。本当は割り込み処理とするところが妥当だが、カウントを復旧させるところがうまくいっていないので、成功したらどこかで改めて紹介したいと思う。ストップ・再生ボタンをArduinoの5ピン、リセットボタンを6ピンに接続した。それ以外の部分は前回と全く同じ接続である。

ストップウォッチ風表示
ストップウォッチ風表示

3. スケッチ

 ここ数回は7セグメントデコーダーや4ビットバイナリカウンタなどデバイスの性能を活用して、スケッチについてはシンプルだったが、今回はある程度プログラムの工夫がある。まずクロック入力とカウント数を記録する部分をint count_on(int cnt)として定義する。処理の内容はクロック信号を入力するため、出力ピンからHIGH-LOWの出力と引数cntをインクリメントして返す。また2つの4ビットバイナリカウンタにリセット信号を入力するvoid reset_on()を定義する。処理としては2ピンと4ピンにHIGHを入力してバイナリカウンタのカウントをリセットしてから、再びカウントを開始できるようにLOWを入力する。

カウンタをリセットするreset_on()state2=digitalRead(6);としてボタンが押された場合state2が0になり、if文内でrest_on()を呼び出すようにする。またカウントのストップ・再開については同様にstate=digitalRead(5);として、stateが0になったらストップか再開(カウント継続)か判定するためにmodeをインクリメントする。modeが偶数の場合はcnt=cont_on(cnt);としてカウント動作を実行し、奇数の場合はcount_on(cnt)が実行されないため、カウントがストップする。

int dt=500;
int cnt=0;
int cnt2=0;
int mode=0;
int state;
int state2;

void setup()
{
  pinMode(3, OUTPUT);//クロック入力
  pinMode(2, OUTPUT);//リセット制御(1桁目)
  pinMode(4, OUTPUT);//リセット制御(2桁目)
  digitalWrite(3,LOW);
  digitalWrite(2,LOW);
  digitalWrite(4,LOW);
  pinMode(5, INPUT_PULLUP);//ストップ/カウント状態監視
  pinMode(6, INPUT_PULLUP);//リセット状態監視
  
}

int count_on(int cnt){ //カウントおよび表示関数
 digitalWrite(3,HIGH);
 delay(dt);
 digitalWrite(3,LOW);
 delay(dt);
 return cnt+1;
}

void reset_on(){ //リセット関数
  digitalWrite(2,HIGH);//カウンタリセット(1)
  digitalWrite(4,HIGH);//カウンタリセット(2)  
  digitalWrite(2,LOW);//カウンタ(1)
  digitalWrite(4,LOW);//カウンタ(2)
}
    
void loop()
{
 state2=digitalRead(6); //リセット状態監視
  
  if(state2==0){
    reset_on();
  }
  if(cnt>9){// 1桁目カウントが9を越えたらリセット処理
    digitalWrite(2,HIGH);//カウンタリセット
    digitalWrite(2,LOW);//カウント
    cnt=0;
    cnt2++;
  }
  
   if(cnt2>9){// 2桁目カウントが9を越えたらリセット処理
    digitalWrite(4,HIGH);//カウンタリセット
    digitalWrite(4,LOW);//カウント
    cnt2=0;
  }
 
 state=digitalRead(5); //ストップ状態監視
    if(state==0){
      mode=mode+1; //ストップまたはカウント:mode

    }
    if (mode%2==0){
      cnt=count_on(cnt);//mode:カウントならばカウント
  }

 delay(250);
}

Tinkercadのシミュレーションを実行すると、リセットボタンを押すとカウントがリセットされ、またストップボタンを1回押すとカウント停止、もう一度押すとカウント再開することが確認できる。loopやカウントが早すぎるとうまく5ピンや6ピンの状態の読み出しとリセット、ストップが認識できないため、最後のdelay(250)dtの数値を調整している。(割り込み処理にするとうまくいくかもしれない)

4. まとめ

 今回はリセットボタンやストップ・再開ボタンを7セグディスプレイ2台を使って2桁のカウントを表示に加えることでストップウォッチ風の動作にすることを紹介した。