Menu
CoddyTech

サイコロを振る

CoddyのArduinoジャーニー「ディスプレイとセンサー」セクションの一部。レッスン 5/24。

random(1, 7)は1から6までの整数を選びます。最初の数は得られる最小値で、2番目の数は最大値より1大きい値です。

ボードの内部には、本当の意味でのランダム性はありません。random()は、シードと呼ばれる数から始めて、前の数をもとにそれぞれの数を計算します。同じシードを使うと、実行するたびに同じ数が返されます。つまり、電源を入れるたびにサイコロは2、2、6、3と出ます。

randomSeed()はシードを設定します。最初のボタン押下時刻のように、実行ごとに変わる値を渡します。micros()はマイクロ秒単位で時間を数えます。同じマイクロ秒に2回ボタンを押す人はいません。

if (!seeded) {
  randomSeed(micros());
  seeded = true;
}
int roll = random(1, 7);

setup()でシードを設定しても役に立ちません。setup()は電源を入れるたびに同じマイクロ秒に実行されるからです。

challenge icon

チャレンジ

中級

ボタンはピン10に接続されており、スターターはボタンが押された瞬間をすでに検知します。サイコロを作りましょう:

  • 押すたびに、random(1, 7)を選び、showDigit()で表示します
  • 最初に押したときだけ、randomSeed(micros())を呼び出して、実行ごとに出目が変わるようにします

Runを押し、ボタンを数回押してから、Checkを押してください。

自分で試してみよう

const int segmentPins[7] = {2, 3, 4, 5, 6, 7, 8};  // a, b, c, d, e, f, g

// 各数字に1つのパターン。右から読むと、最後のビットがセグメントaに対応します。
//                     gfedcba
const byte digits[10] = {
  0b0111111,  // 0
  0b0000110,  // 1
  0b1011011,  // 2
  0b1001111,  // 3
  0b1100110,  // 4
  0b1101101,  // 5
  0b1111101,  // 6
  0b0000111,  // 7
  0b1111111,  // 8
  0b1101111   // 9
};

void showDigit(int n) {
  for (int i = 0; i < 7; i++) {
    if (bitRead(digits[n], i) == 1) {
      digitalWrite(segmentPins[i], LOW);   // 点灯
    } else {
      digitalWrite(segmentPins[i], HIGH);  // 消灯
    }
  }
}

const int buttonPin = 10;
bool wasPressed = false;
bool seeded = false;

void setup() {
  for (int i = 0; i < 7; i++) {
    pinMode(segmentPins[i], OUTPUT);
  }
  pinMode(buttonPin, INPUT_PULLUP);
  showDigit(0);
}

void loop() {
  bool pressed = digitalRead(buttonPin) == LOW;
  if (pressed != wasPressed) {
    if (pressed) {
      // ボタンが押された直後:1から6までの数をランダムに選んで表示する
    }
    delay(50);  // ボタンの状態が安定するのを待つ
  }
  wasPressed = pressed;
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

ディスプレイとセンサーのすべてのレッスン

自分で練習してみよう: Arduinoプレイグラウンド