レゴゴーストバスターズのキャデラックecto-1にLEDを入れてarduinoで光らせようプロジェクト、加工の方は完了したのであとはプログラムの作成です。
そして、最終的に完成したのが下記の動画のプログラムです。
プログラムをループさせて、起動演出を繰り返すようにしました。
もともとこれを作った目的が、arduinoとLEDを使ってガンプラなどを光らせようの会に臨時講師として依頼が来たので、サンプルとして作成しました。
当日、動きを見ながら説明するのに、いちいちリセットボタンを押すよりもループさせた方が便利そうなのでこうなってます。
では動きを順を追っていきます。
まず電源を入れるとarduinoは13番ポートが数回点滅します。で、パトライトの1対を13番に繋げているのでピカピカしています。
あと、pro mini だと0番ポートがあって、ここは電源を入れるとHIGHに設定されるようで、そのままだとずっと点灯するのでプログラムの最初で消しています。
その後、これから始めるぞ感を出すために全LEDを5回点滅させ、3秒待機します。
それからヘッドライト、テールライトを点灯し、2秒待って屋根のレーダー的なやつを点灯。
それからまた2秒待って、ヘッドライトを約2.5秒かけて徐々に明るくしていきます。
で、1秒待ってからパトライトをグリグリ30回回転演出します。
その後、すべてのLEDを消灯して1.5秒まってから最初に戻るってのをひたすら繰り返す感じです。
以上、ざっくり動作を説明しましたが、実際のスケッチは下記の通りです。
int i = 0; int j = 0; int dl = 120; void setup() { pinMode(0, OUTPUT); pinMode(1, OUTPUT); pinMode(2, OUTPUT); pinMode(4, OUTPUT); pinMode(7, OUTPUT); pinMode(8, OUTPUT); pinMode(9, OUTPUT); pinMode(10, OUTPUT); pinMode(11, OUTPUT); pinMode(12, OUTPUT); pinMode(13, OUTPUT); } void loop() { digitalWrite(0, LOW); while(j < 6){ digitalWrite(0, HIGH); digitalWrite(1, HIGH); digitalWrite(2, HIGH); analogWrite(3, 255); digitalWrite(4, HIGH); analogWrite(5, 255); analogWrite(6, 255); digitalWrite(7, HIGH); digitalWrite(8, HIGH); digitalWrite(9, HIGH); digitalWrite(10, HIGH); digitalWrite(11, HIGH); digitalWrite(12, HIGH); digitalWrite(13, HIGH); delay(100); digitalWrite(0, LOW); digitalWrite(1, LOW); digitalWrite(2, LOW); analogWrite(3, 0); digitalWrite(4, LOW); analogWrite(5, 0); analogWrite(6, 0); digitalWrite(7, LOW); digitalWrite(8, LOW); digitalWrite(9, LOW); digitalWrite(10, LOW); digitalWrite(11, LOW); digitalWrite(12, LOW); digitalWrite(13, LOW); delay(50); j = j +1; } j = 0; delay(3000); if(j == 0){ digitalWrite(11, HIGH); delay(2000); digitalWrite(2, OUTPUT); delay(2000); for( i = 0; i < 255; i++){ analogWrite(3, i); delay(10); } delay(1000); j = j + 1; } while(j < 30){ analogWrite(5, 255); analogWrite(6, 255); digitalWrite(12, LOW); digitalWrite(8, LOW); digitalWrite(7, HIGH); digitalWrite(10, HIGH); delay(dl); digitalWrite(1, LOW); digitalWrite(0, LOW); digitalWrite(4, HIGH); digitalWrite(9, HIGH); delay(dl); digitalWrite(7, LOW); digitalWrite(10, LOW); digitalWrite(12, HIGH); digitalWrite(8, HIGH); delay(dl); digitalWrite(4, LOW); digitalWrite(9, LOW); digitalWrite(1, HIGH); digitalWrite(0, HIGH); delay(dl); j = j + 1; } digitalWrite(0, LOW); digitalWrite(1, LOW); digitalWrite(2, LOW); analogWrite(3, 0); digitalWrite(4, LOW); analogWrite(5, 0); analogWrite(6, 0); digitalWrite(7, LOW); digitalWrite(8, LOW); digitalWrite(9, LOW); digitalWrite(10, LOW); digitalWrite(11, LOW); digitalWrite(12, LOW); digitalWrite(13, LOW); delay(1500); j = 0; } よくわかりませんね。
通常、int headlight = 3とかやってポートに名前をつけるとわかりやすくなるんですが、めんどくさいので数字で管理しています。
別に絵でも書いてそこに番号書いておけばいいので自分はいつもこのやり方です。
では上から見てきましょう。
int i = 0ってのは、ヘッドライトをだんだん明るくする時のfor文内でつかう変数の宣言です。
for文内でまとめて宣言もできますが、なんとなく自分は最初に宣言してます。
int j = 0は、所々で処理を指定回数ループさせてるので、その時につかうための変数です。
int dl = 120ってのは、パトライトを回転演出する時の次の処理に移る待ち時間を設定しています。
この120ってのは120/1000秒の事で、この数値を変えるとパトライトの回転速度が変わります。
いろいろ試して120ぐらいが見栄えが良いのでこれにしてあります。
setupはarduinoでは必ず書いとかないといかんやつなのでこれは飛ばします。
PWMで使用する予定の3,5,6ポート以外は全部出力に定義してあります。
ちなみに3はヘッドライト、5、6は謎の青いホースに繋げてあります。
しかし、結局謎の青いホースはデジタル同様の扱いしかしていません(^^;
void loopですが、これはarduinoでは必ず必要なもので、このループ内に書かれた処理をひたすら繰り返します。
コマンドインタープリタなので上から順番に処理する事しかできないので、マルチタスクな感じには使えないです。
ただし、割り込み命令を受けて別のプログラムを走らせる事はできるので、それを活用すると割とすごい感じのプログラムが作れると思います。
さあでは、ループ内を見ていきます。
まずは、0ポートが最初は点灯するから消します。
while文内で、全LEDを5回点滅させています。
ここで先ほど宣言したjを使っています。
最初はjに0が入っているので、まず1回全部点灯消灯します。そしてj=j+1で徐々にjの数字を大きくして行って6になったらこのwhile文から抜けて下の行の処理に移る感じです。
では下です。6になったjをまた0に戻しておき、3秒待ちます。
で、もしjが0なら次の処理に入ります。当然0です。
ここで11番を出力していますが、これはフォグライトとテールランプが並列に接続されています。
で、2秒待って2番を出力、これが屋根の上の謎のレーダー2個です。
で、2秒待ちます。
次のfor文で、ヘッドライトを徐々に明るくしています。
analogWrite命令は、括弧内にまず出力したいポートを記述して、コンマの後ろにパルス幅を記述します。
8ビットでの指定なので0から255の256階調を使う事ができます(2の8乗)
実際は電圧が変わるのではなく、高速にオンオフを繰り返して残像で明るさを調整する擬似アナログで、それがパルス幅変調(Pulse Width Modulation)の動作になります。
0で全く光らない状態、255だとほぼ全開の明るさです。
この数値をiに指定して、for文による繰り返しで10ミリ秒間隔でどんどんスイッチの連打を早くして行ってるので、およそ2500ミリ秒、つまり2.5秒ほどでiが255になって全力で光る感じです。
で、iが255になるとfor条件から外れて、1秒待って下の行の処理に移っていきます。
次はまたwhileで、ここでもjを再利用しています。
このwhileは教材用に処理を最初に戻したかったから書いてありますが、これを無しにすればこのプログラムはずっとここを繰り返します。
まず、analogWriteで5と6を最大出力で点灯しています。
そしてこれをボワンボワンしてやろうと思ったけどあまりに面倒なのでやめました。なのでこれ、digitalWriteでも問題なかったです。
それからパトライトの点灯パターンに移ります。右前グループと左後ろグループ、左前グループと右後ろグループがペアになっています。
1つのグループに注目すると、常に2つが点灯しながらぐるぐる回るようにオンオフを繰り返すようにしてあります。
これだけで1周分になるので、whileで30を指定しているから30回回ります。
j=j+1の結果、jが30になるとwhileから抜けて全LEDを消灯し、1.5秒待って、あとjを0に戻してループの先頭に戻ってまた繰り返す、そしてこれを電池がなくなるまでやり続ける感じです。
以上、プログラムの解説でした。
長いだけで簡単なのですぐできると思います。
スポンサーサイト