Arduinoアプリケーション開発手順 パート3

本シリーズ2回目の投稿「Arduinoアプリケーションの開発手順 パート2」では、部品表、ブレッドボード回路図、およびいくつかの配線のヒントを説明しました。この短い投稿では、プログラミングの最初のステップである、配線が正しいかどうかを確認するためのテストについて説明します。このような大きなプロジェクトでは、入出力をすべてテストすることから始めることを強くお勧めします。そうすれば入力や出力が機能していないことに気づいて、デバッグやトラブルシューティングをさらに行う必要がなくなることがあるからです。プログラムは複雑である必要はありませんが、使用すると思われる初期変数を設定し、すでに持っているコードに追加するだけでよいようにすることをお勧めします。この最初のステップのために用意したものは以下の通りです。

/*
 * This part of the design phase is important, I would recommend setting up a base program to test that you wired everything correctly. In this case, 
 * we have a lot of wires going different places, red wires for routing to resistors for red lights, yellow wires for routing to resistors for blue lights,
 * black wires for routing from the red light resistors to the IOs, white wires for routing from the blue light resistors to the IOs, and blue wires for
 * wiring all the pushbuttons to pull-down resistors and to their IOs. I will use this code in the final product except for the light sequence (that is just for testing the LEDs)
 */
//define red output pins
#define RR3C3 53
#define RR3C2 52
#define RR3C1 51
#define RR2C3 50
#define RR2C2 49
#define RR2C1 48
#define RR1C3 47
#define RR1C2 46
#define RR1C1 45
//define blue output pins
#define BR1C1 22
#define BR1C2 23
#define BR1C3 24
#define BR2C1 25
#define BR2C2 26
#define BR2C3 27
#define BR3C1 28
#define BR3C2 29
#define BR3C3 30
//define input pins
#define R3C1IN 34
#define R3C2IN 3
#define R3C3IN 4
#define R2C1IN 35
#define R2C2IN 6
#define R2C3IN 7
#define R1C1IN 8
#define R1C2IN 9
#define R1C3IN 10
void setup() {
  pinMode(RR1C1, OUTPUT);
  pinMode(RR1C2, OUTPUT);
  pinMode(RR1C3, OUTPUT);
  pinMode(RR2C1, OUTPUT);
  pinMode(RR2C2, OUTPUT);
  pinMode(RR2C3, OUTPUT);
  pinMode(RR3C1, OUTPUT);
  pinMode(RR3C2, OUTPUT);
  pinMode(RR3C3, OUTPUT);
  pinMode(BR1C1, OUTPUT);
  pinMode(BR1C2, OUTPUT);
  pinMode(BR1C3, OUTPUT);
  pinMode(BR2C1, OUTPUT);
  pinMode(BR2C2, OUTPUT);
  pinMode(BR2C3, OUTPUT);
  pinMode(BR3C1, OUTPUT);
  pinMode(BR3C2, OUTPUT);
  pinMode(BR3C3, OUTPUT);
  pinMode(R3C1IN, INPUT);
  pinMode(R3C2IN, INPUT);
  pinMode(R3C3IN, INPUT);
  pinMode(R2C1IN, INPUT);
  pinMode(R2C2IN, INPUT);
  pinMode(R2C3IN, INPUT);
  pinMode(R1C1IN, INPUT);
  pinMode(R1C2IN, INPUT);
  pinMode(R1C3IN, INPUT);
  //use serial for checking if buttons are wired correctly
  Serial.begin(9600);
}

void loop() {
  //loop the red lights by beginning with row 1 col 1 and ending on row 3 column 3
  int i = 45;
  //check buttons individually by each abbreviated variable for "location" in grid, tedious process but better than trying to distinguish what value is what and don't have to print extra text
  Serial.println(digitalRead(R3C3IN));
  for(i; i <= 53; i++){
    digitalWrite(i, HIGH);
    delay(100);
    digitalWrite(i, LOW);
  }
  //loop backwards direction with the blue lights this time
  int i2 = 30;
  for(i2; i2 >= 22; i2--){
    digitalWrite(i2, HIGH);
    delay(100);
    digitalWrite(i2, LOW);
  }
}

コード内のコメントに説明されているように、digitalRead()関数を変更して、各ボタンを個別にテストすることにしました。この方が面倒ですが、異なる入力を「区別」するためには、この段階でもっと書かなければならないでしょう。また、シリアルモニタはまだかなり速く、簡単なテストを行うためだけに遅延を入れるのは避けたいと思います。マス目の異なる位置には#defineを使った略記号を使いました。RR1C1は赤色の1行1列を表し、BR1C1は青色の1行1列を表し、R1C1INは1行1列の入力を表します。最終的なプログラムの中で名前を覚えることができる便利で簡単な方法が必要でした。値は決して変わることがないため、C原語の「#define」構文はこのプログラムではうまく機能します。次回の投稿では、プレーヤー間で交代する順序を理解するという、より難しいタスクについて説明します。




オリジナル・ソース(English)