2026年6月12日金曜日

マイコンゲームの乱数初期化方法(2)

  マイコンによっては、EEPROMが使えない場合があります。その時の一例です。

スイッチ回路

 右はスイッチ回路を接続した図です。
左のボードはESP32マイコンをGroveコネクタで接続できるようにした拡張ボードです。

 ブレッドボードにスイッチを配置して、GroveケーブルでIO13ーGND間に接続しています。

スイッチから乱数列を初期化する

 ゲームをするときに、ほぼスタートスイッチで始める場合が多いかと思います。このスイッチを利用します。スイッチを押してから離すまでの時間を使って乱数の初期化をします。

 プログラム例です。

#define SW  13
long cnt=0;
void setup() {
  pinMode(SW,INPUT_PULLUP);
  Serial.begin(115200);
  delay(100);
  Serial.printf("Plese press the SW.\n");
  // 押されるまで待つ
  while(digitalRead(SW)!=0);
  Serial.printf("Plese release the SW.\n");
  cnt=micros();
  // 離すまで待つ
  while(digitalRead(SW)==0);
  cnt=micros()-cnt;  
  Serial.printf("cnt: %5ld\n", cnt);
  // 乱数の初期化
  srand(cnt);
  for(int i=0;i<10;i++){
    int r=random();
    Serial.printf("%5d\n",r);
  }
}
 
void loop() {
} 
 Arduinoでは内部時間を持ってします。millis()関数やmicros()関数を使うと、リセットされてからの時間を取得できます。
 これを利用して、スイッチを押したときの内部時間と話したときの内部時間の差を取ると、スイッチを押していた時間が取得できます。この時間は個人差があり、毎回異なります。この時間をmicros()関数で計算すると、マイクロ秒で時間を取得できます。マイクロ秒単位であれば、ほとんど同じになることはありません。
 実行結果を示します。

 先頭のcntがスイッチを押していた時間[μS]です。これを乱数の初期化に使うと、毎回異なる乱数列となります。

 Arduinoマイコンでない場合でも、押しているときに数値をカウントするだけで、同じ働きが作ることができます。

0 件のコメント:

コメントを投稿

回転軸をスムーズに動かす工夫

回転軸をスムーズに動かしたいことがあります。右の図は把手です。つまみを持って回転させる機構です。  この時に必要なのは つまみがスムーズに動く ことです。 3D設計  この機構を次のように設計しました。  左図のように、ハンドルにはφ6.0mmの穴が空いています。押さえの差し込ま...