感圧センサーで、「もぐらたたきみたいな(?)ゲーム」を作ってみた:アイデア・ハック!! Arduinoで遊ぼう(10)(2/3 ページ)
頭の中のアイデアを「Arduino(アルドゥイーノ)」で実現!! 筆者と一緒にモノづくりの喜びや難しさを体験・体感してみよう。連載第10回では「感圧センサー」を使って、もぐらたたき風のゲームを作る!
センサー値を取得して、ゲームの判定を行う
それでは、Arduinoの統合開発環境「Arduino IDE」で、スケッチ(プログラム)を作成していきましょう(スケッチ1、スケッチ2)。
#include "pitches.h"
//-----------------------
// 定数の定義
//-----------------------
const int BZ = 2; //ブザーの出力ピン
const int LED_COUNT = 5; //LEDの数
const int LED[LED_COUNT] = {7,8,9,10,11}; //各LEDのピン番号
const int VALUE[LED_COUNT] = {200,400,600,800,1000};
//LEDに対応したセンサー値
const int SENSOR = A5; //センサーの入力ピン
const int SENSOR_OFF = 100; //センサーOFFの値
//-----------------------
// グローバル変数の定義
//-----------------------
int G_ledno = -1; //選択したLED(未選択の値:−1)
1行目で、ブザーで音階を鳴らすための「pitches.h」を読み込んでいます。pitches.hとブザーで音階を鳴らす関数については、連載第4回を参照してください。
6〜13行目は、ブザーとLED、LEDに対応する感圧センサー値の設定です。17行目の「G_ledno」は、アタリ番号(点灯しているLED番号)を入れる変数です。−1は初期値で、LEDを選んでいない状態です。
事前に、各LEDに対応するセンサー値のアタリは、LED1が200、LED5が1000になるようにシールを貼りました。LED1を端にすると感圧センサーを押していない状態との区別ができないので、センサー値が200になる位置をLED1としています。
センサー値を取得する関数「get_sensorno()」は、次のようになります(スケッチ2)。
int get_sensorno() {
int sensorno = -1;
int sensorVal = analogRead(SENSOR); //センサーの値を読む
// Serial.println(sensorVal);
if(sensorVal < SENSOR_OFF) {
//センサーOFF
sensorno = -999;
}
else {
//センサー値が安定するのを待つ
delay(100);
sensorVal = analogRead(SENSOR);
//センサーを押した位置を判定(しきい値±50)
for(int i = 0; i < LED_COUNT; i++) {
if(sensorVal >= VALUE[i] - 50 && sensorVal <= VALUE[i] + 50) {
sensorno = i;
break;
}
}
}
return(sensorno);
}
スケッチ2は、“ユーザーが押した感圧センサーの位置”を、センサーの値から取得する関数です。
「sensorno」は、センサーの押された位置を格納する変数で、初期値は−1です(2行目)。
3行目のanalogRead()でセンサー値を読み取り、変数「sensorVal」に格納。5行目で取得した値が「SENSOR_OFF」より小さい場合、“何も押されていない”と判断し、sensornoに−999を入れて戻します。
どこかが押されているときは、センサー値が安定するのを待ってから、あらためてセンサー値を取得します(11〜12行目)。
閾値をプラスマイナス50ずつとして、sensorValの値と定数で設定したVALUE配列を比較し、センサーのどの位置が押されているかをチェック。押されている位置番号をsensornoに格納します(13〜17行目)。
Copyright © ITmedia, Inc. All Rights Reserved.