注釈

こんにちは、SunFounderのRaspberry Pi & Arduino & ESP32愛好家コミュニティへようこそ!Facebook上でRaspberry Pi、Arduino、ESP32についてもっと深く掘り下げ、他の愛好家と交流しましょう。

参加する理由は?

  • エキスパートサポート:コミュニティやチームの助けを借りて、販売後の問題や技術的な課題を解決します。

  • 学び&共有:ヒントやチュートリアルを交換してスキルを向上させましょう。

  • 独占的なプレビュー:新製品の発表や先行プレビューに早期アクセスしましょう。

  • 特別割引:最新製品の独占割引をお楽しみください。

  • 祭りのプロモーションとギフト:ギフトや祝日のプロモーションに参加しましょう。

👉 私たちと一緒に探索し、創造する準備はできていますか?[ ここ]をクリックして今すぐ参加しましょう!

デジタルダイス

このコードは、74HC595 シフトレジスタと7セグメントデジタルディスプレイを使用して、サイコロを振るシミュレーションを行います。サイコロを振るシミュレーションは、直接チルトスイッチを振ることで起動します。このアクションにより、デジタルディスプレイは1から6の間のランダムな数をサイクルし、サイコロの振る動作をシミュレートします。短い間隔の後、ディスプレイは停止し、サイコロの振りの結果を意味するランダムな数を表示します。

必要なコンポーネント

このプロジェクトには以下のコンポーネントが必要です。

全体のキットを購入すると便利です。こちらがリンクです:

名称

このキットのアイテム数

リンク

Elite Explorer Kit

300+

Elite Explorer Kit

以下のリンクから別々に購入することもできます。

コンポーネント紹介

購入リンク

Arduino Uno R4 WiFi

-

ブレッドボード

購入

ジャンパーワイヤー

購入

抵抗器

購入

チルトスイッチ

-

74HC595

購入

7セグメントディスプレイ

購入

配線図

../_images/05_dice_bb.png

回路図

../_images/05_digital_dice_schematic.png

コード

注釈

  • ファイル 05_digital_dice.inoelite-explorer-kit-main\fun_project\05_digital_dice のパスから直接開くことができます。

  • または、このコードをArduino IDEにコピーしてください。

05_digital_dice.ino
 1/*
 2  This code simulates a dice roll on a 7-segment display. Shaking the device 
 3  (tilt switch activation) starts the roll, displaying random numbers rapidly 
 4  and stopping after a short duration.
 5
 6  Board: Arduino Uno R4 
 7  Component: 7-segment Display with 74HC595 and Tilt Switch
 8*/
 9
10const int dataPin = 10;   // DS of 74HC595
11const int clockPin = 13;  // SH_CP of 74HC595
12const int latchPin = 12;  // ST_CP of 74HC595
13const int tiltPin = 2;    // The pin where the tilt switch is connected
14
15// Byte representation for numbers in a common-cathode 7-segment display
16byte numbers[] = {
17  // 0b00111111,  // 0
18  0b00000110,  // 1
19  0b01011011,  // 2
20  0b01001111,  // 3
21  0b01100110,  // 4
22  0b01101101,  // 5
23  0b01111101,  // 6
24  //... Add the values for the rest of the numbers
25};
26
27// State and timing variables
28volatile bool rolling = false;
29unsigned long lastShakeTime = 0;
30
31void setup() {
32  // Initialize pins
33  pinMode(dataPin, OUTPUT);
34  pinMode(clockPin, OUTPUT);
35  pinMode(latchPin, OUTPUT);
36  pinMode(tiltPin, INPUT_PULLUP);  // Enable internal pull-up resistor
37
38  // Attach an interrupt to the tiltPin. When the tilt switch is activated, the shakeDetected function will be called
39  attachInterrupt(digitalPinToInterrupt(tiltPin), rollDice, CHANGE);
40}
41
42void loop() {
43  // Check if it's rolling
44  if (rolling) {
45    byte number = random(1, 7);  // Generate a random number between 1 and 6
46    displayNumber(number);
47    delay(80);  // Delay to make the rolling effect visible
48
49    // Stop rolling after 1 second
50    if ((millis() - lastShakeTime) > 1000) {
51      rolling = false;
52    }
53  }
54}
55
56// Interrupt handler for shake detection
57void rollDice() {
58  if (digitalRead(tiltPin) == LOW) {
59    lastShakeTime = millis();  // Record the time of shake
60    rolling = true;            // Start rolling
61  }
62}
63
64// Function to display a number on the 7-segment display
65void displayNumber(byte number) {
66  digitalWrite(latchPin, LOW);
67  shiftOut(dataPin, clockPin, MSBFIRST, numbers[number - 1]);
68  digitalWrite(latchPin, HIGH);
69}

どのように動作しますか?

以下はコードの詳細な説明です:

  1. 変数の初期化:

    dataPin, clockPin, latchPin:74HC595用のピン。 buttonPin:ボタンが接続されているデジタルピン。 numbers[]:共通アノードデジタルチューブで1から6までの数を表すエンコーディングを格納する配列。

  2. 揮発性変数:

    rolling:ダイスが現在ローリング中であるかどうかを示す揮発性変数。 割り込みサービスルーチンとメインプログラムの両方でアクセスされるため、揮発性として宣言されます。

  3. setup()

    関連するピンのモードを設定します。 内部プルアップ抵抗を使用してボタンの入力モードを設定します。 ボタンに割り込みを割り当て、ボタンの状態が変わったときにrollDice関数を呼び出します。

  4. loop()

    rollingがtrueであるかどうかをチェックします。trueの場合、1から6の間のランダムな数を表示し続けます。ボタンが500ミリ秒以上押されている場合、ローリングは停止します。

  5. rollDice()

    これはボタンの割り込みサービスルーチンです。ボタンが押されている(低レベル)かどうかをチェックします。もしそうなら、現在の時間を記録し、ローリングを開始します。

  6. displayNumber()

    この関数はデジタルチューブに数を表示します。74HC595シフトレジスタを通じてデジタルチューブに数を送信します。