.. note::
こんにちは、SunFounderのRaspberry Pi & Arduino & ESP32愛好家コミュニティへようこそ!Facebook上でRaspberry Pi、Arduino、ESP32についてもっと深く掘り下げ、他の愛好家と交流しましょう。
**参加する理由は?**
- **エキスパートサポート**:コミュニティやチームの助けを借りて、販売後の問題や技術的な課題を解決します。
- **学び&共有**:ヒントやチュートリアルを交換してスキルを向上させましょう。
- **独占的なプレビュー**:新製品の発表や先行プレビューに早期アクセスしましょう。
- **特別割引**:最新製品の独占割引をお楽しみください。
- **祭りのプロモーションとギフト**:ギフトや祝日のプロモーションに参加しましょう。
👉 私たちと一緒に探索し、創造する準備はできていますか?[|link_sf_facebook|]をクリックして今すぐ参加しましょう!
.. _ar_74hc_4dig:
5.3 - タイムカウンター
================================
4桁の7セグメントディスプレイは、4つの7セグメントディスプレイが連動して動作します。
この4桁の7セグメントディスプレイは独立して動作します。人間の視覚残留の原理を利用して、各7セグメントの文字をループで素早く表示し、連続した文字列を形成します。
例えば、ディスプレイに「1234」と表示された場合、最初の7セグメントには「1」が表示され、「234」は表示されません。一定の時間が経過した後、2番目の7セグメントが「2」を表示し、1番目、3番目、4番目の7セグメントは何も表示しません。このように、4つのディジタル表示が順番に表示されます。このプロセスは非常に短い(通常5ms)ので、光の残光効果と視覚残留の原理により、4つの文字を同時に見ることができます。
**必要なコンポーネント**
このプロジェクトには以下のコンポーネントが必要です。
一式を購入すると便利です、リンクは以下です:
.. list-table::
:widths: 20 20 20
:header-rows: 1
* - 名前
- このキットに含まれるアイテム
- 購入リンク
* - ケプラーキット
- 450+
- |link_kepler_kit|
以下のリンクから個別にも購入可能です。
.. list-table::
:widths: 5 20 5 20
:header-rows: 1
* - SN
- コンポーネント紹介
- 数量
- 購入リンク
* - 1
- :ref:`cpn_pico_w`
- 1
- |link_picow_buy|
* - 2
- マイクロUSBケーブル
- 1
-
* - 3
- :ref:`cpn_breadboard`
- 1
- |link_breadboard_buy|
* - 4
- :ref:`cpn_wire`
- 数本
- |link_wires_buy|
* - 5
- :ref:`cpn_resistor`
- 4(220Ω)
- |link_resistor_buy|
* - 6
- :ref:`cpn_4_dit_7_segment`
- 1
-
* - 7
- :ref:`cpn_74hc595`
- 1
- |link_74hc595_buy|
**回路図**
|sch_4dig|
配線の原理は基本的に :ref:`ar_74hc_led` と同じで、唯一の違いはQ0〜Q7が4桁の7セグメントディスプレイのa〜gピンに接続されている点です。
次に、G10〜G13は動作させる7セグメントディスプレイを選択します。
**配線**
|wiring_4dig|
**コード**
.. note::
* パス ``kepler-kit-main/arduino/5.3_time_counter`` の下の ``5.3_time_counter.ino`` ファイルを開くことができます。
* または、このコードを **Arduino IDE** にコピーアンドペーストしてください。
* **アップロード** ボタンをクリックする前に、ボード(Raspberry Pi Pico)と正しいポートを選択してください。
.. raw:: html
プログラムを実行すると、4桁の7セグメントディスプレイがカウンターとして動作し、数字が1秒ごとに1ずつ増加します。
**動作の仕組みは?**
各7セグメントディスプレイへの信号の書き込みは、 :ref:`ar_74hc_7seg` で使われる ``hc595_shift()`` 関数を用いて、同じように行われます。
4桁の7セグメントディスプレイの要点は、各7セグメントディスプレイを選択的に活性化することです。これに関連するコードは以下のとおりです。
.. code-block:: arduino
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()`` 関数を使用することが優れた方法です。
.. code-block:: arduino
void setup ()
{
timerStart = millis();
}
void loop()
{
unsigned int count = (millis()-timerStart)/1000;
}
``millis()`` 関数は、現在のプログラムが開始されてからのミリ秒数を取得します。最初の時間値を ``timerStart`` として記録します。
その後、再度時間を取得する必要がある場合は、 ``millis()`` 関数を再度呼び出し、その値から ``timerStart`` を減算して、プログラムがどれだけ実行されているかを取得します。
最後に、この時間値を変換し、4桁の7セグメントディスプレイに表示させます。
* `millis() `_