連載
» 2014年05月15日 10時00分 公開

アイデア・ハック!! Arduinoで遊ぼう(10):感圧センサーで、「もぐらたたきみたいな(?)ゲーム」を作ってみた (2/3)

[三月兎,MONOist]

センサー値を取得して、ゲームの判定を行う

 それでは、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 「もぐらたたきみたいな(?)ゲーム」用定数の定義

 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 センサーを押した位置を取得する関数

 スケッチ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.