体験的マイコン学習(Arduino編)


目次



第12回 Processingを使ってスカッシュゲームを作ってみよう


この回はProcessingを使います

Processingについては第8回 レーダーを作成して、Processingで検証してみるの記事に書いてますので、そちらを参考にしてください


準備するもの

  1. 可変抵抗器(10kΩ): 1個
  2. ジャンパー線: 3本

ページトップ

ブレッドボードへの接続

(1)ブレッドボードへの接続を行っていきます


frizing画像
ページトップ

プログラムの作成(Processing)

(1) Processing側のプログラムを作成します

Squash_Pr.pde

// Arduinoと通信するためのライブラリを読み込む
import processing.serial.*;
// シリアル通信を行うための変数の定義
Serial port;
// ボールの位置
float px, py;
// ボールの速度
float vx, vy;
// ラケットの現在位置と1ステップ前の位置
float rx, rx1;

void setup () {
  // 400x400ドットの画面を作成
  size(400, 400);
  // 通信ポートと速度の設定
  port = new Serial(this, "COM3", 9600);
  // ボールの初期位置と初期速度
  px = 100;
  py = 200;
  // ラケットの初期位置
  rx = width/2;
  rx1 = rx;
  // 返信要求を送る
  port.write('a');
}

void draw(){
  // 画面を黒で塗りつぶして更新
  background(0);
  // 線なし
  noStroke();
  // 塗りつぶしの色を白に
  fill(255);
  // ボールが動ける白い範囲を描く
  rect(20, 20, width-40, height-20);

  // 塗りつぶしの色を青に
  fill(0, 0, 255);
  // ラケットの描画
  rect(rx, height-20, 40, 20);

  // 塗りつぶしの色を灰色に
  fill(127);
  // ボールの描画
  ellipse(px, py, 10, 10);

  // 文字の表示
  if (vx == 0 && vy == 0){
    textSize(24);
    text("To start double-click", 80, 100);
  }
  // 左の壁にぶつかったら横方向の速度を反転
  if (px < 25) vx = -vx;
  // 右の壁にぶつかったとき
  if (px > width-25) vx = -vx;
  // 上の壁にぶつかったら縦方向の速度を反転
  if (py < 25) vy = -vy;
  // ラケットとの衝突判定
  if (py > height-25) {
    if (px > rx && px < rx+40)   // ラケットの移動速度によりボールの速さを変える
      vy = -(abs(rx1-rx)*0.5+2);
  }
  // ラケットよりボールが下に行った場合
  if (py > height) {
    // 文字の表示
    text("Game Over", width/2, height/2);
    vy = 0.1;
    }
  // ボールがラケットの下に行ってから約3秒経過したか
  if (py > height+9) {
    // 初期値に戻す
    px = 100;
    py = 200;
    vx = 2;
    vy = 2;
    rx = width/2;
    rx1 = rx;
  }
  // ボールの位置の更新
  px += vx;
  py += vy;
  // 1つ前のラケットの位置を保存
  rx1 = rx;
}

void serialEvent(Serial p) {
  // 文字列の読み込み
  String ms = p.readStringUntil('\n');
  // 改行コードの削除とint型への変換
  rx = int(trim(ms));
  // 可変抵抗器の角度によりラケットの位置を決める
  rx = map(rx, 0, 1023, 20, 340);
  // 返信要求を送る
  port.write('a');
}

void mousePressed() {
  // 画面の更新速度を30fps
  frameRate(30);
  // 文字の大きさを24pt
  textSize(24);
  // 表示位置を中心
  textAlign(CENTER);
  vx = 2;
  vy = 2;
  port.bufferUntil('\n');
  // 返信要求を送る
  port.write('a');
}

ページトップ

プログラムの作成(Arduino)

(1) Arduino側のプログラムを作成します

Squash_Ar.ino

void setup() {
  // 通信速度を9600bpsに
  Serial.begin(9600);
}

void loop() {
  // データが送られてきたか?
  if (Serial.available() > 0) {
    // 値を読み込む
    int c = Serial.read();
    // アナログ値を読み込む
    int v = analogRead(0);
    // 文字列として送る
    Serial.println(v);
  }
}

ページトップ

マイコンボードへの書き込み

(1) 作成したプログラム(Squash_Ar.ino)をコンパイルします

コンパイル

(2) マイコンボードへ書き込みます

マイコンボードへの書き込み
ページトップ

実行する

(1) Processingを起動して、作成したファイル (Squash_Pr.pde)を開きます

Processing起動

(2) 再生ボタンをクリックして実行します

プログラムの実行

(3) ダブルクリックすると始まります

可変抵抗器のつまみを回すとラケット(上図青い部分)が動きます

ゲームの説明
ページトップ