それでは、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.