マイコンArduinoを使って電光掲示板を作る。

マイコンArduinoを使って電光掲示板を作る。

 

続き

今回は音が出る様に改造していきます。

 

本体にブザーを取り付けて行きます。

黒線をGNDに、赤線を11番ピンに直接はんだ付けします。

このブザーは電気に繋げるだけで鳴るタイプ

 

本体の改造はこれだけです。

 

次はプログラムです。

まず最初に作ったプログラムが

int count = 0;
int x_pos = 0;
int y_pos = 0;
boolean x_dir = false;
boolean y_dir = false;
int racket_pos = 5;        // ラケットの位置
int racket_size = 6;        // ラケットのサイズ

void setup() {
  // put your setup code here, to run once:
  pinMode(2,OUTPUT);
  pinMode(3,OUTPUT);
  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);
  pinMode(6,OUTPUT);
  pinMode(7,INPUT_PULLUP);
  pinMode(8,INPUT_PULLUP);
  pinMode(9,INPUT_PULLUP);
  pinMode(10,INPUT_PULLUP);
  pinMode(11,OUTPUT);
 }

void loop() {
  // put your main code here, to run repeatedly:
  for (int i = 0;i < 16;i++) {
    for (int j = 0;j < 16;j++) {
      digitalWrite(2,LOW);

      // ボールを描く
      if (j == x_pos && i == y_pos)
        digitalWrite(2,HIGH);

      // ラケットを描く
      if (i == 15) {          // 1番下の16段目
        if (racket_pos <= j && j < racket_size + racket_pos)
        digitalWrite(2,HIGH);
      }
      digitalWrite(4,HIGH);
      digitalWrite(4,LOW);
    }
    digitalWrite(5,HIGH);
    digitalWrite(5,LOW);
  }
  digitalWrite(6,HIGH);
  digitalWrite(6,LOW);
  
  count++;
  if (count > 10) {
    count = 0;
    
    // ボールの位置 x軸
    if (!x_dir)
      x_pos++;
    else
      x_pos--;
    if (x_pos > 14) {
      x_dir = true;
    }
    if (x_pos < 1) {
      x_dir = false;
    }

    // ボールの位置 y軸
    if (!y_dir)
      y_pos++;
    else
      y_pos--;
    if (y_pos == 14 && x_pos < racket_size + racket_pos && x_pos >= racket_pos) {
      y_dir = true;
      beep();
    }
    if (y_pos < 1) {
      y_dir = false;
    }
    
    if (y_pos > 15) {
      y_dir = false;
    }

    if (digitalRead(7) == 0) {  // サーブ
      x_pos = 0;
      y_pos = 0;
    }

    if (digitalRead(8) == 0) {  // サーブ
      x_pos = 15;
      y_pos = 0;
      x_dir = true;
    }

    // ラケットの位置
    if (digitalRead(9) == 0)
      if (racket_pos > 0)
        racket_pos--;         // 左へ移動

    if (digitalRead(10) == 0)
      if (racket_pos < 16 - racket_size)
        racket_pos++;         // 右へ移動
  }
}

void beep() {
  digitalWrite(11,HIGH);
  delay(5);
  digitalWrite(11,LOW);
}

失敗例

画面がチラつきます。

 

チラつく様子。動画前半の部分


www.youtube.com

 

次に作ったのが

int count = 0;
int x_pos = 0;
int y_pos = 0;
boolean x_dir = false;
boolean y_dir = false;
int racket_pos = 5;        // ラケットの位置
int racket_size = 6;        // ラケットのサイズ
boolean beep_flag = false;
int beep_count = 0;
boolean game_flag = true;

void setup() {
  // put your setup code here, to run once:
  pinMode(2,OUTPUT);
  pinMode(3,OUTPUT);
  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);
  pinMode(6,OUTPUT);
  pinMode(7,INPUT_PULLUP);
  pinMode(8,INPUT_PULLUP);
  pinMode(9,INPUT_PULLUP);
  pinMode(10,INPUT_PULLUP);
  pinMode(11,OUTPUT);
 }

void loop() {
  // put your main code here, to run repeatedly:
  for (int i = 0;i < 16;i++) {
    for (int j = 0;j < 16;j++) {
      digitalWrite(2,LOW);

      // ボールを描く
      if (j == x_pos && i == y_pos)
        digitalWrite(2,HIGH);

      // ラケットを描く
      if (i == 15) {          // 1番下の16段目
        if (racket_pos <= j && j < racket_size + racket_pos)
        digitalWrite(2,HIGH);
      }
      digitalWrite(4,HIGH);
      digitalWrite(4,LOW);
    }
    digitalWrite(5,HIGH);
    digitalWrite(5,LOW);
  }
  digitalWrite(6,HIGH);
  digitalWrite(6,LOW);

  if (beep_flag) {
    beep_count--;
    if (beep_count == 0) { // 0になると音を止める
      beep_flag = false;
      digitalWrite(11,LOW);
    }
  }
  
  count++;
  if (count > 10) {
    count = 0;
    
    // ボールの位置 x軸
    if (!x_dir)
      x_pos++;
    else
      x_pos--;
    if (x_pos > 14) {
      x_dir = true;
    }
    if (x_pos < 1) {
      x_dir = false;
    }

    // ボールの位置 y軸
    if (!y_dir)
      y_pos++;
    else
      y_pos--;
    if (y_pos == 14 && x_pos < racket_size + racket_pos && x_pos >= racket_pos) {
      y_dir = true;
      digitalWrite(11,HIGH); // ラケット音
      beep_count = 7;
      beep_flag = true;
    }
    if (y_pos < 1) {
      y_dir = false;
    }

    if (y_pos > 14 && game_flag) {
      digitalWrite(11,HIGH); // 終了音
      beep_count = 70;
      beep_flag = true;
      game_flag = false;
    }
    
    if (digitalRead(7) == 0) {  // サーブ
      x_pos = 0;
      y_pos = 0;
      game_flag = true;
    }

    if (digitalRead(8) == 0) {  // サーブ
      x_pos = 15;
      y_pos = 0;
      x_dir = true;
      game_flag = true;
    }

    // ラケットの位置
    if (digitalRead(9) == 0)
      if (racket_pos > 0)
        racket_pos--;         // 左へ移動

    if (digitalRead(10) == 0)
      if (racket_pos < 16 - racket_size)
        racket_pos++;         // 右へ移動
  }
}

動画の後半

 

画面のチラつきが無くなりました。

これで完成です。後はボール速度を変える、ラケットを小さくしていく等、改造して行って下さい。

 

次回、新しいゲームを作って行きます。

 

では、また。

 

mckeechan.hatenadiary.com