そこで、プログラムを次のようにしてみましょう
#define R_LED P1_0
#define G_LED P1_6
int count=0;
void setup() {
// initialize the digital pin as an output.
pinMode(R_LED, OUTPUT);
pinMode(G_LED, OUTPUT);
}
void loop() {
if(count%2==0) digitalWrite(R_LED, HIGH);
if(count%2==1) digitalWrite(R_LED, LOW);
if(count==0) digitalWrite(G_LED, HIGH);
if(count==5) digitalWrite(G_LED, LOW);
if(count==10) count=0;
delay(500);
}どうでしょうか、目標通りの動作になっていますよね
(ただし、これが唯一の正解ではありません、プログラムは山の頂上を目指すのと一緒で登山道はいくつもあります)
なぜ、このようなプログラムにする必要があったのか順に見ていきます
まずはじめに#defineのすぐ後にある
int count=0;
数値を入れておく箱と思ってください。
箱には入れるものは何なのか定義が必要です。
実生活ではミカン箱に本を収納しても問題ないですが
コンピュータの世界では、ミカン箱にはミカンしか入らないと思ってください。
ここでは、countという名前の箱をint型で定義しています。
int型とは整数(integer)を入れるための箱ということになります。
整数しか入れることができませんので、1.23のような小数を含む実数は扱えません
1とか108、-52のように整数の値しか入れることができない箱になります。
そして、count=0としてある = とは、= の左側の変数に右側の値を代入する時に使います。
つまり、countに0を代入するということになります。
ここでは、countを定義してすぐに0を代入しておくことになります。
定義するだけでは、箱の中に何が入っているか分らないので
0を代入して、初期状態での箱の中身を決めるわけです。
ちなみに、変数の定義と同時に代入しなくても
以下のようにsetup()の中でcount=0と記述しても同じことです。
int count;
void setup() {
// initialize the digital pin as an output.
pinMode(R_LED, OUTPUT);
pinMode(G_LED, OUTPUT);
count=0;
}
次にloop()を見ていきます
if(count%2==0) digitalWrite(R_LED, HIGH);
if(count%2==1) digitalWrite(R_LED, LOW);
if(count==0) digitalWrite(G_LED, HIGH);
if(count==5) digitalWrite(G_LED, LOW);
if(count==10) count=0;
delay(500);
}ここで出てきたifとは条件文という命令になります
if(条件) 命令;
という形式で、条件が成り立っていれば(「真なら」とか「trueなら」とも言われます)
その後ろの命令を実行し
条件が成り立っていなければ(「偽なら」とか「falseなら」とも言われます)
何もせずに ; の後の命令に進みます
1行目では
if(count%2==0) digitalWrite(R_LED, HIGH);
条件がcount%2==0となっています
%というのは割り算した余りを求める演算子です。
5÷2=2…1 (5わる2は 2あまり1)
ですよね
つまり、5%2は5を2で割ったときの余りを求めることになるので1となります
ここでは、countという変数の中身を2で割っています、一番最初はcountは0なので余りは0です。
続く==とは、==の右側の値と左側の値が等しければ真、等しくなければ偽となる条件式です
なので、loopが初めて実行される回は、条件式が真となりR_LEDをHIGHにする命令が実行されます。
2行目は
if(count%2==1) digitalWrite(R_LED, LOW);
3行目があいて
4行目は
if(count==0) digitalWrite(G_LED, HIGH);
となっています。これは先の2つのifよりわかりやすいですね
countの中身が0の時だけ真となり、命令が実行されます。
5行目も同様に
if(count==5) digitalWrite(G_LED, LOW);
6行目があいて
7行目が
count++;
count=count+1;
そして11行目で
delay(500);
つまり、loop()が一回実行されるたび、
countは1ずつ増えていき、状態は500[ms]保たれることになります。
ただ、これではcountは無限に増えていくので
9行目で
if(count==10) count=0;
つまりloopが実行されるたびにcountの中身は
0→1→2→3→4→5→6→7→8→9→0→1→2→…
と変化していくことになります。
そして、countが偶数になるタイミングで赤色LEDが点灯
奇数になるタイミングで赤色LEDが消灯を繰り返します
緑色LEDはcountが0の時に点灯、5の時に消灯しますから
0~4の間は点灯、5~9の間は消灯ということになります。
これで、赤色の1[s]周期と緑色の5[s]周期を作り出しています。
0 件のコメント:
コメントを投稿