Arduinoであそぶ

しばらく更新してなかったと思ったら新カテゴリです。最近Arduinoなるもので遊んでいました。Arduinoはとても簡単に言うといわゆるマイコンで、とても手軽で楽しいです。興味を持った方はぜひ買っていじってみてください。
ぽちぽちと作ってたものがとりあえず完成したのでなんか書いてみます。


作ってたのはこんなもの。

これは何かというと、ライフゲームです。マトリクスLEDを買って、これでぴかぴかさせてライフゲームしたら楽しいだろうなーと思って作ってみました。右下のボタンも押せて、黒いボタンを押してる間は動きが止まります。赤いボタンを押すと、セルをランダムで再配置します。8×8でちっちゃめだけどそれでも動いてるのを見てると結構楽しいです。

せっかくなのでスケッチ(Arduinoではソースのことをスケッチと言うらしい?)を貼っておきます。

boolean matrix[10][10];

void set(){
  for (int i = 1; i < 9; ++i){
    for (int j = 1; j < 9; ++j){
      matrix[i][j] = random(100) >80;
    }
  }
}

void nextstep(){
  boolean tmp[8][8];
  
  //ふちの処理
  for (int i = 1; i < 9; ++i){
    matrix[i][0] = matrix[i][8];
    matrix[i][9] = matrix[i][1];
    matrix[0][i] = matrix[8][i];
    matrix[9][i] = matrix[1][i];
  }
  matrix[0][0] = matrix[8][8];
  matrix[0][9] = matrix[8][1];
  matrix[9][0] = matrix[1][8];
  matrix[9][9] = matrix[1][1];
  
  //ひたすら計算
  for (int i = 1; i < 9; ++i){
    for (int j = 1; j < 9; ++j){
      int count = 0;
      for (int k = -1; k <= 1; ++k){
        for (int l = -1; l <= 1; ++l){
          if(matrix[k+i][l+j] && (k != 0 || l != 0)){
            count++;
          }
        }
      }
      if(count == 3 || (matrix[i][j] && count == 2)){
        tmp[i-1][j-1] = true;
      }else{
        tmp[i-1][j-1] = false;
      }
    }
  }
  
  //tmpと入れ替え
  for (int i = 0; i < 8; ++i){
    for (int j = 0; j < 8; ++j){
      matrix[i+1][j+1] = tmp[i][j];
    }
  }
}


void setup(){
  for (int i = 2; i < 13; ++i){
    pinMode(i, OUTPUT);
    digitalWrite(i, LOW);
  }
  pinMode(14, INPUT);
  pinMode(17, INPUT);
  
  randomSeed(analogRead(1));
}

void loop(){
  digitalWrite(12,LOW);
  digitalWrite(12,HIGH);
  digitalWrite(11,HIGH);
  digitalWrite(10,HIGH);
  digitalWrite(11,LOW);
  digitalWrite(10,LOW);

  int count = 0;

  set();
  while(1){
    
    //スイッチが押されて離れたら並べ替え
    if (digitalRead(17) == HIGH){
      while(digitalRead(17)){}
      set();
      delay(1);
    }
    
    //LED点灯部分ここから
    for (int i = 2; i < 10; ++i){
      digitalWrite(i, !matrix[count%8+1][i-1]);
    }    
    delayMicroseconds(500);
    for (int i = 2; i < 10; ++i){
      digitalWrite(i, HIGH);
    }
    digitalWrite(10, HIGH);
    delayMicroseconds(50);
    digitalWrite(10,LOW);
    //ここまで
    
    count++;
    
    //一定時間経ってスイッチが押されていなかったら次へ
    if (count % 1200 == 0 && digitalRead(14) == LOW){
      nextstep();
      count = 0;
    }
    
  }
}

回路図も書いてみました・・・が、電気系の学生でありながらこっちは全然自信がないので参考程度におねがいします。

微妙な不具合としてはボタン連打すると表示がおかしくなったり、1行にたくさんLED点灯するとちょっと暗くなったり。後者はトランジスタを間に挟むといいらしいです。前者はフィルタとか入れればいいのかなぁ。いまいちどうしてなるのかはわからず。
楽しかったしためになった気がするのでまた何か作りたいところ。