マイコンによっては、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() {
}
これを利用して、スイッチを押したときの内部時間と話したときの内部時間の差を取ると、スイッチを押していた時間が取得できます。この時間は個人差があり、毎回異なります。この時間をmicros()関数で計算すると、マイクロ秒で時間を取得できます。マイクロ秒単位であれば、ほとんど同じになることはありません。
実行結果を示します。
先頭のcntがスイッチを押していた時間[μS]です。これを乱数の初期化に使うと、毎回異なる乱数列となります。
Arduinoマイコンでない場合でも、押しているときに数値をカウントするだけで、同じ働きが作ることができます。

0 件のコメント:
コメントを投稿