それでは、メインスケッチの作成です。「setup()」を設定し、「loop()」を作りましょう!(スケッチ3)
void setup() { //ブザーを出力モードに設定 pinMode(BZ, OUTPUT); //全てのLEDを出力モードに設定 for(int i = 0; i < LED_COUNT; i++) { pinMode(LED[i], OUTPUT); } //シリアル通信を開始 // Serial.begin(9600); //乱数の初期設定に未接続ピンのノイズを利用 randomSeed(analogRead(A0)); //スタート音 bz_start(); } void loop() { if (G_ledno < 0) { //アタリの番号を決める G_ledno = random(LED_COUNT); //アタリのLEDを点灯する digitalWrite(LED[G_ledno],HIGH); } //センサーを押した位置を取得する int sensorno = get_sensorno(); if(sensorno != -999) { //センサーを押した if (G_ledno == sensorno) { //アタリのLEDを消灯する digitalWrite(LED[G_ledno],LOW); //アタリ! toneMelody(NOTE_G6,4); G_ledno = -1; } else { //はずれ toneMelody(NOTE_D4,4); } //センサーを離すまで待つ while(get_sensorno() != -999); } }
1〜14行目は、おなじみのsetup()。ブザーと5つのLEDのピンを「出力」に設定しています。シリアルモニター通信は、デバッグ時にセンサー値を確認するために使用します。ゲーム内で、LEDをランダムに点灯させるために、「randomSeed()」で乱数の初期化をしています(11行目)。
メロディーを鳴らして、ゲームスタートです(13行目)。「bz_start()」は、連載第4回で作ったものを流用しています。本稿の末尾でスケッチをダウンロードすると、その中に記述されています。
loop()でも特に難しいことはしていません。まだ、LEDが選ばれていないときには、random()関数でLED1〜5の中から1つを選び、点灯させています(17〜22行目)。
LEDが点いたら、プレーヤーがセンサーのどこかを押すはずなので、先ほど作ったget_sensorno関数でどの位置が押されたか、その番号を取得します(24行目)。ちなみに、戻り値sensornoが−999なら、センサーは押されていません。
−999以外のときは、アタリ判定をします(25〜37行目)。当たっていたらLEDを消してアタリ音を、外れたときにはハズレ音を鳴らします。
39行目でセンサーから指が離れるまで待っているのは、押している間中ブザーが鳴り続けるのを避けるためです。
今回のスケッチでは、ハズレを押した場合、アタリを押すまでLEDが光ってくれている優しい仕様になっています。これなら日ごろ、ゲームをやらない筆者でも長時間遊べます(笑)。
さらに、ゲーム度を上げるためには、
など、いろいろな追加仕様が考えられます。
一度にあれもこれも機能追加するとタイヘンなので、一つ一つ動作確認をしっかりとしながら追加していくのがよいでしょう。ぜひチャレンジしてみてください。
感圧センサーの利用シーンを調べてみたところ、エレベーターのドアにも採用されていました。例えば、閉まり掛けのドアにカバンがうっかり挟まってしまった際、安全のためもう一度ドアが開くのは感圧センサーが働いているおかげだとか。
さて次回は、「サーボモータ」を使った作品に挑戦してみたいと思います。お楽しみに!! (次回に続く)
Copyright © ITmedia, Inc. All Rights Reserved.