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

» 2014年05月15日 10時00分 公開
[三月兎MONOist]

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

 それでは、Arduinoの統合開発環境「Arduino IDE」で、スケッチ(プログラム)を作成していきましょう(スケッチ1スケッチ2)。


  1. #include "pitches.h"
  2. //-----------------------
  3. // 定数の定義
  4. //-----------------------
  5. const int BZ = 2; //ブザーの出力ピン
  6. const int LED_COUNT = 5; //LEDの数
  7. const int LED[LED_COUNT] = {7,8,9,10,11}; //各LEDのピン番号
  8. const int VALUE[LED_COUNT] = {200,400,600,800,1000};
  9. //LEDに対応したセンサー値
  10. const int SENSOR = A5; //センサーの入力ピン
  11. const int SENSOR_OFF = 100; //センサーOFFの値
  12. //-----------------------
  13. // グローバル変数の定義
  14. //-----------------------
  15. 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)。


  1. int get_sensorno() {
  2. int sensorno = -1;
  3. int sensorVal = analogRead(SENSOR); //センサーの値を読む
  4. // Serial.println(sensorVal);
  5. if(sensorVal < SENSOR_OFF) {
  6. //センサーOFF
  7. sensorno = -999;
  8. }
  9. else {
  10. //センサー値が安定するのを待つ
  11. delay(100);
  12. sensorVal = analogRead(SENSOR);
  13. //センサーを押した位置を判定(しきい値±50)
  14. for(int i = 0; i < LED_COUNT; i++) {
  15. if(sensorVal >= VALUE[i] - 50 && sensorVal <= VALUE[i] + 50) {
  16. sensorno = i;
  17. break;
  18. }
  19. }
  20. }
  21. return(sensorno);
  22. }
スケッチ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.