マイコン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);
}
失敗例
画面がチラつきます。
チラつく様子。動画前半の部分
次に作ったのが
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++; // 右へ移動
}
}
動画の後半
画面のチラつきが無くなりました。
これで完成です。後はボール速度を変える、ラケットを小さくしていく等、改造して行って下さい。
次回、新しいゲームを作って行きます。
では、また。