目次
この回はProcessingを使います。
Processingについては第8回 レーダーを作成して、Processingで検証してみるの記事に書いてますので、そちらを参考にしてください
準備するもの
- 可変抵抗器(10kΩ): 1個
- ジャンパー線: 3本
ブレッドボードへの接続
(1)ブレッドボードへの接続を行っていきます
プログラムの作成(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)を開きます
(2) 再生ボタンをクリックして実行します
(3) ダブルクリックすると始まります
可変抵抗器のつまみを回すとラケット(上図青い部分)が動きます