\u0026gt; 上手くいきません
プログラミングでも電子回路でもですが、「上手くいかない」は考えを深める時にはNGワードと思ってください。自分の思ったのと違う、それだけの情報しかないのに全てを説明した気になれてしまうから。そうではなく、
「こうなることを期待した」
「そのためにどういうことをした」
「実際に起こったのはこういうことだった」
というのをきちんと挙げてみるべきです。特に、他人に説明するときには前の2つがちゃんと共有されていないと、何が上手くないと思ったのかすら伝わらないこともあります(この質問では一応書いてはありますが、世の中そういう質問も多いので一般論として。でも、YouTubeのURLは記載してあると参考になったでしょう)。
で、今回の「上手くいかなかった」とは、実際にはどのようになったことでしょうか。
とりあえずプログラムから予想される動作は、
LEDが1秒に1つずつ点灯していって、全部点灯すると1秒に1つずつ消灯して全部消える...ことを繰り返すことです。
そうではなくて「全く点灯しない」などの動作であるなら、また別の問題もある(多分は結線間違いとか、ツール類の扱いが間違っていてプログラムが書き込みできていないなど)ことになります(それを判断するにも、「上手くいかない」では情報不足なのです)。
なぜそうなるかはプログラムを読む=自分がコンピュータになったつもりで、コンピュータの動作を追ってみることでわかると思います。
digitalWrite(2, HIGH); //2ピンのLEDを点灯させる
delay(1000); //1000ミリ秒=1秒間なにもしない
digitalWrite(3, HIGH); //3ピンのLEDを点灯させる
delay(1000); //1000ミリ秒=1秒間なにもしない
(以下略)
ということをするのですから。delay(1000)の効果がなぜか直前のLEDだけに及ぶと考えてしまったのであれば、それは都合よすぎです。
「プログラムは、あなたが思ったように動くのではなく、ソースコードに書いてある通りに動く」という格言?があります。
今回であれば、LEDを全部点灯(あるいは消灯)した段階で1秒待つ、とすれば「複数のLEDの同時点灯」と言える動作になるでしょう。
それと、必ずしも間違いとは言えませんが「そうするものではない」という点では、「出力ピンの現在の状態を読み出す」ことがあります。具体的には
if(digitalRead(2) == LOW)
のところ。今回はその影響は出ないと思われますが、マイコンの種類や回路によっては、この方針は意図した動作をしない場合があることが知られています(詳細を知りたければ別途説明します)。君子危うきに近寄らず、初めからそのような方法は取るべきではありません。ではどうするかというと、点灯/消灯状態をデータとして持つ変数を使用してください。例えば
int leds=LOW;
として変数を宣言しておいて、
void loop() {
if( leds == LOW) {
leds = HIGH;
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
//略
delay(1000);
} else {
leds = LOW;
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
//略
delay(1000);
}
}
もう一つ、一般論で言うなら、今どきのLEDは数mAも流せば皓々と光ります。直列にした電流制限抵抗が200Ωというと多分15mA~20mA近く電流が流れると思いますが、LEDの定格が連続20mAとかいうものも多いので、それに対して余裕がなさ過ぎの感があります。もちろん、意図してその明るさならそれでもよいのですけれど、点灯すればいい、ということなら抵抗を1kΩ~3.3kΩ程度とするのが普通っぽいかなぁ、と思います。