5.3 - タイムカウンター¶
4桁の7セグメントディスプレイは、4つの7セグメントディスプレイが連動して動作します。
この4桁の7セグメントディスプレイは独立して動作します。人間の視覚残留の原理を利用して、各7セグメントの文字をループで素早く表示し、連続した文字列を形成します。
例えば、ディスプレイに「1234」と表示された場合、最初の7セグメントには「1」が表示され、「234」は表示されません。一定の時間が経過した後、2番目の7セグメントが「2」を表示し、1番目、3番目、4番目の7セグメントは何も表示しません。このように、4つのディジタル表示が順番に表示されます。このプロセスは非常に短い(通常5ms)ので、光の残光効果と視覚残留の原理により、4つの文字を同時に見ることができます。
必要なコンポーネント
このプロジェクトには以下のコンポーネントが必要です。
一式を購入すると便利です、リンクは以下です:
名前 |
このキットに含まれるアイテム |
購入リンク |
---|---|---|
ケプラーキット |
450+ |
以下のリンクから個別にも購入可能です。
SN |
コンポーネント紹介 |
数量 |
購入リンク |
---|---|---|---|
1 |
1 |
||
2 |
マイクロUSBケーブル |
1 |
|
3 |
1 |
||
4 |
数本 |
||
5 |
4(220Ω) |
||
6 |
1 |
||
7 |
1 |
回路図
配線の原理は基本的に 5.1 マイクロチップ - 74HC595 と同じで、唯一の違いはQ0〜Q7が4桁の7セグメントディスプレイのa〜gピンに接続されている点です。
次に、G10〜G13は動作させる7セグメントディスプレイを選択します。
配線
コード
注釈
パス
kepler-kit-main/arduino/5.3_time_counter
の下の5.3_time_counter.ino
ファイルを開くことができます。または、このコードを Arduino IDE にコピーアンドペーストしてください。
アップロード ボタンをクリックする前に、ボード(Raspberry Pi Pico)と正しいポートを選択してください。
プログラムを実行すると、4桁の7セグメントディスプレイがカウンターとして動作し、数字が1秒ごとに1ずつ増加します。
動作の仕組みは?
各7セグメントディスプレイへの信号の書き込みは、 5.2 - 数字表示 で使われる hc595_shift()
関数を用いて、同じように行われます。
4桁の7セグメントディスプレイの要点は、各7セグメントディスプレイを選択的に活性化することです。これに関連するコードは以下のとおりです。
const int placePin[4] = {13,12,11,10};
void setup ()
{
for (int i = 0; i<4;i++){
pinMode(placePin[i],OUTPUT);
}
}
void loop()
{
pickDigit(0);
hc595_shift(count%10/1);
pickDigit(1);
hc595_shift(count%100/10);
pickDigit(2);
hc595_shift(count%1000/100);
pickDigit(3);
hc595_shift(count%10000/1000);
}
void pickDigit(int digit){
for(int i = 0; i < 4; i++){
digitalWrite(placePin[i],HIGH);
}
digitalWrite(placePin[digit],LOW);
}
ここでは、4つのピン(GP10、GP11、GP12、GP13)が4桁の7セグメントディスプレイの各ビットを個々に制御するために使用されています。
これらのピンの状態が LOW
の場合、対応する7セグメントディスプレイが活性化します。状態が HIGH
の場合、7セグメントディスプレイは動作しません。
ここで pickDigit(digit)
関数は、すべての7セグメントディスプレイを無効にし、特定の桁を個別に有効にするために使用されます。
その後、 hc595_shift()
が7セグメントディスプレイの対応する8ビットコードを書き込むために使用されます。
4桁の7セグメントディスプレイは、私たちが4桁を表示していると感じられるように、連続して順番に活性化する必要があります。これは、主プログラムがタイミングに影響を与えるコードを簡単に追加できないことを意味します。
しかし、この例にタイミング関数を追加する必要があります。 delay(1000)
を追加すると、4つの7セグメントディスプレイが同時に動作しているという錯覚を検出することができます。
その後、 millis()
関数を使用することが優れた方法です。
void setup ()
{
timerStart = millis();
}
void loop()
{
unsigned int count = (millis()-timerStart)/1000;
}
millis()
関数は、現在のプログラムが開始されてからのミリ秒数を取得します。最初の時間値を timerStart
として記録します。
その後、再度時間を取得する必要がある場合は、 millis()
関数を再度呼び出し、その値から timerStart
を減算して、プログラムがどれだけ実行されているかを取得します。
最後に、この時間値を変換し、4桁の7セグメントディスプレイに表示させます。